语法

同时从多张表查询数据,一般来说多张表之间都会存在某种关系

SELECT 列名 别名,列名2 别名2 ...
FROM 表名 别名,表名2 别名2 ...
WHERE 条件
ORDER BY 排序 ACS | DESC, 排序2 ACS | DESC;

原始数据

SELECT * FROM user;   --- user表

zGHR00.png

SELECT * FROM msg;  --- msg表

zGHL0x.png

笛卡尔积

从下例中可以看出数据虽然出来了,但是并不是我们想要结果。

SELECT * FROM user, msg  ---错误的

zGbp1H.png

等值连接

找出两张表之间相互关联的字段,此时正是我们需要的数据。

SELECT * FROM user u, msg m WHERE u.number = m.number;

zGLBtK.png

自身连接

如果想要将一张表分表查询可以使用自身连接

SELECT * from user u, user r WHERE u.name = r.name

zGL5h8.png

非等值链接

SELECT * FROM user u, msg m WHERE u.number IN(m.number)

zGO9c4.png

内连接

语法

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;

zGOUgg.png

外连接

我们给msg表增加一条数据,其中number的为null

zGOg8U.png

如果numbernull时会发现地址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;  --- 有问题

zGOXKH.png

右外连接

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;

zGXFxg.png

左外连接

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;

zGXFxg.png