select 语句执行顺序
select username,max(scores) from user where username is not null group by username having max(scores)>100 order by max
select 语句执行顺序:
开始->from->where->group by->having->order by->select->limit->结果
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用)
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.
delete,drop,truncate 都有删除表的作用,区别在于
delete 和 truncate 仅删除表数据,drop 表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了。
delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚,打个比方,delete 是发微信说分手,后悔还可以撤回,truncate 和 drop 是直接扇耳光说滚,不能反悔。
执行的速度上,drop>truncate>delete,打个比方,drop 是神舟火箭,truncate 是和谐号动车,delete 是自行车
UNION和UNION ALL对比
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
datetime/timestamp
datetime8个字节 默认为null,存null值为null 存时间不对时区做改变,计算时间差需要函数转换
timestamp4个字节,默认not null 存null自动转存当前时间,存时间自动转化为(utc-世界标准时间),计算时间差不需要函数转换,目标时间和1970元年做计算
左连接、右连接、内连接、外连接
内连接:inner join(等值连接) 只返回两个表中联结字段相等的数据
外连接:返回包括左/右表中的所有记录和右/左表中联结字段相等的记录
左外连接也称左连接。以左表为基表,在FROM子句中关键字“LEFT JOIN”来连接俩张表。
右外连接也称右连接。以右表为基表,在FROM子句中使用关键字“RIGHT JOIN”来连接俩张表。
1.内连接就是取交集的部分。
2.左连接就是左表全部的数据加上交集的数据。
3.右连接就是右表全部的数据加上交集的数据
4.外连接:返回包括左/右表中的所有记录和右/左表中联结字段相等的记录
常用函数
-- 字符串函数
SELECT CONCAT('我','热爱','学习'); -- 拼接字符串
SELECT UPPER('abc'); -- 转大写
SELECT LOWER('ZSR'); -- 转小写
SELECT INSTR('abcs','s'); -- 返回第一次出现字串索引的位置
SELECT REPLACE('加油就能胜利','加油','坚持'); -- 替换出现的指定字符串
SELECT SUBSTR('坚持就是胜利',3,6); -- 返回指定的字符串(源字符串,截取位置,截取长度)
SELECT REVERSE('rsz'); -- 反转字符串
-- 时间日期函数
SELECT CURRENT_DATE(); -- 获取当前日期
SELECT CURDATE(); -- 获取当前日期
SELECT now(); -- 获取当前时间
SELECT LOCALTIME(); -- 本地时间
SELECT SYSDATE(); -- 系统时间