SQL中的排序
使用關鍵字:ORDER BY
- ORDER BY 欄位名后使用ASC升序表示;使用DESC表示降序,
- ORDER BY 后面可以使用列的別名進行排序(列的別名只能在ORDER BY中使用,不能再HWERE后使用)
- WHERE需要再FROM后,ORDER BY前宣告!!
- 多級排序,ORDER BY 列名1 ASC,列名2 DESC..;
SQL中的分頁
mysql使用LIMIT實作資料的分頁顯示
# 需求1:每頁顯示20條,此時顯示第1頁
SELECT employee_id,last_name FROM employees
LIMIT 0,20; #limit后第一個數字表示偏移量,第一條資料為0,第二個數字表示顯示多少條,
# 需求2:每頁顯示20條,此時顯示第2頁
SELECT employee_id,last_name FROM employees
LIMIT 20,20;
# 需求3:每頁顯示20條,此時顯示第3頁
SELECT employee_id,last_name FROM employees
LIMIT 40,20;
分頁公式
# 需求:每頁顯示pagesize條,此時顯示第pageno頁
# 公式:LIMIT (pageno-1)*pagesize,pagesize;
關于LIMIT:mysql8.0新特性
LIMIT...OFFSET...
在8.0之前的版本,limit后面的默認第一個數字表示偏移量,第二個數字表示要取的條數
在8.0之后的版本,limit后面新增了一個offset關鍵字,offset后面表示偏移量,limit后面表示要取的條數
SQL的多表查詢
多表查詢基本格式
# 多表查詢的格式:
# select 要查詢的欄位名 from 表1,表2.. where 表1.欄位名=表2.欄位名
# 注意:要查詢的欄位名如果在多表中出現,則需要指定是哪個表的欄位,
# 但是,從sql查詢優化的角度看,建議多表查詢時指明每個欄位來自哪個表
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;
多表查詢的分類
角度1:等值連接 vs 非等值連接
角度2:自連接 vs 非自連接
角度3:內連接 vs 外連接
- 等值連接:where后連接條件是=連接
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;
- 非等值連接:where后連接條件不是=連接
# 非等值連接例子
SELECT employee_id,salary,grade_level
FROM employees e,job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.grade_level;
- 自連接:自己這張表和自己連接
# 自連接的例子
# 員工表里有員工id和員工對應的管理者id(有的管理者也是員工,也在員工表里)這時需要自連接
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;
-
非自連接:一張表和其他表連接
-
內連接:合并具有同一列的兩個以上的表的行,結果集中不包含一個表與另一個表不匹配的行
-
外連接:合并具有同一列的兩個以上的表的行,結果集中包含一個表與另一個表匹配的行之外,還查詢到了左表或者右表中不匹配的行,外連接的分類:左外連接、右外連接、滿外連接,
- 左外連接
兩個表在連接的程序中,除了回傳滿足連接條件的行以外,還回傳了左表不滿足條件的行,這種方式叫左外連接
- 右外連接
兩個表在連接程序中,除了回傳滿足連接條件的行以外,還回傳了右表不滿足條件的行,這種方式叫右外連接
SQL92和SQL99實作內連接外連接的語法格式
# 查詢所有員工的last_name和department_name資訊、
# SQL92語法實作內連接,直接from后面寫表名,表名用逗號分割,where后面寫連接條件
# SQL92語法實作外連接使用+法 ----但是mysql不支持SQL92語法
# SQL99語法中使用JOIN...ON..實作多表查詢
# SQL99的內連接寫法:JOIN前面還可以加一個INNER(一般可省略)
SELECT last_name,department_name
FROM employees t1 JOIN departments t2
ON t1.department_id=t2.department_id
# SQL99的外連接寫法:LEFT OUTER JOIN左外連接(OUTER可省略);RIGHT JOIN 右外連接
SELECT last_name,department_name
FROM employees t1 LEFT OUTER JOIN departments t2
ON t1.department_id=t2.department_id
# 滿外連接:使用FULL OUTER JOIN---但是mysql不支持這樣操作
SELECT last_name,department_name
FROM employees t1 LEFT OUTER JOIN departments t2
ON t1.department_id=t2.department_id
union和union all的使用

union:會執行去重操作
union all:不會執行去重操作
結論:如果明確知道合并后的資料不存在重復的資料,或者不需要去重重復資料,則盡量使用union all陳述句,以次來提高資料查詢效率
7中JOIN操作的實作(重點)

# 7種JOIN的實作,以employees和departments表為例
# 中圖:內連接
SELECT employee_id,department_name
FROM employees t1 JOIN departments t2
ON t1.department_id=t2.department_id
# 左上圖:左外連接
SELECT employee_id,department_name
FROM employees t1 LEFT JOIN departments t2
ON t1.department_id=t2.department_id
#右上圖:右外連接
SELECT employee_id,department_name
FROM employees t1 RIGHT JOIN departments t2
ON t1.department_id=t2.department_id
# 左中圖:
SELECT employee_id,department_name
FROM employees t1 LEFT JOIN departments t2
ON t1.department_id=t2.department_id
WHERE t2.department_id is NULL
# 右中圖:
SELECT employee_id,department_name
FROM employees t1 RIGHT JOIN departments t2
ON t1.department_id=t2.department_id
WHERE t1.department_id IS NULL
# 左下圖:使用union all連接上面的兩個表
# 方式1:連接左上圖和右中圖
SELECT employee_id,department_name
FROM employees t1 LEFT JOIN departments t2
ON t1.department_id=t2.department_id
UNION ALL
SELECT employee_id,department_name
FROM employees t1 RIGHT JOIN departments t2
ON t1.department_id=t2.department_id
WHERE t1.department_id IS NULL
# 方式2:連接右上圖和左中圖
SELECT employee_id,department_name
FROM employees t1 RIGHT JOIN departments t2
ON t1.department_id=t2.department_id
UNION ALL
SELECT employee_id,department_name
FROM employees t1 LEFT JOIN departments t2
ON t1.department_id=t2.department_id
WHERE t2.department_id is NULL
# 右下圖:連接左中圖和右中圖
SELECT employee_id,department_name
FROM employees t1 LEFT JOIN departments t2
ON t1.department_id=t2.department_id
WHERE t2.department_id is NULL
UNION ALL
SELECT employee_id,department_name
FROM employees t1 RIGHT JOIN departments t2
ON t1.department_id=t2.department_id
WHERE t1.department_id IS NULL
SQL99的新特性
- 新特性1:自然連接NATURAL JOIN
自然連接它會幫你自動查詢兩張表中的所有相同欄位,然后進行等值連接
# 不用自然連接的寫法
SELECT employee_id,department_name
FROM employees t1 JOIN departments t2
ON t1.department_id=t2.department_id
AND t1.manager_id=t2.manager_id
# 使用自然連接的寫法
SELECT employee_id,department_name
FROM employees t1 NATURAL JOIN departments t2
# 使用natural自動代替了on下面的連接條件
- 新特性2:USING的使用
# 原先連接的正常寫法
SELECT employee_id,department_name
FROM employees t1 JOIN departments t2
ON t1.department_id=t2.department_id
# 使用USING之后的寫法
SELECT employee_id,department_name
FROM employees t1 JOIN departments t2
USING(department_id)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/544900.html
標籤:MySQL
上一篇:基于SpringBoot實作操作GaussDB(DWS)的專案實戰
下一篇:MySQL調優
