mySql多表查询总结 (需要有一定的sql基础)
select 字段1,字段2... from 表1,表2... [where 条件]
例子: 查询人员和部门所有信息
select * from person, dept where person.did = dept.did;
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
2.2. 内连接 - 查询人员和部门所有信息
select * from person inner join dept on person.did = dept.did;
内连接查询与多表联合查询的效果是一样的.
2.3. 左外连接查询 (左边表中的数据优先全部显示)
查询人员和部门所有信息
select * from person left join dept on person.did =dept.did;
效果:人员表中的数据全部都显示,而 部门表中的数据符合条件的才会显示,不符合条件的会以 null 进行填充.
2.4. 右外连接查询 (右边表中的数据优先全部显示)
#查询人员和部门所有信息
select * from person right join dept on person.did =dept.did;
2.5. 全连接查询(显示左右表中全部数据)
全连接查询:是在内连接的基础上增加 左右两边没有显示的数据
注意: mysql并不支持全连接 full JOIN 关键字
注意: 但是mysql 提供了 UNION 关键字.使用 UNION 可以间接实现 full JOIN 功能
查询人员和部门的所有数据
SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
UNION
SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
select MAX(salary),MIN(salary),dept.dname from
person LEFT JOIN dept
ON person.did = dept.did
GROUP BY person.did;
注意: 第一次的查询结果可以作为第二次的查询的 条件 或者 表名 使用.
子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字. 还可以包含比较运算符:= 、 !=、> 、<等.
4.1. 可以把查询到的结果用来当做表名使用
select * from (select * from person) as 表名;
ps:大家需要注意的是: 一条语句中可以有多个这样的子查询,在执行时,最里层括号(sql语句) 具有优先执行权.
注意: as 后面的表名称不能加引号(’’)
4.2.求最大工资那个人的姓名和薪水
select name, salary from person where salary=(select max(salary) from person);
将括号没查询到的结果作为了一个查询的判断条件来使用
4.3. 求工资高于所有人员平均工资的人员
select name, salary from person where salary >(select avg(salary) from person);
4.4. 查询平均年龄在20岁以上的部门名
SELECT * from dept where dept.did in (
select dept_id from person GROUP BY dept_id HAVING avg(person.age) > 20
);
例如
select * from person p where p.id > any (select id from department);
any() 括号中必须是查询语句。
SELECT * FROM person WHERE EXISTS (SELECT * FROM department WHERE id = 1);
该语法可以理解为:主查询(外部查询)会根据子查询验证结果(TRUE 或 FALSE)来决定主查询是否得以执行。
当然,EXISTS关键字可以与其他的查询条件一起使用,条件表达式与EXISTS关键字之间用AND或者OR来连接,如下:
SELECT * FROM person WHERE id > 1 AND NOT EXISTS (SELECT * FROM department WHERE id=1);
EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。
6. 临时表查询
查询高于本部门平均工资的人员
分成两步骤
第一步想查询出本部门的平均工资
select avg(salary), det_id from person group by det_id
第二步骤
将第一步查询出来的结果作为一张临时表来使用
select * from person p, (select avg(salary) as asalary, det_id from person group by det_id) temp where p.det_id = temp.det_id and p.salary > temp.asalary
select d.name '部门',
sum(case when p.salary >20 then 1 else 0 END) as '高高薪',
sum(case when p.salary between 15 and 20 then 1 else 0 END) as '高薪',
sum(case when p.salary between 10 and 14 then 1 else 0 END) as '中薪',
sum(case when p.salary < 10 then 1 else 0 END) as '低薪'
from person p, department d where p.det_id = d.id group by d.id;
注意: between and 中 小的数字要在前面大的数字要在后面
例如 between 1 and 2
而不是 between 2 and 1
SELECT
CASE WHEN STATE = '1' THEN '成功'
WHEN STATE = '2' THEN '失败'
ELSE '其他' END
FROM 表;
#语法二:
SELECT CASE age
WHEN 23 THEN '23岁'
WHEN 27 THEN '27岁'
WHEN 30 THEN '30岁'
ELSE '其他岁' END
FROM person;
引用 https://blog.csdn.net/aaronthon/article/details/81714428
中间加了一些自己的总结和心得以及自己的实例