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

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

子查询详解

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中进行多表联查,可以使用JOIN关键字来实现。在关系型数据库中,表与表之间可以通过物理外键进行关联。多表查询是指同时查询两个或两个以上的表。 一个常见的多表联查的示例语句如下: SELECT * FROM 表1 JOIN 表2 ON 表1.字段 = 表2.字段 JOIN 表3 ON 表1.字段 = 表3.字段 ... 这里,表1、表2、表3代表需要联查的表,字段代表需要联查的字段。 如果想要去除笛卡尔积的情况,可以通过添加连接条件来实现。比如,查询学生表中成绩大于90分的学生和对应班级信息的示例语句如下: SELECT * FROM student INNER JOIN class ON student.score > 90 AND student.cid = class.id 这里,student和class分别是学生表和班级表的表名,score和cid分别是学生表和班级表中的字段名。 此外,还可以使用等值连接来进行多表联查。等值连接是通过等号(=)操作符来实现的。比如,查询班级ID为1的学生和对应班级信息的示例语句如下: SELECT * FROM student INNER JOIN class ON student.cid = class.id WHERE class.id = 1 这里,student和class分别是学生表和班级表的表名,cid和id分别是学生表和班级表中的字段名。 通过以上方法,可以在MySQL中进行多表联查SQL操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MYSQLsql笔记多表联查](https://blog.csdn.net/weixin_56227932/article/details/123616968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值