diff --git a/notes/SQL.md b/notes/SQL.md index d1fb3e276ea7baa7548171c85d519910ccff90a5..107156e028aee975227a4255fdf00defe4bcf943 100644 --- a/notes/SQL.md +++ b/notes/SQL.md @@ -197,13 +197,15 @@ WHERE col IS NULL; 下表显示了 WHERE 子句可用的操作符 | 操作符 | 说明 | -| ------------ | ------------ | -| `=` `<` `>` | 等于 小于 大于 | -| `<>` `!=` | 不等于 | -| `<=` `!>` | 小于等于 | -| `>=` `!<` | 大于等于 | -| `BETWEEN` | 在两个值之间 | -| `IS NULL` | 为 NULL 值 | +| :---: | :---: | +| = | 等于 | +| < | 小于 | +| > | 大于 | +| <> != | 不等于 | +| <= !> | 小于等于 | +| >= !< | 大于等于 | +| BETWEEN | 在两个值之间 | +| IS NULL | 为 NULL 值 | 应该注意到,NULL 与 0、空字符串都不同。 @@ -253,17 +255,39 @@ FROM mytable; # 十二、函数 -各个 DBMS 的函数都是不相同的,因此不可移植。 +各个 DBMS 的函数都是不相同的,因此不可移植,以下主要是 MySQL 的函数。 + +## 汇总 + +|函 数 |说 明| +| :---: | :---: | +| AVG() | 返回某列的平均值 | +| COUNT() | 返回某列的行数 | +| MAX() | 返回某列的最大值 | +| MIN() | 返回某列的最小值 | +| SUM() |返回某列值之和 | + +AVG() 会忽略 NULL 行。 + +使用 DISTINCT 可以让汇总函数值汇总不同的值。 + +```sql +SELECT AVG(DISTINCT col1) AS avg_col +FROM mytable; +``` ## 文本处理 | 函数 | 说明 | | :---: | :---: | -| `LEFT()` `RIGHT()` | 左边或者右边的字符 | -| `LOWER()` `UPPER()` | 转换为小写或者大写 | -| `LTRIM()` `RTIM()` | 去除左边或者右边的空格 | -| `LENGTH()` | 长度 | -| `SOUNDEX()` | 转换为语音值 | +| LEFT() | 左边的字符 | +| RIGHT() | 右边的字符 | +| LOWER() | 转换为小写字符 | +| UPPER() | 转换为大写字符 | +| LTRIM() | 去除左边的空格 | +| RTRIM() | 去除右边的空格 | +| LENGTH() | 长度 | +| SOUNDEX() | 转换为语音值 | 其中, **SOUNDEX()** 可以将一个字符串转换为描述其语音表示的字母数字模式。 @@ -280,23 +304,23 @@ WHERE SOUNDEX(col1) = SOUNDEX('apple') |函 数 | 说 明| | :---: | :---: | -| `AddDate()` | 增加一个日期(天、周等)| -| `AddTime()` | 增加一个时间(时、分等)| -| `CurDate()` | 返回当前日期 | -| `CurTime()` | 返回当前时间 | -| `Date()` |返回日期时间的日期部分| -| `DateDiff()` |计算两个日期之差| -| `Date_Add()` |高度灵活的日期运算函数| -| `Date_Format()` |返回一个格式化的日期或时间串| -| `Day()`| 返回一个日期的天数部分| -| `DayOfWeek()` |对于一个日期,返回对应的星期几| -| `Hour()` |返回一个时间的小时部分| -| `Minute()` |返回一个时间的分钟部分| -| `Month()` |返回一个日期的月份部分| -| `Now()` |返回当前日期和时间| -| `Second()` |返回一个时间的秒部分| -| `Time()` |返回一个日期时间的时间部分| -| `Year()` |返回一个日期的年份部分| +| AddDate() | 增加一个日期(天、周等)| +| AddTime() | 增加一个时间(时、分等)| +| CurDate() | 返回当前日期 | +| CurTime() | 返回当前时间 | +| Date() |返回日期时间的日期部分| +| DateDiff() |计算两个日期之差| +| Date_Add() |高度灵活的日期运算函数| +| Date_Format() |返回一个格式化的日期或时间串| +| Day()| 返回一个日期的天数部分| +| DayOfWeek() |对于一个日期,返回对应的星期几| +| Hour() |返回一个时间的小时部分| +| Minute() |返回一个时间的分钟部分| +| Month() |返回一个日期的月份部分| +| Now() |返回当前日期和时间| +| Second() |返回一个时间的秒部分| +| Time() |返回一个日期时间的时间部分| +| Year() |返回一个日期的年份部分| ```sql mysql> SELECT NOW(); @@ -310,34 +334,15 @@ mysql> SELECT NOW(); | 函数 | 说明 | | :---: | :---: | -| `SIN()` | 正弦 | -| `COS()` | 余弦 | -| `TAN()` | 正切 | -| `ABS()` | 绝对值 | -| `SQRT()` | 平方根 | -| `MOD()` | 余数 | -| `EXP()` | 指数 | -| `PI()` | 圆周率 | -| `RAND()` | 随机数 | - -## 汇总 - -|函 数 |说 明| -| :---: | :---: | -| `AVG()` | 返回某列的平均值 | -| `COUNT()` | 返回某列的行数 | -| `MAX()` | 返回某列的最大值 | -| `MIN()` | 返回某列的最小值 | -| `SUM()` |返回某列值之和 | - -AVG() 会忽略 NULL 行。 - -使用 DISTINCT 可以让汇总函数值汇总不同的值。 - -```sql -SELECT AVG(DISTINCT col1) AS avg_col -FROM mytable -``` +| SIN() | 正弦 | +| COS() | 余弦 | +| TAN() | 正切 | +| ABS() | 绝对值 | +| SQRT() | 平方根 | +| MOD() | 余数 | +| EXP() | 指数 | +| PI() | 圆周率 | +| RAND() | 随机数 | # 十三、分组 @@ -416,16 +421,16 @@ ORDER BY cust_name; 内连接又称等值连接,使用 INNER JOIN 关键字。 ```sql -SELECT a, b, c -FROM A INNER JOIN B +SELECT A.value, B.value +FROM tablea AS A INNER JOIN tableb AS B ON A.key = B.key; ``` 可以不明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中要连接的列用等值方法连接起来。 ```sql -SELECT a, b, c -FROM A, B +SELECT A.value, B.value +FROM tablea AS A, tableb AS B WHERE A.key = B.key; ``` @@ -452,13 +457,11 @@ WHERE department = ( ```sql SELECT e1.name -FROM employee AS e1, employee AS e2 -WHERE e1.department = e2.department +FROM employee AS e1 INNER JOIN employee AS e2 +ON e1.department = e2.department AND e2.name = "Jim"; ``` -连接一般比子查询的效率高。 - ## 自然连接 自然连接是把同名列通过等值测试连接起来的,同名列可以有多个。 @@ -466,8 +469,8 @@ WHERE e1.department = e2.department 内连接和自然连接的区别:内连接提供连接的列,而自然连接自动连接所有同名列。 ```sql -SELECT * -FROM employee NATURAL JOIN department; +SELECT A.value, B.value +FROM tablea AS A NATURAL JOIN tableb AS B; ``` ## 外连接 @@ -482,15 +485,32 @@ FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id; ``` -如果需要统计顾客的订单数,使用聚集函数。 +customers 表: -```sql -SELECT Customers.cust_id, - COUNT(Orders.order_num) AS num_ord -FROM Customers LEFT OUTER JOIN Orders -ON Customers.cust_id = Orders.cust_id -GROUP BY Customers.cust_id; -``` +| cust_id | cust_name | +| :---: | :---: | +| 1 | a | +| 2 | b | +| 3 | c | + +orders 表: + +| order_id | cust_id | +| :---: | :---: | +|1 | 1 | +|2 | 1 | +|3 | 3 | +|4 | 3 | + +结果: + +| cust_id | cust_name | order_id | +| :---: | :---: | :---: | +| 1 | a | 1 | +| 1 | a | 2 | +| 3 | c | 3 | +| 3 | c | 4 | +| 2 | b | Null | # 十六、组合查询 @@ -610,7 +630,7 @@ create procedure myprocedure(out ret int) 触发器会在某个表执行以下语句时而自动执行:DELETE、INSERT、UPDATE。 -触发器必须指定在语句执行之前还是之后自动执行,之前执行使用 BEFORE 关键字,之后执行使用 AFTER 关键字。BEFORE 用于数据验证和净化。 +触发器必须指定在语句执行之前还是之后自动执行,之前执行使用 BEFORE 关键字,之后执行使用 AFTER 关键字。BEFORE 用于数据验证和净化,AFTER 用于审计跟踪,将修改记录到另外一张表中。 INSERT 触发器包含一个名为 NEW 的虚拟表。 @@ -625,8 +645,6 @@ DELETE 触发器包含一个名为 OLD 的虚拟表,并且是只读的。 UPDATE 触发器包含一个名为 NEW 和一个名为 OLD 的虚拟表,其中 NEW 是可以被修改地,而 OLD 是只读的。 -可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。 - MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储过程。 # 二十一、事务处理 diff --git "a/notes/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\216\237\347\220\206.md" "b/notes/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\216\237\347\220\206.md" index 31adaef54b5e33d0a98a12752323e2ca6d75e0bc..1bf22a52b0c000bfd5faf7653e4f0f44ce5962b7 100644 --- "a/notes/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\216\237\347\220\206.md" +++ "b/notes/\346\225\260\346\215\256\345\272\223\347\263\273\347\273\237\345\216\237\347\220\206.md" @@ -81,7 +81,7 @@ - 在并发的情况下,多个事务并发执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 - 事务满足持久化是为了能应对数据库奔溃的情况。 -

+

## AUTOCOMMIT @@ -530,6 +530,8 @@ Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门 Entity-Relationship,有三个组成部分:实体、属性、联系。 +用来进行数据库系统的概念设计。 + ## 实体的三种联系 包含一对一,一对多,多对多三种。 @@ -564,6 +566,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。 # 参考资料 - 史嘉权. 数据库系统概论[M]. 清华大学出版社有限公司, 2006. +- AbrahamSilberschatz, HenryF.Korth, S.Sudarshan, 等. 数据库系统概念 [M]. 机械工业出版社, 2006. - 施瓦茨. 高性能 MYSQL(第3版)[M]. 电子工业出版社, 2013. - [The InnoDB Storage Engine](https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html) - [Transaction isolation levels](https://www.slideshare.net/ErnestoHernandezRodriguez/transaction-isolation-levels) diff --git a/pics/35650b4b-efa1-49ba-9680-19837027cfc9.png b/pics/35650b4b-efa1-49ba-9680-19837027cfc9.png new file mode 100644 index 0000000000000000000000000000000000000000..8f400a656dccc7ed85b50a1eb014cb254e916a07 Binary files /dev/null and b/pics/35650b4b-efa1-49ba-9680-19837027cfc9.png differ