说明:
1、适用MySQL,其余DBMS语法会略有差异,具体操作参考对应手册。
2、由于篇幅限制,多表查询、子查询、窗口函数见后续笔记
3、在夜曲编程课程的基础上结合《SQL基础教程(第2版)》整理的笔记。
前者:一笔带过了不少细节。但总算建立了基本框架,知道都有啥。
后者:比较《SQL必知必会(第4版)》后选择了基础教程,主要在于整体排版阅读起来非常舒适;图表展示很清晰,尤其是提示了NULL值这点很受益(参见“聚合统计”一节)
但最推荐的还是宋红康老师的全套视频和讲义,边敲代码边对照讲义讲解很清晰;同一道题会展示多种查询方法,演绎式(问题式)和归纳式教学相结合,还融入了阿里开发要求;易错点等细节听视频时更有记忆点。【宋红康】MySQL数据库(mysql安装/基础/高级/优化)_哔哩哔哩_bilibili
#顺便唠一下挑选学习资料:
1、入门还是把基础学的扎实些,网上给出的重点框架更多是学完后对照看有无遗漏的。
2、选择一个老师的视频/一本教材先踏实跟下来,没有完美的资料,建立基本框架后再针对性查缺补漏。
3、资料选择标准:播放量/推荐量;视频、讲义完整,别人做的笔记;评论里多为关于课程内容本身的讨论的,确切指出课程优缺点的,往往不错;边敲代码边讲的(拒绝纯念PPT的!!!)
初步筛选后,挑某个章节,完整听下来不同老师的讲课风格,自然就做出更适合自己的选择了。
目录
表格的创建、增加、修改和删除(CREATE,ALTER,DROP)
数据的插入、更新和修改(INSERT INTO……VALUES;UPDATE;DELETE;INSERT……SELECT)
SQL语句种类:DDL(数据库和表)、DML(数据;90%)、DCL
基础查找
SQL子句书写顺序:
SELECT——FROM——JOIN——ON——WHERE——GROUP BY——HAVING——ORDER BY——LIMIT
命令结束用分号结尾。
SQL子句执行顺序:
FROM——ON——JOIN——WHERE——GROUP BY——HAVING——SELECT——DISTINCT——ORDER BY——LIMIT
# MySQL中,GROUP BY及之后的语句中可以使用SELECT语句中的别名。(不同DBMS有所差异,其他DBMS的判断标准:SELECT之后的语句可以使用SELECT语句中的别名,SELECT之前的语句如GROUP BY,HAVING不可以)
MySQL SQL语句书写顺序和执行顺序 - 楼兰胡杨 - 博客园
SELECT
1.查询的内容即为最终所要呈现的所有字段;多个字段用逗号隔开。
2.SELECT * 表示查询表格中的所有字段。
WHERE
相当于Python中的if条件,常见判断场景如下:
1.比较运算符
1)= 表等于,在SQL中可以用于对数值、时间、字符的比较;时间数据和字符数据要加引号;时间数据若只限定到"x年-x月-x日",SQL数据会默认为这一天的零点整。
# python:==表等于;=表赋值
2)<> 表不等于;!= 表不等于。
#python:!= 表不等于
2.缺失值表示无法提供有效数据
# 某行数据为空
WHERE phone_number IS NULL
# 某行数据不为空
WHERE phone_number IS NOT NULL
3.BETWEEN...AND...在两个范围之间;
...IN (a,b,c,d) 可筛选多个范围,表示 或。
多个条件的连接:1)AND 且;OR 并; NOT 非。2)可用小括号指定优先级(注意列中有NULL值的情况)
4.关键字LIKE和通配符的搭配使用
% 表0到任意数量个常规字符;_ 表一个常规字符(写2个__就表示2个常规字符啦)
# 找11月份的订单
WHERE order_time LIKE '%-11-%'
# 找带买家秀的评论(即含图片)
WHERE text LIKE '%<img%'
ORDER BY
# ORDER BY 默认升序排列,写省略ASC;DESC为降序排列。
# 对于时间来说,数值从小到大为升序:2019年——2020年——2021年(ASC);
# 2021年——2020年——2019年(DESC)
ORDER BY total_price (ASC),order_time DESC
LIMIT
# 取前3位
LIMIT 3
# 跳过前3位再取10个数据,即第4位到13位的数据;注意不同于Python函数,不需要用小括号
LIMIT 3,10
DISTINCT:对某个字段去重。
聚合统计
聚合函数
聚合函数:对一组值进行计算,并返回单个值。
除COUNT(*)外,其余聚合函数会将NULL值排除在外。
所有聚合函数都可以用DISTINCT去重。
所有聚合函数都可以进行列与列之间的加减乘除运算。
COUNT计数函数
COUNT(*) 统计包含NULL的所有行数
COUNT(列名) 统计NULL以外的行数
COUNT(DISTINCT 列名) 统计去重后的行数
SUM(列名) 和AVG(列名)
都会删除NULL值再进行计算;
只适用于数值类型的列;
注意:
若8行数据中有2行NULL值,AVG()计算时分母为6;
也可将NULL值作为0计算,此时分母为8。
MAX(列名)和MIN(列名)
都会删除NULL值再进行计算;
几乎适用于所有类型的列。如时间类型date列:2020-1-1;2021-12-1;2022-1-5。此时MAX(date)=2022-1-5;如text列:C;B;A。此时MAX(text)=C.
业务——ROI
投资回报率ROI=产出/投入=销售收入/成本
ROI>1时,表示收益大于投入费用,可以继续投入。
ROI=1时,表示投入效果和收益持平,一般可以继续投入。
ROI<1时,除非有特殊用途,如烧钱扩大知名度,一般情况下会停止投入。
日期函数
# SQL的日期函数大部分依存于各自的DBMS,因此在不同的DBMS中语法略有差异,使用时建议查阅各个DBMS的官方手册。时间函数MySQL官方文档链接如下:
MySQL :: MySQL 5.7 Reference Manual :: 12.7 Date and Time Functions
CURRENT_DATE 当前日期2016-05-25
CURRENT_TIME 当前时间17:26:50.995+09
CURRENT_TIMESTAMP 当前日期和时间2016-04-25 18:31:03.704+09
# 以上3个函数没有参数,因此无需使用括号
EXTRACT(日期元素 from 日期) 截取日期元素,截取出“年”、“月”、“分”、“小时”、“秒”等。
DATE(日期表达式) 提取日期部分
NOW() 当前日期和时间
TIMESTAMPDIFF(YEAR, 较远日期, 较近日期) 计算日期中的整数差
DATEDIFF(日期表达式1,日期表达式2) 日期之差
DATE_ADD(日期表达式,INTERVAL 数字 DAY/YEAR) 增加时间间隔
DATE_SUB(日期表达式,INTERVAL 数字 DAY/YEAR) 减去时间间隔
字符串函数
字符串函数官方文档如下:
MySQL :: MySQL 5.7 Reference Manual :: 12.8 String Functions and Operators
CONCAT(字符1,字符2,字符3……) 连接字符串函数
SUBSTR(对象字符串, 截取开始位置,截取的字符数) 截取字符串函数,顺序从1开始
LEFT(对象字符串,字符数) 左截取指定字符数
RIGHT(对象字符串