auto commit
This commit is contained in:
parent
63cc7da1a4
commit
76034e67bd
176
notes/SQL.md
176
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 语句,也就是不能调用存储过程。
|
||||
|
||||
# 二十一、事务处理
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
- 在并发的情况下,多个事务并发执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
|
||||
- 事务满足持久化是为了能应对数据库奔溃的情况。
|
||||
|
||||
<div align="center"> <img src="../pics//7b48448f-cbe3-4287-9041-f56566b9d0b4.png"/> </div><br>
|
||||
<div align="center"> <img src="../pics//35650b4b-efa1-49ba-9680-19837027cfc9.png"/> </div><br>
|
||||
|
||||
## 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)
|
||||
|
|
BIN
pics/35650b4b-efa1-49ba-9680-19837027cfc9.png
Normal file
BIN
pics/35650b4b-efa1-49ba-9680-19837027cfc9.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Loading…
Reference in New Issue
Block a user