ZZZZZZ目的
ZZZZZZ代码
ZZZZZZ重点
ZZZZZZ操作(非代码,需要自己手动)
2- 字符串函数 | String Functions_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=56&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- LENGTH:得到字符串中的字符数
SELECT LENGTH('sky')
输出为3 - UPPER:将字符串转化成大写
LOWER:将字符串转成小写
SELECT UPPER('sky')
输出SKY
SELECT LOWER('Sky')
输出sky - LTRIM:移除左侧的空白字符或其他自定义字符
SELECT LTRIM(' Sky')
输出Sky
RTRIM:移除右侧的空白字符或其他自定义字符
SELECT LTRIM('Sky ')
输出Sky
TRIM:删除前面或者后面的空格
SELECT TRIM(' Sky ')
输出Sky - LEFT:返回左侧的几个字符
RIGHT:返回右侧的几个字符
SELECT LEFT('Kindergarden', 4)
输出Kind
SELECT LEFT('Kindergarden', 4)
输出rten - SUBSTRING:得到一个字符串中任何位置的字符
SELECT SUBSTRING('Kindergarden', 3, 5)
输出nderg,代码中的3代表从第三个开始,代码中的5表示输出5个字符,如果只填写一个3,表示输出从第三个开始后的所有字符 - LOCATE:返回第一个字符或者一串字符串匹配位置
SELECT LOCATE('n','Kindergarden')
输出为3,无论是输入大写还是小写,结果都是一样的,这个LOCATE查找不区分大小写
SELECT LOCATE('Q','Kindergarden')
输出为0
SELECT LOCATE('garden','Kindergarden')
输出为7 - REPLACE:替换一个字符或者一串字符
SELECT REPLACE('Kindergarten', 'garten', 'garden')
输出为Kindergarden,将garten换为garden - CONCAT:串联两个字符串
SELECT CONCAT('first', 'last')
输出firstlast
将sql_store表中的first_name和last_name连接起来,中间要用空格隔开
USE sql_store;
SELECT CONCAT(first_name, ' ', last_name)
FROM customers
以上是常见的函数,想要更多函数可以在网上搜索MySQL String Functions
3- MySQL中的日期函数 | Date Functions in MySQL_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=57&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- NOW:输出现在电脑上的时间,具体到几分几秒
SELECT NOW()
输出为2024-10-10 19:35:18
CURDATE:Current Date缩写,输出电脑上的年月日
SELECT CURDATE()
输出为2024-10-10
CURTIME:Current Time缩写,输出电脑上的时分秒
SELECT CURTIME()
输出为19:38:56 - YEAR、MONTH、DAY、HOUR、MINUTE、SECOND分别可以获取特定的年、月、日、时、分和秒
SELECT YEAR(CURTIME()), MONTH(CURTIME()), DAY(CURTIME()),
HOUR(CURTIME()), MINUTE(CURTIME()), SECOND(CURTIME())
输出分别为2024,10,10,19,42,23
DAYNAME、MONTHNAME:获取字符串格式的星期数和月数
SELECT DAYNAME(CURTIME()), MONTHNAME(CURTIME())
输出为Thursday,October - EXTRACT:想要把代码录入别的DBMS,最好用EXTRACT函数
SELECT EXTRACT(YEAR FROM NOW()), EXTRACT(MONTH FROM NOW()), EXTRACT(DAY FROM NOW())
输出为2024,0,0
【练习题】
输出sql_store中当年的订单
USE sql_store;
SELECT *
FROM orders
WHERE YEAR(order_date) = YEAR(NOW())
思路是获取订单日期的年份,然后获取现在的年份,将两者进行对比,输出两者相等的订单
4- 格式化日期和时间 | Formatting Dates and Times_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=58&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- DATE_FORMATE:输出符合某种格式的时间,需要用日期值和格式字符串
%y:返回两位数的年
%Y:返回四位数的年
%m:返回数字月
%M:返回应为单词月
%d:返回日
SELECT DATE_FORMAT(NOW(), '%M %y')
输出为October 24
其他的时间函数可以在网上搜索Mysql Date Format String
5- 计算日期和时间 | Calculating Dates and Times_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=59&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- DATE_ADD:给日期添加时间
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
输出为2024-10-11 20:12:35
SELECT DATE_ADD(NOW(), INTERVAL -1 DAY)
输出为2024-10-09 20:12:45 - DATE_SUB:在一个日期时间值上减去日期部分
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY)
输出为2024-10-09 20:13:45 - DATEDIFF:计算两个日期的间隔
SELECT DATEDIFF('2019-01-05 09:00', '2019-01-01 17:00')
输出为4,注意DATEDIFF只返回天数,不返回小时什么的
SELECT DATEDIFF('2019-01-01 17:00', '2019-01-05 09:00')
输出为-4 - TIME_TO_SEC:返回从零点计算的秒数
SELECT TIME_TO_SEC('09:00')
输出为32400
SELECT TIME_TO_SEC('09:00') - TIME_TO_SEC('09:02')
输出为-120
6- IFNULL和COALESCE函数 | The IFNULL and COALESCE Functions_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=60&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- 在sql_store中,输出没有shipper_id的订单,并将NULL改为Not assigned,并把这一列改名为shipper
SELECT order_id, IFNULL(shipper_id, 'Not assigned') AS shipper
FROM orders - 在sql_store中,输出没有shipper_id的订单。如果有该订单有注释(comments),则用注释来代替NULL,如果没有,那么用Not assigned来代替
SELECT order_id, COALESCE(shipper_id, comments, 'Not assigned') AS shipper
FROM orders
【练习题】
输出下面的图片
SELECT CONCAT(first_name, ' ', last_name) AS customer, I
FNULL(phone, 'Unknown') AS phone
FROM customers
7- IF函数 | The IF Function_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p=61&vd_source=eaeec77dfceb13d96cce76cc299fdd08
- IF(expression, first, second)IF函数可以输入一个测试用的表达式expression,如果这个表达式被判为真,则返回first这个位置的值,否则返回second这个位置的值,first和second这里可以是任何值,可以是NULL,空值什么的
- 根据orders表格,将里面所有的订单旁边都有一个标签”status“,如果订单是今年的,就叫active(活跃的),如果是以前的,就叫archived(存档),并输出订单id,订单日期和status
SELECT order_id, order_date, IF(YEAR(NOW()) = YEAR(order_date), 'active', 'archived') AS status
FROM orders
【练习题】
输出下面的图片,其中,orders是每个订单的产品数,frequency是根据orders决定的,如果某个产品被多次订购,那么就是Many times,如果不是。那就输出Once
SELECT p.product_id AS product_id, name, COUNT(o.order_id) AS orders,
IF(COUNT(o.order_id) = 1, 'Once', 'Many times') AS frequency
FROM products p
JOIN order_items o USING (product_id)
GROUP BY p.product_id
这里IF后面不能用SELECT orders,个人认为是因为SELECT orders返回的是一个根据GROUP BY的分组值,而不是一个值