连接查询

又叫多表查询.核心是将多个表进行连接后一起查询.

多个表的含义是,既可以是自己,也可以是一张表,还可以是多张表.

目前所使用的语法是sql99,支持比较多的连接方式

内连接

主要包括三方面的连接,

  • 等值连接
  • 非等值连接
  • 自连接

内连接查询模板

最好是别名,利于修改

1
2
3
4
5
6
7
8
SELECT 
查询列表
FROM
1
()JOIN
2
ON
连接条件

等值连接

等值连接是通过两个或者多个表中相同字段进行连接.

等值连接的模板在内连接的模板上进行修改了,但是内连接模板差不多等于等值连接了.

其中inner可以省略

例1:查询有奖金的员工名和部门名

1
2
3
4
5
6
7
8
9
10
11
SELECT 
last_name,
department_name
FROM
employees AS e
INNER JOIN
departments AS d
ON
e.department_id = d.department_id
WHERE
e.commission_pct IS NOT NULL

例1输出:

image-20200701152014229

同时在这里添加筛选和分组,以及排序,之前的语法适用于所有的连接。

在多表连接的情况类似。

例2:查询员工名,部门名,工种名,并按部门名降序(三表查询)

1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
last_name,
department_name
job_id
FROM
employees AS e
INNER JOIN
departments AS d ON d.department_id = e.department_id
INNER JOIN
jobs AS j ON e.job_id = j. job_id
ORDER BY
department_name DESC

例2输出:

image-20200701153456032

非等值连接

非等值连接中的表,并没有相同的字段可以进行连接

例3:

image-20200701153850537

例3输出
image-20200701153909872

自连接

自连接相当于等值连接,是一种比较特殊的连接.连接的对象是自己的,所以一定需要取别名

例4

1
2
3
4
5
6
7
8
9
10
11
# 查询员工的名字,上级的名字

SELECT
e.last_name,
m.last_name
FROM
employees AS e
JOIN
employees AS m
ON
e.manager_id = m.employee_id

例4输出

last_name last_name
Kochhar K_ing
De Haan K_ing

外连接

左外连接与右外连接本质上是相似的

都是遍历主表的所有内容还有从表相交集的地方

left join 说明是左边的为主表

right join 说明是右边的为主表

左外连接:除了返回两表中满足连接条件的元组外,还返回左侧表中的不匹配元组

详细说明:

image-20200701155129356

例5 查询哪个部门没有员工

左外连接

1
2
3
4
5
SELECT d.*,e.employee_id 
FROM employees AS e
RIGHT OUTER JOIN departments AS d
ON e.`department_id` = d.`department_id`
WHERE e.`employee_id` IS NULL

例5输出结果

department_id department_name manager_id location_id employee_id
120 Tre 1700
130 Cor 1700
140 Con 1700

交叉连接

迪卡尔乘积,所有的内容一起方法放入了。总行数等于n*m了