Mysql连接查询

62b74565ef3385cebc6bc30a77a02908

1 分类
1.1 内连接(笛卡尔乘积)

INNER JOIN,INNER可以省略

a 等值连接

1
SELECT u.username, p.name, n.money FROM s_user u, s_project p, s_invest n WHERE p.id = n.projectID AND u.id=n.uid;

以上是SQL92语法,要会但要舍弃。

内连接之等值连接(SQL99)

1
SELECT u.username, p.name, n.money FROM s_user u JOIN s_invest n ON u.id = n.uid JOIN s_project p ON p.id = n.projectID;

b 非等值连接

1
2
3
4
5
6
7
SELECT e.name, e.sal, s.grade
FROM
emp e
JOIN
salgrade s
ON
e.sal BETWEEN s.losal AND s.hisal

c 自连接(1张表看成是2张表)

表结构及演示数据

image-20210427094146331

1
2
3
4
5
6
7
SELECT a.name AS '层级', b.name AS '父层级'
FROM
t_tree a
JOIN
t_tree b
ON
a.upperid = b.id;

查询结果(数据会丢失)

image-20210427094214859

1.2 外连接

LEFT OUTER、RIGHT OUTER,OUTER可以省略

内连接、外连接的区别

内连接:假设A和B进行连接,使用内连接,A、B没有主副之分,凡能匹配的记录都能查询出来。

外连接:A、B中有一张是主表,一张是副表,主要查询主表数据,捎带查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null数据与之匹配。

a 左(外)连接:表示左边的表是主表。左连接有右连接的写法。

b 右(外)连接:表示右边的表是主表。右连接有左连接的写法。

示例:自连接的数据

1
2
3
4
5
6
7
SELECT a.name AS '层级', b.name AS '父层级'
FROM
t_tree a
LEFT JOIN
t_tree b
ON
a.upperid = b.id;

查询结果

image-20210427100004345

改写成如下右连接,可得相同结果

1
2
3
4
5
6
7
SELECT a.name AS '层级', b.name AS '父层级'
FROM
t_tree b
RIGHT JOIN
t_tree a
ON
a.upperid = b.id;

开发中,外连接是常用方式。主表的数据无条件的全部查询出来。

嵌套使用例子

image-20210427110035438

案例:将投资表中,投资额单位为万的数值*10000写回投资表

1
2
3
4
5
6
7
8
UPDATE 
s_invest a
JOIN (
SELECT b.id, b.money AS mm
FROM s_invest b
WHERE b.money < 200) AS t
ON a.id = t.id
SET a.money = mm*10000;