SQL中的排序 使用關鍵字:ORDER BY ORDER BY 欄位名後使用ASC升序表示;使用DESC表示降序。 ORDER BY 後面可以使用列的別名進行排序(列的別名只能在ORDER BY中使用,不能再HWERE後使用) WHERE需要再FROM後,ORDER BY前聲明!! 多級排序,ORD ...
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)