MySQL单表查询看这一篇文章就够了( 二 )

应用排序查询【MySQL单表查询看这一篇文章就够了】关键字: ORDER BY 字段1 DESC, 字段2 ASC
#排序查询格式:select 字段|* from 表名 [where 条件过滤] [order by 字段[ASC][DESC]] 升序:ASC 默认为升序降序:DESCPS:排序order by 要写在select语句末尾 #按人员工资正序排列,注意:此处可以省略 ASC关键字select * from company_staff order by salary ASC;select * from company_staff order by salary; #工资大于12000的人,按工资倒序排列select * from company_staff where salary >12000 order by salary DESC; #按中文排序select * from company_staff order by name; #强制中文排序select * from company_staff order by CONVERT(name USING gbk);ps:UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的 。你需要强制让MySQL按中文来排序聚合函数汇总聚合: 将分散的聚集到一起. 
聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值

  • COUNT:统计指定列不为NULL的记录行数;
  • SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  • MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  • MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  • AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
#格式:select 聚合函数(字段) from 表名; #统计人员中最大年龄、最小年龄,平均年龄分别是多少select max(age),min(age),avg(age) from company_staff;分组查询方法分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等
怎么区分什么时候需要分组呢?
套路: 遇到 "每" 字,一般需要进行分组操作.
例如: 1. 公司每个部门有多少人.
2. 公司中有 多少男员工 和 多少女员工.
#分组查询格式:select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]ps: 分组查询可以与 聚合函数 组合使用.#查询每个部门的平均工资select avg(salary),dept from company_staffGROUP BY dept;#查询每个部门的平均薪资 并且看看这个部门的员工都有谁?select avg(salary),dept,GROUP_CONCAT(name) from company_staff GROUP BY dept;#GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来#查询平均薪资大于15000的部门, 并且看看这个部门的员工都有谁?select avg(salary),dept,GROUP_CONCAT(name) from company_staff GROUP BY dept; having avg(salary)>10000;where 与 having区别
执行优先级从高到低:where > group by > having
Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数 。
Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
分页查询方法好处:限制查询数据条数,提高查询效率
#查询前2条数据select * from company_staff limit 2; #查询第3条到第7条数据select * from company_staff limit 3,7; #查询第10条到第15条数据select * from company_staff limit 10,5; ps: limit (起始条数),(查询多少条数);正则表达式方法MySQL中使用 REGEXP 操作符来进行正则表达式匹配 。
MySQL单表查询看这一篇文章就够了

文章插图
 
# ^匹配 name 名称 以 "L" 开头的数据select * from company_staff where name REGEXP '^L'; # $匹配 name 名称 以 "m" 结尾的数据select * from company_staff where name REGEXP 'm$'; # . 匹配 name 名称 第二位后包含"f"的人员 "."表示任意字符select * from company_staff where name REGEXP '.f'; # [abci] 匹配 name 名称中含有指定集合内容的人员select * from company_staff where name REGEXP '[lmns]'; # [^Tom] 匹配 不符合集合中条件的内容 , ^表示取反select * from company_staff where name REGEXP '[^Tom]';#注意1:^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配#注意2 : 简单理解 nameREGEXP '[^Tom]' 等价于 name != 'Tom' # 'l|s' 匹配 条件中的任意值select * from company_staff where name REGEXP 'l|s';#查询以L开头以s结尾的数据select * from company_staff where name regexp '^L.*s$';#注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾SQL 语句关键字的执行顺序查询:姓名不同人员的最高工资,并且要求大于12500元,同时按最高工资进行排序并取出前3条.
select name, max(salary)from company_staffwhere name is not nullgroup by namehavng max(salary) > 12500order by max(salary)limit 0,3


推荐阅读