连接查询分类:
- sql92标准:仅仅支持内连接
- sql99标准:【推荐使用这种做法】
按功能分类:
- 内连接:等值连接、非等值连接、自连接
- 外连接:左外连接、右外连接、全外连接
- 交叉连接:笛卡尔积
sql99语法:
select 查询列表 from 表1 别名 【连接类型】 from 表2 别名 on 连接条件 【where 筛选条件】 【group by 分组】 【having 筛选条件】 【order by 排序列表】
内连接:inner,拿着主表的每一条记录去次表进行匹配,如果符合连接条件将其连接作为新的记录,如果不符合则舍弃该记录
左外连接:left 【outer】,拿着坐标的每一条记录去词表进行匹配,如果符合将其连接作为新的记录,如果不符合,则将主表信息保留,次表的信息置为null
右外连接:right【outer】,同理
全外连接:full【outer】,主表和次表的数据都保留,就是等于内连接+左外连接+右外连接的并集
交叉连接:cross,做笛卡尔积
1.等值连接
案例:查询名字中包含e的员工名和工种名
下面sql中的inner是可以省略的,join默认是使用内连接
SELECT last_name, job_title FROM employees e INNER JOIN jobs j ON e.job_id = j.job_id WHERE last_name LIKE '%e%';
案例:查询部门个数>3的城市名和部门个数
SELECT city, count(*) FROM departments JOIN locations ON departments.location_id = locations.location_id GROUP BY city HAVING count(*)> 3;
案例:查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序
SELECT department_name, COUNT(*) FROM departments JOIN employees ON departments.department_id = employees.department_id GROUP BY employees.department_id HAVING COUNT(*)> 3 ORDER BY COUNT(*) DESC;
2.非等值连接
案例:查询员工的工资级别
SELECT salary, grade_level FROM employees JOIN job_grades ON employees.salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal;
3.自连接
案例:查询员工的名字、上级的名字
SELECT e.last_name, m.last_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id;
4.左、右外连接
案例:查询男朋友不在男神表的女神名
SELECT be.NAME FROM beauty be LEFT JOIN boys bo ON be.boyfriend_id = bo.id WHERE bo.id IS NULL;
案例:查询哪个部门没有员工
SELECT d.department_name FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id WHERE e.employee_id IS NULL;
5.全外连接
对于全外连接相当于:内连接+左外连接+右外连接,但这个语法是在MySQL是报错的,MySQL中没有全外连接概念
6.交叉连接
该种做法相当于做笛卡尔积
SELECT be.*, bo.* FROM beauty be CROSS JOIN boys bo;