其他分享
首页 > 其他分享> > 基础04:多表查询

基础04:多表查询

作者:互联网

多表查询

一、 笛卡尔积(或交叉连接)

-- 查询学生姓名和相关成绩
-- 实际查询得到数据203条
-- 错误的实现方式一:每个学生都与每个成绩匹配了一遍
SELECT
	sname,
	score 
FROM
	j_student,  -- j_student表中数据7条
	j_score;	-- j_score表中数据29条

-- 错误实现方式二:
SELECT
	sname,
	score 
FROM
	j_student
	CROSS JOIN j_score;

image-20220717202630709

-- 正确的实现方式
-- 如果查询语句中出现了多个表都存在的字段,则必须指明此字段所在的表
-- 如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能使用表的原名

SELECT
	j1.sname,
	j2.score 
FROM
	j_student j1,
	j_score j2 
WHERE
	j1.sno = j2.sno;

image-20220717203113006

二、多表查询分类

2.1 等值连接 VS 非等值连接

-- 查询学生预估分数大于实际分数的相关数据
SELECT
	j1.sname,
	j1.pre_score,
	j2.score,
	j2.s_level 
FROM
	j_student j1,
	j_score j2
WHERE
	j1.sno = j2.sno -- 等值连接
	AND j1.pre_score > j2.score;  -- 非等值连接

image-20220717213437948

2.2 自连接 VS 非自连接

-- 查询每位老师教授的课程
-- 当教师信息表(j_teacher)和课程信息表(j_course)本质上是同一张表,只是用取别名的方式虚拟成两张表,来代表不同的意义。

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1,
	j_course j2 
WHERE
	j1.tno = j2.tno;

image-20220717214925303

2.3 内连接 VS 外连接

2.3.1 内连接

-- 内连接格式
-- INNER JOIN...ON,可以省略INNER

SELECT 
	字段1,字段2...
FROM 
    表1
    INNER JOIN 表2 ON 关联条件1
    INNER JOIN 表3 ON 关联条件2
    ...
    WHERE 等其他子句;
-- 内连接查询学生课程和相应成绩
-- INNER JOIN...ON...中的INNER可以省略

SELECT
	j1.sname,
	j3.cname,
	j2.score,
	j2.s_level 
FROM
	j_student j1
	INNER JOIN j_score j2 ON j1.sno = j2.sno
	INNER JOIN j_course j3 ON j3.cno = j2.cno;

image-20220717222326399

2.3.2 外连接

-- 左外连接格式
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;

-- 右外连接格式
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
-- 左外连接 LEFT JOIN...ON
-- 左外连接查询教师负责的课程
-- 由于左表j_teacher共有8个数据,右表j_course共有7个数据。当返回满足左表的数据后,还要返回右表中不满足条件的数据,所以第四行的课程信息数据为NULL。

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	LEFT JOIN j_course j2 ON j1.tno = j2.tno;

image-20220717224347707

-- 右外连接	RIGHT JOIN...ON
-- 右外连接查询教师负责的课程
-- 由于左表j_teacher共有8个数据,右表j_course共有7个数据。最终结果集返回满足右表的数据。

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	RIGHT JOIN j_course j2 ON j1.tno = j2.tno;

image-20220717224425870

三、 UNION的使用

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

image-20220720203804834

​ UNION 操作符返回两个查询的结果集的并集,去除重复记录。

四、7种SQL JOINS的实现

image-20220720205645220

4.1 内连接

-- 内连接查询学生课程和相应成绩
SELECT
	j1.sname,
	j3.cname,
	j2.score,
	j2.s_level 
FROM
	j_student j1
	INNER JOIN j_score j2 ON j1.sno = j2.sno
	INNER JOIN j_course j3 ON j3.cno = j2.cno;

image-20220717222326399

4.2 左外连接

-- 左外连接 LEFT JOIN...ON
-- 左外连接查询教师负责的课程
-- 由于左表j_teacher共有8个数据,右表j_course共有7个数据。当返回满足左表的数据后,还要返回右表中不满足条件的数据,所以第四行的课程信息数据为NULL。

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	LEFT JOIN j_course j2 ON j1.tno = j2.tno;

image-20220717224347707

4.3 右外连接

-- 右外连接	RIGHT JOIN...ON
-- 右外连接查询教师负责的课程
-- 由于左表j_teacher共有8个数据,右表j_course共有7个数据。最终结果集返回满足右表的数据。

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	RIGHT JOIN j_course j2 ON j1.tno = j2.tno;

image-20220720212324348

4.4 A - A∩B

-- 查询没有课程的教师
SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	LEFT JOIN j_course j2 ON j1.tno = j2.tno 
WHERE
	j2.tno IS NULL;

image-20220720211700976

4.5 B-A∩B

-- 查询没有任课教师的课程	
SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	RIGHT JOIN j_course j2 ON j1.tno = j2.tno 
WHERE
	J1.tno IS NULL;

image-20220720212420217

4.6 满外连接 AUB

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	LEFT JOIN j_course j2 ON j1.tno = j2.tno 
	
	UNION ALL
	
SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	RIGHT JOIN j_course j2 ON j1.tno = j2.tno 
WHERE
	J1.tno IS NULL;

image-20220720213512371

​ 2. 第②张图+第⑥张图

SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	RIGHT JOIN j_course j2 ON j1.tno = j2.tno 
	
	UNION ALL
	
SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	LEFT JOIN j_course j2 ON j1.tno = j2.tno 
WHERE
	j2.tno IS NULL;

image-20220720213411503

4.7 A ∪B- A∩B

-- 查询所有没有课程的教师和没有教师的课程
SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	LEFT JOIN j_course j2 ON j1.tno = j2.tno 
WHERE
	j2.tno IS NULL
	
	UNION ALL
	
	SELECT
	j1.tno,
	j1.tname,
	j2.cname 
FROM
	j_teacher j1
	RIGHT JOIN j_course j2 ON j1.tno = j2.tno 
WHERE
	J1.tno IS NULL;

image-20220720214450710

五、 SQL99语法新特性

5.1 自然连接

SELECT
	employee_id,
	last_name,
	department_name 
FROM
	employees e
	JOIN departments d ON e.`department_id` = d.`department_id` 
	AND e.`manager_id` = d.`manager_id`;

SELECT
	employee_id,
	last_name,
	department_name 
FROM
	employees e
	NATURAL JOIN departments d;

5.2 USING连接

-- USING连接查询学生课程和相应成绩
SELECT
	j1.sname,
	j3.cname,
	j2.score,
	j2.s_level 
FROM
	j_student j1
	INNER JOIN j_score j2 USING (sno)
	INNER JOIN j_course j3 USING (cno);

image-20220720223251626

六、章末小结

标签:多表,04,--,j1,j2,查询,JOIN,tno,连接
来源: https://www.cnblogs.com/wl-666/p/16513537.html