mySql多表高级查询总结

mySql多表查询总结 (需要有一定的sql基础)

  1. 简单的多表查询
    1.1. 多表查询语法
select  字段1,字段2... from 表1,表2... [where 条件]

例子: 查询人员和部门所有信息
select * from person, dept where person.did = dept.did;

  1. 多表链接查询
    2.1. 多表连接查询语法(重点)
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;
  1. mysql 部分内置函数
    MAX(),MIN()
    查询每个部门中最高工资和最低工资是多少,显示部门名称
select MAX(salary),MIN(salary),dept.dname from 
        person LEFT JOIN dept
            ON person.did = dept.did
 GROUP BY person.did;
  1. 子查询(嵌套查询): 查多次, 多个select

注意: 第一次的查询结果可以作为第二次的查询的 条件 或者 表名 使用.

子查询中可以包含: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
);

5. 关键字

all, any, some

例如

select * from person p where p.id > any (select id from department);

any() 括号中必须是查询语句。

EXISTS

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
  1. 判断查询
    判断查询就是mysql 里的if关键字
    例如:
    根据工资高低,将人员划分为两个级别,分别为 高收入人群和低收入人群。显示效果:姓名,年龄,性别,工资,级别
    select *,if(p.salary > 20, ‘高收入人群’, ‘低收入人群’) as ‘级别’ from person p;
    语法: IF(条件表达式,“结果为true”,‘结果为false’);
    在这里插入图片描述
    根据工资高低,统计每个部门人员收入情况,划分为 高高薪,高薪’,中薪,低薪 四个级别, 要求统计四个级别分别有多少人
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

case when

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
中间加了一些自己的总结和心得以及自己的实例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章