tonglin0325的个人主页

MySQL学习笔记——多表连接和子查询

多表连接查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 返回的是两张表的乘积
SELECT * FROM tb_emp,tb_dept
SELECT COUNT(*) FROM tb_emp,tb_dept

# 标准写法,每个数据库都能这么写
SELECT * FROM tb_emp CROSS JOIN tb_dept

# 内连接 只列出这些连接表中与连接条件相匹配的数据行
SELECT * FROM tb_emp e,tb_dept d WHERE e.NAME = d.NAME

SELECT * FROM tb_emp INNER JOIN tb_dept
ON tb_emp.NAME = tb_dept.NAME

# 外链接 不仅列出与连接条件相匹配的行,还列出左表(左外连接),右表(右外连接)或两个表(全外连接)中所有符合where过滤条件的数据行
# 左外连接 在外连接中,某些不满足条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行
# 左边的表作为主表,左边的表会全部显示
SELECT * FROM tb_emp LEFT JOIN tb_dept
ON tb_emp.NAME = tb_dept.NAME

#oracle语法,左连接加号在左边
SELECT * FROM tb_emp e,tb_dept d WHERE e.NAME=d.NAME(+)

#右外连接
SELECT * FROM tb_emp RIGHT JOIN tb_dept
ON tb_emp.NAME = tb_dept.NAME

#全外连接 MySQL不支持 OUTER

#自连接
SELECT c.NAME '部门名字',c2.NAME '其他部门'
FROM tb_dept c LEFT JOIN tb_dept c2
ON c.description=c2.id<br /><br /># rollup<br />SELECT orderYear, productLine, SUM(orderValue) totalOrderValue <br />FROM sales <br />GROUP BY orderYear, productline <br />WITH ROLLUP;

参考:https://www.begtut.com/mysql/mysql-rollup.html

 

子查询

 某些情况下,当运行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#子查询
SELECT * FROM tb_emp

#查询年龄是22的人名
SELECT age FROM tb_emp WHERE sex='男'
SELECT * FROM tb_emp WHERE age>23

SELECT *
FROM tb_emp
WHERE age> (
SELECT age
FROM tb_emp
WHERE NAME='Tom'
)

#IN 与列表中的任一成员相等
SELECT *
FROM tb_emp
WHERE age IN (
SELECT age
FROM tb_emp
WHERE sex='男'
)

#ANY 与列表中的每一成员比较,小于最大的
SELECT *
FROM tb_emp
WHERE age < ANY (
SELECT age
FROM tb_emp
WHERE sex='男'
)