MySQL-Chapter2多表查询

在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。
在 MySQL 中,多表查询主要有交叉连接、内连接和外连接。在进行介绍之前,首先引入一个概念,笛卡尔积。

笛卡尔积

笛卡尔积(Cartesian product)是指两个集合 X 和 Y 的乘积,如果是多个,那么就是多个集合的乘积
例如在表t1中有x条数据,在表t2中有y条数据,那么进行多表查询的时候就会有x * y条数据。注意的是两个的顺序不同,那么最终查出来的表是不同的,即使数据的数量、内容一样,但是数据的顺序是不一样的。如下面的例子:
MySQL-Chapter2多表查询
在实际应用中,应避免使用笛卡尔积,因为笛卡尔积中容易存在大量的不合理数据,简单来说就是容易导致查询结果重复、混乱

交叉查询

交叉查询语法格式:select 想要查询的字段 from 表1 cross join 表2 [where/on 条件语句];

sql中的连接查询分为3种, cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,得到的结果是一样的,极端一点,在编写这两种连接查询的时候(即交叉连接/内连接),只用on不使用where也没有什么问题。因此,on筛选和where筛选的差别只是针对outer join,也就是平时最常使用的left join和right join

注意用中括号括起来的on/where 条件语句可以省略,如果两个表之间没有任何的关系,那么不用写on 条件语句,那么得到的表数量是两个表的数量的乘积,比如上面的例子就是这种情况如果两个表是关联的,即含有外键的约束,那么这时候没有on 条件语句,就会造成大量的不合理数据,从而造成查询结果重复,因此这时候需要用到on 条件语句。例如:
MySQL-Chapter2多表查询
有时候为了书写方便,还需要给表取别名,即直接在表的后面空一格,然后再写别名
MySQL-Chapter2多表查询
但是这里按照这样的形式有几个坑需要避免的:
1)在最后一个要查询的字段不需要用写逗号了,否则会发生错误;
MySQL-Chapter2多表查询
2)在表的后面不要写逗号,否则还是会发生错误的:
MySQL-Chapter2多表查询
如果查询的表数量大于等于3个,那么需要在from后面连续使用cross join,即
select 查询的字段 from 表1 cross join 表2 cross join 表3 cross join 表4… [on 条件语句];

内连接

内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。

内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换

语法格式:
select 想要查询的字段 from 表1 [inner] join 表2 [on 条件语句];
MySQL-Chapter2多表查询
内连接表示的是两个表之间相互对应的数据

用中括号括起来的的部分可以省略,如果省略了on 条件语句,此时就会和在讲解笛卡尔积的情况一样。如果是两个相关联的表,那么这时候没有on 条件语句,就会造成大量的不合理数据,从而造成查询结果重复,因此这时候需要用到on 条件语句。因此相互关联约束的表,用on 条件语句减少重复/错误的数据。如:
MySQL-Chapter2多表查询
如果查询的表数量大于等于3个,那么在from的后面连续写[inner] join,即:
select 查询的字段 from 表1 [inner join] 表2 [inner join] 表3 …[on 条件语句];

外连接

语法格式:
左外连接:select 想要查询的字段 from 表1 left [outer] join 表2 on 条件语句
右外连接:select 想要查询的字段 from 表1 right [outer] join 表2 on 条件语句

需要注意的是这里的on 语句是不可以省略的,否则就会发生报错
那么问题来了,左外连接和右外连接有什么不同吗?就是单单语法格式上的left/right有什么作用?
left join(左外连接) 返回包括左表中的所有记录和右表中联结字段相等的记录,下面的交集就是两个表之间相对应的数据,另一部分就是左表中没有和右表对应的数据
MySQL-Chapter2多表查询
如下面的代码:
MySQL-Chapter2多表查询

right join(右外联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,下面的交集就是两个表之间相对应的数据,另一部分就是右表中没有和左表对应的数据
MySQL-Chapter2多表查询
MySQL-Chapter2多表查询

子查询

子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。子查询语句可以嵌套在 SQL 语句中任何表达式出现的位置在 SELECT 语句中,子查询可以被嵌套在 SELECT 语句的列、表和查询条件中,即 SELECT 子句,FROM 子句、WHERE 子句、GROUP BY 子句和 HAVING 子句。在实际开发时,子查询经常出现在 WHERE 子句(作为查询条件)中。
例如:
测试类为department2,employee2:
MySQL-Chapter2多表查询
要求1:获得高于平均薪资的员工信息及其所属部门信息:
MySQL-Chapter2多表查询
从上面的例子可以知道当子查询放在from的后面时,充当一个临时表,这时候必须要给这个临时表起别名,否则会报错
要求2:获得高于平均薪资的员工信息:
MySQL-Chapter2多表查询
从上面的例子中可以知道子查询可以放在where后面,充当条件的判断,这时候需要考虑下运算符的运用了:
1)单行子查询是指子查询的返回结果只有一行数据。运算符可以用=, >, <, >=, <=, <>来进行比较。如上面的例子就是单行子查询。
MySQL-Chapter2多表查询
2)多行子查询即是
子查询的返回结果是多行数据
。此时不再使用=, >, <, >=, <=, <>了,而是使用in,not in等运算符。例如:
MySQL-Chapter2多表查询
如果有说的不好的地方或者有遗漏的,请大家指正哈