MySQL进阶_查询(联合查询)

举报
bug郭 发表于 2022/08/11 09:53:54 2022/08/11
【摘要】 联合查询实际上我们的数据库,查询数据时,如果有多张表的数据,我们采用多表查询,多表查询通常采用笛卡尔积的方式!啥是笛卡尔积呢???笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1] --来自百度 。通俗点说就是,R表和S表,笛卡尔积后变成了RXS表如果...

联合查询

实际上我们的数据库,查询数据时,如果有多张表的数据,我们采用多表查询,多表查询通常采用笛卡尔积的方式!
啥是笛卡尔积呢???

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1] --来自百度 。
在这里插入图片描述
通俗点说就是,R表和S表,笛卡尔积后变成了RXS表如果R表有n*m S表有x*y,那么RXS就是n*xm*y列!!!

那么笛卡尔积有什么用呢?
当我们需要查询一个学生表对应的班级表时,我们便可以借助笛卡尔积!!!
在这里插入图片描述
但是我们可以看到使用笛卡尔积后,学生表和班级表中的班级id并没有一一对应! 所以当我们使用笛卡尔积查看两张表时需要加一些限制条件!!!
在这里插入图片描述
当我们加了一个限制条件后,where class.id = student.class_id;
我们便可以将两张表的对应关系找出来!~!!!

  • 内连接
    SQL语句
    select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
    select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
    我们可以通过上述语句进行内连接!!!
    使用where限制条件!!!
    在这里插入图片描述查找qq为112的学生!!!
    在这里插入图片描述
    使用join on限制条件!!!
    表1 join 表2 on 条件
    在这里插入图片描述
  • 外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

我们先查看这两张表的内容!!
在这里插入图片描述
当我们使用内连接,左外连接,右外连接时区别如下:
内连接:
在这里插入图片描述
可以看到内连接就是两个表的交集:
在这里插入图片描述

左外连接:
在这里插入图片描述
在这里插入图片描述

右外连接:
在这里插入图片描述
在这里插入图片描述

  • 自连接
    自连接是指同一张表连接自身查询!
    案例:
    显示所有数学成绩比语文成绩高的人的成绩的学生信息!
    如果我们这张表中的每一门成绩都在一列中,那么显然我们只要使用一个where判断一下即可!
    比如:
    在这里插入图片描述
    但是如果每门的成绩并不是在单独的一列中,那该如何查询呢?
    这时就需要用到自连接了!!!
    就比如下方我们有三张表 分别为成绩表和学生表和课程表!
    如果我们要查询java程序设计成绩比数据库原理成绩高的学生信息该如何操作呢?
    在这里插入图片描述自连接就是将行改成列!!!
    将一直表起多个别名,就得到多张表!!!
    通过笛卡尔积,我们就可以将这两张表中的行变成列!
    我们先对成绩表进行笛卡尔积!!!

一开始的成绩表:

在这里插入图片描述
可以看到学生id为1的学生的课程成绩都在一列中!!
而我们要将不同科目的成绩放在不同的列才能进行比较!!!
进行笛卡尔积后的成绩表:
在这里插入图片描述选择课程java程序设计数据库原理的课程id!!!

在这里插入图片描述
我们将两门课的成绩分别放在了一个列中了!!!

我们再进行限定就可以找到满足条件的学生信息

在这里插入图片描述最后查询java程序设计数据库原理的课程成绩高的学生信息!!!

在这里插入图片描述
步骤有点繁琐!!!
原理就是将行转化成列!
将一张表期别名利用笛卡尔积转化!!!

  • 子查询
    子查询简单讲就是,多个sql查询语句的嵌套!!!
    就是套娃!!!
    不建议的操作! 反人类!
    代码可读性差
    了解一下即可!

如果我们要查询java程序设计的成绩!!
我们第一步要获取到这个课程的id
在这里插入图片描述
然后通过这个课程id在成绩表中寻找即可!!!
在这里插入图片描述
子查询就一步即可!!!
在这里插入图片描述
显然这玩意除了能装外没啥用!!!

  • 合并查询
    在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 unionunion all。使用unionunion all时,前后查询的结果集中,字段需要一致!

我们就是可以用unionunion all在相同表或者不同表中合并多个select 相当于 单表查询中的or

union

查询刘备和曹操的成绩信息:
or

在这里插入图片描述
union

在这里插入图片描述
unionunion all可以合并多个sql语句! 可以在不同的表中进行查询!!!

union all

union allunion唯一的区别就是 union all不会去掉结果集中的重复行! 而union会进行去重!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。