系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > Mysql > 详细页面

MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

时间:2019-12-22来源:系统城作者:电脑系统城

这篇文章主要介绍了MySQL单表查询操作,结合实例形式详细分析了mysql单表查询的语法、约束、分组、聚合、过滤、排序等相关原理、操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了MySQL单表查询操作。分享给大家供大家参考,具体如下:

语法

一、单表查询的语法

   SELECT 字段1,字段2... FROM 表名
                  WHERE 条件
                  GROUP BY field
                  HAVING 筛选
                  ORDER BY field
                  LIMIT 限制条数

二、关键字的执行优先级(重点)

重点中的重点:关键字的执行优先级

from
where
group by
having
select
distinct
order by
limit

1.找到表:from

2.拿着where指定的约束条件,去文件/表中取出一条条记录

3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组

4.将分组的结果进行having过滤

5.执行select

6.去重

7.将结果按条件排序:order by

8.限制结果的显示条数

(1)where 约束 

 where运算符

where子句中可以使用
1.比较运算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之间
3.in(80,90,100)值是10或20或30
4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

(2)group by 分组查询

#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的

#2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等

#3、为何要分组呢?
    取每个部门的最高工资
    取每个部门的员工数
    取男人数和女人数

小窍门:‘每'这个字后面的字段,就是我们分组的依据

#4、大前提:

可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数

当执行以下sql语句的时候,没有报错,但本身是没有意义的


 
  1. mysql> select * from employee group by post;
  2. +----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
  3. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  4. +----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
  5. | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
  6. | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
  7. | 2 | alex | male | 78 | 2015-03-02 | teacher | | 1000000.31 | 401 | 1 |
  8. | 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |
  9. +----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
  10. 4 rows in set (0.00 sec)
  11.  

设置sql_mode为ONLY_FULL_GROUP_BY,并且退出,再进入才会生效


 
  1. mysql> set globalsql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  

再次进入


 
  1. mysql> select @@sql_mode;
  2. +-----------------------------------------------------------------------------------+
  3. | @@sql_mode |
  4. +-----------------------------------------------------------------------------------+
  5. |ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
  6. +-----------------------------------------------------------------------------------
  7.  
  8. mysql> select * from emp group by post;//现在的情况下就会报错
  9. ERROR 1054 (42S22): Unknown column 'post' in 'group statement'
  10. mysql> select * from employee group by post;
  11. ERROR 1055 (42000): 't1.employee.id' isn't in GROUP BY
  12. mysql> select post from employee group by post;
  13. +-----------------------------------------+
  14. | post |
  15. +-----------------------------------------+
  16. | operation |
  17. | sale |
  18. | teacher |
  19. | 老男孩驻沙河办事处外交大使 |
  20. +-----------------------------------------+
  21. 4 rows in set (0.00 sec)
  22.  

或者如下使用


 
  1. mysql> select name,post from employee group by post,name;
  2. +------------+-----------------------------------------+
  3. | name | post |
  4. +------------+-----------------------------------------+
  5. | 张野 | operation |
  6. | 程咬金 | operation |
  7. | 程咬铁 | operation |
  8. | 程咬铜 | operation |
  9. | 程咬银 | operation |
  10. | 丁丁 | sale |
  11. | 丫丫 | sale |
  12. | 星星 | sale |
  13. | 格格 | sale |
  14. | 歪歪 | sale |
  15. | alex | teacher |
  16. | jingliyang | teacher |
  17. | jinxin | teacher |
  18. | liwenzhou | teacher |
  19. | wupeiqi | teacher |
  20. | xiaomage | teacher |
  21. | yuanhao | teacher |
  22. | egon | 老男孩驻沙河办事处外交大使 |
  23. +------------+-----------------------------------------+
  24. 18 rows in set (0.00 sec)
  25.  
  26. mysql> select post,count(id) from employee group by post;
  27. +-----------------------------------------+-----------+
  28. | post | count(id) |
  29. +-----------------------------------------+-----------+
  30. | operation | 5 |
  31. | sale | 5 |
  32. | teacher | 7 |
  33. | 老男孩驻沙河办事处外交大使 | 1 |
  34. +-----------------------------------------+-----------+
  35. 4 rows in set (0.00 sec)
  36.  

(3)聚合函数

max()求最大值
min()求最小值
avg()求平均值
sum() 求和
count() 求总个数


 
  1. #强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
  2. # 每个部门有多少个员工
  3. select post,count(id) from employee group by post;
  4. # 每个部门的最高薪水
  5. select post,max(salary) from employee group by post;
  6. # 每个部门的最低薪水
  7. select post,min(salary) from employee group by post;
  8. # 每个部门的平均薪水
  9. select post,avg(salary) from employee group by post;
  10. # 每个部门的所有薪水
  11. select post,sum(age) from employee group by post;
  12.  

(4)HAVING过滤

HAVING与WHERE不一样的地方在于

#!!!执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数


 
  1. mysql> select * from employee where salary>1000000;
  2. +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
  3. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  4. +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
  5. | 2 | alex | male | 78 | 2015-03-02 | teacher | | 1000000.31 | 401 | 1 |
  6. +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> select * from employee having salary>1000000;
  10. ERROR 1463 (42000): Non-grouping field 'salary' is used in HAVING clause
  11.  
  12. # 必须使用group by才能使用group_concat()函数,将所有的name值连接
  13. mysql> select post,group_concat(name) from emp group by post having salary > 10000; ##错误,分组后无法直接取到salary字段
  14. ERROR 1054 (42S22): Unknown column 'post' in 'field list'
  15.  

练习

1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数
2. 查询各岗位平均薪资大于10000的岗位名、平均工资
3. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资

答案


 
  1. mysql> select post,group_concat(name),count(id) from employee group by post;
  2. +-----------------------------------------+-----------------------------------------------------------+-----------+
  3. | post | group_concat(name) | count(id) |
  4. +-----------------------------------------+-----------------------------------------------------------+-----------+
  5. | operation | 程咬铁,程咬铜,程咬银,程咬金,张野 | 5 |
  6. | sale | 格格,星星,丁丁,丫丫,歪歪 | 5 |
  7. | teacher | xiaomage,jinxin,jingliyang,liwenzhou,yuanhao,wupeiqi,alex | 7 |
  8. | 老男孩驻沙河办事处外交大使 | egon | 1 |
  9. +-----------------------------------------+-----------------------------------------------------------+-----------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> select post,group_concat(name),count(id) from employee group by post having count(id)<2;
  13. +-----------------------------------------+--------------------+-----------+
  14. | post | group_concat(name) | count(id) |
  15. +-----------------------------------------+--------------------+-----------+
  16. | 老男孩驻沙河办事处外交大使 | egon | 1 |
  17. +-----------------------------------------+--------------------+-----------+
  18. 1 row in set (0.00 sec)
  19.  

 
  1. #题2:
  2. mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000;
  3. +-----------+---------------+
  4. | post | avg(salary) |
  5. +-----------+---------------+
  6. | operation | 16800.026000 |
  7. | teacher | 151842.901429 |
  8. +-----------+---------------+
  9. 2 rows in set (0.00 sec)
  10.  

 
  1. #题3:
  2. mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 andavg(salary) <20000;
  3. +-----------+--------------+
  4. | post | avg(salary) |
  5. +-----------+--------------+
  6. | operation | 16800.026000 |
  7. +-----------+--------------+
  8. 1 row in set (0.00 sec)
  9.  

(5)order by 查询排序

按单列排序


 
  1. SELECT * FROM employee ORDER BY age;
  2. SELECT * FROM employee ORDER BY age ASC;
  3. SELECT * FROM employee ORDER BY age DESC;

按多列排序:先按照age升序排序,如果年纪相同,则按照id降序


 
  1. SELECT * from employee
  2. ORDER BY age ASC,
  3. id DESC;

(5)limit  限制查询的记录数:

示例:


 
  1. SELECT * FROM employee ORDER BY salary DESC
  2. LIMIT 3; #默认初始位置为0
  3.  
  4. SELECT * FROM employee ORDER BY salary DESC
  5. LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
  6.  
  7. SELECT * FROM employee ORDER BY salary DESC
  8. LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
  9.  

 练习:每次显示5条


 
  1. # 第1页数据
  2. mysql> select * from employee limit 0,5;
  3. +----+-----------+------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
  4. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  5. +----+-----------+------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
  6. | 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |
  7. | 2 | alex | male | 78 | 2015-03-02 | teacher | | 1000000.31 | 401 | 1 |
  8. | 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 |
  9. | 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
  10. | 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
  11. +----+-----------+------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
  12. 5 rows in set (0.00 sec)
  13. # 第2页数据
  14. mysql> select * from employee limit 5,5;
  15. +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
  16. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  17. +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
  18. | 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
  19. | 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
  20. | 8 | xiaomage | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
  21. | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
  22. | 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
  23. +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+
  24. 5 rows in set (0.00 sec)
  25. # 第3页数据
  26. mysql> select * from employee limit 10,5;
  27. +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+
  28. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  29. +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+
  30. | 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
  31. | 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
  32. | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
  33. | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
  34. | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
  35. +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+
  36. 5 rows in set (0.00 sec)
  37.  

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

分享到:

相关信息

  • MySQL的核心查询语句详解

    一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...

    2023-10-30

  • Mysql中如何删除表重复数据

    Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...

    2023-10-30

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载