多表查询
1. 交叉连接查询
select * from 表1,表2;
左表的每条数据和右表的每条数据组合,会产生2张表的乘积数据,简称笛卡尔积现象。
2. 内连接查询
作用:可以使用内连接去查询多张表之间有关系的数据。
- 隐式内连接:
语法格式:select * from 表1,表2 where 关联条件 and 筛选条件;
ps:可以使用表别名简化书写 - 显示内连接:
语法格式:select * from 表1 [inner] join 表2 on 关联条件 where 筛选条件 and 筛选条件 ;
两个表以上:
语法格式:select * from 表1 [inner] join 表2 [inner] join 表3 on 表1表2关联条件 and 表1表3关联条件;
on: 后跟的是关联条件
where: 后跟的是对结果的筛选条件
3. 外连接查询
-
左外连接: 以join 左边的表为主,用左边表的记录去匹配右边表的记录,如果符合条件的则显示;如果右表中没有满足条件的对应数据,则填充null。
语法格式:select * from 表1 left [outer] join 表2 on 关联条件 where 筛选条件; -
右外连接: 以join 右边的表为主,用右边表的记录去匹配左边表的记录,如果符合条件的则显示;如果左表中没有满足条件的对应数据,则填充null。
语法格式:select * from 表1 right [outer] join 表2 on 关联条件 where 筛选条件;
两个表以上:
语法格式:select * from 表1 right [outer] join 表2 on 关联条件 right [outer] join 表3 on 关联条件;
总结:外连接就是在内连接的基础上保证左表或右表的所有数据全部展示。
4. 子查询
-
用处1:一条sql执行的结果是另一条sql的条件,适用于单列单值或者单列多值。
单列单值: select 查询字段 from 表 where 字段 =(子查询);
单列多值: select 查询字段 from 表 where 字段 =(子查询); -
用处2:一条sql执行的结果作为一张表存在,适用于多列多值。
多列多值: select 查询字段 from (子查询) 表别名 where 条件 ;
5. 多表查询的规律
-
不管我们查询几张表,表连接查询会产出笛卡尔积,我们需要消除笛卡尔积,拿到正确的数据。我们需要找到表与表之间通过哪个字段关联起来的(通常是外键=主键)。
-
消除笛卡尔积规律:2张表至少需要1个条件,3张表至少需要2个条件,4张表至少需要3个条件。(条件数量 = 表的数量-1),每张表都要参与进来。
-
多表连接查询步骤:
确定要查询哪些表
确定表连接条件
确定查询字段