MySQL:单表查询

在线数据库:http://sqlfiddle.com/

建表脚本:https://gitee.com/bqzzz/sql/tree/master/Scripts


基本查询

①、查询所有记录

SELECT * FROM t_emp;

②、查询特定字段

SELECT ename,job FROM t_emp;

③、查询时指定别名

# AS可省略
SELECT 
ename AS '姓名',
job AS '职位'
FROM t_emp;

④、对查询结果做运算

SELECT ename, sal*12 FROM t_emp;

条件查询

  • 算术运算符:+、-、*、/、%
  • 比较运算符:>、>=、<、<=、=、!=、IN(a,b,c)、IS NULL、IS NOT NULL、BETWEEN ... AND ...、LIKE、REGEXP
  • 逻辑运算符:AND、OR、NOT、XOR
  • 按位运算符:&、|、~、^ 、<<、>>
SELECT * FROM t_emp WHERE (deptno=10 OR deptno=20) AND sal>2000;

注:WHERE子句中的条件表达式的执行顺序从左到右,应尽量把索引条件、筛选掉最多记录的条件写在左侧。


分页查询

# LIMIT + 起始位置,偏移量
SELECT * FROM t_emp LIMIT 0,5; 

# 查询前五条数据 简写
SELECT * FROM t_emp LIMIT 5; 

排序

# 默认升序
SELECT * FROM t_emp ORDER BY sal; 

# 降序
SELECT * FROM t_emp ORDER BY sal DESC; 

# 指定多个排序规则,当第一个规则无法排序时使用第二个,以此类推,兜底使用主键来排序
SELECT * FROM t_emp 
ORDER BY sal DESC,hiredate DESC; 

去重

# DISTINCT用于筛去结果集中完全相同的记录
SELECT DISTINCT deptno FROM t_emp;
SELECT DISTINCT deptno,job FROM t_emp;

聚合查询

聚合函数可以对查询到的记录做简单的计算,常用聚合函数:

函数 说明
AVG (列名) 平均值
COUNT (列名) 非空记录数
MAX (列名) 非空最大值
MIN (列名) 非空最小值
SUN (列名) 合计

示例:

SELECT SUM(sal) FROM t_emp ;
SELECT SUM(IFNULL(sal,0)) FROM t_emp ;

SELECT AVG(IFNULL(sal,0)) FROM t_emp ;
SELECT MAX(IFNULL(sal,0)) FROM t_emp ;
SELECT MIN(IFNULL(sal,0)) FROM t_emp ;

SELECT COUNT(*) FROM t_emp ;
SELECT COUNT(sal) FROM t_emp ;

注:聚合函数是对查询结果做统计,不能用在WHERE条件子句中。


分组查询

一般使用GROUP BY子句将结果集分组处理,用法示例:

SELECT deptno,AVG(sal) FROM t_emp GROUP BY deptno;

如果分组后的结果集还需要再分组,可使用逐级分组

SELECT deptno,job,AVG(sal) FROM t_emp 
GROUP BY deptno,job
ORDER BY deptno,AVG(sal) DESC;

如果需要对分组的结果再做相应的汇总计算,使用WITH ROLLUP

SELECT deptno,AVG(sal) FROM t_emp
GROUP BY deptno WITH ROLLUP;

如果使用 GROP BY 子句,SELECT子句就只能出现 分组列 和 聚合函数,不能出现其他列的字段,如果需要获得某个字段对应结果集(如获得按班级分组后,要显示每个班对应的人)可以使用 GROP_CONCAT 函数,将该字段拼接成字符串显示:

SELECT deptno,COUNT(*),GROUP_CONCAT(ename) FROM t_emp 
GROUP BY deptno ;

使用 HAVING 子句

由于WHERE子句的优先级高,执行WHERE时还没有检索出数据,所以WHERE子句中不能使用聚合函数。

但如果有这样查询逻辑:查询部门平局工资大于2000的部门

# 这样查肯定报错,要配合HAVING子句
SELECT deptno FROM t_emp
WHERE AVG(sal)>=2000
GROUP BY deptno;

# 使用HAVING子句配合GROUP BY字句做筛选,HAVING子句在GROUP BY后执行
SELECT deptno FROM t_emp
GROUP BY deptno HAVING AVG(sal)>=2000;

注:HAVING子句与WHERE子句的功能类似,但普通条件还是要用WHERE条件,WHERE执行顺序靠前,可以提前剔除大量无关数据


查询语句的执行顺序:FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT

posted @ 2021-02-15 21:23  yangblood  阅读(104)  评论(0编辑  收藏  举报