SQL之多表联查
语法
同时从多张表查询数据,一般来说多张表之间都会存在某种关系
SELECT 列名 别名,列名2 别名2 ...
FROM 表名 别名,表名2 别名2 ...
WHERE 条件
ORDER BY 排序 ACS | DESC, 排序2 ACS | DESC;
原始数据
SELECT * FROM user; --- user表
SELECT * FROM msg; --- msg表
笛卡尔积
从下例中可以看出数据虽然出来了,但是并不是我们想要结果。
SELECT * FROM user, msg ---错误的
等值连接
找出两张表之间相互关联的字段,此时正是我们需要的数据。
SELECT * FROM user u, msg m WHERE u.number = m.number;
自身连接
如果想要将一张表分表查询可以使用自身连接
SELECT * from user u, user r WHERE u.name = r.name
非等值链接
SELECT * FROM user u, msg m WHERE u.number IN(m.number)
内连接
语法
SELECT 列名 别名,列名2 别名2 ...
FROM 表名 别名,INNER JOIN 表名2 别名2 ON(多表之间的关系) ...
WHERE 条件
ORDER BY 排序 ACS | DESC, 排序2 ACS | DESC;
例:与等值连接查询结果相同,只是语法不同,等值连接使用 WHERE
内连接则使用 INNER JOIN ON
SELECT * FROM user u INNER JOIN msg m ON u.number = m.number;
外连接
我们给msg
表增加一条数据,其中number
的为null
值
如果number
为null
时会发现地址3的数据没有展示出来。此时我们需要外连接进行更加准确的查询。
SELECT * FROM user u INNER JOIN msg m ON u.number = m.number; --- 有问题
SELECT * FROM user u, msg m WHERE u.number = m.number; --- 有问题
右外连接
RIGHT OUTER JOIN
表名 ON,也被称为右连接,以右边的表为主表,无论如何都会显示主表中的数据。(OUTER 也可以省略不写)
SELECT * FROM user u RIGHT OUTER JOIN msg m ON u.number = m.number;
SELECT * FROM user u RIGHT JOIN msg m ON u.number = m.number;
左外连接
LEFT OUTER JOIN
表名 ON,也被称为左连接,以左边的表为主表,无论如何都会显示主表中的数据。(OUTER 也可以省略不写)
SELECT * FROM user u LEFT OUTER JOIN msg m ON u.number = m.number;
SELECT * FROM user u LEFT JOIN msg m ON u.number = m.number;