 # 1. 在執行語句之前,會先檢查下列事項 ## 1.1. 是否有許可權執行該語句 ## 1.2. 是否有許可權訪問指 ...
1. 在執行語句之前,會先檢查下列事項
1.1. 是否有許可權執行該語句
1.2. 是否有許可權訪問指定的數據
1.3. 語句的語法是否正確
2. select子句
2.1. select子句是select語句中的第一個子句,但最後才會被資料庫伺服器評估
2.2. 決定哪些列應該包含在查詢的結果集中
2.3. 字面量
2.4. 表達式
2.5. 內建函數調用
2.6. 用戶自定義函數調用
2.7. select version(),database(),user()
2.8. 列的別名
2.8.1. AS是可選項
2.9. 移除重覆數據
2.9.1. select後面直接添加關鍵字distinct來實現
2.10. 關鍵字all是預設的
2.10.1. 不需要指明
2.10.2. 如果不想讓伺服器移除重覆數據或者確定結果集中不會出現重覆數據,可以使用關鍵字all代替distinct
2.11. 生成一組不同的結果時需要對數據進行排序,這對於大型結果集會很耗時
2.12. 不要陷入為了確保沒有重覆數據而使用distinct的陷阱,而應該花時間充分理解所處理的數據,以便瞭解是否可能出現重覆數據
3. from子句
3.1. 定義了查詢要用到的數據表以及連接數據表的方式
3.2. 寬泛定義的數據表
3.2.1. 永久數據表(使用create table語句創建)
3.2.2. 派生數據表(由子查詢返回並保存在記憶體中的行)
3.2.2.1. 子查詢由一對小括弧包圍,可以出現在select語句的各個部分中
3.2.2.2. 子查詢的作用在於生成其他所有查詢子句中可見的派生數據表,以及與from子句中的其他數據表交互
3.2.3. 臨時數據表(保存在記憶體中的易失數據)
3.2.3.1. mysql
-> CREATE TEMPORARY TABLE actors_j
-> (actor_id smallint(5),
-> first_name varchar(45),
-> last_name varchar(45)
-> );
3.2.3.2. 臨時保留在記憶體中,會話結束後就消失了
3.2.3.3. Oracle Database是一個例外,它會保留臨時數據表定義,以備後續會話使用
3.2.4. 虛擬數據表(使用create view語句創建)
3.2.4.1. 視圖是存儲在數據目錄中的查詢,其行為表現就像數據表,但是並沒有與之關聯的數據(這就是將其稱為虛擬數據表的原因)
3.2.4.2. 創建視圖時,不會生成或存儲額外的數據
3.2.4.3. 伺服器只是保留select語句,以備後用
3.2.4.4. 創建視圖的原因各種各樣,包含對用戶隱藏列、簡化複雜的資料庫設計
4. 數據錶鏈接
4.1. 如果from子句中出現多個數據表,則必須包含用於鏈接(link)這些數據表的條件
4.2. 定義數據表別名
4.2.1. 使用完整的數據表名稱
4.2.2. 為每個數據表指定別名,在查詢中使用該別名
4.2.3. 使用別名可以在不造成困惑的情況下(只要選擇合理的別名)編寫出更緊湊的語句
5. where子句
5.1. 一種機制,用於過濾掉結果集中不想要的行
5.2. 在混用不同的運算符時,應該堅持使用括弧對條件進行分組
5.2.1. 以便你自己、資料庫伺服器和後續人員都能夠意見統一地修改代碼
6. group by和having子句
6.1. 在返回結果集之前對數據進行處理,以便發現數據呈現的規律
7. order by子句
7.1. 使用原始列數據或基於列數據的表達式對結果集進行排序的一種機制
7.2. 可以通過關鍵字asc和desc來指定升序排序或降序排序
7.3. 預設為按照升序排序,如果希望按照降序排序,需要加入desc關鍵字
7.4. 降序排序多用於評級查詢
7.5. MySQL提供了limit子句以允許對數據進行排序,然後只保留前X行
7.6. 比如“顯示餘額最多的前5個賬戶”
7.7. 通過數字占位符進行排序
7.7.1. 查詢使用select子句中的第3列,按照降序進行排序
7.7.2. mysql
-> SELECT c.first_name, c.last_name,
-> time(r.rental_date) rental_time
-> FROM customer c
-> INNER JOIN rental r
-> ON c.customer_id = r.customer_id
-> WHERE date(r.rental_date) = '2005-06-14'
-> ORDER BY 3 desc;