多表查询分为以下三种方式:
- 合并结果集
- 连接查询
- 子查询
合并结果集:
·要求被合并的表(结果集)中,列的类型和列数相同
·UNION,去除重复行
·UNION ALL,不去除重复行
实例:
SELECT * FROM 表1
UNION ALL
SELECT *FROM 表2;
连接查询:
-
分类
·内连接
·外连接
----左外连接
----右外连接
----全外连接(mysql不支持)
·自然连接(属于一种简化方式) -
内连接
·方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx;
(就当前数据库管理系统支持)
·标准:SELECT * FROM 表1 别名1,INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
自然:SELECT * FROM 表1 别名1,NATURAL JOIN 表2 ;
(就是不用加ON,就是自动帮你找条件)
-
外连接
·左外连接:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
----左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来,左表中不满足条件的记录,右表部分都为NULL
·左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
·右外连接:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
----右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来,右表中不满足条件的记录,左表部分都为NULL
·右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx;
·全连接(只要将LEFT或者RIGHT 改成FULL即可,但是MYSQL 不支持。使用UNION,就直接使用UNION 将左右外连接合并结果集。) -
子查询:即查询中有查询(有多个SELECT的情况)
1)出现的位置:
·WHERE后作为条件存在
·FROM 后作为表存在
2)条件
·单行单列:SELECT * FROM 表1 别名1 WHERE 列1 【=、>、<、>=、<=、!=】(SELECT 列 FROM 表2 别名2 WHERE 条件)
·多行单列:SELECT * FROM 表1 别名1 WHERE 列1 【IN ALL ANY】(SELECT 列 FROM 表2 别名2 WHERE 条件)
·单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
多行多列:SELECT * FROM 表1 别名1 (SELECT 列 FROM 表2 别名2 WHERE 条件) WHERE 条件;