diff --git a/notes/SQL.md b/notes/SQL.md index 20d5c00d..a8b22c44 100644 --- a/notes/SQL.md +++ b/notes/SQL.md @@ -1,39 +1,50 @@ -* [基础](#基础) -* [创建表](#创建表) -* [插入](#插入) -* [更新](#更新) -* [删除](#删除) -* [修改表](#修改表) -* [查询](#查询) -* [排序](#排序) -* [过滤](#过滤) -* [通配符](#通配符) -* [计算字段](#计算字段) -* [函数](#函数) +* [一、基础](#一基础) +* [二、创建表](#二创建表) +* [三、插入](#三插入) +* [四、更新](#四更新) +* [五、删除](#五删除) +* [六、修改表](#六修改表) +* [七、查询](#七查询) + * [DISTINCT](#distinct) + * [LIMIT](#limit) +* [八、排序](#八排序) +* [九、过滤](#九过滤) +* [十、通配符](#十通配符) +* [十一、计算字段](#十一计算字段) +* [十二、函数](#十二函数) * [文本处理](#文本处理) * [日期和时间处理](#日期和时间处理) * [数值处理](#数值处理) * [汇总](#汇总) -* [分组](#分组) -* [子查询](#子查询) -* [连接](#连接) +* [十三、分组](#十三分组) +* [十四、子查询](#十四子查询) +* [十五、连接](#十五连接) * [内连接](#内连接) * [自连接](#自连接) * [自然连接](#自然连接) * [外连接](#外连接) -* [组合查询](#组合查询) -* [视图](#视图) -* [存储过程](#存储过程) -* [游标](#游标) -* [触发器](#触发器) -* [事务处理](#事务处理) -* [字符集](#字符集) -* [权限管理](#权限管理) +* [十六、组合查询](#十六组合查询) +* [十七、视图](#十七视图) +* [十八、存储过程](#十八存储过程) + * [使用存储过程的好处](#使用存储过程的好处) + * [创建存储过程](#创建存储过程) +* [十九、游标](#十九游标) +* [二十、触发器](#二十触发器) +* [二十一、事务处理](#二十一事务处理) +* [二十二、字符集](#二十二字符集) +* [二十三、权限管理](#二十三权限管理) + * [创建账户](#创建账户) + * [修改账户名](#修改账户名) + * [删除账户](#删除账户) + * [查看权限](#查看权限) + * [授予权限](#授予权限) + * [删除权限](#删除权限) + * [更改密码](#更改密码) -# 基础 +# 一、基础 模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。 @@ -53,7 +64,7 @@ FROM mytable; -- 注释 注释2 */ ``` -# 创建表 +# 二、创建表 ```sql CREATE TABLE mytable ( @@ -64,16 +75,16 @@ CREATE TABLE mytable ( PRIMARY KEY (`id`)); ``` -# 插入 +# 三、插入 -**普通插入** +普通插入 ```sql INSERT INTO mytable(col1, col2) VALUES(val1, val2); ``` -**插入检索出来的数据** +插入检索出来的数据 ```sql INSERT INTO mytable1(col1, col2) @@ -81,14 +92,14 @@ SELECT col1, col2 FROM mytable2; ``` -**将一个表的内容复制到一个新表** +将一个表的内容复制到一个新表 ```sql CREATE TABLE newtable AS SELECT * FROM mytable; ``` -# 更新 +# 四、更新 ```sql UPDATE mytable @@ -96,7 +107,7 @@ SET col = val WHERE id = 1; ``` -# 删除 +# 五、删除 ```sql DELETE FROM mytable @@ -107,31 +118,31 @@ WHERE id = 1; 使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除。 -# 修改表 +# 六、修改表 -**添加列** +添加列 ```sql ALTER TABLE mytable ADD col CHAR(20); ``` -**删除列** +删除列 ```sql ALTER TABLE mytable DROP COLUMN col; ``` -**删除表** +删除表 ```sql DROP TABLE mytable; ``` -# 查询 +# 七、查询 -**DISTINCT** +## DISTINCT 相同值只会出现一次。它作用于所有列,也就是说所有列的值都相同才算相同。 @@ -140,7 +151,7 @@ SELECT DISTINCT col1, col2 FROM mytable; ``` -**LIMIT** +## LIMIT 限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。 @@ -167,7 +178,7 @@ LIMIT 2, 3; ``` -# 排序 +# 八、排序 - **ASC** :升序(默认) - **DESC** :降序 @@ -180,7 +191,7 @@ FROM mytable ORDER BY col1 DESC, col2 ASC; ``` -# 过滤 +# 九、过滤 不进行过滤的数据非常大,导致通过网络传输了很多多余的数据,从而浪费了网络带宽。因此尽量使用 SQL 语句来过滤不必要的数据,而不是传输所有的数据到客户端中然后由客户端进行过滤。 @@ -209,7 +220,7 @@ WHERE col IS NULL; **NOT** 操作符用于否定一个条件。 -# 通配符 +# 十、通配符 通配符也是用在过滤语句中,但它只能用于文本字段。 @@ -228,7 +239,7 @@ WHERE col LIKE '[^AB]%' -- 不以 A 和 B 开头的任意文本 ``` 不要滥用通配符,通配符位于开头处匹配会非常慢。 -# 计算字段 +# 十一、计算字段 在数据库服务器上完成数据的转换和格式化的工作往往比客户端上快得多,并且转换和格式化后的数据量更少的话可以减少网络通信量。 @@ -239,14 +250,14 @@ SELECT col1*col2 AS alias FROM mytable ``` -**Concat()** 用于连接两个字段。许多数据库会使用空格把一个值填充为列宽,因此连接的结果会出现一些不必要的空格,使用 **TRIM()** 可以去除首尾空格。 +**CONCAT()** 用于连接两个字段。许多数据库会使用空格把一个值填充为列宽,因此连接的结果会出现一些不必要的空格,使用 **TRIM()** 可以去除首尾空格。 ```sql -SELECT Concat(TRIM(col1), ' (', TRIM(col2), ')') +SELECT CONCAT(TRIM(col1), ' (', TRIM(col2), ')') FROM mytable ``` -# 函数 +# 十二、函数 各个 DBMS 的函数都是不相同的,因此不可移植。 @@ -331,7 +342,7 @@ SELECT AVG(DISTINCT col1) AS avg_col FROM mytable ``` -# 分组 +# 十三、分组 分组就是把具有相同的数据值的行放在同一组中。 @@ -371,7 +382,7 @@ ORDER BY num; 3. NULL 的行会单独分为一组; 4. 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。 -# 子查询 +# 十四、子查询 子查询中只能返回一个字段的数据。 @@ -395,7 +406,7 @@ FROM Customers ORDER BY cust_name; ``` -# 连接 +# 十五、连接 连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 Where。 @@ -429,7 +440,7 @@ where A.key = B.key 一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。 -**子查询版本** +子查询版本 ```sql select name @@ -440,7 +451,7 @@ where department = ( where name = "Jim"); ``` -**自连接版本** +自连接版本 ```sql select name @@ -484,7 +495,7 @@ on Customers.cust_id = Orders.curt_id group by Customers.cust_id; ``` -# 组合查询 +# 十六、组合查询 使用 **UNION** 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果为 M+N 行。 @@ -504,7 +515,7 @@ FROM mytable WHERE col =2; ``` -# 视图 +# 十七、视图 视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。 @@ -522,17 +533,19 @@ FROM mytable WHERE col5 = val; ``` -# 存储过程 +# 十八、存储过程 存储过程可以看成是对一系列 SQL 操作的批处理; -**使用存储过程的好处** +## 使用存储过程的好处 1. 代码封装,保证了一定的安全性; + 2. 代码复用; + 3. 由于是预先编译,因此具有很高的性能。 -**创建存储过程** +## 创建存储过程 命令行中创建存储过程需要自定义分隔符,因为命令行是以 ; 为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符,造成语法错误。 @@ -561,13 +574,13 @@ call myprocedure(@ret); select @ret; ``` -# 游标 +# 十九、游标 在存储过程中使用游标可以对一个结果集进行移动遍历。 游标主要用于交互式应用,其中用户需要对数据集中的任意行进行浏览和修改。 -**使用游标的四个步骤:** +使用游标的四个步骤: 1. 声明游标,这个过程没有实际检索出数据; 2. 打开游标; @@ -597,7 +610,7 @@ create procedure myprocedure(out ret int) delimiter ; ``` -# 触发器 +# 二十、触发器 触发器会在某个表执行以下语句时而自动执行:DELETE、INSERT、UPDATE @@ -618,9 +631,9 @@ UPDATE 触发器包含一个名为 NEW 和一个名为 OLD 的虚拟表,其中 MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。 -# 事务处理 +# 二十一、事务处理 -**基本术语** +基本术语: 1. 事务(transaction)指一组 SQL 语句; 2. 回退(rollback)指撤销指定 SQL 语句的过程; @@ -645,9 +658,9 @@ ROLLBACK TO delete1 COMMIT ``` -# 字符集 +# 二十二、字符集 -**基本术语** +基本术语: 1. 字符集为字母和符号的集合; 2. 编码为某个字符集成员的内部表示; @@ -669,7 +682,7 @@ FROM mytable ORDER BY col COLLATE latin1_general_ci; ``` -# 权限管理 +# 二十三、权限管理 MySQL 的账户信息保存在 mysql 这个数据库中。 @@ -678,7 +691,7 @@ USE mysql; SELECT user FROM user; ``` -**创建账户** +## 创建账户 ```sql CREATE USER myuser IDENTIFIED BY 'mypassword'; @@ -686,25 +699,25 @@ CREATE USER myuser IDENTIFIED BY 'mypassword'; 新创建的账户没有任何权限。 -**修改账户名** +## 修改账户名 ```sql RENAME myuser TO newuser; ``` -**删除账户** +## 删除账户 ```sql DROP USER myuser; ``` -**查看权限** +## 查看权限 ```sql SHOW GRANTS FOR myuser; ``` -**授予权限** +## 授予权限 ```sql GRANT SELECT, INSERT ON mydatabase.* TO myuser; @@ -714,7 +727,7 @@ GRANT SELECT, INSERT ON mydatabase.* TO myuser; 账户用 username@host 的形式定义,username@% 使用的是默认主机名。 -**删除权限** +## 删除权限 ```sql REVOKE SELECT, INSERT ON mydatabase.* FROM myuser; @@ -728,7 +741,7 @@ GRANT 和 REVOKE 可在几个层次上控制访问权限: - 特定的列; - 特定的存储过程。 -**更改密码** +## 更改密码 必须使用 Password() 函数