select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【groupby 分组】
【having 筛选条件】
【orderby 排序列表】
分类:
内连接(*):inner
外连接
左外(*): left 【outer】
右外(*): right 【outer】
全外: full 【outer】
交叉连接: cross
9.1、内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名
on 连接条件;
分类:
等值
非等值
自连接
特点:
添加排序、分组、筛选
inner可以省略
筛选条件放在where后,连接条件放在 on后面,提高分离性,便于阅读
inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
9.1.1、等值连接
9.1.2、案例1:查询员工名、部门名(调换位置)
SELECT last_name , department_name
FROM departments d
JOIN employees e
ON e.`department_id`= d.`department_id`;
9.1.3、案例2:查询名字中包含e的员工名和工种名(筛选)
SELECT last_name , job_title
FROM employees e
JOIN jobs j
ON e.`job_id`= j.`job_id`WHERE e.`last_name`LIKE'%e%';
9.1.4、案例3:查询部门个数 > 3的城市名和部门个数,(分组+筛选)
SELECTCOUNT(*), city
FROM locations l
JOIN departments d
ON l.`location_id`= d.`location_id`GROUPBY city
HAVINGCOUNT(*)>3;
9.1.5、案例4:查询哪个部门的部门员工个数 > 3的部门名和员工个数,并按个数降序
SELECT department_name,COUNT(*)FROM employees e
JOIN departments d
ON e.`department_id`= d.`department_id`GROUPBY department_name
HAVINGCOUNT(*)>3ORDERBYCOUNT(*)DESC;
9.1.6、案例5:查询员工名、部门名、工种名,并按部门名降序
SELECT e.last_name, d.department_name, j.job_title
FROM employees e
JOIN departments d
JOIN jobs j
ON e.`department_id`= d.`department_id`AND e.`job_id`=j.`job_id`ORDERBY d.`department_name`DESC;
9.2、非等值连接
9.2.1、查询员工的工资级别
ELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.`salary`BETWEEN g.`lowest_sal`AND g.`highest_sal`;
9.2.2、查询每个工资级别的个数 >20 个数,并且按工资级别降序
SELECTCOUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e.`salary`BETWEEN g.`lowest_sal`AND g.`highest_sal`GROUPBY grade_level
HAVINGCOUNT(*)>20ORDERBY salary DESC;
9.3、自连接
9.3.1、查询员工的名字、上级的名字
SELECT e.last_name, m.last_name
FROM employees e
JOIN employees m
ON e.`employee_id`= m.`manager_id`
9.3.2、查询姓名中包含字符k的员工的名字、上级的名字
SELECT e.last_name, m.last_name
FROM employees e
JOIN employees m
ON e.`employee_id`= m.`manager_id``girls`WHERE e.`last_name`LIKE'%k%';