ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多表连接查询

2022-09-12 19:32:29  阅读:227  来源: 互联网

标签:join -- 数据库 查询 student sc 多表 连接


多表连接查询

一、交叉连接

在现实生活中的查询往往需要查找多个表中的数据,要求所查询的数据表存在联系,这就涉及到多表查询了。

1、交叉连接

交叉连接的基本格式:
select <[数据库1.]表1.属性1>
[,[数据库2.]表2.属性2,…,[数据库n.]表n.属性n]
from <[数据库1.]表1>
[,[数据库2.]表2,…,[数据库n.]表n];

这里有涉及到一个笛卡尔积的概念,也就是多个表中所有数据都相互匹配一次

2、交叉连接的条件筛选

简单的多表查询不符合我们的要求,需要在其基础上添加相应的条件才能准确的查询出我们想要的数据。
基本格式:
select <[数据库1.]表1.属性1>
[,[数据库2.]表2.属性2,…,[数据库n.]表n.属性n]
from <[数据库1.]表1>
[,[数据库2.]表2,…,[数据库n.]表n];
where <条件表达式>;

交叉连接先产生笛卡尔积,再根据条件表达式筛选出相应的记录

-- 1、不带条件的交叉连接
SELECT student.Sname,student.Sno,sc.Cno
	FROM student,sc;

-- 2、迪卡尔积
-- 连接查询的多个表格所有数据相互匹配一次,
-- 交叉连接会产生一个笛卡尔积
SELECT student.*,sc.*
	FROM student,sc;
-- 迪卡尔积是非常影响查询性能,会降低查询效率


-- 3、带条件的交叉连接
SELECT course.*,sc.* FROM course,sc
WHERE course.cno = sc.cno;  -- 等值连接 外键值 = 主键值
-- 带条件的交叉连接从迪卡尔积中筛选出满足条件的数据

两个表生成的迪卡尔积:

二、内连接

1、内连接

内连接先判断连接条件,根据表中匹配的字段,列出与连接条件匹配的数据,也就是说只有相匹配的结果才能查询出来。

内连接的关键字:inner join

内连接的基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 inner join [数据库2.]表2 on 条件表达式1
inner join … inner join [数据库n.]表n on 条件表达式n;

交叉连接与内连接的区别在于:

交叉连接是先把所有情况都连接起来,再从中查询出满足条件的数据,也就是先产生笛卡尔积,然后判断条件筛选数据。

内连接是先筛选出满足条件的数据,再讲筛选出的数据进行连接,避免产生笛卡尔积。

所以内连接比交叉连接的查询性能要好。

-- 1、带条件的内连接
SELECT course.*,sc.* FROM course INNER JOIN sc
ON course.cno = sc.cno;
-- 相同条件下,内连接和交叉连接查询的效果一致

-- 2、 不带条件的内连接
SELECT course.*,sc.* FROM course INNER JOIN sc;
-- 不带条件下,内连接和交叉连接查询的效果一致

-- 3、内连接和交叉连接的区别
/*
交叉连接:交叉连接是先产出笛卡尔积,然后再从迪卡尔积里面筛选出满足条件的数据

内连接:内连接不会产生笛卡尔积,不会把多个表格的所有数据相互匹配一次
        内连接是先筛选出满足条件的数据,再讲筛选出的数据进行连接,避免产生笛卡尔积。

内连接的查询效率比交叉连接要快
*/

三、外连接

外连接是对内连接进行筛选,又分为左外连接(左连接)、右外连接(右连接)和全外连接(全连接)。

1、左外连接(简称左连接)

以左表为基准,显示左表查询 字段的所有记录,右表只显示与左表匹配的记录,没有匹配的用null代替。
左连接关键字:left join
左连接基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 left join [数据库2.]表2 on 条件表达式1
left join … left join [数据库n.]表n on 条件表达式n;

-- 外连接是对内连接查询结构的补全(查询结果完全展示)
-- 外连接和内连接的区别为:外连接会显示没有关联的数据

-- 1、左外连接 left jion(左连接)
-- 左连接以左表为基准,连接显示左表所有数据,右表只显示与左表匹配的记录,没有匹配的用null代替。
SELECT student.sno,student.sname,sc.grade  FROM student LEFT JOIN sc
ON student.sno = sc.sno;

-- 内连接
SELECT student.sno,student.sname,sc.grade 
FROM student INNER JOIN sc
ON student.sno = sc.sno;
2、右外连接(简称右连接)

与左连接相反,是以右表为基准,显示右表查询字段的所有记录,左表只显示和右表匹配的记录,没有匹配的用NULL代替。
右连接关键字:right join
右连接的基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 right join [数据库2.]表2 on 条件表达式1
right join … right join [数据库n.]表n on 条件表达式n;

举一反三:左右连接可以相互转换吗?

答:可以的,只要把两个表的顺序倒过来就可以了,没有特别限制。外连接的左右表没有严格的限制左右连接可以相互转换。

-- 与左连接相反,是以右表为基准,显示右表查询字段的所有记录,左表只显示和右表匹配的记录,没有匹配的用NULL代替。
SELECT student.sno,student.sname,sc.grade  FROM student RIGHT JOIN sc
ON student.sno = sc.sno;

-- 左右表位置互换,就可以实现左右连接的互换。
3、全外连接(简称全连接)

全连接的左右表不做限制,显示全部数据,没有匹配的数据用NULL代替。
全连接关键字:full join
全连接的基本格式:
select [数据库1.]表1.属性1,
[数据库2.]表2.属性2,…,[数据库n.]表n.属性n
from [数据库1.]表1 full join [数据库2.]表2 on 条件表达式1
full join … full join [数据库n.]表n on 条件表达式n;

注意:mysql不支持全外连接

4、利用左连接和右连接实现全连接

基本格式:
select [数据库1.]表1.属性1,[数据库2.]表2.属性2,…,
[数据库n.]表n.属性n
from [数据库1.]表1 right join [数据库2.]表2 on 条件表达式1
right join … right join [数据库n.]表n on 条件表达式n
union
select [数据库1.]表1.属性1,[数据库2.]表2.属性2,…,
[数据库n.]表n.属性n
from [数据库1.]表1 left join [数据库2.]表2 on 条件表达式1
left join … left join [数据库n.]表n on 条件表达式n;

这里使用union连接两个查询语句来实现全连接。

-- 使用左连接+右连接实现全连接
SELECT student.sno,student.sname,sc.grade  FROM student LEFT JOIN sc
ON student.sno = sc.sno
UNION
SELECT student.sno,student.sname,sc.grade  FROM student RIGHT JOIN sc
ON student.sno = sc.sno;

-- 查询结果集的合并:union(去重)/union all(不去重)
-- 也可以使用左连接+左连接实现全连接
-- 也可以使用右连接+右连接实现全连接

四、多表连接查询

DQL不仅可以连接查询2个表,也可以连接查询多个表中的数据(一般最好不要超过4个表)。如果有4个以上的连接表的查询,那就是数据库设计有问题。

格式1:

select 表1.属性1,表2.属性2[,…,表n.属性n]
from 表1 连接(inner/left/right join) 表2 on 连接条件1
连接(inner/left/right join) 表3 on 连接条件2
…… 连接(inner/left/right join) 表n on 连接条件n;
(连接两个表之后写上连接条件,再连接另一个表)

进行多表连接查询时应注意连接表之间的外键关系和连接条件,只有表中属性相互有关系的表才能进行连接。

格式2:

select 表1.属性1,表2.属性2,…,表n.属性n
from 表1 连接(inner/left/right join) 表2
连接(inner/left/right join) 表3
…… 连接(inner/left/right join) 表n
on 连接条件1 && 连接条件2 && … && 连接条件n;

这是将所有数据表连接完毕后再判断连接条件,这种方式格式比较混乱,不推荐使用

-- 只有存在外键联系的表格连接查询才有意义,否则是无意义操作




给表取别名:

取别名关键字:as

可以在查询时给表取别名,方便使用。

基本格式:表名 [as] 别名。

as可以省略

给表取别名能够缩短连接查询的解析时间,使查询效率更高。

-- 给数据表取别名可以减少解析时间 
-- 别名的使用(as可以省略)
SELECT S.sno AS 学号,S.sname AS 学生姓名,b.cno AS 课程号,C.cname AS 课程名
FROM studnet AS S LEFT JOIN sc AS b ON S.sno=b.sno
LEFT JOIN course AS C ON b.cno=C.cno;

标签:join,--,数据库,查询,student,sc,多表,连接
来源: https://www.cnblogs.com/Mr-black-7/p/16687048.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有