mysql数据库2—复杂sql语法
1.case when用法
场景:当我们需要将数据库中查询到的字段值,转换成其他值的时候,就需要使用CASE-WHEN函数。类似:Java中的switch-case语句。
分类:Case具有两种格式。简单Case函数和Case搜索函数。
1.简单Case函数
(1)语法格式
case 列名
when 条件值1 then 选择项1
when 条件值2 then 选项2.......
else 默认值
end
(2)例子
SELECT
CASE pay_way
WHEN 1 THEN '支付宝支付'
WHEN 2 THEN '微信支付'
WHEN 3 THEN '银联支付'
ELSE '其他支付'
END payWay <!-- 把查询出的列名转成:payWay -->
FROM order;
2.Case搜索函数
(1)语法格式
case
when 列名 = 条件值1 then 选项1
when 列名 = 条件值2 then 选项2.......
else 默认值
end
(2)例子
UPDATE employee
SET salary =
CASE
WHEN level = '1' THEN salary * 1.8
WHEN level = '2' THEN salary * 1.5
WHEN level = '3' THEN salary * 1.2
ELSE salary * 1.1
END
2.group by … having用法
1.查询SQL表中某个字段的重复数据
sql1:SELECT user_name,COUNT(*) AS count FROM user_info GROUP BY user_name HAVING count > 1;
sql2:SELECT user_name FROM user_info GROUP BY user_name HAVING COUNT(1) > 1;
sql3:SELECT * FROM user_info WHERE user_name IN (SELECT user_name FROM user_info GROUP BY user_name HAVING COUNT(1) > 1);
PS:
1.HAVING是分组(GROUP BY)后的筛选条件,分组后的数据组内再筛选;WHERE 则是在分组前筛选。
2.WHERE 子句中不能使用聚集函数(类似count),而 HAVING 子句中可以,所以在集合函数中加上了 HAVING 来起到测试查询结果是否符合条件的作用。即 HAVING 子句的适用场景是可以使用聚合函数。
3.使用了group by 之后,就要求select后面的字段包含在group by 或聚合函数里面。所以要查询出某个字段重复的全部数据,用sql3
3.if 语句用法
定义:判断第一个参数为true还是false,来决定取第二个参数值还是第三个参数值
1.语法:IF(expr1,expr2,expr3)
如果 expr1 是TRUE,则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值
2.例子:
select *,if(sex=1,"男","女") as sex from user where sex != ""
4.ifnull语句用法
定义:判断字段是否为null,为null就返回特定值,不为null也返回特定值
1.语法:IFNULL(expr1,expr2)
假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串
2.例子:
select IFNULL(sex,1) from user
5.datediff 函数
定义:返回两个日期之间的天数
1.语法:DATEDIFF(date1,date2)
2.例子:SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate
PS:
1.date1 和 date2 参数是合法的日期或日期/时间表达式。
2.计算是date1 - date2
6.date_format 函数
定义:用于以不同的格式显示日期/时间数据
1.语法:DATE_FORMAT(date,format)
2.例子:select date_format(now(),'%Y-%m-%d %H:%i:%S') AS startDate 得到结果:2021-12-20 20:02:18
PS:
1.date 参数是合法的日期。format 规定日期/时间的输出格式。
可以使用的格式有:
格式 | 意义 |
---|---|
%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) |
%p | AM 或 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 位 |