准备sql:
创建部门表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
# 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
连接:
交叉连接:
交叉连接得出的结果就是所有表中数据的所有组合关系,表一x表二. 叫做笛卡尔积.
一般情况下, 一旦我们发现结果集中包含笛卡尔积的情况, 都是因为条件不够完整导致的.
-- 简化前
SELECT * FROM emp CROSS JION dept;
-- 简化后
SELECT * FROM emp,dept;
内连接查询(不写关键字,where条件AND条件):
有两个集合A,B .取这两个集合的所有组成情况。要完成多表查询,两个表的积会出现无用数据,我们要消除无用的数据所以我们应使用内连接和外连接。
隐式内连接:
使用where条件消除无用数据
-- 查询所有员工信息和对应的部门信息
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
-- 查询员工表的名称,性别。部门表的名称
SELECT
t1.name, -- 员工表的姓名
t1.gender,-- 员工表的性别
t2.name -- 部门表的名称
FROM
emp t1,
dept t2
WHERE
t1.`dept_id` = t2.`id`;
显式内连接(写关键字inner join 表 on 条件):
语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件(写不写inner都行)
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
内连接查询:
先写From字句,明确从那些表查询
如果这些表中包含主外键关系,先把主外键关系的条件
如果还有其他额外的额外条件,添加
最后在补充select字句的内容。
外链接查询:
左外和右外可以互相转化,一般写左外。<