当遇到一些复杂的需求时,例如对查询结果进行排序,分组和分页等,MySQL 数据库有着更高级的查询方法以处理更加复杂的需求。

一,排序查询

在查询完成后,结果集中的数据是按默认顺序排序的。为了方便用户自定义结果集中数据的顺序,MySQL 提供了 ORDER BY 对于查询结果进行排序,具体语法如下:

SELECT 字段名1, 字段名2, ....FROM 表名 ORDER BY 字段名1 (ASC/DESC), 字段名2(ASC/DESC)...;

在以上语法中,字段名1,字段名2等表示需要查询的字段名称,ORDER BY 关键字后的字段名表示指定排序的字段,ASC 和 DESC 参数是可选的,其中 ASC 代表按升序排序,DESC 代表按降序排序,如果不写该参数,则默认按升序排序。

查询所有学生记录,按年龄升序排序。

SELECT * FROM stu ORDER BY age ASC;


注意:如果不写 ASC 也是升序排序,使用默认排序方式。

接着查询所有学生记录,按 sid 降序排序。

SELECT * FROM stu ORDER BY sid DESC;


查询所有员工信息,按员工月薪降序排序,如果月薪相同,按员工编号升序排序。

SELECT * FROM emp ORDER BY sal DESC,empno ASC;

二,聚合函数

在查询出数据之后,可能需要对数据进行统计,例如获得工资的总和,年龄最大值,奖金最小值等,MySQL 提供了一系列函数实现数据统计,也称为聚合函数。

常用聚合函数:

函数名称 作用
COUNT() 返回某列的行数
SUM() 返回某列的和
AVG() 返回某列的平均值
MAX() 返回某列的最大值
MIN() 返回某列的最小值

1,COUNT() 函数

COUNT() 函数的语法格式如下:

SELECT COUNT(*|1|列名) FROM 表名;

在上述语法格式中,COUNT() 函数有3个可选参数,其中 COUNT(*)是返回行数,包含 NULL ;COUNT(列名)是返回特定列的值具有的行数,不包含 NULL ;还有一种是 COUNT(1) ,它与 COUNT(*)返回的结果是一样的,如果数据表没有主键,则 COUNT(1)的执行效率会高一些。

查询员工表中的记录数。

SELECT COUNT(*) FROM emp;
SELECT COUNT(1) FROM emp;

从执行结果上看,COUNT(*) 与 COUNT(1) 的查询结果一致,他们只是在某些情况下执行效率不同。

另外,查询出的结果集列名显示为 COUNT(1) ,不是很直观,这时可以为列名起别名,只需要在 COUNT(1) 还没加上“ AS 别名 ”即可。

SELECT COUNT(1) AS totle FROM emp;


注意:在取别名时 AS 是可以省略不写的,效果一样。

接着查询员工表中有奖金的人数。

SELECT COUNT(comm) AS totle FROM emp;


员工表中,comm 字段为奖金,除去值为 NULL 的其他记录共4条。

查询员工表中月薪大于 2500 元的人数,查询结果的列名指定为 total。

SELECT COUNT(*) AS total FROM emp WHERE sal>2500;


查询员工表中有奖金的人数和领导的人数。

SELECT COUNT(comm),COUNT(mgr) FROM emp;


查询员工表中月薪与奖金之和大于 2500 元的人数。

SELECT COUNT(*) AS total FROM emp WHERE sal+IFNULL(comm,0)>2500;


注意:因为有些员工的奖金为 NULL 当数字类型与 NULL 相加时结果为0。所以 IFNULL() 函数可以解决这个问题,该函数可以判断字段是否为 NULL 如果是,则将 NULL 替换为0。

2,SUM() 函数

SUM() 函数用于计算指定列的数值和,如果指定列的类型不是数值类型,那么计算结果为0,具体语法如下:

SELECT SUM(字段名) FROM 表名;

查询员工表中所有员工的月薪和。

SELECT SUM(sal) FROM emp;


查询员工表中所有员工的月薪和以及所有员工的奖金和。

SELECT SUM(sal),SUM(comm) FROM emp;


查询员工表所有员工的月薪和奖金的和,查询出的列名指定为 totle。

SELECT SUM(sal+IFNULL(comm,0)) AS totle FROM emp;

注意:奖金中有 NULL 值的存在,因此需要用到 IFNULL() 函数进行判断。

3,AVG() 函数

AVG() 函数用于计算指定列的平均值,如果指定列的类型不是数值类型,那么计算的结果为0,具体语法格式如下:

SELECT AVG(字段名) FROM 表名;

查询员工表中所有员工的平均月薪。

SELECT AVG(sal) FROM emp;

4,MAX() 函数

MAX() 函数用于计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算,具体语法格式如下:

SELECT MAX(字段名) FROM 表名;

查询员工表中员工的最高月薪。

SELECT MAX(sal) FROM emp;

5,MIN() 函数

MIN() 函数用于计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算,具体语法格式如下:

SELECT MIN(字段名) FROM 表名;

查询员工表的最低月薪。

SELECT MIN(sal) FROM emp;

三,分组查询

在查询数据时,有时需要按照一定的类别进行统计,例如查询每个部门的人数,查询每个部门的薪资总和等,在 MySQL 中可以使用 GROUP BY 关键字进行分组查询,语法格式如下:

SELECT 字段名1, 字段名2, ....FROM 表名 GROUP BY 字段名1, 字段名2, ....;

在以上语法格式中,GROUP BY 后面的字段名是对查询结果分组的依据。

查询学生表中的学生信息,按照性别字段分组。

SELECT * FROM stu GROUP BY gender;


按照 gender 字段分组后的记录是3条,查询结果是按照 gender 字段不同的值进行分组,并没有太多实际意义,GROUP BY 通常与聚合函数一起使用。

查询员工表中每个部门的部门编号和每个部门的工资和。

SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;


查询员工表中每个部门的部门编号以及每个部门的人数。

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;


查询员工表中每个部门的部门编号以及每个部门工资大于1500元的人数。

SELECT deptno,COUNT(*) FROM emp-> WHERE sal>1500-> GROUP BY deptno;

四,HAVING 子句

对于一些更复杂的分组查询,在查询完成后还需要进行数据过滤。MySQL 提供了 HAVING 子句,用于分组后对数据进行过滤,在它后面可以使用聚合函数,而 WHERE 子句是在分组前对数据进行过滤,在它后面不可以使用聚合函数。HAVING 子句语法格式如下:

SELECT 字段名1, 字段名2, ....FROM 表名 GROUP BY 字段名1, 字段名2, ....[HAVING 条件表达式];

HAVING 子句是可选的。

查询员工表中工资总和大于9000元的部门编号以及工资和。

SELECT deptno,SUM(sal) FROM emp-> GROUP BY deptno-> HAVING SUM(sal)>9000;

五,LIMIT 分页

在查询数据时一般会返回几条,几十条甚至更多的数据,但用户可能只需要其中某几条,而且这种查询方式明显会影响程序的性能,为了解决这一问题,MySQL 提供了 LIMIT 关键字用于限制查询结果的数量,也可以通俗的理解为分页,既满足了用户需求,又不影响系统性能。LIMIT 的语法格式如下:

SELECT 字段名1, 字段名2, .....FROM 表名 LIMIT m,n;

LIMIT 后面可以跟两个参数,第一个 m 是可选的,代表起始索引,若不指定,则默认为0,代表第一条记录;第二个参数 n 是必选的,代表从第 m+1 条记录开始取 n 条记录。

查询学生表中前五条记录。

SELECT * FROM stu LIMIT 0,5;


当从0开始查询时,0也可以省略不写。

查询学生表中从第3条开始的记录,总共查询5条记录。

SELECT * FROM stu LIMIT 2,5;


LIMIT 后面的第一个参数指定为2,代表从第3条记录开始查询,第二个参数指定的5,代表查询5条记录。

MySQL 数据库单表查询——高级查询相关推荐

  1. 为什么说mysql数据库单表最大两千万?依据是啥?

    为什么说mysql数据库单表最大两千万?依据是啥? 前言 数据库单表行数最大多大 索引的结构 页的结构 从页到索引 B+树承载的记录数量 x怎么算 y的计算 行总数计算 行数超一亿就慢了吗? B树承载 ...

  2. 为什么大家说mysql数据库单表最大两千万?依据是啥?

    故事从好多年前说起. 想必大家也听说过数据库单表建议最大2kw条数据这个说法.如果超过了,性能就会下降得比较厉害. 巧了. 我也听说过. 但我不接受它的建议,硬是单表装了1亿条数据. 这时候,我们组里 ...

  3. 为什么大家说 MySQL 数据库单表最大两千万?依据是啥?

    故事从好多年前说起. 想必大家也听说过数据库单表建议最大两千万条数据这个说法.如果超过了,性能就会下降得比较厉害. 巧了.我也听说过. 但我不接受它的建议,硬是单表装了 1 亿条数据. 这时候,我们组 ...

  4. 为什么大家说mysql数据库单表最大两千万?

    故事从好多年前说起. 想必大家也听说过数据库单表建议最大2kw条数据这个说法.如果超过了,性能就会下降得比较厉害. 巧了. 我也听说过. 但我不接受它的建议,硬是单表装了1亿条数据. 这时候,我们组里 ...

  5. 95.第十九章 MySQL数据库 -- 单表操作(五)

    3.7 DQL语句 3.7.1 单表操作 官方帮助:https://dev.mysql.com/doc/refman/8.0/en/select.html 语法: SELECT[ALL | DISTI ...

  6. MySQL 案例实战--MySQL数据库 单表查询 一

    前言 本环境是基于 Centos 7.8 系统构建MySQL-5.7.14 具体构建,请参考 MySQL-5.7.14 环境构建 素材准备: DROP TABLE IF EXISTS `course` ...

  7. Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解

    文章目录 内连接 inner join 示例 外连接 outer join left outer join 左外连接 示例 right outer join 右外连接 示例 full outer jo ...

  8. MySQL:单表查询---简单查询+条件查询+高级查询+表和字段取别名

    目录 一.通用模版展示 简单查询 条件查询 高级查询 表和字段取别名 二.举例说明 简单查询 条件查询 高级查询 表和字段取别名 三.注意事项 四.Mapper简单举例 简单查询 条件查询 高级查询 ...

  9. 面向考试数据库—单表查询(包含建表数据)

    面向考试数据库-单表查询(包含建表数据) 引言 ● 建立练习数据库(之后习题亦是基于该库) 建表源码 单表查询知识点汇总 单表查询练习题32道 (1)选取表中的若干列 (2)选择表中若干元祖 (3)o ...

最新文章

  1. C# 中 以 # 打头的 编码 是: html 编码解码地址 转换
  2. 安装了超图、oracle、eclipse、JDK后系统的java进程情况以及java.exe、javaw.exe
  3. 减法公式运算法则_人教版数学七年级上册1.3.2有理数的减法视频讲解+知识点+同步练习...
  4. Firefox about
  5. 开源库 | 监控视频中的目标检测与跟踪
  6. C# 调用c++ 实例
  7. Python+matplotlib绘图时显示中文的设置方法
  8. 不要在变量名的旁边加echo和.br;
  9. 1114. Family Property (25)-PAT甲级真题(并查集)
  10. Linux auditd rules generate 通用linux审计规则生成工具DevOps CI/CD持续集成交付 tools
  11. linux 性能检测工具之 dstat
  12. java控制浏览器,java控制夜神访问浏览器
  13. mysql开发认证 cmdev_学无止境:了解主流的DBA认证考试
  14. esp32 cam 内网穿透 视频传输
  15. mac 删除磁盘图标_如何在Mac上更改硬盘图标
  16. Linux7网卡绑定后mac一样,如何解决双网卡bond0绑定模式物理成员口的mac地址和bonding接口mac地址不一致......
  17. VML标记与通用属性
  18. 315晚会给我们的几点启示
  19. ue4 android log,UE4+Log日志
  20. 太原理工计算机复试题库,太原理工大学研究生复试理论力学选择题题库

热门文章

  1. 剖析Spring源码:加载IOC容器
  2. APP在线制作平台,手机应用,手机App开发,手机客户端开发
  3. 组织人事类主数据业务梳理以及流程编排
  4. java为word添加水印,图片水印和文字水印
  5. 香烟logo设计灵感 - logo设计公司 - ci设计
  6. 所有人望向黑洞那一刻,我们短暂地共享了 5500 万光年外的世界
  7. Linux服务之DHCP服务篇(scp)
  8. 为你的树莓派安装xbox手柄驱动~
  9. 光速入门MyBatis-Plus
  10. [MySQL光速入门]020 事务