连接
四种连接
- 内连接(inner join)。分别比较两个表第i(i是一个具体的行号)行每一行中的两个值,进行连接;
- 左向外联接(LEFT JOIN)。左边表的第i行和右边表的第i行比较,若右表对应的行不存在,右表返回null
- 右向外联接(LEFT JOIN)。右边表的第i行和左边表的第i行比较,若左表对应的行不存在,左表返回null
- 完整联接(FULL JOIN) 左、右向外之和。
例子
- 查找所有已经分配部门的员工的last_name和first_name
CREATE TABLEdept_emp
(
emp_no
int(11) NOT NULL,
dept_no
char(4) NOT NULL,
from_date
date NOT NULL,
to_date
date NOT NULL,
PRIMARY KEY (emp_no
,dept_no
));
CREATE TABLEemployees
(
emp_no
int(11) NOT NULL,
birth_date
date NOT NULL,
first_name
varchar(14) NOT NULL,
last_name
varchar(16) NOT NULL,
gender
char(1) NOT NULL,
hire_date
date NOT NULL,
PRIMARY KEY (emp_no
));
思路:先将员工表和 员工-部门关系表进行内连接,再查询
select e.last_name,e.first_name,d.dept_no from employees e inner join dept_emp d where d.emp_no=e.emp_no
上面的题目改为:
查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
select e.last_name,e.first_name,d.dept_no from employees e left join dept_emp d on e.emp_no=d.emp_no
on和where的区别:where是先先连接,后排除不相等。on是在连接时,无论正确与否都返回,若是有一个为null则默认正确。