12-单表查询
本节重点:
单表查询
语法:
一、单表查询的语法SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数二、关键字的执行优先级(重点)重点中的重点:关键字的执行优先级fromwheregroup byhavingselectdistinctorder bylimit
1.找到表:from
2.拿着where指定的约束条件,去文件/表中取出一条条记录
3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
4.将分组的结果进行having过滤
5.执行select
6.去重
7.将结果按条件排序:order by
8.限制结果的显示条数
创建公司员工表,表的字段和数据类型
company.employee员工id id int 姓名namevarchar 性别sex enum 年龄age int入职日期 hire_datedate岗位postvarchar职位描述 post_comment varchar薪水salary double办公室office int部门编号 depart_idint

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

(2)group by 分组查询
#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的#2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等#3、为何要分组呢?取每个部门的最高工资取每个部门的员工数取男人数和女人数小窍门:‘每’这个字后面的字段,就是我们分组的依据#4、大前提:可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
当执行以下sql语句的时候,是以post字段查询了组中的第一条数据,没有任何意义,因为我们现在想查出当前组的多条记录。
mysql> select * from employee group by post;+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+| id | name| sex| age | hire_date | post| post_comment | salary | office | depart_id |+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+| 14 | 张野| male| 28 | 2016-03-11 | operation| NULL |10000.13 |403 | 3 || 9 | 歪歪| female | 48 | 2015-03-11 | sale| NULL |3000.13 |402 | 2 || 2 | alex| male| 78 | 2015-03-02 | teacher | | 1000000.31 |401 | 1 || 1 | egon| male| 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL |7300.33 |401 | 1 |+----+--------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+4 rows in set (0.00 sec)#由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的如果想分组,则必须要设置全局的sql的模式为ONLY_FULL_GROUP_BYmysql> set global sql_mode='ONLY_FULL_GROUP_BY';Query OK, 0 rows affected (0.00 sec)#查看MySQL 5.7默认的sql_mode如下:mysql> select @@global.sql_mode;+--------------------+| @@global.sql_mode |+--------------------+| ONLY_FULL_GROUP_BY |+--------------------+1 row in set (0.00 sec)mysql> exit;#设置成功后,一定要退出,然后重新登录方可生效Bye
继续验证通过group by分组之后,只能查看当前字段,如果想查看组内信息,需要借助于聚合函数
mysql> select * from emp group by post;# 报错ERROR 1054 (42S22): Unknown column 'post' in 'group statement'mysql> select post from employee group by post;+-----------------------------------------+| post|+-----------------------------------------+| operation|| sale|| teacher || 老男孩驻沙河办事处外交大使 |+-----------------------------------------+4 rows in set (0.00 sec)
(3)聚合函数
max()求最大值min()求最小值avg()求平均值sum() 求和count() 求总个数#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组# 每个部门有多少个员工select post,count(id) from employee group by post;# 每个部门的最高薪水select post,max(salary) from employee group by post;# 每个部门的最低薪水select post,min(salary) from employee group by post;# 每个部门的平均薪水select post,avg(salary) from employee group by post;# 每个部门的所有薪水select post,sum(age) from employee group by post;

(4)HAVING过滤
HAVING与WHERE不一样的地方在于#!!!执行优先级从高到低:where > group by > having #1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
验证:

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

(5)order by 查询排序
按单列排序SELECT * FROM employee ORDER BY age;SELECT * FROM employee ORDER BY age ASC;SELECT * FROM employee ORDER BY age DESC;按多列排序:先按照age升序排序,如果年纪相同,则按照id降序SELECT * from employeeORDER BY age ASC,id DESC;

小练习:
1. 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序2. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列3. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列

(5)limit 限制查询的记录数:
示例:SELECT * FROM employee ORDER BY salary DESC LIMIT 3;#默认初始位置为0 SELECT * FROM employee ORDER BY salary DESCLIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条SELECT * FROM employee ORDER BY salary DESCLIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
小练习:
分页显示,每页5条

作者:断浪狂刀忆年少
来源链接:https://www.cnblogs.com/TodayWind/p/13122056.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。