CREATE DATABASE fundb;
-- 数学成绩表
CREATE TABLE t_score_math (
sname varchar(40) ,
score double
);
insert into t_score_math values ('zs',100);
insert into t_score_math values ('ls',69);
insert into t_score_math values ('ww',78);
insert into t_score_math values ('zl',97);
insert into t_score_math values ('lq',58);
CREATE TABLE t_user (
id int(11) NOT NULL AUTO_INCREMENT,
uname varchar(40) DEFAULT NULL,
age int(11) DEFAULT NULL,
sex int(11) DEFAULT NULL,
PRIMARY KEY (id)
);
insert into t_user values (null,'zs',18,1);
insert into t_user values (null,'ls',20,0);
insert into t_user values (null,'ww',23,1);
insert into t_user values (null,'zl',24,1);
insert into t_user values (null,'lq',15,0);
insert into t_user values (null,'hh',12,0);
insert into t_user values (null,'wzx',60,null);
insert into t_user values (null,' lb ',null,null);
更多精彩请访问本文源地址: https://blog.csdn.net/zixiao217 case 函数主要在sql中实现类似于java语言的分支语句的功能。case结合when语句可以灵活的根据字段的所属条件展示不同的内容。
case函数的作用: 可以针对某个字段满足某些条件来显示特定的信息。
简而言之,case函数类似于java中的switch…case语句。
case函数又分为简单case函数、case搜索函数。用的多的一般是case搜索函数,功能更强大,比如可以写一些条件表达式。
简单case函数的语法如下:
CASE 字段
WHEN 值1 THEN 显示值1
WHEN 值2 THEN 显示值2
ELSE 显示其它值 END [as 字段]
说明:当字段值为 值1的时候,则显示值1; 为值2的时候,则显示值2; 否则显示其它值。
缺陷: 只能匹配一个值, 无法使用条件判断。
练习1:从用户表中查询用户的性别信息,1显示男,0表示女,其他值显示其他。
select uname,
case sex
when 1 then '男'
when 0 then '女'
else '其他'
end
from t_user;
练习2: 给练习1的case增加别名:性别
select uname,
case sex
when 1 then '男'
when 0 then '女'
else '其他'
end as '性别'
from t_user;
case搜索函数的语法如下:
CASE WHEN 条件1 THEN 显示值1
WHEN 条件1 THEN 显示值2
ELSE 其他显示值 END [as 字段]
说明:当满足条件1的时候,则显示值1; 当满足条件2的时候,则显示值2;否则显示其他值;也可以在end后面取别名。
优点: 比简单case函数更灵活,可以根据字段满足的条件,显示对应的信息。
注意:case when 子句只会有一个满足,如果满足了第一个,则后面的不会再执行。(回忆一下java的case 值: 表达式; break;
)
练习1:从数学成绩表中查询每个学生的成绩,按以下要求显示信息:
分数 | 显示信息 |
---|---|
90-100 | 优秀 |
80-89 | 良好 |
70-79 | 一般 |
60-69 | 合格 |
60以下 | 不合格 |
select sname,
case when score>=90 then '优秀'
when score>=80 and score<=89 then '良好'
when score>=70 and score<=79 then '一般'
when score>=60 and score<=69 then '合格'
else '不合格'
end
from t_score_math;
练习2:将练习1的case函数显示为"成绩等级"展示:
select sname,
case when score>=90 then '优秀'
when score>=80 and score<=89 then '良好'
when score>=70 and score<=79 then '一般'
when score>=60 and score<=69 then '合格'
else '不合格'
end as 成绩等级
from t_score_math;
case函数的作用
case搜索函数的语法
case
when 条件1 then 值1
when 条件2 then 值2
else 其他值
end [as 字段]
if(expr1,expr2,expr3)
说明: 如果 expr1 是TRUE,则 IF()的返回值为expr2; 否则返回值则为 expr3。if() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
练习1:获取用户的姓名、性别,如果性别为1则显示1,否则显示0;要求使用if函数查询:
SELECT uname, IF(sex, 1, 0) FROM t_user;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PMuDoal2-1571815436897)(img\1571365566405.png)]
ifnull(expr1,expr2)
说明:假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。ifnull()的返回值是数字或是字符串,具体情况取决于其所使用的语境。
练习1:获取用户的姓名、性别,如果性别为null则显示为1;要求使用ifnull函数查询:
SELECT uname, IFNULL(sex, 1) FROM t_user;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-amc3Yqnr-1571815436897)(img\1571365818068.png)]
nullif(expr1,expr2)
说明:如果expr1 = expr2 成立,那么返回值为NULL,否则返回值为 expr1。
如: SELECT NULLIF(1,1); 其结果为null;SELECT NULLIF(1,2); 其结果则为1。
练习1:获取用户的年龄,如果为60,则显示为null;要求使用nullif函数查询:
select uname, nullif(age, 60) from t_user;
if函数的语法
if(exp1, exp2, exp3)
ifnull函数的语法
ifnull(exp1, exp2)
nullif函数的语法
nullif(exp1, exp2)
常见的字符串函数清单如下所示:
函数或操作符 | 描述 |
---|---|
concat(str1, str2, …) | 字符串连接函数,可以将多个字符串进行连接 |
concat_ws(separator, str1, str2, …) | 可以指定间隔符将多个字符串进行连接; |
bin(N) | 得到数值N的二进制表示形式:BIN(12) --》1100 |
format(exp, d) | 返回一个格式化后的字符串;将exp使用指定小数位数d进行四舍五入显示,exp可以是数值也可以是能转换为数值的字符串 |
upper(str) | 得到str的大写形式 |
lower(str) | 得到str的小写形式 |
lpad(str, len, padstr) | 将str填充至len的长度,不足长度的在左边用padstr进行重复填充 |
ltrim(str) | 将str左边的空白符移除 |
rtrim(str) | 将str右边的空白符移除 |
trim(str) | 将str两边的空白符移除 |
substr()、substring() | 获取子串: 1:substr(str, pos) 、substring(str, pos); 2:substr(str, pos, len)、substring(str, pos, len) |
substring_index(str, delim, count) | 在指定数量的分隔符出现之前,从字符串返回子字符串 |
字符串连接函数主要有2个:
函数或操作符 | 描述 |
---|---|
concat(str1, str2, …) | 字符串连接函数,可以将多个字符串进行连接 |
concat_ws(separator, str1, str2, …) | 可以指定间隔符将多个字符串进行连接; |
练习1:使用concat函数显示出 你好,uname 的结果
SELECT CONCAT('你好,' , uname) FROM t_user;
练习2:使用concat_ws函数显示出 你好,uname 的结果
SELECT CONCAT_WS(',', '你好', uname) FROM t_user;
字符串大小写处理函数主要有2个:
函数或操作符 | 描述 |
---|---|
upper(str) | 得到str的大写形式 |
lower(str) | 得到str的小写形式 |
练习1: 将字符串 hello 转换为大写显示
SELECT UPPER('hello'); -- HELLO
练习2:将字符串 heLLo 转换为小写显示
SELECT LOWER('heLLo'); -- hello
格式化函数了解2个:
函数或操作符 | 描述 |
---|---|
bin(N) | 得到数值N的二进制表示形式:BIN(12) --》1100 |
format(exp, d) | 返回一个格式化后的字符串;将exp使用指定小数位数d进行四舍五入显示,exp可以是数值也可以是能转换为数值的字符串 |
练习1:得到数字 12 的二进制形式
SELECT BIN(12); -- 1100
练习2:得到数值 2345.9767 的文本格式化形式,且保留2位小数
SELECT FORMAT('2345.9767', 2); -- 2,345.98
可以对字符串进行按长度填充满、也可以移除空格符
函数或操作符 | 描述 |
---|---|
lpad(str, len, padstr)lower(str) | 将str填充至len的长度,不足长度的在左边用padstr进行重复填充 |
ltrim(str) | 将str左边的空白符移除 |
rtrim(str) | 将str右边的空白符移除 |
trim(str) | 将str两边的空白符移除 |
练习1: 将 t_user表的uname位zs的用户姓名按10位显示,不足的左边填充0
SELECT LPAD(uname, 10, '0') FROM t_user WHERE uname = 'zs'; -- 00000000zs
练习2:将用户id位8的用户的姓名的左边空白符移除
-- 表中数据是:' lb ', 使用ltrim后是: 'lb '
SELECT LTRIM(uname) FROM t_user WHERE id = 8;
练习3:将用户id位8的用户的姓名的右边空白符移除
-- 表中数据是:' lb ', 使用rtrim后是: ' lb'
SELECT RTRIM(uname) FROM t_user WHERE id = 8;
练习3: 将用户id位8的用户的姓名的两边空白符移除
-- 表中数据是:' lb ', 使用trim后是: 'lb'
SELECT TRIM(uname) FROM t_user WHERE id = 8;
字符串也可以按条件进行截取,主要有以下可以截取子串的函数;
函数或操作符 | 描述 |
---|---|
substr()、substring() | 获取子串: 1:substr(str, pos) 、substring(str, pos); 2:substr(str, pos, len)、substring(str, pos, len) |
substring_index(str, delim, count) | 在指定数量的分隔符出现之前,从字符串返回子字符串 |
练习1:获取 hello,world 从第二个字符开始的完整子串
SELECT SUBSTR("hello,world", 2); -- ello,world
练习2:获取 hello,world 从第二个字符开始但是长度为4的子串
SELECT SUBSTR("hello,world", 2, 4); -- ello
练习3:指定数量分隔符操作
SELECT SUBSTRING_INDEX("hello,world. hello,boy.hello,girl!", ".", 1); -- 得到第一个.分隔的前面的所有内容
SELECT SUBSTRING_INDEX("hello,world. hello,boy.hello,girl!", ".", 2); -- 得到第2个.分隔的前面的所有内容
SELECT SUBSTRING_INDEX("hello,world. hello,boy.hello,girl!", ".", 3); -- 个数超过则返回全部
SELECT SUBSTRING_INDEX("hello,world. hello,boy.hello,girl!", ".", -1); -- 得到从尾部开始计数第一个分隔符.后面的所有内容
SELECT SUBSTRING_INDEX("hello,world. hello,boy.hello,girl!", ".", -2); -- 得到从尾部开始计数第2个分隔符.后面的所有内容
SELECT SUBSTRING_INDEX("hello,world. hello,boy.hello,girl!", ".", -3); -- 个数超过则返回全部
说明: SUBSTRING_INDEX 可以用于这类场景, 如果 字段值是 顶级/高级/上级/中级/初级
这种存储形式则很有用处。
mysql提供了一些用于获取特定时间的函数:
函数或操作符 | 描述 |
---|---|
curdate()、cruuent_date() | 获取当前日期,如 2019-10-18 |
current_time(), current_time | 获取当前时:分:秒,如:15:36:11 |
now() | 获取当前的日期和时间,如:2019-10-18 15:37:17 |
sysdate() | 获取当前的日期和时间,如:2019-10-18 15:37:17 |
练习1:获取当前的日期
select curdate();
select cruuent_date();
练习2: 获取当前的时间(仅仅需要时分秒)
select current_time();
select current_time;
练习3: 获取当前时间(包含年月日时分秒)
select now();
select sysdate();
常用的格式化函数如下:
函数或操作符 | 描述 |
---|---|
date_format(date, format) | 将date按指定的格式format显示出来 |
str_to_date(str,format) | 把字符串str根据format格式转换为时间日期,要求str符合format的格式 |
说明符 | 描述 |
---|---|
%d | 月里面的天 (00…31) |
%H | 表示小时 (00…23) |
%h | 表示小时 (01…12) |
%i | 分钟 (00…59) |
%j | 年里面的第多少天 (001…366) |
%m | 月 (00…12) |
%s | 秒(00…59) |
%Y | 年,4位表示如 2019 |
%y | 年,2位如 19 |
练习1: 将当前时间显示成 2019-10-10 14:10:20 的形式
select date_format(now(), '%Y-%m-%d %H:%i:%s');
练习2: 将字符串 2019-10-10 14:10:20 转换为时间日期数据类型
select str_to_date('2019-10-10 14:10:20', '%Y-%m-%d %H:%i:%s');
关于时间日期的运算,常见的有日期的增减等操作,也有一些常见的函数如下表:
函数或操作符 | 描述 |
---|---|
date_add(date, interval expr type) | 日期增加函数; 将date按type类型进行增加expr天; type的值有 DAY、MONTH、YEAR、MINUTE、SECOND、HOUR;如果expr为负数,则变成了减法 |
date_sub(date, interval expr type) | 与date_add类似,只不过是减法运算。如果expr为负数,则变成了加法 |
last_day(date) | 获取date所在月的最后一天的日期形式 |
datediff(expr1, expr2) | expr1减去expr2的天数,仅仅是日期的减法 |
练习1:将当前日期往后加一天,显示其日期时间格式
select date_format(date_add(now(), interval 1 day), '%Y-%m-%d %H:%i:%s');
练习2: 将当前日期往前一天的日期
select date_sub(curdate(), interval 1 day);
练习3:获取当前这个月的最后一天的日期
select last_day(now());
练习4: 中华人民共和国至今成立多少天了?
select datediff(now(), '1949-10-01');
常见的数值相关函数如下表:
函数或操作符 | 描述 |
---|---|
abs(x) | 获取数值x的绝对值 |
ceil(x) | 向上取整,获取不小于x的整数值 |
floor(x) | 向下取证,获取不大于x的整数值 |
pow(x, y) | 获取x的y次幂 |
rand() | 获取一个0-1之间的随机浮点数 |
练习1: 获取 -12 的绝对值
select abs(-12);
练习2: 将 -11.2 向上取整
select ceil(-11.2);
练习3: 将 1.6 向下取整
select floor(1.6);
练习4: 获得2的32次幂的值
select pow(2, 32);
练习5: 获得一个在0-100之间的随机数
select rand()*100;
类型转换函数主要有以下2个:
函数 | 描述 |
---|---|
cast(exp AS type) | 将exp转换为指定类型type |
convert(expr , type) | 将exp转换为指定类型type |
练习1:将字符串转换为无符号整型,使用cast函数
select cast('123' as unsigned int);
练习1:将字符串转换为无符号整型,使用convert函数
select convert('123', unsigned int);
休眠函数如下:
函数 | 描述 |
---|---|
sleep(duration) | 睡眠指定duration秒数 |
练习1: 获取当前时间以及2秒之后的时间
select now(), sleep(2), now();