01 子查询
在某个查询结果之上进行的查询.叫做子查询,即把一个查询(又叫内部查询)嵌套在另一个查询(又叫外部查询)当中。
select … (select)…【使用较少,了解即可】
from …(select)…
where …(select)…
select子表(要在小括号里)可以放到from后面,也可以用在where子句中
啥意思呢,就是先select一些东西,会生成一张临时表,这张临时表可取别名(别名要放在select子表的括号外),再根据这张表来查询,即可能使用到了这张表的字段
例1 比如要查询,语数英三门成绩都及格(大于等于60分)的人
SELECT DISTINCT NAME FROM scores WHERE NAME NOT IN (SELECT NAME FROM scores WHERE score<60);
说明:先查询有一门科目不及格的姓名,不在这些姓名中的就是三门及格的人,再使用distinct去重
例2 如果要查询有一门成绩小于60分的人,可以这样查
SELECT DISTINCT newscore.name FROM (SELECT NAME FROM scores WHERE score<60 ) AS newscore;
-- 或者直接这样写
SELECT DISTINCT NAME FROM scores WHERE score<60;
例3 找出薪水比公司平均薪水高的员工,要求显示员工名和薪水
SELECT employeename,salary FROM employee WHERE salary>(SELECT AVG(salary)FROM employee);
例4 找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级
SELECT
newtab.departmentnumber, newtab.avgsalary,
s.grade
FROM
salarygrade s
JOIN
(SELECT
departmentnumber,
AVG(salary) avgsalary
FROM
employee
GROUP BY departmentnumber) AS newtab
ON newtab.avgsalary BETWEEN s.lowsalary
AND s.highsalary ;
2 union联合查询
UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据.
将查询的结果集合并,合并结果集时查询的字段的个数必须一致
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
对同一张表,查询的字段不同值的排序方式要求不同
例5 查询出job为MANAGER和SALESMAN的员工
SELECT employeenumber,employeename,job FROM employee WHERE job='manager'
UNION
SELECT employeenumber,employeename,job FROM employee WHERE job='salesman';
例6 查询员工编号,姓名,工作,工资,工作为'clerk','salesman','manager'的员工按工资升序排序,工作为'analyst''president'的员工,按工资降序排序
(SELECT employeenumber,employeename,job ,salary FROM employee WHERE job IN ('cleck','salesman','manager') ORDER BY salary LIMIT 999)
UNION
(SELECT employeenumber,employeename,job,salary FROM employee WHERE job IN('analyst','president') ORDER BY salary LIMIT 999);
说明:union联合查询时, order by不能直接使用,要对查询语句加括号才能使用,要使orderby生效: 必须搭配limit
3 limit
limit的作用:获取一表前几条戒中间某几行数据,主要用来分页处理,limit关键字只在MySQL中起作用。
用法:limit 起始下标m,长度n
m:记录开始的index,默认从 0 开始,表示第1条记录;
n :指从第 m+1 条开始,取 n 条;
获取前5个员工信息
SELECT * FROM employee LIMIT 0,5;
-- 因为从第1条数据开始算,可以省略第一个参数即索引
SELECT * FROM employee LIMIT 5;
获取工资前5的员工编号,员工姓名,工资
SELECT employeenumber,employeename,salary FROM employee ORDER BY salary desc LIMIT 0,5;
SELECT employeenumber,employeename,salary FROM employee ORDER BY salary DESC LIMIT 5;
-- 获取工资排名在前5-10的员工编号,姓名,工资
SELECT employeenumber ,employeename,salary FROM employee ORDER BY salary DESC LIMIT 4,6;
参考:小猴子视频