100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > MYSQL的sql笔记之多表联查

MYSQL的sql笔记之多表联查

时间:2020-06-25 19:07:24

相关推荐

MYSQL的sql笔记之多表联查

多表联查

在关系型数据库中,表与表之间是联系的,至于是怎么联系的,我们在开发设计表的时候一般会使用物理外键将多张表进行关联。所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。

主要的查询方式

交叉连接内连接外连接子查询

我首先准备三张表,方便我们下面举例用

学生表

班级表

老师表

那这三张表的关系是 学生对应的是班级,班级对应老师,每个老师都负责各自的班级。

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字句中当虚拟表

下面是一个关于子查询写得比较详细得一篇文章,可以借鉴看看

子查询详解

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。