其他分享
首页 > 其他分享> > 多表连接查询

多表连接查询

作者:互联网

多表连接查询

一、交叉连接

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

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