Further study and note-taking of MySQL, including principle analysis, practical code, interview questions and SQL cheat sheet.
MySQL的深层学习和笔记,包括原理分析、实用代码、面试题和SQL速查表。
Coming Soon...
语法 | 作用 |
---|---|
# 注释文字 | 单行注释 |
-- 注释文字 | 单行注释 |
/* 注释文字 */ | 多行注释 |
语法 | 作用 |
---|---|
SELECT 1+1, 2+2 FROM DUAL; | 伪表查询 |
SELECT department_id, location_id FROM departments; |
普通字段查询 |
SELECT last_name "Name", salary*12 "Annual Salary" FROM employees; |
列的别名。(列和别名之间加AS 也行)。 |
SELECT DISTINCT department_id FROM employees; |
关键字DISTINCT去除重复行 |
SELECT * FROM `ORDER`; | 和保留字、数据库系统或常用方法冲突。语句中使用一对``引起来。 |
SELECT 'timering' as corporation, last_name FROM employees; |
在 SELECT 查询结果中增加一列固定的常数列 |
SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90 ; |
过滤数据 |
算术语法 | 作用 |
---|---|
SELECT A+B | + 遇到非数值类型,先尝试转成数值,如果转失败,就按0计算 |
SELECT A - B | - |
SELECT A * B | * |
SELECT A DIV B SELECT A / B |
/ 一个数除整数,必得浮点(保留4位),除以0为NULL |
SELECT A % B SELECT A MOD B |
求模(取余) |
比较语法 | 作用 |
SELECT C FROM TABLE WHERE A = B | = 判断等号两边的值、字符串或表达式是否相等。 一个是整数,MySQL会将字符串转化为数字进行比较。如果字符串不能隐式地转为数字,则会等价数字0。 有一个为NULL,结果为NULL。 |
SELECT C FROM TABLE WHEREA <=> B | <=> 安全等于运算符:两个操作数均为NULL时,其返回值为1。 当一个操作数为NULL时,其返回值为0。 |
SELECT C FROM TABLE WHEREA <> B SELECT C FROM TABLE WHEREA != B |
<>OR!= 有任意一个为NULL,结果为NULL。 |
SELECT C FROM TABLE WHERE A < B | < |
SELECT C FROM TABLE WHERE A <= B | <= |
SELECT C FROM TABLE WHERE A > B | > |
SELECT C FROM TABLE WHERE A >= B | >= |
语法 | 作用 |
---|---|
SELECT B FROMTABLE WHERE A IS NULL SELECT B FROM TABLE WHERE A ISNULL |
IS NULL 判断是否为空 |
SELECT B FROM TABLE WHERE A IS NOT NULL | IS NOT NULL 判断是否非空 |
SELECT D FROM TABLE WHERE C LEAST(A,B) | LEAST 返回多值中最小值,字符串时返回字母表中顺序最靠前的字符,有NULL返回NULL |
SELECT D FROM TABLE WHERE C GREATEST(A,B) | GREATEST 返回多值中最大值,字符串时返回字母表中顺序最靠后的字符,有NULL返回NULL |
SELECT D FROM TABLE WHERE C BETWEEN A AND B | 是否在两值之间(闭区间) |
SELECT D FROMTABLE WHERE C IN (A,B) | 是否为列表中任意一个值,有NULL返回NULL |
SELECT D FROM TABLE WHERE C NOT IN (A,B) | 是否不为列表中任意一个值 |
SELECT C FROMTABLE WHERE A LIKE '_a%k%' | 模糊匹配。“%”:匹配0个或多个字符。 “_”:只能匹配一个字符。 \ 表示转义或者ESCAPE 转义 |
SELECT C FROM TABLE WHERE A REGEXP 'e$' | 正则匹配 |
SELECT C FROM TABLE WHERE A RLIKE B | 正则匹配 |
语法 | 作用 |
---|---|
SELECT NOT A | NOT ! |
SELECT A AND B SELECT A && B |
AND && 有0返回0,然后再有NULL返回NULL。此外返回1 |
SELECT A OR B SELECT A ||B |
OR 或 优先级1最高,然后是NULL,最后是0 |
SELECT A XOR B | XOR 异或 有NULL返回NULL其他正常 |
位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
指令 | 作用 |
---|---|
SELECTA & B | 按位与 |
SELECTA | B | 按位或 |
SELECT A ^ B | 按位异或 |
SELECT ~ A | 按位取反 |
SELECT A >> 2 | 按位右移 |
SELECT B <<2 | 按位左移 |
指令 | 作用 |
---|---|
'^b' | 匹配以字母b开头的字符串 |
'st$' | 匹配以 st 结尾的字符串 |
'b.t' | 匹配任何b和t之间有一个字符的字符串 |
'f*n' | 匹配字符n前面有任意个字符f 的字符串 |
'ba+' | 匹配以b开头后面紧跟至少有一个a的字符串 |
'fa' | 匹配包含fa的字符串 |
'[xz]' | 匹配包含x或者z的字符串 |
'[^abc]' | 匹配任何不包含a- b或c的字符串 |
b{2} | 匹配2个或更多的b |
b{2,4} | 匹配含最少2个、最多4个b的字符串 |
指令 | 作用 |
---|---|
ORDER BY hire_date DESC; | 单列排序,ORDER BY 子句在SELECT语句的结尾 ASC(ascend): 升序(默认) DESC(descend):降序 |
ORDER BY department_id, salary DESC; | 可以使用不在SELECT列表中的列排序。 若第一列数据中所有值都是唯一的,将不再对第二列进行排序。 |
指令 | 作用 |
---|---|
LIMIT [位置偏移量,] 行数 | LIMIT 子句必须放在整个 SELECT 语句的最后! “位置偏移量” 参数指示MySQL从哪一行开始显示(可选参数),默认从第一条记录偏移量为0 “行数”指示返回的记录条数 |
LIMIT 3 OFFSET 4 | MySQL 8.0新增,从第5条记录开始后面的3条记录,同LIMIT 4,3; |
LIMIT (PageNo - 1) * PageSize, PageSize; | 每页参数计算公式,每页的是从第(当前页数-1)* 每页条数 条起 |
指令 | 作用 |
---|---|
SELECT e.last_name,e.salary,j.grade_level FROM employees e,job_grades j WHERE e.salary between j.lowest_sal and j.highest_sal; |
等值连接与非等值连接 |
SELECT CONCAT(worker.last_name ,' works for ', manager.last_name) FROM employees worker, employees manager WHERE worker.manager_id = manager.employee_id ; |
自连接与非自连接,构造两张表进行匹配 |
# 左外连接 SELECT last_name,department_name FROM employees ,departments WHERE employees.department_id = departments.department_id(+); |
SQL92内连接与外连接,(+) 表示哪个是从表 |
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ; |
SQL99内连接与外连接 |
SELECT column,... FROM table1 UNION [ALL] SELECT column,... FROM table2 |
合并查询结果。UNION 操作符返回两个查询的结果集的并集,去除重复记录。UNION ALL不去重。 |
SELECT employee_id,last_name,department_name FROM employees e NATURAL JOIN departments d; |
自然连接,自动查询两张连接表中所有相同的字段,然后进行等值连接。 |
SELECT employee_id,last_name,department_name FROM employees e JOIN departments d USING (department_id); |
USING连接。指定数据表里的同名字段进行等值连接。但是只能配合JOIN一起使用。 |
中图:内连接 A ∩ B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
左上图:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
右上图:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
左中图:A - A ∩ B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
右中图:B - A ∩ B
这里解释一下WHERE e.department_id IS NULL
,首先是由右外连接衍生出来的,减去中间交集的部分,然后交际的部分是包含A和B的,只需要用条件将 从表
A置为NULL,即可将在B中有A的部分筛掉。
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
左下图:满外连接,左中图 + 右上图 A∪B
SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL
UNION ALL #没有去重操作,效率高
SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
右下图:左中图 + 右中图 A ∪ B - A ∩ B 或者 ( A - A ∩ B) ∪ ( B - A ∩ B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
指令 | 作用 |
---|---|
source d:\xxxx.sql | 使用source指令绝对路径导入数据库 |
DESCRIBE employees; # 或 DESC employees; |
显示表结构 |
学习参考:MySQL数据库教程 https://www.bilibili.com/video/BV1iq4y1u7vj
- 本仓库针对内容进行了一定程度上的精简,去除了冗余。同时对一些相关的知识进行了适当的补充。
- 如果您在阅读的过程中存在疑问或发现错误,欢迎提Issues交流订正。
- 如果遇到图片无法加载的情况,可以考虑使用代理,或者访问博客网站 。