多表连接查询
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='男' )
|