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 NULL
LEAST()
:取最小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