多表联查
在关系型数据库中,表与表之间是联系的,至于是怎么联系的,我们在开发设计表的时候一般会使用物理外键将多张表进行关联。所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。
主要的查询方式
- 交叉连接
- 内连接
- 外连接
- 子查询
我首先准备三张表,方便我们下面举例用
学生表
班级表
老师表
那这三张表的关系是 学生对应的是班级,班级对应老师,每个老师都负责各自的班级。
1.交叉连接
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
SELECT * from student CROSS JOIN calss
# CROSS JOIN 可以省略
SELECT * from student , calss
我们发现当我们使用交叉连接的时候,左表的每一条数据都和右表三条要匹配了一次,产生的数据也称笛卡尔积。相当于左表与右表结合。
笛卡尔乘积:
产生原因:没有加连接条件,导致结果为 表1的行数 * 表2的行
2.内连接
内连接分为三种
- 等值连接
- 自然连接
- 不等连接
1.等值连接:
在连接中使用等号(=)操作就是等值连接。
SELECT * from student INNER JOIN calss on student.cid = calss.id WHERE calss.id = 1
查询三班的学生
2.自然连接:
(NATURAL JOIN)自然连接是一种特殊的等值连接,他要求两个关系表中进行连接的必须是相同的属性列(名字相同
),无须添加连接条件,并且在结果中消除重复的属性列。
SELECT * from student NATURAL JOIN calss
3.不等值连接:
主要用除了等号之外的操作符,比如:<>、>、<、>=、<=、LIKE、IN、BETWEEN…AND。
查询分数大于90分的学生所在班级
SELECT * from student INNER JOIN calss ON student.score > 90
这里我们发现一个问题,就是他并没有给我们去除笛卡尔积,所以呢我们还需要将sql改造一下,加多个连接条件
SELECT * from student INNER JOIN calss ON student.score > 90 and student.cid = calss.id
3.外连接
外连接分为三种
- 左外连接LEFT JOIN
- 右外连接RIGHT JOIN
- 全外连接FULL OUTER JOIN
1.左外连接:
除了显示符合条件的数据行外,还显示左边数据表不符合条件的数据行,要是右边没有对应的行,就显示NULL
SELECT * from student LEFT JOIN calss ON student.cid = calss.id
上面可以看出左表的数据是全部都显示出来了,右表的只显示符合条件的数据。
2.右外连接:
与左外连接同理,无限满足右表,即根据右表中数据去左表搜索,如果没有匹配数据,填入null。
right outer join,outer可省略)
SELECT * from student RIGHT JOIN calss ON student.cid = calss.id
3.全外连接:
全外连接=左外连接+右外连接,相当于左表的数据和右表的数据都要
MySQL目前不支持此种方式,可以用其他方式替代解决
4.子查询
一般而言在一个查询中,可以嵌套另一个查询,即在一个SELECT查询内在嵌入另一个SELECT查询 ,外层的SELECT语句较外部查询,内层的SELECT语句叫子查询,子查询可以嵌套多层,但每层需要用“()”括起来,子查询可以用在SELECT语句中,还可以用在INSERT,UPDATE,DELETE语句中 .子查询是一个完整的的SELECT语句,是其他SOL语句的一部分,大部分子查询是在SELECT语句的WHERE字句中实现的,也可以放在FROM字句中当虚拟表
下面是一个关于子查询写得比较详细得一篇文章,可以借鉴看看
子查询详解
更多推荐
MYSQL的sql笔记之多表联查
发布评论