准备工作
书中附录 2 提到的 SQL 脚本文件
使用步骤
- 创建一个新数据源:create database 数据库名
- 保证选择新数据源:use 数据库名
- 执行 create.sql 脚本。如果使用 mysql 命令行实用程序,可给出 source create.sql;(指定 create.sql 件的完全路径)
- 重复前面的步骤,用 source populate.sql 填充各个新表。
第三章 使用 MySQL
了解数据库和表
1 | show databases; 显示可用数据库 |
第四章 检索数据
1 书写习惯
- 一般来说,SQL 关键字使用大写
- 所有列和表名使用小写
2 检索列
- 从products表中选择3列
1 | SELECT prod_id, prod_name, prod_price |
- 检索所有列
1 | SELECT * |
3 检索不同行
- 只返回不同的 vend_id
1 | SELECT DISTINCT vend_id |
注意:不能部分使用 DISTINCT。 如果有 SELECT DISTINCT vend_id,prod_price FROM products;
那么只有指定的两个列的值都不相同时,才会被检索
4 限制结果
- LIMIT 行数N 表示返回不多于N行
- LIMIT N, M 表示从第 N 行开始的 M 行(替代方法 LIMIT N OFFSET M)
1 | SELECT prod_name |
5 使用完全限定的表名
- 与之前使用的语句结果都是一样的
1
2SELECT products.prod_name
FROM products;1
2SELECT products.prod_name
FROM crashcourse.products;
第五章 排序检索数据
5.1 排序数据
ORDER BY 列名
默认升序
5.2 按多列排序
1 | SELECT prod_id, prod_price, prod_name |
以上语句虽然 ORDER BY 后有两个列,但是会优先按前者排序,只有前者相同时,才会轮到后者排序
5.3 指定排序方向
- 一个列的排序方向
ORDER BY 列名 DESC
降序
- 多个列的排序方向
ORDER BY 列名 DESC, 列名 DESC
(DESC 只能作用于前面的那个列名)
1 | SELECT prod_id, prod_price, prod_name |
- ORDER BY 和 LIMIT 的结合可以找到最大/小值
第六、七章 WHERE 过滤数据
6.1 WHERE 子句
可以通过 WHERE 指定的条件进行过滤,但应注意:如果同时使用 ORDER BY 和 WHERE 应该让 ORDER BY 位于 WHERE 之后。
6.2 WHERE 子句操作符
- 当限定字符串时,应用单引号包起来
- 范围限定:
WHERE 列名 BETWEEN 值1 AND 值2
- 空值检查:
WHERE 列名 is NULL
- 组合条件:用
AND
或OR
进行组合,AND
优先级高于OR
- IN 操作符:
WHERE 列名 IN (值1,值2,...)
括号内的条件都可以匹配 - NOT 操作符:否定后面跟的条件(NOT IN)
第八章 用通配符过滤
8.1 LIKE 操作符
为在搜索子句(注意:搜索是区分大小写的)中使用通配符,必须使用 LIKE 操作符
- %
% 表示任意字符出现任意次数
1 | SELECT prod_id, prod_name |
- _
_ 匹配单个字符
1 | SELECT prod_id, prod_name |
第九章 正则表达式
1 . | [] \\
- 基本使用:检索列中含有 100 的行
1 | SELECT prod_name |
- . 匹配一个任意字符
- | 匹配表达式中的一个
1
2
3
4SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
- [123] 匹配单一特定的字符
- 转义符:
\\
2 匹配字符类
3 匹配多个实例
4 定位符
第十章 创建计算字段
10.1 Concat() 拼接字段
1 | SELECT Concat(vend_name, '(', vend_country, ')') |
AS 别名
1 | SELECT Concat(vend_name, '(', vend_country, ')') AS vend_title |
10.2 执行计算结果
1 | SELECT prod_id, |
expanded_price 列为一个计算字段
第十一章 函数
11.1 常用文本处理函数
- Sounden() 可以比较字符串发音,找到发音类似的结果
1 | SELECT cust_name, cust_contact |
11.2 日期、时间处理函数
11.2.1 提取时间
Date()
可以将日期部分提取出来,2005-09-01 11:30:05 经过 Date() 函数可获取日期部分2005-09-01
1 | SELECT cust_id, order_num |
当然用正则表达式可以获得相同的结果
1 | SELECT cust_id, order_num |
11.2.2 限定时间范围
- BETWEEN AND 可以限定时间范围
1 | SELECT cust_id, order_num |
- 通过
Year()
Month()
等函数限定具体的年月等
1 | SELECT cust_id, order_num |
11.3 数值处理函数
第十二章 汇总数据
12.1 聚集函数
12.2 组合聚集函数
1 | SELECT COUNT(*) AS num_items, |
第十三章 分组数据
13.1 创建分组
- 查询每个供应商都有多少个产品
1 | SELECT vend_id, COUNT(*) AS num_prods |
注意:GROUP BY
必须在 WHERE
之后 ORDER BY
之前
13.2 过滤分组
1 | SELECT vend_id, COUNT(*) AS num_prods |
13.3 SELECT 子句及其顺序
第十五章 连结表 第十六章 高级连结
1 | SELECT prod_name, vend_name, prod_price, quantity |
第二十章 更新和删除数据
- UPDATE 要更新的表 SET 列名 = 新值 WHERE 条件
1 | UPDATE customers |
- DELETE FROM 表 WHERE 条件
- DELETE 不需要列名或通配符,它只删除整行而不是整列
1 | DELETE FROM customers |
第二十一章 创建和操纵表
- 创建
1 | CREATE TABLE 表明 ( |
- 删除
1 | DROP TABLE 表名 |
根据 leetcode SQL 架构创建表的方法
如 196
1 | Truncate table Person |
- 创建一个数据库
1 | CREATE database leetcode; |
use leetcode
- 创建表
1 | CREATE TABLE Person(Id int,Email char(50),PRIMARY KEY(Id))ENGINE=InnoDB; |
- 依次 insert into 即可(删除语句中间的
(Id, Email)
)
1 | insert into Person values ('1', 'john@example.com') |
SELECT_from_WORLD_Tutorial
问题:https://sqlzoo.net/wiki/SQLZOO:SELECT_from_WORLD_Tutorial/zh
答案: