Day03 排序查询、常见函数

排序查询

进阶3: 排序查询
引入:
	SELECT * FROM `employees`;

语法:
	select 查询列表 from 表名 【where 筛选条件】 order by 排序列表 【asc/desc】
特点:
	1asc 代表 升序【低 - 高】,desc 代表 降序【高 - 低】
	2、 如果不写。默认是升序。
	3order by 子句中可以支持单个字段、多个字段、表达式、函数、别名
	4order by 子句一般放在查询语句的最后面,但limit子句除外
*/

#案例1: 查询员工信息,要求工资从高到低排序
SELECT * FROM `employees` ORDER BY`salary` DESC;
SELECT * FROM `employees` ORDER BY`salary`

#案例2: 查询部门编号大于等于90的员工信息,要求按入职时间的先后排序
SELECT * FROM `employees` WHERE `department_id`>=90 ORDER BY `hiredate`;

#案例3: 按年薪的高低显示员工的信息和年薪【按表达式排序】
SELECT *,`salary`*12*(1+IFNULL(`commission_pct`,0))AS 年薪 FROM `employees`  ORDER BY `salary`*12*(1+IFNULL(`commission_pct`,0))DESC;

#案例4: 按年薪的高低显示员工的信息和年薪【按别名排序】
SELECT *,`salary`*12*(1+IFNULL(`commission_pct`,0))AS 年薪 FROM `employees`  ORDER BY 年薪 DESC;

#案例5: 查询按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT LENGTH(`last_name`)AS 字节长度,`last_name`,`salary` FROM `employees` ORDER BY LENGTH(`last_name`);

#案例6: 查询员工信息,要求先按工资升序,再按员工编号降序【按多个字段排序】
SELECT * FROM `employees` ORDER BY `salary`  ASC,`employee_id`DESC

常见函数

概念:	类似于java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名

好处:	1、隐藏了功能的实现细节
	    2、提高了代码的重用性
	 
调用:	select 函数名(实参列表)from 表名】;

特点:	①叫什么(函数名)
	    ②干什么(函数的功能)
	 
分类:	1、单行函数
		功能:	做处理使用
		如concat、length、ifnull等
	 2、分组函数
		功能:	做统计使用,又称统计函数、聚合函数、组函数
		
常见函数:
	一、单行函数
            字符函数:
                length、concat、substr、instr、trim、upper、lower、lpad、rpad、repace
            数学函数:
                round、ceil、floor、truncate、mod
            日期函数:
                now、curdate、curdtime、yearmonth、monthname、dayhourminutesecond、str_to_date、date_format
            其他函数:
                version、databaseuser
            控制函数:
                ifcase
            
   二、分组函数
            分类:
                sum 求和
                avg 平均值
                max 最大值
                min 最小值
                count 计算个数

            特点:
            1、sum、avg一般用于处理数值型
               max、min、count可以处理任何类型
            2、以上分组函数都忽略null3、可以和distinct搭配实现去重运算
            4、count函数的单独介绍
               一般使用count(*)用作统计行数
            5、和分组函数一同查询的字段要求是group by后的字段

1.字符函数

#一、字符函数

#1.length:   获取参数值的字节个数
	SELECT LENGTH("john");

#2.concat:   拼接字符串
	SELECT CONCAT(`last_name`,'_',`first_name`) AS 姓名 FROM `employees`;

#3.upper、lower:   大小写转换
	SELECT UPPER("john");
	SELECT LOWER("JOHN");
	#示例:	将姓变大写,名变小写,然后再拼接
	SELECT CONCAT(UPPER(`last_name`),"_",LOWER(`first_name`)) 姓名 FROM `employees`;
	
#4.substr、substring:	截取字符
	注意:	MySQL中索引从1开始,java从0开始
	#截取从指定索引处到结尾所有字符
	SELECT SUBSTRING("张飞大战奥特曼",5);

	#截取从指定索引处指定字符长度的字符
	SELECT SUBSTRING("张飞大战奥特曼",1,2);
	
	#案例:	姓名中首字符大写,其他字符小写,然后用_拼接,显示出来
	SELECT CONCAT(UPPER(SUBSTR(`last_name`,1,1)),"_",LOWER(SUBSTR(`last_name`,2)))AS out_put FROM `employees`
	
#5.instr   返回子串首次出现的索引位置,如果找不到就返回0
SELECT INSTR("青青草原刘海生","刘海生") AS output;

#6.trim   去除字符前后的空格,或指定的字符
	SELECT TRIM("      阿昌       ") AS output;
	SELECT TRIM("a" FROM "aaaaa阿aaaaa昌aaaa")AS output

#7.lpad   用指定的字符实现左填充指定长度
	SELECT LPAD("鲁智深",8,"*") AS output
	
#8.rpad   用指定的字符实现右填充指定长度
	SELECT RPAD("鲁智深",7,"Ab") AS output	
	
#9.replace   替换
		SELECT REPLACE("外星人外星人关公大战外星人外星人外星人外星人","外星人","曹操") AS output;

2.数学函数

#二、数学函数
#1.round   四舍五入	2,1.67
	SELECT ROUND(1.65);	
	SELECT ROUND(1.6721,2);

#2.ceil   向上取整,返回大于等于该参数的最小整数	2
	SELECT CEIL(1.523);

#3.floor   向下取整,返回小于等于该函数的最大整数	2
	SELECT FLOOR(2.486);

#4.truncate   截断,返回小数点后指定位数之前的数值	11.15
	SELECT TRUNCATE(11.152223,2);

#5.mod   取余	1
	#mod(a,b):	a-a/b*b
	SELECT MOD(10,3);
	SELECT 10%3;

3.日期函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#三、日期函数

	#1.now   返回当前系统日期+时间
		SELECT NOW();
	
	#2.curdate   返回当前系统日期,不包含时间
		SELECT CURDATE();
	
	#3.curtime   返回当前系统时间,不包含日期
		SELECT CURTIME();
		
	#4.可以获取指定的部分,年、月、日、小时、分钟、秒
		SELECT YEAR(NOW()) AS;
		SELECT YEAR(`hiredate`) ASFROM `employees`SELECT MONTH(NOW()) AS;
		SELECT MONTHNAME(NOW()) AS;
	
	#5.str_to_date 将字符通过指定格式转换成日期
		SELECT STR_TO_DATE("1999-3-9","%Y-%c-%d");
		
		#查询入职日期为1992-4-3的员工信息
		SELECT * FROM`employees` WHERE `hiredate` = STR_TO_DATE("4-3 1992","%c-%d %Y");
		
	#6.date_format   将日期转换为字符
		SELECT DATE_FORMAT(NOW(),"%Y年%c月%d日");
		
		#查询有奖金的员工名和入职日期(xx月/xx日 xx年)
		SELECT `last_name`,DATE_FORMAT(`hiredate`,"%c月/%d日 %Y年") FROM `employees` WHERE `commission_pct` IS NOT NULL;

4.其他函数

#四、其他函数
	
	#1.version	查看版本号
		SELECT VERSION();
		
	#2.database	查看当前数据库
		SELECT DATABASE();
	
	#3.user		查看当前用户
		SELECT USER();

5.流程控制函数

#五、流程控制函数

	#1.if函数	实现if else的效果
	SELECT IF(10>5,"大","小");
	SELECT `last_name`,`commission_pct`,IF(`commission_pct`IS NULL,"没奖金","有奖金")AS 备注 FROM `employees`;
	
	#2.case函数
		
		#使用一		类似java中switch case的效果	适合用于等值判断
		
			/*
				java中:
				
					swtich(变量或表达式){
						case 常量1: 语句1;break;
						...
						default:语句n;break;
					}
					
				mysql中:
				
					case 要判断的字段或表达式
					when 常量1 then 要显示的值1或 语句1;
					when 常量2 then 要显示的值2或 语句2;
					...
					else 要显示的值n或 语句n;
					end
			
			*/
			
			/*
			案例:查询员工的工资,要求
						部门号=30,显示的工资为1.1倍
						部门号=40,显示的工资为1.2倍
						部门号=50,显示的工作为1.3倍
						其他的部门,显示为原工资
			*/
			SELECT `salary` AS 原始工资,`department_id`,
			CASE `department_id`
			WHEN 30 THEN `salary`*1.1
			WHEN 40 THEN `salary`*1.2
			WHEN 50 THEN `salary`*1.3
			ELSE `salary`
			END AS 实际工资
			FROM `employees`;
			
		#使用二		类似于java中多重if	适合用于区间判断
		
			/*
			java中:
			
				if(条件1){
					语句1;
				}else if(条件2){
					语句2;
				}
				...
				else{
					语句n;
				}
				
			mysql中:
			
				case
				when 条件1 then 要显示的值1或 语句1;
				when 条件2 then 要显示的值2或 语句1;
				...
				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` 

6.分组函数

#二、分组函数
	/*
	功能: 用作统计使用,又称为聚合函数、统计函数、组函数
	
	分类:
		sum 求和
		avg 平均值
		max 最大值
		min 最小值
		count 计算个数
		
	特点:
	1、sum、avg一般用于处理数值型
	   max、min、count可以处理任何类型
	2、以上分组函数都忽略null值
	3、可以和distinct搭配实现去重运算
	4、count函数的单独介绍
	   一般使用count(*)用作统计行数
	5、和分组函数一同查询的字段要求是group by后的字段
		
	
	
	*/
	
	#1、简单 的使用
	SELECT SUM(`salary`) FROM `employees`;
	SELECT AVG(`salary`) FROM `employees`;
	SELECT MAX(`salary`) FROM `employees`;
	SELECT MIN(`salary`) FROM `employees`;
	SELECT COUNT(`salary`) FROM `employees`;
	
	SELECT SUM(`salary`),ROUND(AVG(`salary`),2) 平均值,MAX(`salary`) 最大值,MIN(`salary`) 最小值,COUNT(`salary`) 数量 FROM `employees`;
	
	#2、参数支持哪些类型
	SELECT SUM(`last_name`),AVG(`last_name`) FROM `employees`;
	SELECT SUM(`hiredate`),AVG(`hiredate`) FROM `employees`;
	
	SELECT MAX(`last_name`),MIN(`last_name`) FROM `employees`;
	SELECT MAX(`hiredate`),MIN(`hiredate`) FROM `employees`;	
	
	SELECT COUNT(`last_name`) FROM `employees`;
	SELECT COUNT(`commission_pct`) FROM `employees`;
	
	#3、是否忽略null值
	SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM `employees`;
	SELECT MAX(commission_pct),MIN(commission_pct) FROM `employees`;
	SELECT COUNT(commission_pct) FROM `employees`;
	
	#4.和distinct搭配
	SELECT SUM(DISTINCT `salary`),SUM(`salary`) FROM `employees`;
	SELECT COUNT(DISTINCT `salary`),COUNT(`salary`)FROM `employees`;
	
	#5.count函数的详细介绍
	SELECT COUNT(`salary`) FROM `employees`;
	SELECT COUNT(*) FROM `employees`;
	SELECT COUNT(1) FROM `employees`;
	
	效率:
	MYISAM存储引擎下,COUNT(*)效率最高
	INNODB存储引擎下,COUNT(*)COUNT(1)效率差不多,比COUNT(字段)要高一些
	
	#6.和分组函数一同查询的字段有限制
	SELECT AVG(`salary`),`employee_id` FROM `employees`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值