SQL語言基本關鍵字、排序與分頁
尚硅谷MySQL筆記-02
SQL
Structured Query Language,是一種通用的資料庫查詢語言
分類
- DDL:數據定義語言,定義資料庫或表本身,例如
- CREATE、ALTER、DROP、RENAME、TRUNCATE
- DML:數據操作語言,即增刪改查,針對的是具體的某條資料,例如
- INSERT、DELETE、UPDATE、SELECT
- DCL:數據控制語言,事務操作或權限控制等等,例如
- COMMIT、ROLLBACK、SAVEPOINT、GRANT、REVOKE
標準
- 最經典的版本是SQL92與SQL99,一般也稱為SQL-2與SQL-3標準
- SQL92形式簡單但語句長,難讀
- SQL99版可讀性好,但語法較複雜
規則與規範
-
可以一行或多行,子句分行縮進增加可讀性
-
每條命令用
;、\G或\g結束 -
標點符號
- 必定成對,例如
''、() - 必定是半形符號
- 字串和時間日期用
''單引號表示 - 列的別名盡量使用
""雙引號,且不建議省略as
- 必定成對,例如
-
大小寫
- Windows不分,Linux區分且規則如下:
- 資料庫名、表名、表別名、變數名區分
- 關鍵字、函數名、列名是忽略大小寫
- 建議規範
- 資料庫名、表名、表別名、字段名都用小寫
- SQL關鍵字、函數名、綁定變數都大寫
註釋
單行: -- 註釋體,注意--後面有一個空格 多行: */ 註釋體 */ MySQL特有:# - Windows不分,Linux區分且規則如下:
關鍵字
SELECT
- 功能:查、列出
- 格式:
SELECT 列名 FROM 表名;
SELECT * FROM 表名; -- 列出全部
FROM:來源表FROM DUAL;返回一個偽表(暫時的)
AS
- 功能:暫時將返回的列名顯示成別名
- 格式:
SELECT 列名 AS "想顯示的別名" from 表名;
SELECT 列名 "想顯示的別名" from 表名; -- 省略AS
SELECT 列名 想顯示的別名 from 表名; -- 省略"",但注意別名不能有空格
- 注意:並不是真的給某資料庫的某表某列賦了別名,只是暫時顯示來看而已
DISTINCT
- 功能:去重複
- 格式:
SELECT DISTINCT 列名 FROM 表名;
-- 聯合去重複,須滿足所有列的元素都不重複
SELECT DISTINCT 列名1,列名2 FROM 表名;
null
null不等於0- 當
null參與運算,結果必然也是空 - 解決方案:
IFNULL(列名,備胎)
‘‘單引號
- 注重符
- 功能:如果表名或字段名跟關鍵字衝突了,用其避開
- 格式:
SELECT * FROM order;
- 查詢常數
- 功能:可以用作分隔之類的,沒多大意義
- 格式:
SELECT emp_no,'分隔',first_name,'間隔'FROM employees;
DESCRIBE
- 功能:返回表的詳細結構與說明
- 格式:
DESCRIBE 表名;、DESC 表名;
WHERE
- 功能:過濾
- 格式:
SELECT * FROM 表 WHERE 條件;
-- 範例
SELECT * FROM employees WHERE first_name ='georgi';
- 注意WHERE必定聲明在FROM之後
- MySQL中,篩字串不分大小寫
運算符號
先乘除後加減,沒特別的就不提了,與常規經驗一致
加號
- 在SQL中加號
+沒有連接的作用,跟字串用會隱式轉換成數字 - 若轉換不成功,就視為0,舉例:
SELECT 100+'1' FROM dual; -- 101
SELECT 100+'a' FROM dual; -- 100,a被視為0
SELECT 100+null FROM dual; -- null
除號
-
用除號
/會自動轉為浮點數,即使是整數相除也轉- 預設到小數點後4位,除不盡時四捨五入
-
用
DIV則只保留整數位(無條件捨去) -
除0得
null
SELECT 100/2 FROM dual; -- 50.0000
SELECT 100/6 FROM dual; -- 16.6667
SELECT 100 DIV 6 FROM dual; -- 16
SELECT 100/0 FROM dual; -- null
SELECT 100*1.11 FROM dual; -- 111.00
取模
- 功能:取餘數
- 格式:
%、MOD
-- 查詢編號為偶數的員工 (除2於0為偶數)
SELECT * FROM employees WHERE emp_no%2=0;
比較符號
等於
-
返回
1=true,0=false -
若兩邊都是字串,比較ANSI碼
-
只要有null參與,結果必是null
-
WHERE xx =null;並不會篩出xx為null的數據,而是啥都沒有,因為結果是null -
安全等於
<=>,專門用於null- 兩邊都是
null,返回1 - 一邊是
null一邊不是,返回0
- 兩邊都是
-
比較用關鍵字
IS NULL:相當於<=>ISNULL():不加空格時為函數,()內放入要判斷的IS NOT NULLLEAST():取最小GREATEST():取最大BETWEEN ... AND ...:區間,包含上下邊界NOT BETWEEN ... AND ...:不在區間,包含上下邊界- 比如
NOT BETWEEN 10 AND 100,必須<10且>100
- 比如
IN (set):離散包含,例如WHERE score IN (60,99)篩出成績剛好為60分與99分的NOT IN (set)LIKE '字串':模糊查詢WHERE name like '%a%':查詢名字中任意位置有a的%表示不確定個數的字符,可以是0、1或多個_下畫線代表一個不確定的字符- 要查的內容本身是符號則用轉譯字符
\修飾
REGEXP '正則式':正則式,也可以用RLIKE
邏輯運算
-
NOT、!:非 -
AND、&&:且 -
OR、||:或- 注意
AND優先級大於OR
- 注意
-
XOR:異或
位運算
很少用且跟一般程式語言規則相同
- 跳過
排序
ORDER BY ...:升序ORDER BY ... DESC:降序- 也可以
ORDER BY -...
- 也可以
WHERE必須聲明在FROM之後、ORDER BY之前- 別名只能在
ORDER BY中使用,不能在WHERE中使用,範例:
SELECT emp_no,salary "薪水" FROM salaries
WHERE emp_no IN (10001,10002,10003) ORDER BY 薪水;
- 多級排序用"
,“逗號分開,例如:
SELECT emp_no,salary "薪水" FROM salaries
ORDER BY -薪水,emp_no;
分頁
- 格式:
LIMIT 偏移量,條目數
LIMIT (pageNo-1) * pageSize,pageSize;
-
pageSize:每頁顯示幾筆 -
pageNo:當前顯示第幾頁- 例如每頁10筆且想看第一頁就是
LIMIT 0,10,偏移量0可以省略
- 例如每頁10筆且想看第一頁就是
-
聲明順序:
FROM ... WHERE ... ORDER BY ... LIMIT,注意LIMIT總是放在最尾 -
表中有100條數據,只想顯示第45、46條:
LIMIT 44,2;- 8.0新特性,可以顯式寫關鍵字OFFSET ,格式反過來變成
LIMIT 條目數 OFFSET 偏移量 - 改寫成
LIMIT 2 OFFSET 44;
- 8.0新特性,可以顯式寫關鍵字OFFSET ,格式反過來變成
-
方言,其他資料庫中的LIMIT稱呼
- SQL Server和Access叫
TOP - DB2用
FETCH FIRST 5 ROWS ONLY - Oracle用
ROWNUM
- SQL Server和Access叫
上次修改於 2021-12-17