文章目录

  • 0 前言
  • 1 基本查询
  • 2 多表查询
  • 3 自连接
  • 4 子查询
    • 4.1 单行子查询
    • 4.2 多行子查询
    • 4.3 多列子查询
    • 4.4 在from子句中使用子查询
    • 4.5 合并查询
      • 4.5.1 union
      • 4.5.3 union all

0 前言

相关内容已经准备好了

  • 链接:https://gitee.com/ding-xushengyun/linux__cpp/blob/master/scott_data.sql
    准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)

    • emp员工表
    • dept部门表
    • salgrade工资等级表

1 基本查询

  • 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
mysql> select * from `emp` where (`sal`>500 or `job`='MANAGER') and `ename` like 'J%';
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno  | ename | job     | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL |     20 |
| 007900 | JAMES | CLERK   | 7698 | 1981-12-03 00:00:00 |  950.00 | NULL |     30 |
+--------+-------+---------+------+---------------------+---------+------+--------+
2 rows in set (0.00 sec)
  • 按照部门号升序而雇员的工资降序排序
mysql> select * from `emp` order by `deptno` asc, `sal` desc;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)
  • 使用年薪进行降序排序
mysql> select `ename`, `sal`*12+ifnull(`comm`, 0) '年薪' from `emp` order by 年薪 desc;
+--------+----------+
| ename  | 年薪     |
+--------+----------+
| KING   | 60000.00 |
| SCOTT  | 36000.00 |
| FORD   | 36000.00 |
| JONES  | 35700.00 |
| BLAKE  | 34200.00 |
| CLARK  | 29400.00 |
| ALLEN  | 19500.00 |
| TURNER | 18000.00 |
| MARTIN | 16400.00 |
| MILLER | 15600.00 |
| WARD   | 15500.00 |
| ADAMS  | 13200.00 |
| JAMES  | 11400.00 |
| SMITH  |  9600.00 |
+--------+----------+
14 rows in set (0.00 sec)
  • 显示工资最高的员工的名字和工作岗位
mysql> select `ename`, `job` from `emp` where `sal` = (select max(`sal`) from `emp`);
+-------+-----------+
| ename | job       |
+-------+-----------+
| KING  | PRESIDENT |
+-------+-----------+
1 row in set (0.00 sec)
  • 显示工资高于平均工资的员工信息
mysql> select `ename`, `sal` from `emp` where `sal` > (select avg(`sal`) from `emp`);
+-------+---------+
| ename | sal     |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING  | 5000.00 |
| FORD  | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)
  • 显示每个部门的平均工资和最高工资
mysql> select `deptno`, avg(`sal`), max(`sal`) from `emp` group by `deptno`;
+--------+-------------+------------+
| deptno | avg(`sal`)  | max(`sal`) |
+--------+-------------+------------+
|     10 | 2916.666667 |    5000.00 |
|     20 | 2175.000000 |    3000.00 |
|     30 | 1566.666667 |    2850.00 |
+--------+-------------+------------+
3 rows in set (0.00 sec)
  • 显示平均工资低于2000的部门号和它的平均工资
mysql> select `deptno`, avg(`sal`) '平均工资' from `emp` group by `deptno` having 平均工资<2000;
+--------+--------------+
| deptno | 平均工资     |
+--------+--------------+
|     30 |  1566.666667 |
+--------+--------------+
1 row in set (0.00 sec)
  • 显示每种岗位的雇员总数,平均工资
mysql> select `job`, count(*), format(avg(`sal`), 2) from `emp` group by `job`;
+-----------+----------+-----------------------+
| job       | count(*) | format(avg(`sal`), 2) |
+-----------+----------+-----------------------+
| ANALYST   |        2 | 3,000.00              |
| CLERK     |        4 | 1,037.50              |
| MANAGER   |        3 | 2,758.33              |
| PRESIDENT |        1 | 5,000.00              |
| SALESMAN  |        4 | 1,400.00              |
+-----------+----------+-----------------------+
5 rows in set (0.00 sec)

2 多表查询

  • 多表查询本质就是穷举

    (—此图来自于相关资料)

  • 实际有效数据为下面所示:

mysql> select * from emp, dept where emp.deptno=dept.deptno;
+--------+--------+-----------+------+---------------------+---------+---------+--------+--------+------------+----------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno | deptno | dname      | loc      |
+--------+--------+-----------+------+---------------------+---------+---------+--------+--------+------------+----------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |     30 | SALES      | CHICAGO  |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |     30 | SALES      | CHICAGO  |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |     30 | SALES      | CHICAGO  |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |     30 | SALES      | CHICAGO  |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
+--------+--------+-----------+------+---------------------+---------+---------+--------+--------+------------+----------+
14 rows in set (0.00 sec)
  • 示部门号为10的部门名,员工名和工资
mysql> select `dname`, `ename`, `sal` from `emp`, `dept` where emp.deptno=dept.deptno and emp.deptno=10;
+------------+--------+---------+
| dname      | ename  | sal     |
+------------+--------+---------+
| ACCOUNTING | CLARK  | 2450.00 |
| ACCOUNTING | KING   | 5000.00 |
| ACCOUNTING | MILLER | 1300.00 |
+------------+--------+---------+
3 rows in set (0.00 sec)
  • 显示各个员工的姓名,工资,及工资级别
mysql> select `ename`, `sal`, `grade` from `emp`, `salgrade` where `sal` between `losal` and `hisal`;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.00 sec)

3 自连接

自连接是指在同一张表连接查询

案例:
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)

  • 使用的子查询:
mysql> select empno, ename from emp where empno = (select mgr from emp where ename='FORD');
+--------+-------+
| empno  | ename |
+--------+-------+
| 007566 | JONES |
+--------+-------+
1 row in set (0.02 sec)
  • 使用多表查询(自查询)
mysql> select e1.empno, e1.ename from emp e1, emp e2 where e1.empno=e2.mgr and e2.ename='FORD';
+--------+-------+
| empno  | ename |
+--------+-------+
| 007566 | JONES |
+--------+-------+
1 row in set (0.00 sec)

4 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

4.1 单行子查询

返回一行记录的子查询

  • 显示SMITH同一部门的员工
mysql> select ename from emp where deptno=(select deptno from emp where ename='SMITH');
+-------+
| ename |
+-------+
| SMITH |
| JONES |
| SCOTT |
| ADAMS |
| FORD  |
+-------+
5 rows in set (0.00 sec)

4.2 多行子查询

返回多行记录的子查询

  • in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
mysql> select ename, job, sal, deptno from emp where job in (select distinct job from emp where deptnoo=10) and deptno!=10;
+-------+---------+---------+--------+
| ename | job     | sal     | deptno |
+-------+---------+---------+--------+
| JONES | MANAGER | 2975.00 |     20 |
| BLAKE | MANAGER | 2850.00 |     30 |
| SMITH | CLERK   |  800.00 |     20 |
| ADAMS | CLERK   | 1100.00 |     20 |
| JAMES | CLERK   |  950.00 |     30 |
+-------+---------+---------+--------+
5 rows in set (0.00 sec)
  • all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
mysql> select ename, sal, deptno from emp where sal > all(select sal from emp where deptno=30);
+-------+---------+--------+
| ename | sal     | deptno |
+-------+---------+--------+
| JONES | 2975.00 |     20 |
| SCOTT | 3000.00 |     20 |
| KING  | 5000.00 |     10 |
| FORD  | 3000.00 |     20 |
+-------+---------+--------+
4 rows in set (0.00 sec)
  • any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
mysql> select ename, sal, deptno from emp where sal > any(select sal from emp where deptno=30);
+--------+---------+--------+
| ename  | sal     | deptno |
+--------+---------+--------+
| ALLEN  | 1600.00 |     30 |
| WARD   | 1250.00 |     30 |
| JONES  | 2975.00 |     20 |
| MARTIN | 1250.00 |     30 |
| BLAKE  | 2850.00 |     30 |
| CLARK  | 2450.00 |     10 |
| SCOTT  | 3000.00 |     20 |
| KING   | 5000.00 |     10 |
| TURNER | 1500.00 |     30 |
| ADAMS  | 1100.00 |     20 |
| FORD   | 3000.00 |     20 |
| MILLER | 1300.00 |     10 |
+--------+---------+--------+
12 rows in set (0.00 sec)

4.3 多列子查询

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
mysql> select ename from emp where (deptno, job) = (select deptno, job from emp where ename='SMITH') and ename!!='SMITH';
+-------+
| ename |
+-------+
| ADAMS |
+-------+
1 row in set (0.00 sec)

4.4 在from子句中使用子查询

子查询语句出现在from子句中。

  • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
mysql> select ename, emp.deptno, sal, format(myavg, 2)  from emp, (select avg(sal) myavg, deptno from emp groupp by deptno) tmp where emp.deptno=tmp.deptno and emp.sal>tmp.myavg;
+-------+--------+---------+------------------+
| ename | deptno | sal     | format(myavg, 2) |
+-------+--------+---------+------------------+
| KING  |     10 | 5000.00 | 2,916.67         |
| JONES |     20 | 2975.00 | 2,175.00         |
| SCOTT |     20 | 3000.00 | 2,175.00         |
| FORD  |     20 | 3000.00 | 2,175.00         |
| ALLEN |     30 | 1600.00 | 1,566.67         |
| BLAKE |     30 | 2850.00 | 1,566.67         |
+-------+--------+---------+------------------+
6 rows in set (0.00 sec)
  • 查找每个部门工资最高的人的姓名、工资、部门、最高工资
mysql> select ename, sal, deptno, maxsal from emp, (select max(sal) maxsal from emp group by deptno) tmp where sal=maxsal;
+-------+---------+--------+---------+
| ename | sal     | deptno | maxsal  |
+-------+---------+--------+---------+
| BLAKE | 2850.00 |     30 | 2850.00 |
| SCOTT | 3000.00 |     20 | 3000.00 |
| KING  | 5000.00 |     10 | 5000.00 |
| FORD  | 3000.00 |     20 | 3000.00 |
+-------+---------+--------+---------+
4 rows in set (0.00 sec)
  • 显示每个部门的信息(部门名,编号,地址)和人员数量
mysql> select dept.deptno, dept.dname, dept.loc, count from dept, (select deptno, count(*) count from emp groupp by deptno) tmp where tmp.deptno=dept.deptno;
+--------+------------+----------+-------+
| deptno | dname      | loc      | count |
+--------+------------+----------+-------+
|     10 | ACCOUNTING | NEW YORK |     3 |
|     20 | RESEARCH   | DALLAS   |     5 |
|     30 | SALES      | CHICAGO  |     6 |
+--------+------------+----------+-------+
3 rows in set (0.01 sec)

4.5 合并查询

合并多个select的执行结果,可以使用集合操作符 union,union all

4.5.1 union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

  • 将工资大于2500或职位是MANAGER的人找出来
mysql> select ename, sal, job from emp where sal > 2500 union-> select ename, sal, job from emp where job='MANAGER';
+-------+---------+-----------+
| ename | sal     | job       |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   |
| SCOTT | 3000.00 | ANALYST   |
| KING  | 5000.00 | PRESIDENT |
| FORD  | 3000.00 | ANALYST   |
| CLARK | 2450.00 | MANAGER   |
+-------+---------+-----------+
6 rows in set (0.00 sec)

4.5.3 union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行

mysql> select ename, sal, job from emp where sal > 2500 union all select ename, sal, job from emp where job='MAANAGER';
+-------+---------+-----------+
| ename | sal     | job       |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   |
| SCOTT | 3000.00 | ANALYST   |
| KING  | 5000.00 | PRESIDENT |
| FORD  | 3000.00 | ANALYST   |
| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   |
| CLARK | 2450.00 | MANAGER   |
+-------+---------+-----------+
8 rows in set (0.01 sec)

MySQL(复合查询)相关推荐

  1. MySQL —— 复合查询

    目录 MySQL复合查询 一.基本查询回顾 二.多表查询 三.自连接 四.子查询 1. 单行子查询 2. 多行子查询 3. 多列子查询 4. 在from子句中使用子查询 五.合并查询 MySQL复合查 ...

  2. MySQL复合查询(多表查询)

    文章目录 一.基本查询回顾 二.多表查询 1.最基本的复合查询 三.自查询 四.子查询 1.单行子查询 2.多行子查询 (1)in关键字 (2)all关键字 (3)any关键字 3.多列子查询 4.在 ...

  3. mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询

    1.SELECT --group by 子句 group by子句按照指定的列column_name对表数据进行分组 group by 后面跟的列也叫分组特性列 使用group by后,能选择的列   ...

  4. MySQL(四)复合查询与联合查询

    文章目录 复合查询 复合函数 AVG COUNT SUM MAX MIN 分组查询 GROUP BY HAVING 联合查询 内连接 外连接 左连接 右连接 自连接 子查询 合并查询 UNION UN ...

  5. MySQL数据检索+查询+全文本搜索

    [0]README 0.1)本文部分文字描述转自"MySQL 必知必会",旨在review"MySQL数据检索+查询+全文本搜索" 的基础知识: [1]使用子查 ...

  6. mysql 组合查询_MySQL组合查询教程

    #MYSQL#这是我MySQL的第八篇教程.本篇主要介绍的是MySQL的组合查询的用法.在大多数的SQL查询中都只包含从一个或者多个表中返回数据的单条SELECT语句,MySQL其实也支持允许执行多条 ...

  7. Mysql简介和Mysql优化查询的方法

    MySQL 是瑞典的MySQL AB公司开发的一个可用于各种流行操作系统平台的关系数据库系统,它具有客户机/服务器体系结构的分布式数据库管理系统.MySQL 完全适用于网络,用其建造的数据库可在因特网 ...

  8. mysql数据库查询笔记_mysql笔记: 查询

    mysql笔记: 查询 查询准备 CREATE DATABASE search; use search; # 学生表(student):学号.姓名.性别.出生日期.班级 CREATE TABLE st ...

  9. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  10. Mysql复合索引最左匹配原则以及索引失效条件

    Mysql复合索引最左匹配原则以及索引失效条件 复合索引最左匹配原则 用EXPLAIN 来查看语句是否用到了索引 索引失效的条件 一般性建议 复合索引最左匹配原则 复合索引又叫联合索引.两个或更多个列 ...

最新文章

  1. MFC应用程序中添加控制台窗口
  2. 曲线图绘制软件_Origin教程丨一文教你快速绘制20种常用图
  3. 妈蛋:kinMaxShow轮播图异常,WebUploader图片上传坑爹,图片被压缩了
  4. Serverless在游戏、电商行业的一个运用场景示例
  5. 日常总结:自学操作系统基础的一些领悟
  6. java源程序可以有几个主类_Java源程序是由类定义组成的,每个程序可以定义若干个类,但只有一个类是主类。_学小易找答案...
  7. [java设计模式简记] 观察者模式(Observer-Pattern)
  8. Hbase2修复 - HBCK2
  9. 在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。 * (静态初始化一个数组,在数组中随意写入6个分数) 选手的最后得分为: * 去掉一个最高分和一个最低分后 的4个评委平均值。
  10. python的urllib四大模块_Python常用的内建模块4:urllib
  11. python 生成随机数的几种方法
  12. 爬虫学习笔记(一)初识爬虫
  13. 理解Ruby的4种闭包:blocks, Procs, lambdas 和 Methods
  14. 动态规划之详细分析0-1背包问题
  15. 微信小程序推广多多进宝商品,微信小程序跳转拼多多小程序领券页面,微信小程序跳转多多进宝推广链接
  16. HP SD2 DAT160小磁带机故障
  17. 数据结构与算法——算法知识总览
  18. 初中数学知识点总结_初中数学知识点总结
  19. vue使用keep-alive缓存页面 回到滚动位置
  20. 百度地图批量精度和维度Java,关于百度地图API批量转换成坐标的方法

热门文章

  1. Bootstrap基础10(标签页)
  2. Unity粒子特效裁剪(基于NGUI的shader裁剪实现)
  3. 啊。啊。啊。https免费证书又到期了怎么办。。。。
  4. 第十一章 C++ 封装/继承/多态
  5. Verdi 使用教程(持续更新中)
  6. 服务器上扩展nvme装系统,图文并茂,NVME固态UEFI安装win10操作系统详解
  7. 深富策略:震荡格局明显 弃高就低要谨记
  8. yolov4模型部署流程
  9. 上楼一次走一节还是两节楼梯,走法计算思路
  10. 计算机图形学曲线算法代码,计算机图形学自由曲线绘制算法.doc