Skip to content

Commit d925323

Browse files
committed
feat: 更新 Mysql 示例
1 parent 651a6db commit d925323

File tree

6 files changed

+180
-33
lines changed

6 files changed

+180
-33
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# 源码说明
22

3-
> 本目录代码为 [《SQL 必知必会》](https://item.jd.com/11232698.html) 部分示例源码
3+
> 本目录代码为 [《SQL 必知必会》](https://book.douban.com/subject/35167240/) 部分示例源码

codes/mysql/SQL必知必会示例/create.sql

+9-9
Original file line numberDiff line numberDiff line change
@@ -72,25 +72,25 @@ CREATE TABLE vendors (
7272
-- Define primary keys
7373
-- -------------------
7474
ALTER TABLE customers
75-
ADD PRIMARY KEY (cust_id);
75+
ADD PRIMARY KEY (cust_id);
7676
ALTER TABLE orderitems
77-
ADD PRIMARY KEY (order_num, order_item);
77+
ADD PRIMARY KEY (order_num, order_item);
7878
ALTER TABLE orders
79-
ADD PRIMARY KEY (order_num);
79+
ADD PRIMARY KEY (order_num);
8080
ALTER TABLE products
81-
ADD PRIMARY KEY (prod_id);
81+
ADD PRIMARY KEY (prod_id);
8282
ALTER TABLE vendors
83-
ADD PRIMARY KEY (vend_id);
83+
ADD PRIMARY KEY (vend_id);
8484

8585

8686
-- -------------------
8787
-- Define foreign keys
8888
-- -------------------
8989
ALTER TABLE orderitems
90-
ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders(order_num);
90+
ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders(order_num);
9191
ALTER TABLE orderitems
92-
ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products(prod_id);
92+
ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products(prod_id);
9393
ALTER TABLE orders
94-
ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers(cust_id);
94+
ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers(cust_id);
9595
ALTER TABLE products
96-
ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors(vend_id);
96+
ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors(vend_id);

codes/mysql/SQL必知必会示例/select.sql

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
/**
2-
* Mysql 查询示例
3-
* @author Zhang Peng
4-
* @date 2018/5/5
5-
*/
1+
-- --------------------------------------------------------------------------------------
2+
-- Mysql 查询示例
3+
-- @author Zhang Peng
4+
-- @date 2018/5/5
5+
-- ----------------------------------------------------------------------------------------
66

77
-- -------------------------------------------
88
-- 查询数据
@@ -24,7 +24,7 @@ FROM products;
2424
SELECT DISTINCT vend_id
2525
FROM products;
2626

27-
-- 限制结果
27+
-- 限制查询数量
2828
-- 返回前 5 行(1)
2929
SELECT *
3030
FROM products
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
-- --------------------------------------------------------------------------------------
2+
-- 函数操作影响索引效率示例
3+
-- @author Zhang Peng
4+
-- ----------------------------------------------------------------------------------------
5+
6+
-- 步骤 1、建表
7+
CREATE TABLE tradelog (
8+
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Id',
9+
tradeid VARCHAR(32) DEFAULT NULL,
10+
operator INT(11) DEFAULT NULL,
11+
t_modified DATETIME DEFAULT NULL,
12+
PRIMARY KEY (id),
13+
KEY tradeid(tradeid),
14+
KEY t_modified(t_modified)
15+
)
16+
ENGINE = InnoDB
17+
DEFAULT CHARSET = utf8mb4;
18+
19+
CREATE TABLE trade_detail (
20+
id INT(11) NOT NULL,
21+
tradeid VARCHAR(32) DEFAULT NULL,
22+
trade_step INT(11) DEFAULT NULL, /* 操作步骤 */
23+
step_info VARCHAR(32) DEFAULT NULL, /* 步骤信息 */
24+
PRIMARY KEY (id),
25+
KEY tradeid(tradeid)
26+
)
27+
ENGINE = InnoDB
28+
DEFAULT CHARSET = utf8;
29+
30+
-- 步骤 2、存储过程初始化数据
31+
32+
INSERT INTO trade_detail
33+
VALUES (1, 'aaaaaaaa', 1, 'add');
34+
INSERT INTO trade_detail
35+
VALUES (2, 'aaaaaaaa', 2, 'update');
36+
INSERT INTO trade_detail
37+
VALUES (3, 'aaaaaaaa', 3, 'commit');
38+
INSERT INTO trade_detail
39+
VALUES (4, 'aaaaaaab', 1, 'add');
40+
INSERT INTO trade_detail
41+
VALUES (5, 'aaaaaaab', 2, 'update');
42+
INSERT INTO trade_detail
43+
VALUES (6, 'aaaaaaab', 3, 'update again');
44+
INSERT INTO trade_detail
45+
VALUES (7, 'aaaaaaab', 4, 'commit');
46+
INSERT INTO trade_detail
47+
VALUES (8, 'aaaaaaac', 1, 'add');
48+
INSERT INTO trade_detail
49+
VALUES (9, 'aaaaaaac', 2, 'update');
50+
INSERT INTO trade_detail
51+
VALUES (10, 'aaaaaaac', 3, 'update again');
52+
INSERT INTO trade_detail
53+
VALUES (11, 'aaaaaaac', 4, 'commit');
54+
55+
INSERT INTO tradelog
56+
VALUES (1, 'aaaaaaaa', 1000, now());
57+
INSERT INTO tradelog
58+
VALUES (2, 'aaaaaaab', 1000, now());
59+
INSERT INTO tradelog
60+
VALUES (3, 'aaaaaaac', 1000, now());
61+
62+
DELIMITER ;;
63+
DROP PROCEDURE IF EXISTS init;
64+
CREATE PROCEDURE init()
65+
BEGIN
66+
DECLARE i INT;
67+
SET i = 3;
68+
WHILE i < 10000
69+
DO
70+
INSERT INTO tradelog(tradeid, operator, t_modified)
71+
VALUES (concat(char(97 + (i DIV 1000)), char(97 + (i % 1000 DIV 100)), char(97 + (i % 100 DIV 10)),
72+
char(97 + (i % 10))), i, now());
73+
SET i = i + 1;
74+
END WHILE;
75+
END;;
76+
DELIMITER ;
77+
CALL init();
78+
79+
-- 步骤 3、执行计划查看SQL效率
80+
-- 3.1.1 此 SQL 对索引字段做函数操作,优化器会放弃走树搜索功能,改为全表扫描
81+
EXPLAIN
82+
SELECT count(*)
83+
FROM tradelog
84+
WHERE month(t_modified) = 7;
85+
86+
-- 3.1.2 SQL 优化
87+
EXPLAIN
88+
SELECT count(*)
89+
FROM tradelog
90+
WHERE (t_modified >= '2016-7-1' AND t_modified < '2016-8-1') OR
91+
(t_modified >= '2017-7-1' AND t_modified < '2017-8-1') OR
92+
(t_modified >= '2018-7-1' AND t_modified < '2018-8-1');
93+
94+
-- 3.2.1 此 SQL 对索引字段隐式的使用了转换函数操作,优化器会放弃走树搜索功能,改为全表扫描
95+
-- 相当于 select * from tradelog where CAST(tradid AS signed int) = 110717;
96+
EXPLAIN
97+
SELECT *
98+
FROM tradelog
99+
WHERE tradeid = 110717;
100+
101+
-- 3.3.1 下面两条 SQL 的扫描行数不同
102+
-- 原因是:字符集 utf8mb4 是 utf8 的超集,所以当这两个类型的字符串在做比较的时候,
103+
-- MySQL 内部的操作是,先把 utf8 字符串转成 utf8mb4 字符集,再做比较。
104+
# 需要做字符编码转换
105+
EXPLAIN
106+
SELECT d.*
107+
FROM tradelog l, trade_detail d
108+
WHERE d.tradeid = l.tradeid AND l.id = 2;
109+
110+
# 上面的 SQL 等价于这条注掉的 SQL
111+
# SELECT *
112+
# FROM trade_detail
113+
# WHERE CONVERT(traideid USING utf8mb4) = $l2.tradeid.value;
114+
115+
# 不需要做字符编码转换
116+
EXPLAIN
117+
SELECT l.operator
118+
FROM tradelog l, trade_detail d
119+
WHERE d.tradeid = l.tradeid AND d.id = 2;
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-- --------------------------------------------------------------------------------------
2+
-- 函数操作影响索引效率示例
3+
-- @author Zhang Peng
4+
-- ----------------------------------------------------------------------------------------
5+
6+
CREATE TABLE t (
7+
id INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Id',
8+
c INT(11) DEFAULT NULL,
9+
PRIMARY KEY (id)
10+
)
11+
ENGINE = InnoDB;
12+
13+
DELIMITER ;;
14+
DROP PROCEDURE IF EXISTS init;
15+
CREATE PROCEDURE init()
16+
BEGIN
17+
DECLARE i INT;
18+
SET i = 1;
19+
WHILE(i <= 100000)
20+
DO
21+
INSERT INTO t VALUES (i, i);
22+
SET i = i + 1;
23+
END WHILE;
24+
END;;
25+
DELIMITER ;
26+
27+
CALL init();

codes/mysql/基本DDL示例.sql

+18-17
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
-- --------------------------------------------------------------------- 数据库定义
99

10-
-- 撤销数据库 test
10+
-- 删除数据库 db_tutorial
1111
DROP DATABASE IF EXISTS db_tutorial;
1212

1313
-- 创建数据库 db_tutorial
@@ -18,11 +18,11 @@ USE db_tutorial;
1818

1919
-- --------------------------------------------------------------------- 数据表定义
2020

21-
-- 撤销表 user
21+
-- 删除数据表 user
2222
DROP TABLE IF EXISTS user;
2323
DROP TABLE IF EXISTS vip_user;
2424

25-
-- 创建表 user
25+
-- 创建数据表 user
2626
CREATE TABLE user (
2727
id INT(10) UNSIGNED NOT NULL COMMENT 'Id',
2828
username VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT '用户名',
@@ -37,31 +37,32 @@ FROM user;
3737

3838
-- 添加列 age
3939
ALTER TABLE user
40-
ADD age INT(3);
40+
ADD age INT(3);
4141

4242
-- 修改列 age 的类型为 tinyint
4343
ALTER TABLE user
44-
MODIFY COLUMN age TINYINT;
44+
MODIFY COLUMN age TINYINT;
4545

46-
-- 撤销列 age
46+
-- 删除列 age
4747
ALTER TABLE user
48-
DROP COLUMN age;
48+
DROP COLUMN age;
4949

5050
-- --------------------------------------------------------------------- 索引定义
5151

52-
-- 创建表 user 的索引 user_index
53-
CREATE INDEX user_index
54-
ON user(id);
52+
-- 创建表的索引
53+
CREATE INDEX idx_email
54+
ON user(email);
5555

56-
-- 创建表 user 的唯一索引 user_index2
57-
CREATE UNIQUE INDEX user_index2
58-
ON user(id);
56+
-- 创建表的唯一索引
57+
CREATE UNIQUE INDEX uniq_username
58+
ON user(username);
5959

60-
-- 撤销表 user 的索引
60+
-- 删除表 user 的索引
6161
ALTER TABLE user
62-
DROP INDEX user_index;
62+
DROP INDEX idx_email;
63+
6364
ALTER TABLE user
64-
DROP INDEX user_index2;
65+
DROP INDEX uniq_username;
6566

6667
-- --------------------------------------------------------------------- 视图定义
6768

@@ -71,5 +72,5 @@ SELECT id, username
7172
FROM user
7273
WHERE id < 10;
7374

74-
-- 撤销表 user 的视图 top_10_user_view
75+
-- 删除表 user 的视图 top_10_user_view
7576
DROP VIEW top_10_user_view;

0 commit comments

Comments
 (0)