SQL查詢語句基礎構成

    本文是基本的SQL查詢語句用法,內容主要來自Alan Learning SQL這本書第3章,包括select,from,where,group by,having,order by六個查詢子句,後續會深入介紹每個查詢子句的用法。

1. 查詢機制

在已經創建數據庫連接的情況下,當查詢被髮送到服務器端時,服務器在執行查詢語句之前需要進行檢查:

  1. 用戶是否有權限執行該語句?
  2. 用戶是否有權限訪問目標數據?
  3. 語句的語法是否正確?

通過3項檢查後,傳遞給查詢優化器,從from語句開始執行。

2. 查詢語句

一般來說,查詢語句包含以下6個子句中的2-3個

3. select子句

select子句用於結果集中需要顯示的列

儘管select子句是查詢語句中第一個組成部分,但實際上在數據庫服務中,它是最後被評估的,因爲在確定結果集最後包含哪些列之前,必須先要知道結果集所有可能的列。

select 語句除了能選擇表中的列,還可以包含其他內容,包括:

  1. 字符
  2. 表達式,比如emp_id*3.14
  3. 調用內建函數,比如UPPER(lname)
  4. 用戶自定義函數

也可以對查詢的列名設置別名,例如:

mysql> SELECT emp_id,

                 -> 'ACTIVE' status,

                 -> emp_id * 3.14159 empid_x_pi,

                 -> UPPER(lname) last_name_upper

          -> FROM employee;

status, empid_x_pi等是列的別名,使得輸出結果更容易理解,有時爲了清楚的表示別名,一般加掛檢測AS

如:mysql> SELECT emp_id,

                 -> 'ACTIVE' AS status,

                 -> emp_id * 3.14159 AS empid_x_pi,

                 -> UPPER(lname) AS last_name_upper

          -> FROM employee;

4. from子句

from子句 定義查詢中所使用的表,以及這些表的連接方式。

4.1 表的概念

其中表既包括永久表(create table產生的表),也包括臨時表(子查詢所返回的表),虛擬表(使用create view子句創建的試圖)

比如子查詢產生的表

SELECT e.emp_id, e.fname, e.lname

FROM (SELECT emp_id, fname, lname, start_date, title

              FROM employee) e;

4.2 表的連接

目前表中爲ANSI標準,引入了ON語句,舉例:

SELECT e.emp_id, e.fname, e.lname, d.name dept_name  #d.name 使用別名dept_name

FROM employee e INNER JOIN department d          ## 使用了表別名employee e

ON e.dept_id = d.dept_id;

表別名也可以使用AS關鍵詞,比如 FROM employee AS e INNER JOIN department AS d

5. Where子句

Where子句用於在結果集中過濾掉不需要的行。

可以使用 AND,OR,NOT包含更多的條件

SELECT emp_id, fname, lname, start_date, title

FROM employee

WHERE (title = 'Head Teller' AND start_date > '2006-01-01')

        OR (title = 'Teller' AND start_date > '2007-01-01');

6. group by和having子句

group by對查詢結果進行分組,having對分組結果進行過濾(類似於where子句,但此處不能用Where子句,二者的區別https://www.cnblogs.com/yzdqxing/p/4603508.html

例如:

SELECT d.name, count(e.emp_id) num_employees

FROM department d INNER JOIN employee e

    ON d.dept_id = e.dept_id

GROUP BY d.name

HAVING count(e.emp_id) > 2;

7. order by子句

order by子句對結果集中原始列或者計算表達式的結果進行排序。

例如:

SELECT open_emp_id, product_cd

FROM account

ORDER BY open_emp_id, product_cd;

默認是排序爲升序,如果需要降序,可以加上關鍵詞DESC

SELECT account_id, product_cd, open_date, avail_balance

FROM account

ORDER BY avail_balance DESC;

也可以對錶達式進行排序:

SELECT cust_id, cust_type_cd, city, state, fed_id

FROM customer

ORDER BY RIGHT(fed_id, 3);

還可以制定列的位置進行排序,比如用第2列和第5列進行排序:

SELECT emp_id, title, start_date, fname, lname

FROM employee

ORDER BY 2, 5;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章