多表查询
多表查询会产生笛卡尔积现象
笛卡尔积:
把多张表放在一起,同时去查询,会得到一个结果(左表的每条记录和右表的每条记录会组合起来),而这结果并不是我们想要的数据,这个结果称为笛卡尔积。
内,外连接可以消除笛卡尔积
多表查询分类:
- 表连接查询
- 子查询
表连接查询又分为内连接和外连接
下面详细介绍一下这几种查询方式~
表连接查询
内连接:
内连接查询的结果是两表的公共部分
- 隐式内连接 :没有
JOIN
关键字,条件使用WHERE
SELECT 列名,列名..FROM 表1,表2 WHERE 从表.外键=主表.主键;
- 显示内连接:使用
INNER JOIN ... ON
语句, 可以省略INNER
SELECT 列名,列名..FROM 表1 INNER JOIN 表2 ON 从表.外键=主表.主键;
外连接:
- 左外连接: 以左侧的表为主,如果左侧有数据,右侧没有对应的数据,仍然会把左侧数据进行显示。
SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 从表.外键=主表.主键;
-- 表1看作为左表,表2看做为右表
- 右外连接:用右边表去左边表查询对应记录,不管是否找到,右边表全部记录都将显示。
SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 从表.外键=主表.主键;
-- 表1为左表,表2为右表
OUTER
可以省略
左外连接交换两表位置,就是右外连接
子查询
一条查询语句作为另一条查询语句的一部分
子查询的三种情况:
- 子查询的结果是单行单列,通常作为父查询的的条件
SELECT 字段名 FROM 表名 WHERE 字段=(子查询);
- 子查询的结果是多行单列,结果集类似数组,在
WHERE
后面作为条件,使用IN
关键字
SELECT 字段名 FROM 表名 WHERE 字段 IN (子查询);
IN
用法:IN(值1,值2,…) 只要满足一个即可,或者的关系
- 子查询的结果是多行多列,在
FROM
后面作为表,
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
注意:子查询作为表需要取别名,使用as,可以省略。否则无法访问这个表中的字段