标签:rom 通过 单表查询 unique max 限制 命令 指定 str
单表查询的语法及关键字执行的优先级
单表查询语法
select distinct 字段一,字段二,... from 表名 where 条件 group by field having 筛选 order by field limit 限制条数
关键字执行的优先级
1. 找到表: from
2. 拿着where指定的约束条件,去文件 / 表中取出一条条记录
3. 将取出的一条条记录进行分组group by , 如果没有group by ,则整体作为一组
4. 执行select (distinct --> 去重)
5. 将分组的结果进行having过滤
6. 将结果按条件排序: order by
7. 限制结果的显示条数
建表和数据的准备:
#创建表 create table employee( id int not null unique auto_increment, emp_name varchar(20) not null, sex enum(‘male‘,‘female‘) not null default ‘male‘, #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, #一个部门一个屋子 depart_id int ); #插入记录 #三个部门:教学,销售,运营 insert into employee(emp_name,sex,age,hire_date,post,salary,office,depart_id) values (‘egon‘,‘male‘,18,‘20170301‘,‘联合国外交大使‘,7300.33,401,1), #以下是教学部 (‘alex‘,‘male‘,78,‘20150302‘,‘teacher‘,1000000.31,401,1), (‘wupeiqi‘,‘male‘,81,‘20130305‘,‘teacher‘,8300,401,1), (‘yuanhao‘,‘male‘,73,‘20140701‘,‘teacher‘,3500,401,1), (‘liwenzhou‘,‘male‘,28,‘20121101‘,‘teacher‘,2100,401,1), (‘jingliyang‘,‘female‘,18,‘20110211‘,‘teacher‘,9000,401,1), (‘jinxin‘,‘male‘,18,‘19000301‘,‘teacher‘,30000,401,1), (‘成龙‘,‘male‘,48,‘20101111‘,‘teacher‘,10000,401,1), (‘歪歪‘,‘female‘,48,‘20150311‘,‘sale‘,3000.13,402,2),#以下是销售部门 (‘丫丫‘,‘female‘,38,‘20101101‘,‘sale‘,2000.35,402,2), (‘丁丁‘,‘female‘,18,‘20110312‘,‘sale‘,1000.37,402,2), (‘星星‘,‘female‘,18,‘20160513‘,‘sale‘,3000.29,402,2), (‘格格‘,‘female‘,28,‘20170127‘,‘sale‘,4000.33,402,2), (‘张野‘,‘male‘,28,‘20160311‘,‘operation‘,10000.13,403,3), #以下是运营部门 (‘程咬金‘,‘male‘,18,‘19970312‘,‘operation‘,20000,403,3), (‘程咬银‘,‘female‘,18,‘20130311‘,‘operation‘,19000,403,3), (‘程咬铜‘,‘male‘,18,‘20150411‘,‘operation‘,18000,403,3), (‘程咬铁‘,‘female‘,18,‘20140512‘,‘operation‘,17000,403,3) ;
一 . 查询的语法:
1. select 语句:
select ( case when 字段名1 = ‘aaa‘ then 字段名 # 如果字段名1的内容为aaa时,就返回字段名原来的数据 when 字段名1 = ‘bbb‘ then concat(字段名1,‘wahaha‘) # 如果字段名1的内容为bbb时,就将字段名和wahaha拼接起来返回 else concat(字段名1,‘shuangwaiwai‘) # 如果字段名1的内容不为上面两个时,就将字段名和shuangwaiwai拼接起来返回 end ) as new_name # 给这字段起一个新名字 from 表名
2. 通过四则运算查询
3. where 筛选出所有符合条件的行
4. 逻辑运算 (与 或 非)
二 . 分组聚合
1. 分组: group by 字段名; 根据某个字段分组
- 根据谁分组,可以求出这个组的总人数,最大值,最小值,平均值,求和,但是这个求出来的值只是和分组字段对应,并不和其他任何字段对应,这个时候查出来的所有其他字段都不生效
单独使用GROUP BY关键字分组 SELECT post FROM employee GROUP BY post; 注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数 GROUP BY关键字和GROUP_CONCAT()函数一起使用 SELECT post,GROUP_CONCAT(emp_name) FROM employee GROUP BY post;#按照岗位分组,并查看组内成员名 SELECT post,GROUP_CONCAT(emp_name) as emp_members FROM employee GROUP BY post; GROUP BY与聚合函数一起使用 select post,count(id) as count from employee group by post;#按照岗位分组,并查看每个组有多少人
2. 聚合函数
三. having 过滤语句
mysql> select post,group_concat(emp_name) from emp group by post having salary > 10000; ERROR 1054 (42S22): Unknown column ‘salary‘ in ‘having clause‘ #错误,分组后无法直接取到salary字段 # 通过分组聚合获取值: 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资 mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 and avg(salary) <20000; +-----------+--------------+ | post | avg(salary) | +-----------+--------------+ | operation | 16800.026000 |
四. order by 排列语句
# 按多列排序:先按照age排序,如果年纪相同,则按照薪资排序 select * from employee order by age,salary desc; # 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列 mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) asc; +-----------+---------------+ | post | avg(salary) | +-----------+---------------+ | operation | 16800.026000 | | teacher | 151842.901429 | +-----------+---------------+ 2 rows in set (0.00 sec)
五. limit 限制查询的记录条数
# 从第0开始,即先查询出第0+1条,然后包含这一条在内往后查3条 select * from employee order by salary desc limit 3; # 从第5开始,即先查询出第6条,然后包含这一条在内往后查5条 select * from employee order by salary desc limit 5,5;
标签:rom 通过 单表查询 unique max 限制 命令 指定 str
原文地址:https://www.cnblogs.com/wenxin1120/p/11074003.html