SQL - SELECT語句



使用SQL SELECT語句檢索資料

SQL是一種全面的資料庫語言。SQL(發音為Sequel或簡稱S-Q-L)是一種計算機程式語言,用於以非過程方式查詢關係資料庫。當您使用SQL從資料庫中提取資訊時,這被稱為查詢資料庫。

關係資料庫是透過使用關係資料庫管理系統(RDBMS)實現的。RDBMS執行上述DBMS軟體的所有基本功能以及許多其他功能,這些功能使關係模型更容易理解和實現。RDBMS使用者透過使用特殊的資料庫操作語言來操作資料。資料庫結構是透過使用資料定義語言定義的。系統使用者為了儲存和檢索資料而執行的命令可以透過鍵入命令在帶有RDBMS介面的終端輸入,或者透過某種型別的圖形介面輸入。然後DBMS處理這些命令。

SELECT語句的功能

資料庫中的資料檢索是透過適當和有效地使用SQL完成的。關係理論中的三個概念包含了SELECT語句的功能:投影、選擇和連線。

  • 投影:投影操作僅從表中選擇某些列(欄位)。結果表具有可用列的子集,可以包含從單個列到所有可用列的任何內容。

  • 選擇:選擇操作選擇表(關係)中滿足選擇條件的行(記錄)的子集。從完整結果集中選擇行,稱為選擇。它涉及條件過濾和資料分段。子集的範圍可以是從沒有行(如果沒有任何行滿足選擇條件)到表中的所有行。

  • 連線:連線操作基於一個或多個公共列值組合來自兩個或多個表的資料。連線操作使使用者能夠處理表之間存在的關係。連線操作非常強大,因為它允許系統使用者調查在設計資料庫時可能無法預料到的資料元素之間的關係。

Joining scenario of EMPLOYEES and DEPARTMENTS table

考慮上述表結構。從EMPLOYEES表中為單個員工獲取first_name名稱、department_id和salary是投影。從EMPLOYEES表中獲取工資低於5000的員工詳細資訊是選擇。透過連線EMPLOYEES和DEPARTMENTS獲取員工的first_name和部門名稱是連線。

基本的SELECT語句

下面介紹了SELECT語句的基本語法。

SELECT  [DISTINCT | ALL] {* | select_list}
FROM {table_name [alias] | view_name} 
    [{table_name [alias]  | view_name}]...  
[WHERE  condition]
[GROUP BY  condition_list]
[HAVING  condition]
[ORDER BY  {column_name | column_#  [ ASC | DESC ] } ...

SELECT子句是必須的,它執行關係投影操作。

FROM子句也是必須的。它標識一個或多個表和/或檢視,從中檢索結果表中顯示的列資料。

WHERE子句是可選的,它執行關係選擇操作。它指定要選擇的行。

GROUP BY子句是可選的。它根據SELECT子句中列出的一個或多個列名稱將資料組織成組。

可選的HAVING子句設定有關結果表中要包含哪些組的條件。組由GROUP BY子句指定。

ORDER BY子句是可選的。它按升序或降序對查詢結果進行排序。

SELECT語句中的算術表示式和NULL值

可以使用列名、運算子和常量值建立算術表示式,以將表示式嵌入SELECT語句中。適用於列的運算子取決於列的資料型別。例如,算術運算子不適用於字元文字值。例如,

SELECT employee_id, sal * 12 ANNUAL_SAL
FROM employees;

上述查詢包含算術表示式(sal * 12)來計算每個員工的年薪。

算術運算子

運算子作用於列(稱為運算元)以產生不同的結果。如果表示式中有多個運算子,則運算子優先順序決定評估順序。以下是優先順序的基本規則:

  • 乘法和除法先於加法和減法。

  • 相同優先順序的運算子從左到右計算。

  • 使用括號可以覆蓋運算子的預設行為。

下表顯示了這些情況下運算子的優先順序,優先順序級別運算子符號操作

Description   Operator	Precedence	   
Addition	+	Lowest	   
Subtraction	-	Lowest	   
Multiplication	*	Medium	   
Division	/	Medium	   
Brackets	( )	Highest	 

檢查下面的查詢 (a)、(b) 和 (c)

  • SQL> SELECT 2*35 FROM DUAL;
  • SQL> SELECT salary + 1500 FROM employees;
  • SQL> SELECT first_name, salary, salary + (commission_pct* salary) FROM employees;

查詢 (a) 乘以兩個數字,而 (b) 顯示向所有員工的薪水中新增 1500 美元。查詢 (c) 顯示將佣金部分新增到員工薪水中。根據優先順序,首先計算薪水的佣金,然後將其新增到薪水中。

列別名

別名用於在顯示期間重新命名列或表示式。列或表示式的別名作為查詢輸出中的標題出現。它有助於為SELECT查詢中的長表示式提供有意義的標題。預設情況下,別名在查詢輸出中以大寫形式顯示,不包含空格。要覆蓋此行為,必須將別名括在雙引號中以保留別名名稱的大小寫和空格。

SELECT price * 2 as DOUBLE_PRICE, price * 10 "Double Price"
FROM products;

DOUBLE_PRICE	Double Price
------------	------------
39.9			39.9
60			60
51.98			51.98

連線運算子

連線運算子可用於在SELECT查詢中連線兩個字串值或表示式。雙豎線符號用作字串連線運算子。它僅適用於字元和字串列值,產生一個新的字元表示式。示例

SQL> SELECT 'ORACLE'||' CERTIFICATION' FROM dual;

上述查詢顯示了兩個字元文字值的連線。

文字

SELECT子句中任何未儲存在資料庫中的硬編碼值稱為文字。它可以是數字、字元或日期值。字元和日期值必須用引號括起來。考慮下面的SQL查詢。使用SQL查詢中不同資料型別的文字的示例。

下面的查詢使用兩個字元文字將它們連線在一起。

SQL> SELECT 'ORACLE'||' CERTIFICATION' FROM DUAL

下面的查詢使用字元文字來美化員工的工資。

SQL> SELECT first_name ||'earns'|| salary||' as of '|||sysdate
FROM employees

引號運算子

引號運算子用於指定您自己的引號分隔符。您可以根據資料選擇方便的分隔符。

SELECT 	department_name|| ' Department' ||q'['s Manager Id: ]'|| manager_id
FROM departments;

NULL

如果列沒有確定的值,則將其視為NULL。NULL值表示未知或不可用。對於數值而言,它不是零,對於字元值而言,它不是空格。

可以在SELECT查詢中選擇包含NULL值的列,並且可以作為算術表示式的部分。任何使用NULL值的算術表示式都會產生NULL。因此,必須透過使用Oracle提供的函式(如NVL或NULLIF)指定其備用值來以不同的方式處理包含NULL值的列。

SQL> SELECT NULL + 1000 NUM 
FROM DUAL;

NUM
--------

DISTINCT關鍵字

如果資料預計會有重複的結果,請使用DISTINCT關鍵字來消除重複項並在查詢輸出中僅顯示唯一的結果。僅驗證所選列的重複性,並且行將在邏輯上從查詢輸出中消除。需要注意的是,DISTINCT關鍵字必須出現在SELECT子句之後。

下面的簡單查詢演示了使用DISTINCT從EMPLOYEES表中顯示唯一部門ID。

SQL> SELECT DISTINCT DEPARTMENT_ID 
FROM employees;

DEPARTMENT_ID
---------------
10
20
30
40

DESCRIBE命令

可以使用DESCRIBE命令查詢資料庫以獲取組成它的列列表,從而獲得表的結構元資料。它將列出使用的列名、它們的NULL屬性和資料型別。

語法

DESC[RIBE] [SCHEMA].object name

例如,

DESC EMPLOYEE

將顯示EMPLOYEE表結構,即列、它們的資料型別、精度和可為空屬性。

廣告
© . All rights reserved.