MySQL—常见函数(三)

一、数据准备

-- 数据准备
-- 1 创建学生表
CREATE TABLE `customer` (
  `id` varchar(30),
  `name` varchar(30),
  `age` int,
  `email` varchar(20),
  `birthday` date
);
-- 1.1 插入数据
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10002', 'Jerry', '22', 'jerry@sohu.com', '2023-01-08');
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10004', '孙行者', '100', 'xzsun@qq.com', '1997-11-21');
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10006', '行者孙', '39', '', '1979-12-31');
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10010', '行者孙孙', '44', 'hongxiao@sohu.com', '1978-03-15');
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10012', NULL, '44', 'hongxiao@sohu.com', '1972-03-15');
INSERT INTO `canada_sql`.`customer` (`id`, `name`) VALUES ('1003', '孙悟空');
INSERT INTO `canada_sql`.`customer` (age,birthday) VALUES (18,'2022-12-21');

二、实操练习

-- 实操练习
-- 1 字符函数
-- 1.1 大小写控制函数
-- 1.1.1 小写函数 LOWER(str)
SELECT LOWER("JERRY");
-- 1.1.2 大写函数 UPPER(str)
SELECT UPPER("jerry");
-- 1.2 字符控制函数
-- 1.2.1 连接字符串函数 CONCAT(str1,str2,...): str1+str2+...
SELECT CONCAT("你好!","Jerry!");
-- 1.2.1.1 SUBSTR(str,pos):  str-被截取字段  pos-从第几位开始截取
SELECT SUBSTR("hello-jerry!",5) -- 结果:o-jerry!
-- 1.2.1.2 SUBSTR(str,pos,len) str-被截取字段  pos-从第几位开始截取 len-截取长度
SELECT SUBSTR("hello-jerry!",5,3); -- 结果:o-j
-- 或
SELECT SUBSTR("hello-jerry!" FROM 5 FOR 3);
-- 1.2.2 获取字符串长度:LENGTH(str)
SELECT LENGTH("hello-jerry!");
-- 1.2.3 INSTR(str,substr):获取子串substr第一次出现在str中的位置,如果没有找到则返回0
SELECT INSTR("123456","4"); 
-- 1.2.4 LPAD(str,len,padstr):左边填充   str-要处理的对象 len-处理完后的str长度为len padstr-如果str的长度小于len指定的值,那么长度差由padstr在左边填充;如果str的长度大于len指定的值,则截取str到len指定的长度。 
-- 1.2.4.1 str的长度小于len指定的值,那么长度差由padstr在左边填充
SELECT LPAD("12345",7,"*");
-- 1.2.4.2 str的长度大于len指定的值,则截取str到len指定的长度
SELECT LPAD("12345",4,"*");
-- 1.2.5 RPAD(str,len,padstr):右边填充   str-要处理的对象 len-处理完后的str长度为len padstr-如果str的长度小于len指定的值,那么长度差由padstr在右边填充;如果str的长度大于len指定的值,则截取str到len指定的长度。 
-- 1.2.5.1 str的长度小于len指定的值,那么长度差由padstr在右边填充
SELECT RPAD("12345",7,"*");
-- 1.2.5.2 str的长度大于len指定的值,则截取str到len指定的长度
SELECT RPAD("12345",4,"*");
-- 1.2.6 TRIM()
-- 1.2.6.1 TRIM(str):删除指定字符串str中的首尾空格
SELECT TRIM("  xxx123456xxx  ");
-- 1.2.6.2 TRIM(LEADING remstr FROM str):删除指定的首字符
SELECT TRIM(LEADING "x" FROM "xxx123x456xxx");
-- 1.2.6.3 TRIM(TRAILING remstr FROM str):删除指定的尾字符
SELECT TRIM(TRAILING "x" FROM "xxx123x456xxx");
-- 1.2.6.4 TRIM(BOTH remstr FROM str):删除指定的首尾字符
SELECT TRIM(BOTH "x" FROM "xxx123x456xxx");
-- 或者 省略掉"BOTH"
SELECT TRIM("x" FROM "xxx123x456xxx");
-- 1.2.7 REPLACE(str1,str2,str3):将str1中的str2字符替换为str3
SELECT REPLACE("abcd","b","mm");
-- 1.3 数字函数
-- 1.3.1 ROUND():用于对数字四舍五入
-- 1.3.1.1 ROUND(X,D):X指要处理的数,D是指保留几位小数
SELECT ROUND(1.123456,2);
-- 1.3.1.2 ROUND(X):其实就是round(x,0),也就是默认d为0
SELECT ROUND(1.123456);
-- 1.3.2 TRUNCATE(X,D):X是数值,D是保留小数的位数,就是按照小数位数,进行数值截取(此处的截取是按保留位数直接进行截取,没有四舍五入)
-- 1.3.2.1 当 D 大于0,是对数值 X 的小数位数进行操作
SELECT TRUNCATE(111.567,2);
-- 1.3.2.2 当 D 等于0,是将数值 X 的小数部分去除,只保留整数部分;
SELECT TRUNCATE(111.567,0);
-- 1.3.2.3 当 D 小于0,是将数值 X 的小数部分去除,并将整数部分按照D指定位数,用0替换
SELECT TRUNCATE(111.567,-1);
-- 1.3.3 MOD(x,y):返回 x 被 y 除后的余数
SELECT MOD(1600,300);
-- 1.4 日期函数
-- 1.4.1 NOW():获取当前时间
SELECT NOW();
-- 1.4.2 STR_TO_DATE(str,format):将日期转换成指定格式format
SELECT STR_TO_DATE(NOW(),"%Y-%m-%d");
SELECT STR_TO_DATE("2012-12-21 12:59:12","%Y-%m-%d");
-- 1.4.3 DATE_FORMAT(date,format):将日期date转成字符串
SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日");
-- 1.5 条件表达式 if-then-else
-- 1.5.1 简单函数:CASE [column_name] WHEN [value1] THEN [result1]... ELSE [default] END
SELECT name,
			 CASE  `name` WHEN"Jerry" THEN "人"
			              WHEN "孙行者" THEN "猴"
                    WHEN "行者孙" THEN "猴"
			              WHEN "行者孙孙" THEN "猴"
										WHEN "孙悟空" THEN "猴"
										ELSE "不明物种"
			 END "物种"
FROM customer;
-- 1.5.2 搜索函数:CASE WHEN [expr] THEN [result1]... ELSE [default] END
SELECT name,
			 age,
			 CASE WHEN age <= 25 THEN "青年"
						WHEN age > 25 AND age <= 40 THEN "壮年"
						WHEN age > 40 AND age <=60 THEN "中年"
						WHEN age >60 THEN "晚年"
						ELSE "不详"
			 END
FROM customer;

三、练习题

-- 1 创建客户表:id,name,age,email,birthday。
CREATE TABLE `customer` (
  `id` varchar(30),
  `name` varchar(30),
  `age` int,
  `email` varchar(20),
  `birthday` date
);
-- 2 插入数据
-- 2.1 id='10002', name='Jerry', age='22', email='jerry@sohu.com', birthday='2023-01-08'
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10002', 'Jerry', '22', 'jerry@sohu.com', '2023-01-08');
-- 2.2 id='10004', name='孙行者', age='100', email='xzsun@qq.com', birthday='1997-11-21'
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10004', '孙行者', '100', 'xzsun@qq.com', '1997-11-21');
-- 2.3 id='10006', name='行者孙', age='39', birthday='1979-12-31'
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10006', '行者孙', '39', '', '1979-12-31');
-- 2.4 id='10010', name='行者孙孙', age='44', email='hongxiao@sohu.com', birthday='1978-03-15'
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10010', '行者孙孙', '44', 'hongxiao@sohu.com', '1978-03-15');
-- 2.5 id='10012', name=NULL, age='44', email='hongxiao@sohu.com', birthday='1972-03-15'
INSERT INTO `canada_sql`.`customer` (`id`, `name`, `age`, `email`, `birthday`) VALUES ('10012', NULL, '44', 'hongxiao@sohu.com', '1972-03-15');
-- 2.6 id='1003', name='孙悟空'
INSERT INTO `canada_sql`.`customer` (`id`, `name`) VALUES ('1003', '孙悟空');
-- 2.7 age=18,birthday='2022-12-21'
INSERT INTO `canada_sql`.`customer` (age,birthday) VALUES (18,'2022-12-21');
-- 3 将“Jack”大写
SELECT UPPER("Jack");
-- 4 利用customer表中姓名和年龄拼接出一句话“我是xxxx,今年芳龄xx”,过滤掉姓名或年龄为空的用户
SELECT CONCAT("我是",name,",今年芳龄",age)
FROM customer
WHERE `name` IS NOT NULL AND age IS NOT NULL;
-- 5 输出customer表中邮箱的字符串长度大于等于14的客户信息
SELECT *,LENGTH(email)
FROM customer
WHERE LENGTH(email) >= 14;
-- 6 将数字"123.4567"保留数字2位
SELECT ROUND(123.4567,2);
-- 7 返回1000被700除后的余数
SELECT MOD(1000,700);
-- 8 根据customer表中信息加工出三列属性,分别是出生年、出生月和出生日,最后和其他属性一并输出
SELECT *,SUBSTR(birthday FROM 1 FOR 4) AS "出生年",SUBSTR(birthday FROM 6 FOR 2) AS "出生月",SUBSTR(birthday FROM 9 FOR 2) AS "出生日"
FROM customer;
-- 9 将“Hello World!”转成小写
SELECT LOWER("Hello World!");
-- 10 输出customer表中邮箱字段@字符的位置
SELECT email,INSTR(email,"@")
FROM customer;
-- 11 删除"  !!!!!!!   "字符的首尾空格,并给左右补一个"$"
SELECT RPAD(LPAD(TRIM("  !!!!!!!   "),8,"$"),9,"$");
-- 12 将customer表中birthday字段中的日期格式更改为yyyy/MM/dd。尝试使用两种方式实现
SELECT REPLACE(birthday,"-","/"),DATE_FORMAT(birthday,"%Y/%m/%d")
FROM customer;
-- 13 利用customer表中信息,拼接出一句话“我是xxxx,出生于xx年”,过滤掉姓名或出生日期为空的用户
SELECT CONCAT("我是",name,",出生于",SUBSTR(birthday FROM 1 FOR 4),"年")
FROM customer
WHERE name IS NOT NULL AND birthday IS NOT NULL;
-- 14 将customer表中的id扩充为8位,不足8位id左边补“0”
SELECT LPAD(id,8,"0") AS "id",name,age,email,birthday
FROM customer;
-- 15 输出customer表中邮箱的字符串长度
SELECT `name`,LENGTH(email)
FROM customer;
-- 16 输出customer表所有属性列,并新增一个当前时间列,取别名为“当前时间”
SELECT *,NOW() AS "当前时间"
FROM customer;
-- 17 计算出每个客户的星座
SELECT name,
			 birthday,
			 CASE WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "01-20" AND "02-18" THEN "水瓶座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "02-19" AND "03-20" THEN "双鱼座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "03-21" AND "04-19" THEN "白羊座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "04-20" AND "05-20" THEN "金牛座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "05-21" AND "06-21" THEN "双子座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "06-22" AND "07-22" THEN "巨蟹座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "07-23" AND "08-22" THEN "狮子座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "08-23" AND "09-22" THEN "处女座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "09-23" AND "10-23" THEN "天秤座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "10-24" AND "11-22" THEN "天蝎座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "11-23" AND "12-21" THEN "射手座"
						WHEN DATE_FORMAT(birthday,"%m-%d") BETWEEN "12-22" AND "12-31" OR DATE_FORMAT(birthday,"%m-%d") BETWEEN "01-01" AND "01-19" THEN "魔蝎座"
						ELSE "不详"
			 END
FROM customer;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值