第六章 SQL查询二(函数)

第六章 SQL查询二

一,MySQL 中的函数

常用的几类函数
字符串函数
用于控制返回给用户的字符串
日期函数
用于操作日期值
数学函数
用于对数值进行代数运算

二,字符串

函数名描  述示  例
CONCAT(s1,s2…,sn)将s1,s2…,sn连接成字符串SELECT CONCAT('a‘,'b‘,‘c’)
LENGTH返回传递给它的字符串长度SELECT LENGTH(‘MySQL 课程’) 返回:12
UPPER把传递给它的字符串转换为大写SELECT UPPER(‘MySQL课程’) 返回:MYSQL 课程
LTRIM清除字符左边的空格SELECT LTRIM (’ 周智宇 ') 返回:周智宇 (后面的空格保留)
RTRIM清除字符右边的空格SELECT RTRIM (’ 周智宇 ') 返回: 周智宇(前面的空格保留)
RIGHT从字符串右边返回指定数目的字符SELECT RIGHT(‘买卖提.吐尔松’,3) 返回:吐尔松
REPLACE替换一个字符串中的字符SELECT REPLACE(‘莫乐可切.杨可’,‘可’,‘兰’) 返回:莫乐兰切.杨兰
INSERT(str,x,y,instr)将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果SELECT INSERT(‘AbcdeFG’,2,4,‘我的音乐我的世界’) 返回:A我的音乐我的世界EFG
 -- 连接字符串
 SELECT CONCAT('a','b','c','d');
 #返回传递给它的字符串长度
SELECT LENGTH("hello word!");
#把传递给它的字符串转换为大写
SELECT UPPER("abcdefg");
 #清除字符左边的空格
SELECT TRIM(' asdasd ');
#从字符串右边返回指定数目的字符
SELECT right('hello word!',3);
#替换一个字符串中的字符
SELECT REPLACE('hello word!','o','0');
#将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
SELECT INSERT('hello word!',3,5,'abcd');

三,日期函数

在这里插入图片描述

#系统时间
SELECT CURDATE();
#当前的日期和时间
SELECT NOW();
#当前的系统时间
SELECT CURTIME();
#将指定的数值添加到指定的日期部分后的日期
SELECT DATE_ADD('2020-03-22',INTERVAL 2 YEAR);
#从日期减去指定的时间间隔
SELECT DATE_SUB('2020-03-22',INTERVAL 2 MONTH);
#格式化日期 y xx Y xxxx
SELECT DATE_FORMAT('2020-03-22','%Y年%m月%d日');
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H:%i:%S');
格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位

四,数学函数

函数名描  述示  例
RAND返回从 0 到 1 之间的随机 float 值SELECT RAND( ) 返回:0.79288062146374
ABS取数值表达式的绝对值SELECT ABS(-43) 返回:43
CEILING取大于或等于指定数值、表达式的最小整数SELECT CEILING(43.5) 返回:44
FLOOR取小于或等于指定表达式的最大整数SELECT FLOOR(43.5) 返回:43
POWER取数值表达式的幂值SELECT POWER(5,2) 返回:25
ROUND将数值表达式四舍五入为指定精度SELECT ROUND(43.543,1) 返回:43.5
SIGN对于正数返回+1,对于负数返回-1,对于0则返回0SELECT SIGN(-43) 返回:-1
SQRT取浮点表达式的平方根SELECT SQRT(9) 返回:3
#返回从 0 到 1 之间的随机 float 值 
SELECT RAND();
#取数值表达式的绝对值
SELECT ABS(-100);
#取大于或等于指定数值、表达式的最小整数
SELECT CEIL(-99.3);
#取小于或等于指定表达式的最大整数
SELECT FLOOR(99.3);
#取数值表达式的幂值
SELECT POWER(5,2);
#将数值表达式四舍五入为指定精度
SELECT ROUND(36.35);
#对于正数返回+1,对于负数返回-1,对于0则返回0
SELECT SIGN(-90);
#取浮点表达式的平方根
SELECT SQRT(9);

五,聚合函数

# 求和  求出所有菜的总价
SELECT sum(price) from menus;
# 求平均值 avg 求出所有菜的平均价格
SELECT	avg(price) from menus;
# 最大值 max 求出所有菜的最高的价格
SELECT max(price) from menus;
#最小值	min 求出所有菜的最低的价格
SELECT min(price) FROM menus;
# count 统计次数  统计有多少个菜品类型是 1(好吃不贵)
SELECT count(*) from menus where typeid=1;

六,DISTINCT关键字

消除结果集中的重复行
对表只选择其某些列时,可能会出现重复行。例如,若对XSCJ数据库的XS表只选择专业名和总学分,则出现多行重复的情况。可以使用DISTINCT或DISTINCTROW关键字消除结果集中的重复行,其格式是:
SELECT DISTINCT | DISTINCTROW column_name [ , column_name…]
其含义是对结果集中的重复行只选择一个,保证行的唯一性。
【例】 对XSCJ数据库的XS表只选择专业名和总学分,消除结果集中的重复行。
SELECT DISTINCT 专业名,总学分
FROM XS;

-- 数据重复
SELECT studentname FROM student where studentname='张三';
-- 去重
SELECT DISTINCT studentname FROM student where studentname='张三';
-- 把studentname,sex 两个都重复的数据去重
SELECT DISTINCT studentname,sex FROM student where studentname='张三';

七,替换查询

替换查询结果中的数据
在对表进行查询时,有时对所查询的某些列希望得到的是一种概念而不是具体的数据。例如查询XS表的总学分,所希望知道的是学习的总体情况,这时,就可以用等级来替换总学分的具体数字。
要替换查询结果中的数据,则要使用查询中的CASE表达式,格式为:
CASE
WHEN 条件1 THEN 表达式1
WHEN 条件2 THEN 表达式2
……
ELSE 表达式
END
【例】 查询XS表中计算机系各同学的学号、姓名和总学分,对其总学分按以下规则进行替换:若总学分为空值,替换为“尚未选课”;若总学分小于50,替换为“不及格”;若总学分在50~52之间,替换为“合格”;若总学分大于52,替换为“优秀”。列标题更改为“等级”。
SELECT学号, 姓名,
CASE
WHEN 总学分 IS NULL THEN ‘尚未选课’
WHEN 总学分 < 50 THEN ‘不及格’
WHEN 总学分 >=50 and 总学分<=52 THEN ‘合格’
ELSE ‘优秀’
END AS 等级
FROM XS
WHERE 专业名=‘计算机’;

#  小于60 不及格 60~80 及格  80~100 优秀
SELECT studentNo,studentresult ,CASE 
	WHEN studentresult>80 and studentresult<=100 THEN
		'优秀'
			WHEN studentresult>=60  THEN
		'及格'
	ELSE
		'不及格'
END as '等级'
from result;

八,分组查询

语法

SELECT …… FROM  <表名>  
WHERE  ……
GROUP BY ……

SELECT COUNT(*) AS 人数, GradeId AS 年级
FROM  Students
 GROUP BY GradeId

-- 每个年级的人数
SELECT COUNT(*),gradeid FROM student GROUP  BY gradeid; 
-- 每个年级的男生女数量

SELECT COUNT(*),gradeid,sex FROM student GROUP  BY gradeid; 
# group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,
#必须出现在 group by 后面
SELECT COUNT(*),gradeid,sex FROM student GROUP  BY gradeid,sex; 

注意

SELECT列表中只能包含:
1、被分组的列
2、为每个分组返回一个值的表达式,如聚合函数

如何查询每门课程的平均分?

-- 如何查询每门课程的平均分?
SELECT   subjectNo,avg(studentresult) '平均分' FROM result GROUP BY subjectNo;

查询每门课程的平均分,并且按照分数由低到高的顺序排列显示

-- 查询每门课程的平均分,并且按照分数由低到高的顺序排列显示 
-- 排序要放在分组后边,否则会报错
SELECT   subjectNo,avg(studentresult) '平均分' FROM result GROUP BY subjectNo ORDER BY avg(studentresult);

有限定条件的查询

-- 分组筛选
-- 如何获得总人数超过15人的年级?
-- 聚合函数在where中无法使用
SELECT COUNT(*),gradeid '年级' FROM student where count(*)>3 GROUP  BY gradeid ; 
-- having 作用是对已经分组的数据进行筛选
SELECT COUNT(*),gradeid '年级' FROM student GROUP  BY gradeid HAVING count(*)>3; 
-- 获得男生人数超过15人的年级
SELECT COUNT(*),gradeid '年级' FROM student where sex='男' GROUP  BY gradeid HAVING count(*)>2;

WHERE与HAVING对比

WHERE子句:
用来筛选 FROM 子句中指定的操作所产生的行
HAVING子句:
用来从分组的结果中筛选行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斑马有点困

原创不易,多谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值