#排序查询 语法: #执行顺序 select 查询列表 3 from 表 1 【where 筛选条件】2 order by 排序列表【asc|desc】asc升序desc降序;默认升序排序,可以不用ASC关键字 4 特点: 1、order by 子句中可以支持单个字段、多个字段、表达式、函数、别名 2、order by子句一般是放在查询语句的最后面,但limit子句除外 #案例1:查询员工信息,要求工资从高到低排序 SELECT * FROM employees ORDER BY salary DESC; #案例2:按年薪的高低显示员工信息和年薪(按表达式排序)也可以用别名 SELECT *,salary12(1+IFNULL(commission_pct,0))年薪 FROM employees ORDER BY salary12(1+IFNULL(commission_pct,0)) DESC; 或者 ORDER BY 年薪 DESC; #案例3:按姓名的长度显示员工的姓名和工资(按函数排序) SELECT LENGTH(last_name)字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC; #案例4:查询员工信息,要求先按工资排升序,再按员工编号排降序(按多个字段排序) SELECT * FROM employees ORDER BY salary ASC,employee_id DESC; #案例5:查询邮箱中包含a的员工信息,并先按邮箱的字节数降序,再按部门号升序 SELECT * FROM employees WHERE email LIKE ‘%a%’ ORDER BY LENGTH(email) DESC,department_id ASC;
#常见函数 函数功能:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名 好处:1、隐藏了实现细节;2、提高代码的重用性 调用:SELECT 函数名(实参列表) 【FROM 表】;(当函数中的参数用到了表中的字段时,需要加FROM 表) 特点:函数名;函数功能 分类: 1、单行函数 如concat、length、ifnull等(传过一个参数,进行处理得到返回值) 2、分组函数 功能:做统计使用,又称为统计函数、聚合函数、组函数(传过一组值,进行处理得到返回值) 1、单行函数 一、字符函数 1、LENGTH() #获取参数值的字节个数 #分字符集:utf8下:一个字母占一个字节,一个汉字占三个字节 gbk下:一个字母占一个字节,一个汉字占两个字节 SHOW VARIABLES LIKE ‘%char%‘ 展示客户端所用字符集 2、CONCAT() #拼接字符串 3、UPPER()/LOWER() #将字符参数变大写/小写 #案例1、将姓变大写,名变小写,然后拼接 SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees; 4、substr/substring 截取字符串 注意:索引从1开始 #截取从索引开始后面所有的字符 SELECT SUBSTR(‘李莫愁爱上了陆展元’,7) out_put; #输出结果:陆展元 #截取从指定索引处指定长度的字符 SELECT SUBSTR(‘李莫愁爱上了陆展元’,1,3) out_put; #输出结果:李莫愁 案例2:姓名中首字符大写,其他字符小写然后用_拼接,显示出来 SELECT CONCAT(UPPER(SUBSTR(lastname,1,1)),’’,LOWER(SUBSTR(last_name,2))) out_put FROM employees; 5、INSTR SELECT INSTR(‘杨不悔爱上了殷六侠’,’殷六侠’) AS out_put; #输出结果:7;返回子串在大的字符串中的第一次出现的起始索引,如果找不到返回0 6、TRIM #默认去掉字符前后空格 SELECT TRIM(‘ 张翠山 ’) AS out_put; SELECT TRIM(‘a’ FROM ‘aaaaa张aaaaaa翠山aaaaaaa’) AS out_put; #去掉字符前后以’a’出现的字符 7、LPAD #用指定的字符实现左填充指定字符长度 SELECT LPAD(‘殷素素’,10,’*’) AS out_put; #输出结果:*殷素素 SELECT LPAD(‘殷素素’,2,’*’) AS out_put; #输出结果:殷素;超出就截断 8、RPAD #用指定的字符实现右填充指定字符长度 9、replace SELECT REPLACE(‘张无忌爱上了周芷若’,’周芷若’,’赵敏’) AS out_put; #将’周芷若’替换成’赵敏’ 二、数学函数 1、round 四舍五入 #默认取整 SELECT ROUND(-1.55); #输出结果:-2 SELECT ROUND(1.567,2); #输出结果1.57;保留两位小数 2、ceil #向上取整,返回>=该参数的最小整数 SELECT CEIL(1.001); #输出结果:2 3、floor #向下取整,返回<=该参数的最大整数 SELECT FLOOR(9.99); #输出结果:9 4、truncate #截断 SELECT TRUNCATE(1.69,1); #输出结果:1.6 5、mod #取余 MOD(a,b)相当于 a-b*floor(a/b) SELECT MOD(10,3); 输出结果:1 相当于 SELECT 10%3; 6、rand #获取随机数,返回0-1之间的小数 三、日期函数 1、now #返回当前系统日期+时间 SELECT NOW(); 2、curdate #返回当前系统日期,不包含时间 SELECT CURDATE(); 3、curtime #返回当前系统时间,不包含日期
#可以获取指定的部分,年、月、日、时、分、秒 SELECT YEAR(NOW()) 年; SELECT YEAR(‘1998-1-1’) 年; SELECT YEAR(hiredate) 年 FROM employees; #查找输入字段名中的年 SELECT MONTH(NOW()) 月; SELECT MONTHNAME(NOW()) 月名; #输出当前的月份英文名 4、str_to_date #将日期格式的字符转换成指定格式的日期 SELECT STR_TO_DATE(‘9-13-1999’,‘%m-%d-%Y’); #用右边的格式去解析左边的字符,告诉每个位置的意义;输出结果:1999-09-13 #查询入职日期为1992-4-3的员工信息 SELECT * FROM emplyees WHERE hiredate = ‘1992-4-3’; 对于特殊情况,如: SELECT * FROM employees WHERE hiredate = STR_TO_DATE(‘4-3 1992’,‘%c-%d %Y’); 5、date_format #将日期转换成字符 SELECT DATE_FORMAT(‘2018/6/6’,‘%Y年%m月%d日’); #输出结果2018年06月06日 #查询有奖金的员工名和入职日期(xx月/xx日 xx年) SELECT last_name,DATE_FORMAT(hiredate,‘%m月/%d日 %Y年’) 入职日期 FROM employees WHERE commission_pct IS NOT NULL; 6、monthname #以英文形式返回月 四、其他函数 SELECT VERSION(); SELECT DATADASE(); #查看当前的数据库 SELECT USER(); #查看当前的用户 SELECT password(‘字符’) #返回该字符的密码形式,即自动加密 还有md5(‘字符’) #md5加密 五、流程控制函数 1、if函数 #if else 的效果 SELECT IF(10>5,’大’,’小’); #第一个表示条件表达式,成立返回第二个值,不成立返回第三个值 SELECT IF(commission_pct IS NULL,’没奖金’,’有奖金’) FROM employees; 2、case函数 特点: 1、如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case;如果都不满足,则执行else中的语句或值 2、else可以省略,如果else省略了,并且所有when条件都不满足,则返回null 使用1:switch case的效果 (主要处理等值判断) /* 类似于java中的switch语句 Java中 switch(变量或表达式)( case 常量1:语句1;break; … default:语句n;break; ) Mysql中 case既可以搭配着select当表达式使用,又可以自己单独当一条语句。 case 要判断的变量、字段或表达式 when 常量1 then 要显示的值1或 语句1;(是值时不用放分号;搭配SELECT用值,单独用时用语句) when 常量2 then 要显示的值2或 语句2; … else 要显示的值n或 语句n; end */ 案例:查询员工的工资 要求:部门号=30,显示的工资为1.1倍;部门号=40,显示的工资为1.2倍;部门号=50,显示的工资为1.3倍;其他部门,显示的工资为原工资。 SELECT salary 原始工资,department_id, CASE department_id #这里的case是作为SELECT的值来使用,所以一定要在上一个值后面加逗号 WHEN 30 THEN salary*1.1 WHEN 40 THEN salary*1.2 WHEN 50 THEN salary1.3 ELSE salary END AS 新工资 FROM employees; 使用2:类似于多重if (判断区间,大于小于等) / Java中 if(条件1){ 语句1; }else if(条件2){ 语句2; } … else{ 语句n; } Mysql中: case when 条件1 then 要显示的值1或 语句1;(是值时不用放分号;搭配SELECT用值,单独用时用语句) when 条件2 then 要显示的值2或 语句2; … else 要显示的值n或 语句n; end */ #案例:查询员工工资的情况 如果工资>20000,显示A级别 如果工资>15000,显示B级别 如果工资>10000,显示C级别 否则,显示D级别
SELECT salary, CASE WHEN salary>20000 THEN ‘A’ WHEN salary>15000 THEN ‘B’ WHEN salary>10000 THEN ‘C’ ELSE ‘D’ END AS 工资级别 FROM employees; #案例:将员工的姓名按首字母排序,并写出姓名的长度 SELECT LENGTH(last_name) 长度,SUBSTR(last_name,1,1)首字符,last_name FROM employees ORDER BY 首字符; #如果按ORDER BY last_name排序则结果稍有不同,因在首字母相同的情况下,last_name会接着按第二个字母排序

2、分组函数 /* 功能:做统计使用,又称为统计函数、聚合函数、组函数(传过一组值,进行处理得到返回值) 分类:sum 求和、avg 平均值、max最大值、min 最小值、count 计算个数 特点:可以和distinct搭配实现去重的运算;一般使用COUNT()用作统计行数;和分组函数一同查询的字段要求是group by后的字段 / 一、简单使用 SELECT SUM(salary) FROM employees; #对salary字段所有的值进行求和运算 SELECT SUM(salary), AVG(salary) FROM employees; #也可以嵌套其他函数使用 SELECT SUM(salary), ROUND(AVG(salary), 2) FROM employees; #对平均工资进行两位小数点四舍五入保留 二、参数支持的类型 sum 求和、avg平均值 #一般用于处理数值型,忽略null值 max 最大值、min最小值、count 计算个数 #可以用于处理任何类型,忽略null值 count 计算个数 #计算非空(非 null)值的个数 三、和distinct搭配 如:SELECT SUM(DISTINCT salary) FROM employees; 四、count函数的详细介绍 SELECT COUNT(*) FROM employees; #计算表的行数,在统计时只要一行不为空则进行加一 SELECT COUNT(1) FROM employees; #相当于在表中加了一列常量值(可以为任何值,如:1、5、’数据’等),并统计出常量值的个数即表的行数
效率: MYISAM存储引擎下,COUNT()的效率高 INNODB存储引擎下,COUNT()和COUNT(1)的效率差不多,比COUNT(字段)要高一些(因要判断字段的值是否为null) 五、和分组函数一同查询的字段有限制 因查询的结果必须是一个规则的表格 案例:查询员工表中的最大入职时间和最小入职时间的相差天数(DIFFRENCE) DATEDIFF:日期函数,可以求出两个时间的相差天数 SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) DIFFRENCE FROM employees; 案例:查询部门编号为90的员工个数 SELECT COUNT(*) FROM employees WHERE department_id = 90;
欢迎大家关注公众号“拾月小白的算法小屋”:
交流学习!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/154051.html