MySQL(八)DQL之连接查询

图片 18

连接查询又称多表查询,查询到的字段来自于多个表中的数据。
一、 连接查询的分类和语法
1.分类
按标准分:
92标准:只支持内连接
99标准:支持内连接和、外连接和全外连接
功能进行分类:
内连接:inner
等值连接
非等值连接
自连接
外连接:
左外连接left 【outer】
右外连接right【outer】
全外连接(mysql不支持) full【outer】
交叉连接cross
笛卡尔集:没有加约束条件。若表1有m行数据,表2有m2行数据,最终有m*m2行数据。
2.语法
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
二、内连接(inner)
1.等值连接
语法:select 查询列表 from 表1 别名1 [inner join] 表2 别名
[on]/[where] 连接条件
特点:
①多表等值连接的结果为多表的交集部分;
②m个表的连接,至少需要m-1个连接条件
③各个表的先后顺序没有要求
④可以结合其他函数和字句,比如:排序、分组、筛选等
⑤可以用inner join on连接也可以使用from多个表
⑥inner join on 是sql99语法规范,提高了分离性、可读性。
图片 1
图片 2
图片 3
图片 4
2.非等值连接
图片 5
图片 6
3.自连接
查询出员工名和上级名
图片 7
三、外连接
用于查询一个表中存在另一个表中不存在的数据
1.特点
①外连接的查询结果为主表中的所有数据,若从表中有和他匹配的,则显示匹配的数据;若没有与之匹配的数据,则显示null
②左外连接,left join 左边是主表;右外连接,right join 右边是主表
③左外和右外交换两个表的顺序,可以实现相同的查询结果
④全外连接=内连接+表1中有表2中没有的+表2中有表1中没有的
2.左外连接
图片 8
3.右外连接
图片 9
4.全连接
图片 10

又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。

2.1、按年代分类:

sql92标准:仅仅支持内连接

sql99标准:支持内连接+外连接+交叉连接

2.2、按功能分类:

内连接:等值连接、非等值连接、自连接

外连接:左外连接、右外连接、全外连接

交叉连接

3.1、等值连接:

① 多表等值连接的结果为多表的交集部分

②n表连接,至少需要n-1个连接条件

③ 多表的顺序没有要求

④一般需要为表起别名

⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

简单查询

案例:查询员工名和对应的部门名

SELECT last_name,department_name FROM employees,departments WHERE
employees.`department_id`=departments.`department_id`;

图片 11

为表起别名

①提高语句的简洁度

②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

案例:查询员工名、工种号、工种名

SELECT e.last_name,e.job_id,j.job_title FROM employees e,jobs j WHERE
e.`job_id`=j.`job_id`;

图片 12

两个表的顺序可以调换

可以加筛选

案例:查询有奖金的员工名、部门名

SELECT last_name,department_name,commission_pct FROM employees
e,departments d WHERE e.`department_id`=d.`department_id` AND
e.`commission_pct` IS NOT NULL;

图片 13

可以加分组

案例:查询每个城市的部门个数

SELECT COUNT 个数,city FROM departments d,locations l WHERE
d.`location_id`=l.`location_id` GROUP BY city;

图片 14

可以加排序

案例:查询每个工种的工种名和员工的个数,并且按员工个数降序

SELECT job_title,COUNT FROM employees e,jobs j WHERE
e.`job_id`=j.`job_id` GROUP BY job_title ORDER BY COUNT DESC;

图片 15

可以实现三表连接

SELECT last_name,department_name,city FROM employees e,departments
d,locations l WHERE e.`department_id`=d.`department_id` AND
d.`location_id`=l.`location_id` ORDER BY department_name DESC;

图片 16

3.2、非等值连接

SELECT salary,grade_level FROM employees e,job_grades g WHERE salary
BETWEEN g.`lowest_sal` AND g.`highest_sal`;

图片 17

3.3、自连接

案例:查询员工名和上级的名称

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name FROM
employees e,employees m WHERE e.`manager_id`=m.`employee_id`;

图片 18