1. 查詢
1.1 SELECT語句: MySQL 中使用 SELECT 語句來查詢數據。 數據庫中根據需求,使用不同的查詢方式來獲取不同的數據,是使用頻率最高、最重要的操作。
1.2 查詢---通配符
1.2.1 通配符---(“ * ”)用法
語法:
SELECT * FROM <表名>;

1.2.2 通配符---(“ % ”)用法
匹配任意長度的字符串,包括空字符串。例如,字符串“ c% ”匹配以字符 c 開始,任意長度的字符串,如“ ct ”,“ cut ”,“ current ”等;字符串“ c%g ”表示以字符 c 開始,以 g 結尾的字符串;字符串“ %y% ”表示包含字符“ y ”的字符串,無論“ y ”在字符串的什么位置。

1.2.3 通配符---(“ _ ”)用法
下划線通配符只匹配單個字符,若要匹配多個字符,需要使用多個下划線通配符。例如,字符串“ cu_ ”匹配以字符串“ cu ”開始,長度為3的字符,如“ cut ”,“ cup ”;字符串“ c__l”匹配在“ c ”和“ l ”之間包含兩個字符的字符串,如“ cool ”。需要注意的是,連續的“_”之間不能有空格,例如“M_ _QL”只能匹配“My SQL”,不能匹配“MySQL”。
注意:若要查詢的字段值本來就含有“ % ”或者“ _ ”,則要用“ \ ”進行轉義,如要查詢本身含有“ % ”的字符串,命令應改為 “ %\%%”。

1.3 查詢---空值
在數據表中有些值可能為空值(NULL),空值不同於0。需要使用 IS NULL 來判斷字段的值是否為空值。IS NOT NULL 關鍵字用來查詢字段不為空值的記錄。
語法: SELECT [字段名1,字段名2,…] FROM <表名> WHERE [字段名] IS [ NOT ] NULL

1.4 查詢---關鍵字
1.4.1 關鍵字---distinct用法
很多表中某些字段的數據存在重復的值,可以使用DISTINCT關鍵字來過濾重復的值,只保留一個值。DISTINCT 關鍵字還可作用於多個字段,則只有多個字段的值都完全相同時才會被認作是重復記錄。
語法:
SELECT DISTINCT [字段名] FROM <表名>

1.4.2 關鍵字---like用法
通常與通配符 “%” 與 “_” 搭配使用,也可以單獨使用。
語法: SELECT [字段名1,字段名2,…] FROM <表名> WHERE [字段名] [ NOT ] LIKE ‘匹配字符串’

1.4.3 關鍵字---and用法
在使用SELECT語句查詢數據時,優勢為了使查詢結果更加精確,可以使用多個查詢條件,如使用 AND 關鍵字可以連接兩個或多個查詢條件。
語法: SELECT [字段名1,字段名2,…] FROM <表名> WHERE [條件表達式1] AND [條件表達式2] ...

1.4.4 關鍵字---or用法
與 AND 關鍵字不同,OR 關鍵字只要滿足任意一個條件就會被查詢出來。
語法: SELECT [字段名1,字段名2,…] FROM <表名> WHERE [條件表達式1] OR [條件表達式2] ...

1.4.5 關鍵字---and與or配合用法
OR 和 AND 一起使用的時候,AND 的優先級高於 OR,因此二者一起使用時,會先運算 AND 兩邊的表達式,再運算 OR 兩邊的表達式。

2. 子查詢
通常我們在查詢的SQL中嵌套查詢,稱為子查詢。子查詢通常會使復雜的查詢變得簡單,但是相關的子查詢要對基礎表的每一條數據都進行子查詢的動作,所以當表單中數據過大時,一定要慎重選擇,常用的子查詢語句有五種:
-
- 條件查詢(where子句):按照“條件表達式”指定的條件進行查詢。
- 分組查詢(group by子句):按照“屬性名”指定的字段進行分組。group by子句通常和count()、sum()等聚合函數一起使用。
- 篩選查詢(having子句):有group by才能having子句,只有滿足“條件表達式”中指定的條件的才能夠輸出。
- 排序查詢(order by子句):按照“屬性名”指定的字段進行排序。排序方式由“asc”和“desc”兩個參數指出,默認是按照“asc”來排序,即升序。
- 限制查詢(limit):限制結果集。
2.1 條件查詢(where子句)
where子句常用與運算符配合使用,常用於配合的運算符:
| 類型 | 運算符 | 說明 |
| 比較運算符 | <,<=,=,>,>=,!= | 小於,小於等於,等於,大於,大於等於,不等於 |
| 邏輯運算符 | not 或 !,or 或 |,and 或 & | 非,或,與 |
需求:查詢表格中分數大於50,且名字為“張三”的數據!
2.2 分組查詢(group by子句)
“group by”就是,根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”划分成若干個“小區域”,然后針對若干個“小區域”進行數據處理。group by語句中,select指定的字段必須是“分組依據字段”,其他字段若想出現在select中則必須包含在聚合函數中。
select 類別, sum(數量) as 數量之和 from A group by 類別
MySQL常用的五種聚合函數:
-
- max():求最大值。
- min():求最小值。
- sum():求和。
- avg():求平均值。
- count():統計記錄的條數。
需求:選出表中各成員中成績最高的數據!

2.3 篩選查詢(having子句)
having子句可以讓我們篩選“成組”后的各種數據,主要是針對“組"里面條件進行篩選。where子句在聚合前先篩選記錄,也就是說作用在group by和having子句前。而 having子句在聚合后對組記錄進行篩選。
需求:篩選出name和score這組數據中,分數大於50的數據!

where和having的區別:
作用的對象不同。WHERE 子句作用於表和視圖,HAVING 子句作用於組。
WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之后選取分組的行。因此,WHERE 子句不能包含聚集函數; 因為試圖用聚集函數判斷那些行輸入給聚集運算是沒有意義的。相反,HAVING 子句總是包含聚集函數。(嚴格說來,你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費勁。同樣的條件可以更有效地用於 WHERE 階段。)在上面的例子中,我們可以在 WHERE 里應用數量字段來限制,因為它不需要聚集。 這樣比在 HAVING 里增加限制更加高效,因為我們避免了為那些未通過 WHERE 檢查的行進行分組和聚集計算。
綜上所述:
having一般跟在group by之后,執行記錄組選擇的一部分來工作的。where則是執行所有數據來工作的。
再者having可以用聚合函數,如having sum(qty)>1000。
2.4 排序查詢(order by子句)
- order by <列名> # 默認升序排列
- order by <列名> desc # 降序排列
- order by <列名> asc # 升序排列
- order by rand() # 隨機排列
需求:將數據表中的數據依據score,進行降序排列!

列中的元素不是為數字也可以的。

2.5 限制查詢(limit子句)
在查詢語句中,我們經常想要只返回前面幾行或中間幾行的數據,可使用【 limit [offset,] N 】,offset偏移量,可選,默認為0,【limit 0,N】取出0至N數據。

2.6 子查詢關鍵字
2.6.1 關鍵字---as的用法
1)重命名表/列名:as可以理解為用作、當成,一般是重命名“列名”或者“表名”,主要是為了查詢方便。
需求:將表中“name”列名,重命名為n。

需求:查找表中數據,並將數據表重命名為st。

2)關鍵字as作為連接語句的操作符
create table charm1 as select * from charm2
解釋:上面的語句是先獲取charm1表格中所有數據,之后再創建一張charm1表,結構和charm2表相同,記錄為后面語句的查詢結果。
2.6.2 關鍵字---in用法
使用in關鍵字可以將原表中特定列的值與子查詢返回的結果集中的值進行比較
如果某行的特定列的值存在,則在select語句的查詢結果中就包含這一行。
例:查詢成績大於80的學生的所有信息,
先在子查詢中查出成績大於80的結果集,然后將原成績表中的成績與結果集進行比較,如果存在,就輸出這條學生的記錄。
2.6.3 關鍵字---exists用法
exists: 是否存在的意思, exists子查詢就是用來判斷某些條件是否滿足(跨表),
exists是接在where之后
exists返回的結果只有0和1。
需求:如果存在成績大於90的人則列出“整個表”的記錄。

2.6.4 關鍵字---any用法
any關鍵字表示滿足其中的任意一個條件,使用any關鍵字時,只要滿足內層查詢語句結果的的任意一個,就可以通過該條件來執行外層查詢語句。

2.6.5 關鍵字---all用法
all和any剛好是相反的,all關鍵字表示滿足所有結果,使用all關鍵字,要滿足內層查詢語句的所有結果,才可以通過該條件來執行外層查詢語句。

2.6.6 關鍵字---between and 用法
between關鍵字是一個邏輯操作符用來篩選指定屬性或表達式某一范圍內或范圍外的數據。between常用在where關鍵字后與select或update或delete共同使用。
between的使用語法: expr [NOT] BETWEEN begin_expr AND end_expr 在整個表達式中,expr表示的是一個單一的屬性或者是一個計算的表達式,整個表達式中的三個參數 expr、begin_expr、end_expr 必須是同一種數據類型。 between篩選的是 expr >= begin_expr並且 expr <= end_expr 的數據,如果不存在則返回的是0; not between篩選的是 expr < begin_expr或者 expr > end_expr 的數據,如果不存在則返回的是0; 如果 expr 返回的是 NULL,則between 也返回的是null (暫未驗證)。
需求:查詢stu_sc表中,分數在40-80分之間的數據!

2.7 子查詢組合
2.7.1 組合:where + group by + having + 函數。
需求:查詢出兩門以上不及格者的平均成績(注意:是所有科目含及格科目的平均成績)
第一步:打開數據表。

第二步:打開查詢,新建查詢,輸入查詢語句,查詢出表中所有數據。

第三步:試試用count()函數,count(a),無論a是什么,都只是數一行;count時,每遇到一行,就數一個a,跟條件無關!(數據多了王五的)!

第四步:試試用sum()函數,用sum(score<60)來計算不及格的科目數!(正解)

2.8 查詢語句的執行順序(從上至下)
| 語句類型 | 執行語句 | 簡介 | 是否必須使用 |
| 查詢語句 | select | 要返回的列或表達式 | 必須 |
| 查詢語句 | form | 從中檢索數據的數據表 | 僅在表中選擇數據時使用 |
| 子句 | where | 行級過濾 | 否 |
| 子句 | group by | 分組說明 | 僅在按組計算聚集時使用 |
| 子句 | having | 組級過濾 | 否 |
| 子句 | order by | 輸出排序順序 | 否 |
| 子句 | limit | 要檢索的行數 | 否 |
3. 連接查詢
連接查詢的意義: 在用戶查看數據的時候,需要顯示的數據來自多張表。
3.1 內連接查詢
內連接查詢是最常見的連接查詢,內連接查詢可以查詢兩張或兩張以上的表。
內連接:[inner] join:從左表中取出每一條記錄,去右表中與所有的記錄進行匹配: 匹配必須是某個條件在左表中與右表中相同最終才會保留結果,否則不保留。
基本語法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
on表示連接條件: 條件字段就是代表相同的業務含義(如my_student.c_id和my_class.id)
當兩個表中存在相同意義的字段的時候,就可以通過該字段來連接查詢這兩個表,當該字段的值相同時就可以查出該記錄。
內連接可以沒有連接條件: 沒有on之后的內容,這個時候系統會保留所有結果。
需求:輸出stu_xx與sj表中以id為連接條件,stu_xx中name與age數據,sj中country與city數據。
若沒有on的話,左表中的數據會逐一與右表的數據連接。

3.2 外連接查詢
以某張表為主,取出里面的所有記錄, 然后每條與另外一張表進行連接: 不管能不能匹配上條件,最終都會保留: 能匹配,正確保留; 不能匹配,其他表的字段都置空。
3.2.1 左連接查詢
左連接(left join): 左外連接(左連接), 以左表為主表。
基本語法: from 左表 left join 右表 on 左表.字段 = 右表.字段;
左表不管能不能匹配上條件,最終都會保留:能匹配,正確的保留; 若不能匹配,右表的字段都置NULL。

3.2.2 右連接查詢
右連接(right join): 右外連接(右連接), 以右表為主表
基本語法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
右表不管能不能匹配上條件,最終都會保留:能匹配,正確的保留; 若不能匹配,左表的字段都置NULL。

4. 聯合查詢
4.1 聯合查詢定義:聯合查詢結果是將多個select語句的查詢結果合並到一塊因為在某種情況下需要將幾個select語句查詢的結果合並起來顯示。比如現在需要查詢兩個公司的所有員工的信息,這就需要從甲公司查詢所有員工信息,再從乙公司查詢所有的員工信息,然后將兩次的查詢結果進行合並。
4.2 聯合查詢語法
4.2.1 可以使用union和union all關鍵字進行操作。
語法:
select 語句1
union [union 選項]
select 語句2
union [union 選項]
select 語句n
4.2.2 其中union選項有兩個選項可選:
-
- all:表示無論重復都輸出
- distinct: 去重(整個重復)(默認的)
需求:將兩個表中所有內容合並后輸出!
4.2.3 聯合查詢的意義:
-
- 查詢同一張表,但是需求不同 如查詢學生信息, 男生身高升序, 女生身高降序
- 多表查詢: 多張表的結構是完全一樣的,保存的數據(結構)也是一樣的.
4.2.4 聯合查詢 order by 的使用
在聯合查詢中: order by不能直接使用(不能出現兩次,不然報錯!),需要對查詢語句使用括號才行。
也就是說,order by不能直接出現在union的子句中,但是可以出現在子句的子句中。

