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特有:#
    

關鍵字

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=true0=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可以省略
  • 聲明順序:FROM ... WHERE ... ORDER BY ... LIMIT,注意LIMIT總是放在最尾

  • 表中有100條數據,只想顯示第45、46條:

    LIMIT 44,2;
    
    • 8.0新特性,可以顯式寫關鍵字OFFSET ,格式反過來變成LIMIT 條目數 OFFSET 偏移量
    • 改寫成LIMIT 2 OFFSET 44;
  • 方言,其他資料庫中的LIMIT稱呼

    • SQL Server和Access叫TOP
    • DB2用FETCH FIRST 5 ROWS ONLY
    • Oracle用ROWNUM

上次修改於 2021-12-17