mysql--函数
合计/统计函数
- 使用的表材料
-- 演示mysql的统计函数
# 1.统计一个班级有多少个学生
SELECT COUNT(*) FROM student;
# 2.统计数学成绩>90的学生有多少个
SELECT COUNT(*) FROM student
WHERE math>90;
# 3.统计总分大于250的人数有多少
SELECT COUNT(*) FROM student
WHERE (chinese+math+english)>250;
count(*)和count(列)的区别
-
count(*):返回满足条件的记录的行数
-
count(列):统计满足条件的某列有多少个,但是会排除为null
-
表中的数据
-- count(*):返回满足条件的记录的行数
-- count(列):统计满足条件的某列有多少个,但是会排除为null
CREATE TABLE test2(
`name` VARCHAR(20));
INSERT INTO test2 VALUES('tom');
INSERT INTO test2 VALUES('bob');
INSERT INTO test2 VALUES('mary');
INSERT INTO test2 VALUES('jack');
INSERT INTO test2 VALUES(NULL);
# 1.使用count(*)
SELECT COUNT(*) FROM test2;-- 5
# 2.使用count('name')
SELECT COUNT(`name`) FROM test2;-- 4 会排除null
-- 其实记录的行数和列的行数都是一样的,因为查询列的行数回排除列值为Null的情况
统计函数Sum
- 表中的数据
-- 演示sum函数的使用
-- 1.统计一个班级数学总成绩
SELECT SUM(math) FROM student;
-- 2.统计一个班级语文 数学 英语各科的总成绩
SELECT SUM(math),SUM(chinese),SUM(english) FROM student;
-- 3.统计一个班级语文 数学 英语 数学的成绩总和
SELECT SUM(math+chinese+english)AS total FROM student;
-- 4.统计一个班级语文成绩的平均分
SELECT SUM(chinese)/COUNT(*) FROM student;
注意:
该函数仅仅只对数值起作用,对非数值没有意义
合计函数 avg
- 表中的数据
-- 演示avg的使用
-- 1.求一个班数学成绩的平均分
SELECT AVG(math) FROM student;
-- 2.求一个班总分平均分
SELECT AVG (math+english+chinese)AS '总分平均分' FROM student;
合计和函数Max/Min
- 表中的数据
-- Max/Min的使用演示
-- 1.求班级总分的最高分和最低分(函数可以同时使用多个用,隔开)
SELECT MAX(math+english+chinese)AS'总分最高分',
MIN(math+english+chinese)AS'总分最低分' FROM student;
分组统计
-
测试数据
-
部门表
-
雇员表emp
- 工资级别表
对于分组查询不是很理解,在此标记
字符串相关的函数
黑色标识的用到不是很多
- 拼接结果显示
-- 演示字符串函数的使用
-- 1.CHARSET(str)返回字串字符集(括号里面为是字符串的字段名)
SELECT CHARSET(user_name) FROM employee;
-- 2.CONCAT(String2[,...])连接字符串,将多个列拼接成一列
SELECT CONCAT(user_name,'工作是',job ) FROM employee;
-- 3.INSTR(String,substring)返回subString在string中的出现的位置,没有则返回0
-- dual亚元表,系统表,可以作为测试表使用
SELECT INSTR('天下第一','天') FROM DUAL;-- 输出1
-- 5 ucase(String2)转成大写
SELECT UCASE(user_name) FROM employee;
-- 6.Lcase(str)转成小写
SELECT LCASE(user_name) FROM employee;
-- 7.LEFT(String2,length)从String2的左边起取length个字符,然后显示
-- RIGHT(String,length) 从右边取length个字符出来
SELECT LEFT(user_name,2) FROM employee;
-- 8.LENGTH(String)统计string的长度怕[按照字节]
SELECT LENGTH(user_name) FROM employee;
-- 9.REPLACE(str,search_str,replace_str)(将str中的search_str替换成replace_str)
SELECT REPLACE(user_name,'石','王') FROM employee;
SELECT REPLACE (user_name,"石文涛","天才") FROM employee;-- 为石文涛则替换成天才
-- 10. STRCMP(String1,string2)逐个字符比较两字符的大小(相同返回0不相同返回-1)
SELECT STRCMP('hello','helo') FROM employee;
-- 11.SUBSTRING(str,position[,length])
-- 从str的position开始【从1开始算】,取length个字符 并返回
SELECT SUBSTRING("hello",1,2) FROM DUAL;
-- 12.LTRIM(String)去除左边的空格
-- RTRIM(String)去除右边的空格
-- TRIM去除前端和后端的空格
SELECT LTRIM(" hlello") FROM DUAL;
SELECT RTRIM( " 天才 " ) FROM DUAL;
SELECT TRIM(" 大聪明 ") FROM DUAL;
SELECT * FROM employee;
字符串函数练习
- 实验数据表
注意这里的下面都是从1开始的,而不是从0开始
-- 注意:substring第三个参数不写则是默认取出从指定下标开始的所有
SELECT CONCAT (UCASE( SUBSTRING(user_name,1,1)),
SUBSTRING(user_name,2,LENGTH(user_name)-1)) FROM employee;
- 运行结果
该题还有其他的实现思路 如repalce 等
数学函数
-- 演示数学相关的函数
-- 1.ABS(num)绝对值
SELECT ABS(-10) FROM DUAL;-- 将会显示10
-- 2.BIN(decimal_number)-- 十进制转二进制
SELECT BIN(10) FROM DUAL;
-- 3.ceiling(number)向上取整,得到比number大的最小整数(负数也一样)
SELECT CEILING(2.2) FROM DUAL;
-- 4.conv(number ,from_base,to_base)进制转换
-- 下面含义:是十进制的8,转成二进制输出
SELECT CONV(8,10,2) FROM DUAL;
-- 5.floor(number)向下取整,得到比number小的最大整数
SELECT FLOOR(1.1) FROM DUAL;
-- 6.format(number,decimal_places)保留小数位(会进行四舍五入保留)
SELECT FORMAT(1.23556,2) FROM DUAL;
-- 7.hex(decimalNumber)转十六进制
-- 8.least(number,number1[,...])求多个里面的最小值
SELECT LEAST(0,9,-1,-98) FROM DUAL;-- -98
-- 9 .mod(10,3) 取余
SELECT MOD(10,3) FROM DUAL;
-- 10.rand([seed]) 返回随机数 其范围为 0=<v<=1.0
SELECT RAND() FROM DUAL;-- 每次运行将得到(0.1.0)的随机数
-- 将rand()加上随机数种子 seed,则将每次获取固定的随机数
SELECT RAND(3) FROM DUAL; -- 种子的值什么都行,但是种子换了返回的值就会变,否则不变
日期函数1
- 基本使用
-- 演示日期相关的函数
-- 1.current_date() 当前日期
SELECT CURRENT_DATE() FROM DUAL;-- 2023-04-05
-- 2.current_time()当前时间
SELECT CURRENT_TIME() FROM DUAL;-- 15:14:45
-- 3.current_timestamp()当前实践戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;-- 2023-04-05 15:15:38
进阶使用---使用函数填充插入的值
-- 创建信息表
CREATE TABLE mes(
id INT,
content VARCHAR(30),
sent_time DATETIME);-- 消息的发送时间
-- 使用函数填充
INSERT INTO mes VALUES(1,'北京新闻',CURRENT_TIMESTAMP());
SELECT * FROM mes;
综合应用
-- 演示日期相关的函数
-- 1.current_date() 当前日期
SELECT CURRENT_DATE() FROM DUAL;-- 2023-04-05
-- 2.current_time()当前时间
SELECT CURRENT_TIME() FROM DUAL;-- 15:14:45
-- 3.current_timestamp()当前实践戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;-- 2023-04-05 15:15:38
-- 1.now()返回当前的日期+时间
SELECT NOW() FROM DUAL;-- 2023-04-05 15:32:49
-- 创建信息表
CREATE TABLE mes(
id INT,
content VARCHAR(30),
sent_time DATETIME);-- 消息的发送时间
-- 使用函数填充
INSERT INTO mes VALUES(1,'北京新闻',CURRENT_TIMESTAMP());
INSERT INTO mes VALUES(2,'上海新闻',NOW());
INSERT INTO mes VALUES(3,'广州新闻',NOW());
INSERT INTO mes VALUES(4,'天津新闻',CURRENT_DATE());
-- 1.显示所有的新闻信息,发布日期只显示日期,不显示时间
SELECT id,content,DATE(sent_time) FROM mes;
-- 2.请查询十分钟内发布的新闻
-- 在发布时间上+10和现在时间做比较即可
SELECT * FROM mes
WHERE DATE_ADD(sent_time,INTERVAL 10 MINUTE)>=NOW();
-- 也可以使用date_sub来实现
SELECT * FROM mes
WHERE sen_time >=DATE_SUB(NOW(),INTERVAL 10 MINUTE)
-- 3.请在mysql的sql语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11','1990-1-1')FROM DUAL;
-- 4.使用sql语句求出你活了多少天
SELECT DATEDIFF(NOW(),'2001-4-26') FROM DUAL;//8014
-- 5.如果你会活到80岁,求出你还能活多少天
-- 先求出活到80岁的时的日期,再和现在的日期相减
SELECT DATEDIFF(DATE_ADD('2001-4-26',INTERVAL 80 YEAR),NOW());
日期相关函数的使用细节
日期函数3
-- 1.year|month|day|date(datetime)
SELECT NOW() FROM DUAL;
SELECT YEAR('2022-11-23') FROM DUAL;
SELECT YEAR(NOW()) FROM DUAL;-- 只会返回当前的年
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
-- 2.unix_timestamp()返回1970-1-1到现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL; -- 1680685199
-- 3.from_unixtime:可以把一个unix_timestamp秒数,转换成指定格式的日期
# %Y %m %d %i %H等都是已经规定好的
-- 该函数的意义:再开发中,可以存放一个整数表示时间,通过
-- from_unixtime进行转换
SELECT FROM_UNIXTIME(12343355,'%Y-%m-%d') FROM DUAL;-- 1970-05-24
SELECT FROM_UNIXTIME(12343355,'%Y/%m/%d %H:%i:%s')FROM DUAL;-- Y-05-24 04:42:35
加密函数和系统函数
-- 演示加密函数和系统函数
-- 1.user()查询用户(可以查询登录到mysql有那些用户和所登录的ip)
SELECT USER() FROM DUAL;-- 返回登录mysql的用户名和ip地址(root@localhost)
-- 2.database()查询当前使用数据库的名称
SELECT DATABASE() FROM DUAL;
-- 3.md5()为字符串算出一个md5 32位的字符串,常用于(用户密码)加密
SELECT MD5('hsp') FROM DUAL;-- 数据库中真正存储的-》c435a9810009800cafef7dce3b7844a6
# root密码是hsp->加密md5-->数据库中存储的是加密后的32位的md5
-- 演示用户表存放密码
CREATE TABLE hsp_user1(
id INT ,
`name` VARCHAR(30) NOT NULL DEFAULT '',
`password` CHAR(32) NOT NULL DEFAULT '');
INSERT INTO hsp_user1 VALUES(1,"石文涛",MD5(123456));-- 将加密后的密码存入到数据库中
SELECT * FROM hsp_user1;-- 查询的密码:e10adc3949ba59abbe56e057f20f883e
-- select * from hsp_user1 where `name` = '石文涛' and `password` = '123456';-- 这样将查询不出来
-- 这样可以查询出来 select * from hsp_user1 where `name` = '石文涛' and `password`= md5(123456);
# 3.password(str)加密函数,mysql数据库的用户密码就是password函数加密的
SELECT * FROM mysql.user;-- 使用这个可以直接查询mysql的用户信息
SELECT PASSWORD('123456') FROM DUAL;-- $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED
流程控制函数 、
-- 演示流程控制语句
#1.if(expr1,expr2,expr3)如果expr1为true,则返回expr2否则返回expr3
SELECT IF(TRUE,'北京','上海')FROM DUAL;-- 北京
#2.ifnull(expr1,expr2)如果expr1不为空返回expr1,否则返回expr2
SELECT IFNULL(NULL,0.0);-- 0.0
#3.case when expr1 then expr2 when expr3 then expr4 else end(类似多重分支)
-- 如果expr1为真,则返回expr2,如果expr3为真返回 expr4,否则返回expr5
SELECT CASE
WHEN TRUE THEN 'jack'-- 输入jack(和swich类似)
WHEN TRUE THEN 'tom'
ELSE 'marry' END
-- 1.查询emp表,如果comm是null,则显示0.0
-- 说明:判断是否为Null,要使用is null,判断不为空,使用 is not null
SELECT ename,IF(comm IS NULL ,0.0,comm)-- 写法一
FROM emp;
SELECT ename,IFNULL(comm,0.0)FROM emp-- 写法二 更简单
-- 2.如果 emp表的job是clerk则显示职员,如果是manager则显示经理
-- 如果是salesman则显示销售人员,其他正常显示
SELECT ename,(SELECT CASE
WHEN job = 'CLERK' THEN '职员'
WHEN job = 'MANAGER ' THEN '经理'
WHEN job = 'SALESMAN' THEN '销售人员' )AS 'job'
FROM emp;
-- 括号里面相当于对该该表的所有记录的job进行判断