本書所用的表:

68.png

67.png

66.png

65.png

64.png

63.png
第一章:了解SQL
- 數(shù)據(jù)庫:保存有組織的數(shù)據(jù)的容器(通常是一個文件或一組文件)。
- 數(shù)據(jù)庫軟件:DBMS(數(shù)據(jù)庫管理系統(tǒng)),如MySQL等。
- 表:某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單。
- 表名:表名的唯一性取決于多個因素,如數(shù)據(jù)庫名和表名等的結(jié)合。
- 模式:關(guān)于數(shù)據(jù)庫和表的布局及特性的信息。
- 列:表中的一個字段。所有表都是由一個或多個列組成的。每個列都有相應(yīng)的數(shù)據(jù)類型。
- 數(shù)據(jù)類型:所容許的數(shù)據(jù)的類型。限制可存儲在列中的數(shù)據(jù)種類。
- 行:表中的一個記錄。表中的數(shù)據(jù)是按行存儲的。
- 主鍵(primary key):一列(或一組列),其值能夠唯一區(qū)分表中的每個行。
- SQL:結(jié)構(gòu)化查詢語言(Structured Query Language),用來與數(shù)據(jù)庫通信。
第二章:MySQL簡介
- MySQL是一種DBMS,即它是一種數(shù)據(jù)庫軟件。
- DBMS可分為兩類:一類為基于共享文件系統(tǒng)的DBMS,另一類為基于客戶機(jī)-服務(wù)器的DBMS。MySQL、Oracle以及Microsoft SQL Server等數(shù)據(jù)庫是基于客戶機(jī)-服務(wù)器的數(shù)據(jù)庫。
- 客戶機(jī)是與用戶打交道的軟件,與數(shù)據(jù)文件打交道的只有服務(wù)器軟件??蛻魴C(jī)軟件通過網(wǎng)絡(luò)與服務(wù)器軟件交流。
第三章:使用MySQL
- 連接MySQL,需要以下信息:
1.主機(jī)名——如果連接到本地MySQL服務(wù)器,為localhost
2.端口(如果使用默認(rèn)端口3306之外的端口)
3.一個合法的用戶名
4.用戶口令(如果需要) - 選擇數(shù)據(jù)庫可使用use關(guān)鍵字,例如:use dbone;
- 了解數(shù)據(jù)庫和表:
1.show databases;返回可用數(shù)據(jù)庫的一個列表
2.show tables;返回一個數(shù)據(jù)庫內(nèi)的表的列表
3.show columns from customers;顯示表的列的信息
4.show status;用于顯示廣泛的服務(wù)器狀態(tài)信息
5.show create database;顯示創(chuàng)建特定數(shù)據(jù)庫的MySQL語句
6.show create table;顯示創(chuàng)建特定表的MySQL語句
7.show grants;顯示授予用戶的安全權(quán)限
8.show errors;和show warnings;顯示服務(wù)器錯誤或警告信息
第四章:檢索數(shù)據(jù)
本章介紹如何使用select語句從表中檢索一個或多個數(shù)據(jù)列
- 檢索單個列:select cust_address from customers;
- 檢索多個列:select cust_address,cust_city,cust_zip from customers;
- 檢索所有列:select * from customers;
- 檢索不同的行: select distinct cust_country from customers; distinct關(guān)鍵字指示MySQL只返回不同的值。
- 限制結(jié)果:select cust_address from customers limit 5;
select cust_address from customers limit 2,3;

5.png

6.png

7.png

8.png

9.png

10.png
第五章:排序檢索數(shù)據(jù)
本章講授如何使用select語句的order by子句
- 排序數(shù)據(jù):select cust_zip from customers order by cust_zip;
- 按多個列排序:select cust_id,cust_zip,cust_contact from customers order by cust_zip,cust_contact;
- 指定排序方向:select cust_id,cust_zip,cust_contact from customers order by cust_zip desc,cust_contact;倒序 desc關(guān)鍵字只應(yīng)用到直接位于其前面的列名。

13.png

12.png

11.png
第六章:過濾數(shù)據(jù)
本章使用where子句指定索引條件
| where子句操作符 | 說明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| between | 在指定的兩個值之間 |

17.png

16.png

14.png
第七章:數(shù)據(jù)過濾
本章講授如何組合where子句,使用and,or,not,in操作符
- and:用在where子句中的關(guān)鍵字,用來指示檢索滿足所有給定條件的行。
- or: where子句中使用的關(guān)鍵字,用來表示檢索匹配任一給定條件的行。
- where子句中使用圓括號分組操作符
- in:where子句中用來指定要匹配值的清單的關(guān)鍵字,功能與or相當(dāng)。
- not:where子句中用來否定后跟條件的關(guān)鍵字。

23.png

22.png

21.png

20.png

19.png

18.png
第八章:用通配符進(jìn)行過濾
本章介紹什么是通配符,如何使用通配符,如何使用like操作符。
- 通配符:用來匹配值的一部分的特殊字符
- 搜索模式:由字面值、通配符或兩者組合構(gòu)成的搜索條件
- 百分號(%) 通配符:表示任何字符出現(xiàn)任意次數(shù)。
- 下劃線(_) 通配符:下劃線的用途與%一樣,但下劃線只匹配單個字符而不是多個字符
- 使用通配符的技巧:
1.不要過度使用通配符。
2.在確實(shí)需要使用通配符,除非絕對有必要,否則不要把他們用在搜索模式的開始處。
3.仔細(xì)注意通配符的位置。

27.png

26.png

25.png

24.png
第九章:用正則表達(dá)式進(jìn)行搜索
本章將學(xué)習(xí)如何在MySQL where子句內(nèi)使用正則表達(dá)式來控制數(shù)據(jù)過濾。
- 正則表達(dá)式是用來匹配文本的特殊的串(字符集合)。
- MySQL僅支持多數(shù)正則表達(dá)式實(shí)現(xiàn)的一個很小的自己。MySQL中的正則表達(dá)式匹配不分區(qū)大小寫,regexp后所跟的東西作為正則表達(dá)式處理。
- like匹配整個列,regexp在列值內(nèi)進(jìn)行匹配
- 基本字符匹配
- or匹配:使用|
- 匹配幾個字符之一:[]
- 匹配范圍:[0-9] [a-z]
- 匹配特殊字符:\. \\
- 匹配字符類
- 匹配多個實(shí)例
- 定位符
| 字符類 | 說明 |
|---|---|
| [:alnum:] | 任意字母和數(shù)字(同[a-zA-Z0-9]) |
| [:alpha:] | 任意字符(同[a-zA-Z]) |
| [:blank:] | 空格和制表(同[\t]) |
| [:cntrl:] | ASCII控制字符(ASCII 0到31和127) |
| [:digit:] | 任意數(shù)字(同[0-9]) |
| [:graph:] | 與[:print:]相同,但不包括空格 |
| [:lower:] | 任意小寫字母(同[a-z]) |
| [:print:] | 任意可打印字符 |
| [:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
| [:space:] | 包括空格在內(nèi)的任意空白字符(同[\f\n\r\t\v]) |
| [:upper:] | 任意大寫字母(同[A-z]) |
| [:xdigit:] | 任意十六進(jìn)制數(shù)字(同[a-fA-f0-9]) |
| 重復(fù)元字符 | 說明 |
|---|---|
| * | 0個或多個匹配 |
| + | 一個或多個匹配(等于{1,}) |
| ? | 0個或1個匹配(等于{0,1}) |
| {n} | 指定數(shù)目的匹配 |
| {n,} | 不少于指定數(shù)目的匹配 |
| {n,m} | 匹配數(shù)目的范圍(m不超過255) |
| 定位元字符 | 說明 |
|---|---|
| ^ | 文本的開始 |
| $ | 文本的結(jié)尾 |
| [[:<:]] | 詞的開始 |
| [[:>:]] | 詞的結(jié)尾 |

37.png

36.png

35.png

34.png

33.png

32.png

30.png

29.png

28.png
第十章:創(chuàng)建計(jì)算字段
- 字段基本上與列的意思相同,經(jīng)?;Q使用,不過數(shù)據(jù)庫列一般稱為列,而術(shù)語字段通常用在計(jì)算字段的連接上。
- 拼接:將值聯(lián)結(jié)到一起構(gòu)成單個值??墒褂肅oncat()函數(shù)來拼接兩個列。
- 別名:a as b
- RTrim()函數(shù):去除數(shù)據(jù)右側(cè)多余的空格
- 執(zhí)行算術(shù)計(jì)算:+ - * /

38.png

39.png

40.png
第十一章:使用數(shù)據(jù)處理函數(shù)
本章介紹什么是函數(shù),MySQL支持何種函數(shù),以及如何使用這些函數(shù)。
- SQL支持利用函數(shù)來處理數(shù)據(jù)。函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。
- 大多數(shù)SQL實(shí)現(xiàn)支持以下類型的函數(shù):
1.用于處理文本串(如刪除或填充值,轉(zhuǎn)換值為大寫或小寫)的文本函數(shù)。
2.用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)操作(如返回絕對值,進(jìn)行代數(shù)運(yùn)算)的數(shù)值函數(shù)。
3.用于處理日期和時間值并從這些值中提取特定成分(例如,返回兩個日期之差,檢查日期有效性等)的日期和時間函數(shù)。
4.返回DBMS正使用的特殊信息(如返回用戶登錄信息,檢查版本細(xì)節(jié))的系統(tǒng)函數(shù)。
| 常用的文本處理函數(shù) | 說明 |
|---|---|
| Left() | 返回串左邊的字符 |
| Length() | 返回串的長度 |
| Locate() | 找出串的一個子串 |
| Lower() | 將串轉(zhuǎn)換為小寫 |
| LTrim() | 去掉串左邊的空格 |
| Right() | 返回串右邊的字符 |
| RTrim() | 去掉串右邊的空格 |
| Soundex() | 返回串的SOUNDEX值 |
| SubString() | 返回子串的字符 |
| Upper() | 將串轉(zhuǎn)換為大寫 |
| 常用日期和時間處理函數(shù) | 說明 |
|---|---|
| AddDate() | 增加一個日期(天、周等) |
| AddTime() | 增加一個時間(時、分等) |
| CurDate() | 返回當(dāng)前日期 |
| CurTime() | 返回當(dāng)前時間 |
| Date() | 返回日期時間的日期部分 |
| DateDiff() | 計(jì)算兩個日期之差 |
| Date_Add() | 高度靈活的日期運(yùn)算函數(shù) |
| Date_Format() | 返回一個格式化的日期或時間串 |
| Day() | 返回一個日期的天數(shù)部分 |
| DayOfWeek() | 對于一個日期,返回對應(yīng)的星期幾 |
| Hour() | 返回一個時間的小時部分 |
| Minute() | 返回一個時間的分鐘部分 |
| Month() | 返回一個日期的月數(shù)部分 |
| Now() | 返回當(dāng)前日期和時間 |
| Second() | 返回一個時間的秒部分 |
| Time() | 返回一個日期時間的時間部分 |
| Year() | 返回一個日期的年份部分 |
| 常用數(shù)值處理函數(shù) | 說明 |
|---|---|
| Abs() | 返回一個數(shù)的絕對值 |
| Cos() | 返回一個角度的余弦 |
| Exp() | 返回一個數(shù)的指數(shù)值 |
| Mod() | 返回除操作的余數(shù) |
| Pi() | 返回圓周率 |
| Rand() | 返回一個隨機(jī)數(shù) |
| Sin() | 返回一個角度的正弦 |
| Sqrt() | 返回一個數(shù)的平方根 |
| Tan() | 返回一個角度的正切 |

45.png

44.png

43.png

42.png

41.png
第十二章:匯總數(shù)據(jù)
本章介紹什么是SQL的聚集函數(shù)以及如何利用它們匯總表的數(shù)據(jù)。
- 聚集函數(shù):運(yùn)行在行組上,計(jì)算和返回單個值的函數(shù)。
| SQL聚集函數(shù) | 說明 |
|---|---|
| AVG() | 返回某列的平均值 |
| COUNT() | 返回某列的函數(shù) |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
| SUM() | 返回某列值之和 |

52.png

51.png

50.png

49.png

48.png

47.png

46.png
第十三章:分組數(shù)據(jù)
本章介紹如何分組數(shù)據(jù),以便能匯總表內(nèi)容的子集,這涉及兩個新select語句子句,分別是group by子句和having子句
- 分組允許把數(shù)據(jù)分為多個邏輯組,以便能對每個組進(jìn)行聚集計(jì)算。
- 分組是在select語句的group by子句中建立的,group by子句指示MySQL分組數(shù)據(jù),然后對每個組而不是整個結(jié)果集進(jìn)行聚集。
- 在具體使用group by子句前,需要知道一些重要的規(guī)定。
1.group by子句可以包含任意數(shù)目的列。這使得能對分組進(jìn)行嵌套,為數(shù)據(jù)分組提供更細(xì)致的控制。
2.如果在group by子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總。換句話說,在建立分組時,指定的所有列都一起計(jì)算。
3.group by子句中列出的每個列都必須是檢索列或有效的表達(dá)式。如果在select中使用表達(dá)式,則必須在group by子句中指定相同的表達(dá)式。不能使用別名。
4.除聚集計(jì)算語句外,select語句中的每個列都必須在group by子句中給出。
5.如果分組列中具有null值,則null將作為一個分組返回。如果列中有多行null值,它們將分為一組。
6.group by子句必須出現(xiàn)在where子句之后,order by子句之前。 - 使用with rollup關(guān)鍵字,可以得到每個分組以及每個分組匯總級別的值。
- 使用having子句過濾分組。
- where在數(shù)據(jù)分組前進(jìn)行過濾,having在數(shù)據(jù)分組后進(jìn)行過濾。
- 以下二者區(qū)別:
| order by | group by |
|---|---|
| 排序產(chǎn)生的輸出 | 分組行。但輸出可能不是分組的順序 |
| 任意列都可以使用 | 只可能使用選擇列或表達(dá)式列,而且必須使用每個選擇列表達(dá)式 |
| 不一定需要 | 如果與聚集函數(shù)一起使用列,則必須使用 |
- select子句及其順序:
| select子句 | 說明 | 是否必須使用 |
|---|---|---|
| select | 要返回的列或表達(dá)式 | 是 |
| from | 從中檢索數(shù)據(jù)的表 | 僅在從表選擇數(shù)據(jù)時使用 |
| where | 行級過濾 | 否 |
| group by | 分組說明 | 僅在按組計(jì)算聚集時使用 |
| having | 組級過濾 | 否 |
| order by | 輸出排序順序 | 否 |
| limit | 要檢索的行數(shù) | 否 |

59.png

58.png

57.png

56.png

55.png

54.png

53.png
第十四章:使用子查詢
本章介紹什么是子查詢以及如何使用它們。
- 子查詢:即嵌套在其他查詢中的查詢。
- 利用子查詢進(jìn)行過濾。
- 在where子句中使用子查詢,應(yīng)該保證select語句具有與where子句中相同數(shù)目的列。通常,子查詢將返回單個列并且與單個列匹配,但如果需要也可以使用多個列。
- 作為計(jì)算字段使用子查詢。
- 相關(guān)子查詢:涉及外部查詢的子查詢。
- 子查詢最常見的使用是在where子句的in操作符中,以及用來填充計(jì)算列。
- 例子一:列出訂購物品tnt2的所有客戶:
1.檢索包含物品tnt2的所有訂單的編號
2.檢索具有前一步驟列出的訂單編號的所有客戶的ID。
3.檢索前一步驟返回的所有客戶ID的客戶信息。 - 例子二:顯示customers表中每個客戶的訂單總數(shù)。
1.從customers表中檢索客戶列表。
2.對于檢索出的每個客戶,統(tǒng)計(jì)其在orders表中的訂單數(shù)目。

61.png

62.png
第十五章:聯(lián)結(jié)表
本章介紹什么是聯(lián)結(jié),為什么要使用聯(lián)結(jié),如何編寫使用聯(lián)結(jié)的select語句。
- 關(guān)系表的設(shè)計(jì)就是要保證把信息分解成多個表,一類數(shù)據(jù)一個表。各表通過某些常用的值(即關(guān)系設(shè)計(jì)中的關(guān)系)互相關(guān)聯(lián)。
- 外鍵:外鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關(guān)系。
- 可伸縮性:能夠適應(yīng)不斷增加的工作量而不失敗。設(shè)計(jì)良好的數(shù)據(jù)庫或應(yīng)用程序稱之為可伸縮性好。
- 聯(lián)結(jié)是一種機(jī)制,用來在一條select語句中關(guān)聯(lián)表。
- 創(chuàng)建聯(lián)結(jié):規(guī)定要聯(lián)結(jié)的所有表以及它們?nèi)绾侮P(guān)聯(lián)即可。
- 完全限定列名:在引用的列可能出現(xiàn)二義性時,必須使用完全限定列名(用一個點(diǎn)分隔的表名和列名)。
- 笛卡爾積:由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡爾積。檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)。
- 等值聯(lián)結(jié):基于兩個表之間的相等測試,也稱為內(nèi)部聯(lián)結(jié)。

72.png

71.png

70.png

69.png
第十六章:創(chuàng)建高級聯(lián)結(jié)
本章講解另外一些聯(lián)結(jié)類型,介紹如何對被聯(lián)結(jié)的表使用表別名和聚集函數(shù)。
- 別名除了用于列名和計(jì)算字段外,SQL還允許給表名起別名。理由:
1.縮短SQL語句。
2.允許在單條select語句中多次使用相同的表。 - 表別名不僅能用于where子句,它還可以用于select的列表、order by子句以及語句的其他部分。
- 自聯(lián)結(jié):自聯(lián)結(jié)通常作為外部語句用來替代從相同表中檢索數(shù)據(jù)時使用的子查詢語句。
- 自然聯(lián)結(jié):只能選擇那些唯一的列。通過對表使用通配符(select *),對所有其他表的列使用明確的子集來完成。
- 外部聯(lián)結(jié):聯(lián)結(jié)包含了那些在相關(guān)表中沒有關(guān)聯(lián)行的行。包括左外聯(lián)結(jié)和右外聯(lián)結(jié)。它們之間的唯一差別是所關(guān)聯(lián)的表的順序不同。
- 使用帶聚集函數(shù)的聯(lián)結(jié)。
- 關(guān)于聯(lián)結(jié)及其使用的某些要點(diǎn):
1.注意所使用的聯(lián)結(jié)類型。一般我們使用內(nèi)部聯(lián)結(jié),但使用外部聯(lián)結(jié)也是有效的。
2.保證使用正確的聯(lián)結(jié)條件,否則將返回不正確的數(shù)據(jù)。
3.應(yīng)該總是提供聯(lián)結(jié)條件,否則會得出笛卡爾積。
4.在一個聯(lián)結(jié)中可以包含多個表,甚至對于每個聯(lián)結(jié)可以采用不同的聯(lián)結(jié)類型。雖然這樣做是合法的,一般也很有用,但應(yīng)該在一起測試它們前,分別測試每個聯(lián)結(jié)。這將使故障排除更為簡單。

77.png

76.png

75.png

74.png

73.png
第十七章:組合查詢
本章講述如何利用union操作符將多條select語句組合成一個結(jié)果集。
- MySQL也允許執(zhí)行多個查詢,并將結(jié)果作為單個查詢結(jié)果集返回。這些組合查詢稱為并(union)或復(fù)合查詢。
- 有兩種基本情況,其中需要使用組合查詢:
1.在單個查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù)
2.對單個表執(zhí)行多個查詢,按單個查詢返回?cái)?shù)據(jù)。 - 使用union可極大地簡化復(fù)雜的where子句,簡化從多個表中檢索數(shù)據(jù)的工作。
- union規(guī)則:
1.union必須由兩條或兩條以上的select語句組成,語句之間用關(guān)鍵字union分隔。
2.union中的每個查詢必須包含相同的列、表達(dá)式或聚集函數(shù)。
3.列數(shù)據(jù)類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含地轉(zhuǎn)換的類型 - 使用union all,MySQL不取消重復(fù)的行。

80.png

79.png

78.png