MySQL进阶_查询(联合查询)
联合查询
实际上我们的数据库,查询数据时,如果有多张表的数据,我们采用多表查询,多表查询通常采用笛卡尔积的方式!
啥是笛卡尔积呢???
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1] --来自百度 。
通俗点说就是,R
表和S
表,笛卡尔积后变成了RXS
表如果R
表有n*m
S
表有x*y
,那么RXS
就是n*x
行m*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
的执行结果,可以使用集合操作符union
,union all
。使用union
和union all
时,前后查询的结果集中,字段需要一致!
我们就是可以用union
和 union all
在相同表或者不同表中合并多个select
相当于 单表查询中的or
union
查询刘备和曹操的成绩信息:
or
union
union
和union all
可以合并多个sql
语句! 可以在不同的表中进行查询!!!
union all
union all
和union
唯一的区别就是 union all
不会去掉结果集中的重复行! 而union
会进行去重!
- 点赞
- 收藏
- 关注作者
评论(0)