什麼是SQL

在關聯式資料庫中,用來定義表格、搜尋/新增/修改/刪除資料,以及控制權限等的標準語言。由ISO/IEC制定為標準。包括SELECT、INSERT、UPDATE、DELETE、CREATE TABLE、GRANT等敘述。

日文名稱: SQL

「SQL」出現在3領域的15道練習題中(資料庫基礎, 資訊安全基礎, LSI設計流程與EDA等)。

這個名詞所屬的領域: 資料庫基礎

SQL敘述的種類

SQL敘述依作用大致分為3類。資料定義語言(DDL)如CREATE、ALTER、DROP,用來定義表格、檢視表、索引等結構。資料操作語言(DML)如SELECT、INSERT、UPDATE、DELETE,用來處理表格中的資料。資料控制語言(DCL)如GRANT與REVOKE,用來控制權限。確認交易的COMMIT與取消交易的ROLLBACK,有時歸入DCL,有時另外分為交易控制敘述。

SELECT敘述的子句與處理順序

SELECT敘述以 SELECT 欄位 FROM 表格 WHERE 條件 GROUP BY 欄位 HAVING 條件 ORDER BY 欄位 的方式排列子句。與書寫順序不同,把處理順序想成FROM(決定並連結表格)、WHERE(選出資料列)、GROUP BY(分組)、HAVING(選出群組)、SELECT(取出欄位並計算聚合函數)、ORDER BY(排序),會比較容易理解。這就是WHERE中不能寫聚合函數、群組的條件要寫在HAVING的原因。

宣告式語言與NULL的處理

SQL是寫出想要什麼結果的宣告式語言,取得結果的步驟由DBMS的最佳化器決定。表示值未知的NULL需要特別注意。與NULL的比較既不為真也不為假(未知),因此要用IS NULL而不是 = NULL 來檢查。SUM、AVG等聚合函數會忽略NULL;COUNT(*)計算資料列數,COUNT(欄位)則計算該欄位不是NULL的資料列數。

練習SQL的題目

SQL敘述可分為資料定義語言(DDL)、資料操作語言(DML)與資料控制語言(DCL)。屬於DDL的是下列何者?

  1. AUPDATE 員工 SET 部門 = '研發' WHERE 員工編號 = 5
  2. BCREATE TABLE 部門 (部門編號 INTEGER PRIMARY KEY, 部門名稱 CHAR(10))
  3. CGRANT SELECT ON 員工 TO 田中
查看答案與解析

正確答案:B. CREATE TABLE 部門 (部門編號 INTEGER PRIMARY KEY, 部門名稱 CHAR(10))

DDL(Data Definition Language)是定義表格、檢視表、索引等資料庫結構的敘述,包括CREATE、ALTER、DROP。DML(Data Manipulation Language)是處理表格中資料的敘述,包括SELECT、INSERT、UPDATE、DELETE。DCL(Data Control Language)是控制權限等的敘述,包括授予使用者權限的GRANT與撤銷權限的REVOKE。確認交易的COMMIT與取消交易的ROLLBACK,有時歸入DCL,有時另外分為交易控制敘述。選項中,建立表格的CREATE TABLE屬於DDL。

在SQL中不加WHERE子句執行 DELETE FROM 員工,結果何者正確?

  1. A員工表格的所有資料列被刪除,留下空的表格
  2. B表格本身被刪除,表格的定義也消失
  3. C因為沒有WHERE子句,會產生錯誤而不刪除任何資料
查看答案與解析

正確答案:A. 員工表格的所有資料列被刪除,留下空的表格

DELETE是從表格中刪除資料列的DML敘述。以WHERE子句加上條件時,只刪除符合條件的資料列;省略WHERE子句時,所有資料列都會被刪除。即使DELETE刪除了所有資料列,表格的定義(欄位名稱、型別與限制)仍然保留,之後仍可用INSERT新增資料列。連同定義刪除表格本身的是DDL的 DROP TABLE 員工。UPDATE也一樣,忘了加WHERE子句就會改寫所有資料列,因此執行前確認條件很重要。若在交易之中,可在COMMIT之前以ROLLBACK取消。

常見問題

SQL的WHERE子句與HAVING子句有什麼不同?

WHERE子句是分組前針對每一筆資料列的條件,不能寫聚合函數。HAVING子句是針對以GROUP BY分組後之群組的條件,可以像 HAVING SUM(金額) >= 1000 這樣使用聚合函數。

在SQL中如何找出含NULL的資料列?

寫成 WHERE 欄位 IS NULL。WHERE 欄位 = NULL 因為與NULL的比較不會為真,一筆都選不出來。不是NULL的資料列則以IS NOT NULL選出。

解析中的「SQL」

出現「SQL」的題目(15題)

  1. SQL敘述可分為資料定義語言(DDL)、資料操作語言(DML)與資料控制語言(DCL)。屬於DDL的是下列何者?
  2. 在SQL中不加WHERE子句執行 DELETE FROM 員工,結果何者正確?
  3. 想從員工表格(員工編號, 部門, 薪資)中,求出各部門平均薪資在300以上的部門及其平均薪資。正確的SQL敘述是下列何者?
  4. 想從客戶表格(客戶編號, 姓名)與訂單表格(訂單編號, 客戶編號, 金額)中,求出從未下過訂單之客戶的姓名。正確的SQL敘述是下列何者?
  5. 在SQL標準規格所定義的隔離等級中,關於READ COMMITTED下可能發生之現象的組合,下列何者正確?
  6. RTL設計主要使用的硬體描述語言為下列何者?
  7. 在某網頁應用程式的登入畫面中,只要在密碼欄位輸入 ' OR '1'='1 之類的字串,不知道密碼也能登入。這種攻擊稱為什麼?
  8. 作為SQL隱碼攻擊的對策,使用預留位置的參數化查詢(prepared statement),被視為比去除輸入中危險字元的方法更根本的對策。理由是什麼?
  9. 在關聯式資料庫的用語中,相當於表格(關聯)中一筆資料列的是下列何者?
  10. 在關聯式資料庫的表格中,被指定為主鍵的欄位(或欄位組合)必須滿足的條件是下列何者?
  11. 選課表格(學號, 課程編號, 成績)記錄哪位學生修了哪門課、成績如何。一位學生會修多門課,一門課也有多位學生修。若同一學生不會重複登記同一門課,此表格適當的主鍵是下列何者?
  12. 考試表格的分數欄位中有 80、NULL、70、90 共4個值(NULL表示未應考)。SELECT AVG(分數) FROM 考試 的結果是下列何者?
  13. 庫存表格中某商品的庫存數為10。交易T1讀出庫存數後寫入減3的值,T2讀出庫存數後寫入減5的值。若不加鎖,依T1讀取、T2讀取、T1寫入、T2寫入的順序執行,最後的庫存數為多少?
  14. 在同時執行交易時發生的問題中,下列何者正確說明了髒讀(Dirty read)?
  15. 交易T1執行 SELECT COUNT(*) FROM 訂單 WHERE 金額 >= 1000,結果為8筆。緊接著T2以INSERT新增一筆金額2000的訂單並提交。T1再次執行相同的SELECT敘述,結果變為9筆。這個現象是下列何者?

半導體、電子電路與資訊計算工具

相關名詞

交易 隔離等級 主鍵 SQL隱碼攻擊 關聯式資料庫 檢視表 索引 RTL(暫存器傳輸層級) 硬體描述語言(Hardware description language, HDL) Verilog

前往名詞解釋列表