08 mysql 子查询,UNION 联合查询,limit分页

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;

参考:小猴子视频

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84931452