4.13、Sql书写与执行顺序
4.13.1、语法顺序
select
distinct
from
join
on
where
group by
having
order by
以上关键字只能按照这个顺序来, 不能颠倒
4.13.2、执行顺序
from
on
join
where
group by //分组
having //过滤
select
distinct
order by //排序
4.13.3、解析
从某张表(或者是连接的多张表)中查询数据
on筛选出符合条件的行
根据join的类型把两张表的结果相连
经过where条件筛选出有价值的数据
对这些有价值的数据进行分组
分组之后可以使用 having 继续过滤筛选
select 查询出来
去重
最后排序输出
5、Mysql常用函数
5.1、常用函数
-- 数学运算 SELECT ABS(-8); -- 绝对值 SELECT CEIL(5.1); -- 向上取整 SELECT CEILING(5.1); -- 向上取整 SELECT RAND(); -- 返回0~1之间的一个随机数 SELECT SIGN(-10); -- 返回一个数的符号;0返回0;正数返回1;负数返回-1 -- 字符串函数 SELECT CHAR_LENGTH('法外狂徒'); -- 字符串长度 SELECT CONCAT('法外','狂','徒'); -- 拼接字符串 SELECT INSERT('我喜欢',1,1,'超级') -- INSERT(str,pos,len,newstr) 从str的pos位置开始替换为长度为len的newstr SELECT UPPER('zsr'); -- 转大写 SELECT LOWER('ZSR'); -- 转小写 SELECT INSTR('zsrs','s'); -- 返回第一次出现字串索引的位置 SELECT REPLACE('加油就能胜利','加油','坚持'); -- 替换出现的指定字符串 SELECT SUBSTR('坚持就是胜利',3,6); -- 返回指定的字符串(源字符串,截取位置,截取长度) SELECT REVERSE('rsz'); -- 反转字符串 -- 时间日期函数 SELECT CURRENT_DATE(); -- 获取当前日期 SELECT CURDATE(); -- 获取当前日期 SELECT now(); -- 获取当前时间 SELECT LOCALTIME(); -- 本地时间 SELECT SYSDATE(); -- 系统时间 SELECT DATE_FORMAT(now() ,'%Y-%m-%d %H-%m-%s' ) -- 格式化日期 SELECT STR_TO_DATE('21,5,2018','%d,%m,%Y'); -- 将时间格式的字符串(str),按照所提供的显示格式(format)转换为DATETIME类型的值 SELECT YEAR(NOW()); SELECT MONTH(NOW()); SELECT DAY(NOW()); SELECT HOUR(NOW()); SELECT MINUTE(NOW()); SELECT SECOND(NOW()); -- 系统信息 SELECT SYSTEM_USER(); SELECT USER(); SELECT VERSION();
5.2、聚合函数
函数 描述
max 最大值
min 最小值
sum 和
avg 平均值
count 计算个数
示例
SELECT COUNT(StudentName) FROM student; SELECT COUNT(*) FROM student; SELECT COUNT(1) FROM student; SELECT SUM(`StudentResult`) FROM result; SELECT AVG(`StudentResult`) FROM result; SELECT MAX(`StudentResult`) FROM result; SELECT MIN(`StudentResult`) FROM result;
5.3、条件判断函数
5.3.1、CASE WHEN … THEN … ELSE … END
语法
CASE expression WHEN if_true_expr THEN return_value1 WHEN if_true_expr THEN return_value2 WHEN if_true_expr THEN return_value3 …… ELSE default_return_value END
示例1 : 用在更新语句的更新条件中
UPDATE users_info u SET u.balance = CASE WHEN u.sex = '女' AND u.age > 18 THEN u.balance + 10 ELSE u.balance + 5 END WHERE u.create_time >= '2020-01-01'
示例2 : 用在查询语句的返回结果中
SELECT *, CASE WHEN total_score >= 650 THEN '重点大学' WHEN total_score >= 600 AND total_score < 650 THEN '一本' WHEN total_score >= 500 AND total_score < 600 THEN '二本' WHEN total_score >= 400 AND total_score < 500 THEN '三本' ELSE '大专' END AS status_student FROM student_score;
示例3 : 用在分组查询语句中
SELECT SUM(c.users_count) AS '用户数量', CASE c.city WHEN '济南' THEN '山东省' WHEN '青岛' THEN '山东省' WHEN '枣庄' THEN '山东省' WHEN '广州' THEN '广东省' WHEN '深圳' THEN '广东省' ELSE '其他' END AS '归属省' FROM users_area c GROUP BY CASE c.city WHEN '济南' THEN '山东省' WHEN '青岛' THEN '山东省' WHEN '枣庄' THEN '山东省' WHEN '广州' THEN '广东省' WHEN '深圳' THEN '广东省' ELSE '其他' END;
注意点
需要注意的点,Case函数只返回第一个符合条件的值,剩下的Case when部分将会被自动忽略
5.3.2、IF(expr,if_true_expr,if_false_expr)
在mysql中if()函数的用法类似于java中的三目表达式,具体语法如下:
IF(expr,if_true_expr,if_false_expr),如果expr的值为true,则返回if_true_expr的值,如果expr的值为false,则返回if_false_expr的值。
示例
SELECT IF ( sex = '女', '1', '0' ) AS sex_code FROM employee
5.3.3、IFNULL(expr1,expr2)
IFNULL函数是MySQL控制流函数之一,它有两个参数,两个参数可以是真实值或表达式,如果expr1不是NULL,则返回第一个参数(expr1)。 否则,IFNULL函数返回第二个参数。
示例
SELECT `NAME`,IFNULL(sex,'未知') from student;