SQL語句大全

正如大多數現代的關係語言一樣, SQL 是基於記錄關係微積分(TRC)的。 結果是每個可以用記錄關係微積分(TRC)表示的查詢(相等地,或者是關係演算), 同樣也可以用 SQL 表示。不過, 還有一些超出關係演算或者微積分的能力。 下面是一個 SQL 提供的並非關係演算或者關係微積分的內容的一個列表:

 

  • 插入,刪除或者更改數據的命令。

  • 算術能力:在 SQL 裏, 我們可以和比較功能一樣進行算術運算, 例如

    A < B + 3。
           
    要注意 + 或者其他算術操作符從未在關係演算或者關係微積分裏面出現過。

     

  • 分配和打印命令: 我們可以打印一條查詢構造的關係以及給一個被計算的關係分配關係名。

  • 聚集函數:象 averagesummax, 等操作符可以應用於一個關係的列以獲取單一的量。

 

1.4.1. Select(選擇)

SQL 裏面最常用的命令是 SELECT 語句,用於檢索數據。語法是:

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ AS output_name ] [, ...]
    [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION | INTERSECT | EXCEPT [ ALL ] } select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
    [ FOR UPDATE [ OF class_name [, ...] ] ]
    [ LIMIT { count | ALL } [ { OFFSET | , } start ]]
     

 

現在我們將通過不同的例子演示 SELECT 語句複雜的語法。用於這些例子的表在 供應商和部件數據庫 裏定義。

1.4.1.1. 簡單的 Select

這裏是一些使用 SELECT 語句的簡單例子:

Example 1-4. 帶有條件的簡單查詢

要從表 PART 裏面把字段 PRICE 大於 10 的所有記錄找出來, 我們寫出下面查詢:

SELECT * FROM PART
    WHERE PRICE > 10;
	
然後得到表:
 PNO |  PNAME  |  PRICE
-----+---------+--------
  3  |  Bolt   |   15
  4  |  Cam    |   25
	

 

在 SELECT語句裏使用 "*" 將檢索出表中的所有屬性。 如果我們只希望從表 PART 中檢索出屬性 PNAME 和 PRICE, 我們使用下面的語句:

SELECT PNAME, PRICE 
    FROM PART
    WHERE PRICE > 10;
	
這回我們的結果是:
                      PNAME  |  PRICE
                     --------+--------
                      Bolt   |   15
                      Cam    |   25
	
請注意 SQL 的 SELECT 語句對應關係演算裏面的 "projection" (映射),而不是 "selection"(選擇)(參閱 關係演算 獲取詳細信息)。

 

WHERE 子句裏的條件也可以用關鍵字 OR,AND,和 NOT 邏輯地連接起來:

SELECT PNAME, PRICE 
    FROM PART
    WHERE PNAME = 'Bolt' AND
         (PRICE = 0 OR PRICE <= 15);
	
這樣將生成下面的結果:
 PNAME  |  PRICE
--------+--------
 Bolt   |   15
	

 

目標列表和 WHERE 子句裏可以使用算術操作。例如, 如果我們想知道如果我們買兩個部件的話要多少錢, 我們可以用下面的查詢:

SELECT PNAME, PRICE * 2 AS DOUBLE
    FROM PART
    WHERE PRICE * 2 < 50;
	
這樣我們得到:
 PNAME  |  DOUBLE
--------+---------
 Screw  |    20
 Nut    |    16
 Bolt   |    30
	
請注意在關鍵字 AS 後面的 DOUBLE 是第二個列的新名字。 這個技巧可以用於目標列表裏的每個元素, 給它們賦予一個在結果列中顯示的新的標題。 這個新的標題通常稱爲別名。這個別名不能在該查詢的其他地方使用。

 

 

1.4.1.2. Joins(連接)

下面的例子顯示了 SQL 裏是如何實現連接的。

要在共同的屬性上連接三個表 SUPPLIER,PART 和 SELLS, 我們通常使用下面的語句:

SELECT S.SNAME, P.PNAME
    FROM SUPPLIER S, PART P, SELLS SE
    WHERE S.SNO = SE.SNO AND
          P.PNO = SE.PNO;
      
而我們得到的結果是:
 SNAME | PNAME
-------+-------
 Smith | Screw
 Smith | Nut
 Jones | Cam
 Adams | Screw
 Adams | Bolt
 Blake | Nut
 Blake | Bolt
 Blake | Cam
      

 

在 FROM 子句裏,我們爲每個關係使用了一個別名, 因爲在這些關係間有着公共的命名屬性(SNO 和 PNO)。 現在我們可以區分不同表的公共命名屬性, 只需要簡單的用每個關係的別名加上個點做前綴就行了。 聯合是用與 一個內部聯接 裏顯示的同樣的方法計算的。首先算出笛卡兒積 SUPPLIER × PART × SELLS 。然後選出那些滿足 WHERE 子句裏給出的條件的記錄 (也就是說,公共命名屬性的值必須相等)。 最後我們映射出除 S.SNAME 和 P.PNAME 外的所有屬性。

另外一個進行連接的方法是使用下面這樣的 SQL JOIN 語法:

select sname, pname from supplier
	JOIN sells USING (sno)
	JOIN part USING (pno);
	
giving again:
 sname | pname
-------+-------
 Smith | Screw
 Adams | Screw
 Smith | Nut
 Blake | Nut
 Adams | Bolt
 Blake | Bolt
 Jones | Cam
 Blake | Cam
(8 rows) 
	 

 

一個用 JOIN 語法創建的連接表,是一個出現在 FROM 子句裏的, 在任何 WHERE,GROUP BY 或 HAVING 子句之前的表引用列表項. 其它表引用,包括表名字或者其它 JOIN 子句,如果用逗號分隔的話, 可以包含在 FROM 子句裏. 連接生成的表邏輯上和任何其它在 FROM 子句裏列出的表都一樣.

SQL JOIN 有兩種主要類型,CROSS JOIN (無條件連接) 和條件連接.條件連接還可以根據聲明的 連接條件(ON,USING,或 NATURAL)和它 應用的方式(INNER 或 OUTER 連接)進一步細分.

 

連接類型

CROSS JOIN

{ T1 } CROSS JOIN { T2 }

一個交叉連接(cross join)接收兩個分別有 N 行和 M 行 的表 T1 和 T2,然後返回一個包含交叉乘積 NxM 條記錄的 連接表. 對於 T1 的每行 R1,T2 的每行 R2 都與 R1 連接生成 連接的錶行 JR,JR 包含所有 R1 和 R2 的字段. CROSS JOIN 實際上就是一個 INNER JOIN ON TRUE.

條件 JOIN

{ T1 } [ NATURAL ] [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN { T2 } { ON search condition | USING ( join column list ) }

一個條件 JOIN 必須通過提供一個(並且只能有一個) NATURAL,ON,或者 USING 這樣的關鍵字來聲明它的 連接條件. ON 子句 接受一個 search condition, 它與一個 WHERE 子句相同.USING 子句接受一個用逗號分隔的 字段名列表,連接表中必須都有這些字段, 並且用那些字段連接這些表,生成的連接表包含每個共有字段 和兩個表的所有其它字段. NATURAL 是 USING 子句的縮寫,它列出兩個表中所有公共 的字段名字.使用 USING 和 NATURAL 的副作用是 每個連接的字段都只有一份拷貝出現在結果表中 (與前面定義的關係演算的 JOIN 相比較).

 

[ INNER ] JOIN

對於 T1 的每行 R1,連接成的表在 T2 裏都有一行滿 足與 R1 一起的連接條件.

對於所有 JOIN 而言,INNER 和 OUTER 都是可選的.INNER 是缺省. LEFT,RIGHT,和 FULL 只用於 OUTER JOIN.

LEFT [ OUTER ] JOIN

首先,執行一次 INNER JOIN. 然後,如果 T1 裏有一行對任何 T2 的行都不滿足 連接條件,那麼返回一個連接行,該行的 T2 的字段 爲 null.

小技巧: 連接成的表無條件地包含 T1 裏的所有行.

RIGHT [ OUTER ] JOIN

首先,執行一次 INNER JOIN. 然後,如果 T2 裏有一行對任何 T1 的行都不滿足 連接條件,那麼返回一個連接行,該行的 T1 的字段 爲 null.

小技巧: 連接成的表無條件地包含 T2 裏的所有行.

FULL [ OUTER ] JOIN

首先,執行一次 INNER JOIN. 然後,如果 T1 裏有一行對任何 T2 的行都不滿足 連接條件,那麼返回一個連接行,該行的 T1 的字段 爲 null. 同樣,如果 T2 裏有一行對任何 T1 的行都不滿足 連接條件,那麼返回一個連接行,該行的 T2 的字段 爲 null.

小技巧: 連接成的表無條件地擁有來自 T1 的每 一行和來自 T2 的每一行.

所有 類型的 JOIN 都可以鏈接在一起或者嵌套在一起, 這時 T1T2 都可以是連接生成的表.我們可以使用圓括弧控制 JOIN 的順序,如果我們不主動控制,那麼連接順序是從左到右.

1.4.1.3. 聚集操作符

SQL 提供以一些聚集操作符(如, AVG,COUNT,SUM,MIN,MAX),這些聚集操作符以一個表達式爲參數。 只要是滿足 WHERE 子句的行,就會計算這個表達式, 然後聚集操作符對這個輸入數值的集合進行計算. 通常,一個聚集對整個 SELECT 語句計算的結果是 生成一個結果.但如果在一個查詢裏面聲明瞭分組, 那麼數據庫將對每個組進行一次獨立的計算,並且 聚集結果是按照各個組出現的(見下節).

Example 1-5. 聚集

果我們想知道表 PART 裏面所有部件的平均價格,我們可以使用下面查詢:

SELECT AVG(PRICE) AS AVG_PRICE
    FROM PART;
	

 

結果是:

 AVG_PRICE
-----------
   14.5
	

 

如果我們想知道在表 PART 裏面存儲了多少部件,我們可以使用語句:

SELECT COUNT(PNO)
    FROM PART;
	
得到:
 COUNT
-------
   4
	

 

 

1.4.1.4. 分組聚集

SQL 允許我們把一個表裏面的記錄分成組。 然後上面描述的聚集操作符可以應用於這些組上 (也就是說,聚集操作符的值不再是對所有聲明的列的值進行操作, 而是對一個組的所有值進行操作。這樣聚集函數是爲每個組獨立地進行計算的。)

對記錄的分組是通過關鍵字 GROUP BY 實現的,GROUP BY 後面跟着一個定義組的構成的屬性列表。 如果我們使用語句 GROUP BY A1, &tdot;, Ak 我們就把關係分成了組,這樣當且僅當兩條記錄在所有屬性 A1, &tdot;, Ak 上達成一致,它們纔是同一組的。

Example 1-6. 聚集

如果我們想知道每個供應商銷售多少個部件,我們可以這樣寫查詢:

SELECT S.SNO, S.SNAME, COUNT(SE.PNO)
    FROM SUPPLIER S, SELLS SE
    WHERE S.SNO = SE.SNO
    GROUP BY S.SNO, S.SNAME;
	
得到:
 SNO | SNAME | COUNT
-----+-------+-------
  1  | Smith |   2
  2  | Jones |   1
  3  | Adams |   2
  4  | Blake |   3
	

 

然後我們看一看發生了什麼事情。首先生成表 SUPPLIER 和 SELLS 的連接:

 S.SNO | S.SNAME | SE.PNO
-------+---------+--------
   1   |  Smith  |   1
   1   |  Smith  |   2
   2   |  Jones  |   4
   3   |  Adams  |   1
   3   |  Adams  |   3
   4   |  Blake  |   2
   4   |  Blake  |   3
   4   |  Blake  |   4
	

 

然後我們把那些屬性 S.SNO 和 S.SNAME 相同的記錄放在組中:

 S.SNO | S.SNAME | SE.PNO
-------+---------+--------
   1   |  Smith  |   1
                 |   2
--------------------------
   2   |  Jones  |   4
--------------------------
   3   |  Adams  |   1
                 |   3
--------------------------
   4   |  Blake  |   2
                 |   3
                 |   4
	

 

在我們的例子裏,我們有四個組並且現在我們可以對每個組應用聚集操作符 COUNT,生成上面給出的查詢的最終結果。

 

請注意如果要讓一個使用 GROUP BY 和聚集操作符的查詢的結果有意義, 那麼用於分組的屬性也必須出現在目標列表中。 所有沒有在 GROUP BY 子句裏面出現的屬性都只能通過使用聚集函數來選擇。 否則就不會有唯一的數值與其它字段關聯.

還要注意的是在聚集上聚集是沒有意義的,比如,AVG(MAX(sno)), 因爲 SELECT 只做一個回合的分組和聚集.你可以獲得這樣的結果, 方法是使用臨時表或者在 FROM 子句中使用一個子 SELECT 做第一個層次的聚集.

1.4.1.5. Having

HAVING 子句運做起來非常象 WHERE 子句, 只用於對那些滿足 HAVING 子句裏面給出的條件的組進行計算。 其實,WHERE 在分組和聚集之前過濾掉我們不需要的輸入行, 而 HAVING 在 GROUP 之後那些不需要的組. 因此,WHERE 無法使用一個聚集函數的結果. 而另一方面,我們也沒有理由寫一個不涉及聚集函數的 HAVING. 如果你的條件不包含聚集,那麼你也可以把它寫在 WHERE 裏面, 這樣就可以避免對那些你準備拋棄的行進行的聚集運算.

Example 1-7. Having

如果我們想知道那些銷售超過一個部件的供應商,使用下面查詢:

SELECT S.SNO, S.SNAME, COUNT(SE.PNO)
    FROM SUPPLIER S, SELLS SE
    WHERE S.SNO = SE.SNO
    GROUP BY S.SNO, S.SNAME
    HAVING COUNT(SE.PNO) > 1;
	
and get:
 SNO | SNAME | COUNT
-----+-------+-------
  1  | Smith |   2
  3  | Adams |   2
  4  | Blake |   3
	

 

 

1.4.1.6. 子查詢

在 WHERE 和 HAVING 子句裏,允許在任何要產生數值的地方使用子查詢 (子選擇)。 這種情況下,該值必須首先來自對子查詢的計算。子查詢的使用擴展了 SQL 的表達能力。

Example 1-8. 子查詢

如果我們想知道所有比名爲 'Screw' 的部件貴的部件,我們可以用下面的查詢:

SELECT * 
    FROM PART 
    WHERE PRICE > (SELECT PRICE FROM PART
                   WHERE PNAME='Screw');
	

 

結果是:

 PNO |  PNAME  |  PRICE
-----+---------+--------
  3  |  Bolt   |   15
  4  |  Cam    |   25
	

 

當我們檢查上面的查詢時會發現出現了兩次 SELECT 關鍵字。 第一個在查詢的開頭 - 我們將稱之爲外層 SELECT - 而另一個在 WHERE 子句裏面,成爲一個嵌入的查詢 - 我們將稱之爲內層 SELECT。 對外層 SELECT 的每條記錄都必須先計算內層 SELECT。在完成所有計算之後, 我們得知名爲 'Screw' 部件的記錄的價格, 然後我們就可以檢查那些價格更貴的記錄了。 (實際上,在本例中,內層查詢只需要執行一次, 因爲它不依賴於外層查詢高等狀態.)

如果我們想知道那些不銷售任何部件的供應商 (比如說,我們想把這些供應商從數據庫中刪除),我們用:

SELECT * 
    FROM SUPPLIER S
    WHERE NOT EXISTS
        (SELECT * FROM SELLS SE
         WHERE SE.SNO = S.SNO);
	

 

在我們的例子裏,結果列將是空的,因爲每個供應商至少銷售一個部件。 請注意我們在 WHERE 子句的內層 SELECT 裏使用了來自外層 SELECT 的 S.SNO。 正如前面所說的,子查詢爲每個外層查詢計算一次,也就是說, S.SNO 的值總是從外層 SELECT 的實際記錄中取得的。

 

1.4.1.7. 在 FROM 裏面的子查詢

一種有些特別的子查詢的用法是把它們放在 FROM 子句裏. 這個特性很有用,因爲這樣的子查詢可以輸出多列和多行, 而在表達式裏使用的子查詢必須生成一個結果. FROM 裏的子查詢還可以讓我們獲得多於一個回合的分組/聚集特性, 而不需要求助於臨時表.

Example 1-9. FROM 裏面的子查詢

如果我們想知道在所有我們的供應商中的最高平均部件價格的那家, 我們不能用 MAX(AVG(PRICE)),但我們可以這麼寫:

SELECT MAX(subtable.avgprice)
    FROM (SELECT AVG(P.PRICE) AS avgprice
          FROM SUPPLIER S, PART P, SELLS SE
          WHERE S.SNO = SE.SNO AND
                P.PNO = SE.PNO
          GROUP BY S.SNO) subtable;
	
這個子查詢爲每個供應商返回一行(因爲它的 GROUP BY) 然後我們在外層查詢對所有行進行聚集.

 

 

1.4.1.8. Union, Intersect, Except(聯合,相交,相異)

這些操作符分別計算兩個子查詢產生的元組的聯合,相交和集合理論裏的相異。

Example 1-10. Union, Intersect, Except

下面的例子是 UNION 的例子:

SELECT S.SNO, S.SNAME, S.CITY
    FROM SUPPLIER S
    WHERE S.SNAME = 'Jones'
UNION
    SELECT S.SNO, S.SNAME, S.CITY
    FROM SUPPLIER S
    WHERE S.SNAME = 'Adams';    
	
產生結果:
 SNO | SNAME |  CITY
-----+-------+--------
  2  | Jones | Paris
  3  | Adams | Vienna
	

 

下面是相交( INTERSECT)的例子:

SELECT S.SNO, S.SNAME, S.CITY
    FROM SUPPLIER S
    WHERE S.SNO > 1
INTERSECT
    SELECT S.SNO, S.SNAME, S.CITY
    FROM SUPPLIER S
    WHERE S.SNO < 3;
	
產生結果:
 SNO | SNAME |  CITY
-----+-------+--------
  2  | Jones | Paris
	
兩個查詢都會返回的元組是那條 SNO=2 的

 

最後是一個 EXCEPT 的例子:

SELECT S.SNO, S.SNAME, S.CITY
    FROM SUPPLIER S
    WHERE S.SNO > 1
EXCEPT
    SELECT S.SNO, S.SNAME, S.CITY
    FROM SUPPLIER S
    WHERE S.SNO > 3;
	
結果是:
 SNO | SNAME |  CITY
-----+-------+--------
  2  | Jones | Paris
  3  | Adams | Vienna
	

 

 

1.4.2. 數據定義

SQL 語言裏包含一套用於數據定義的命令。

1.4.2.1. 創建表

數據定義的最基本的命令是創建一個新關係(新表)的命令。 CREATE TABLE 命令的語法如下:

CREATE TABLE table_name
    (name_of_attr_1 type_of_attr_1
     [, name_of_attr_2 type_of_attr_2 
     [, ...]]);
      

Example 1-11. 創建表

要創建 供應商和部件數據庫裏的表,要使用下面的 SQL 語句:

CREATE TABLE SUPPLIER
    (SNO   INTEGER,
     SNAME VARCHAR(20),
     CITY  VARCHAR(20));
     
CREATE TABLE PART
    (PNO   INTEGER,
     PNAME VARCHAR(20),
     PRICE DECIMAL(4 , 2));
     
CREATE TABLE SELLS
    (SNO INTEGER,
     PNO INTEGER);
	

 

 

1.4.2.2. SQL 裏的數據類型

下面是 SQL 一些數據類型的列表:

 

  • INTEGER:有符號全長二進制整數(31位精度)。

  • SMALLINT:有符號半長二進制整數(15位精度)。

  • DECIMAL (p[,q]): 有符號的封裝了的十進制小數,最多有 p 位數,並假設有 q 位在小數點右邊。 如果省略 q ,則認爲是 0。

  • FLOAT:有符號雙字浮點數。

  • CHAR(n): 長度爲 n 的定長字符串。

  • VARCHAR(n): 最大長度爲 n 的變長字符串。

 

1.4.2.3. 創建索引

索引用於加速對關係的訪問。如果關係 R 有一個建立在屬性 A 上的索引,那麼我們檢索滿足 t(A) = a 的所有元組 t 用的時間和這樣的元組數 t 成比例,而不是與 R 的大小成比例。

SQL 裏創建一個索引, 使用 CREATE INDEX 命令。語法是:

CREATE INDEX index_name 
    ON table_name ( name_of_attribute );
      

 

 

Example 1-12. 創建索引

要在關係 SUPPLIER 的屬性 SNAME 上創建一個名爲 I 的索引, 我們使用下面語法:

CREATE INDEX I ON SUPPLIER (SNAME);
      

 

所創建的索引是自動維護的,也就是說,當向關係 SUPPLIER 插入新的記錄時, 索引 I 相應做調節。請注意有索引存在時, 用戶能感覺到的唯一的變化就是速度的提升。

 

1.4.2.4. 創建視圖

一個視圖可以看作一個虛擬表, 也就是說,數據庫裏的一個 物理上不存在的,但是用戶看起來卻存在的表。 與之相比,當我們談到一個 基本表時, 則是在物理存儲中的確物理地存放着表中每一行的內容。

視圖沒有它們自身的,物理上分開的,可區分的存儲區。 實際上,系統把視圖的定義(也就是說,爲視圖物化的應如何訪問物 理上存儲在基本表中內容的規則)存放在系統表裏的某個地方(參閱 系統表)。 關於實現視圖的不同技巧,請參考 SIM98.

SQL 裏,使用 CREATE VIEW 命令定義視圖。語法是:

CREATE VIEW view_name
    AS select_stmt
      
這裏 select_stmt 是一個與定義在 Select(選擇) 裏一樣的有效選擇語句。 請注意在視圖創建時並不執行 select_stmt。 它只是存儲在 系統表裏,當對視圖進行查詢時將執行。

 

假設給出下面的視圖定義(我們再次使用來自 供應商和部件數據庫裏的表):

CREATE VIEW London_Suppliers
    AS SELECT S.SNAME, P.PNAME
        FROM SUPPLIER S, PART P, SELLS SE
        WHERE S.SNO = SE.SNO AND
              P.PNO = SE.PNO AND
              S.CITY = 'London';
      

 

現在我們可以把這個虛擬的關係 London_Suppliers當作是另外一個基本表:

SELECT * FROM London_Suppliers
    WHERE PNAME = 'Screw';
      
將返回下面的表:
 SNAME | PNAME
-------+-------
 Smith | Screw                 
      

 

要計算這個結果,數據庫系統必須先對基本表SUPPLIER,SELLS 和 PART 先進行一次 隱藏的訪問。 它是通過對這些基本表運行該視圖定義裏面給出的查詢實現隱藏訪問的。 然後,餘下的附加條件(在查詢裏給出的對視圖的條件)就可以應用上來, 最後獲取結果表。

1.4.2.5. 刪除表,刪除索引,刪除視圖

要刪除表(包括該表存儲的所有記錄),使用 DROP TABLE 命令:

DROP TABLE table_name;
       

 

要刪除 SUPPLIER 表,使用下面語句:

DROP TABLE SUPPLIER;
      

 

DROP INDEX 命令用於刪除一個索引:

DROP INDEX index_name;
      

 

最後用 DROP VIEW 刪除一個給出的視圖:

DROP VIEW view_name;
      

 

1.4.3. 數據操作

1.4.3.1. 插入數據

一旦表創建完成(參閱 創建表),就可以用命令 INSERT INTO 向裏面填充元組。語法是:

INSERT INTO table_name (name_of_attr_1 
    [, name_of_attr_2 [,...]])
    VALUES (val_attr_1 [, val_attr_2 [, ...]]);
      

 

要向關係 SUPPLIER 中插入第一條元組(來自 供應商和部件數據庫),我們使用下面語句:

INSERT INTO SUPPLIER (SNO, SNAME, CITY)
    VALUES (1, 'Smith', 'London');
      

 

要向關係 SELLS 插入第一條元組,我們用:

INSERT INTO SELLS (SNO, PNO)
    VALUES (1, 1);
      

 

1.4.3.2. Update(更新)

要修改元組中的一個或者多個屬性的值,使用 UPDATE 命令。語法是:

UPDATE table_name
    SET name_of_attr_1 = value_1 
        [, ... [, name_of_attr_k = value_k]]
    WHERE condition;
      

 

要修改表關係 PART 中部件 'Screw' 的屬性 PRICE 的值,我們用:

UPDATE PART
    SET PRICE = 15
    WHERE PNAME = 'Screw';
      

 

記錄名爲 'Screw' 的屬性 PRICE 的新值現在是 15。

1.4.3.3. Delete(刪除)

要從一個表中刪除一條記錄,使用 DELETE FROM 命令。語法是:

DELETE FROM table_name
    WHERE condition;
      

 

要刪除 SUPPLIER 表中名爲 'Smith' 的供應商,使用下面的語句:

DELETE FROM SUPPLIER
    WHERE SNAME = 'Smith';
      

 

1.4.4. 系統表

在所有 SQL 數據庫系統裏面, 系統表都被用於追蹤表, 視圖索引等在數據庫中定義的東西。 這些系統表可以象普通關係一樣檢索。例如,有一個系統表用於視圖的定義。 這個表存儲來自視圖定義的查詢。每當對視圖進行查詢時, 系統在處理用戶查詢之前首先從該表中取出 視圖定義查詢並且執行該查詢 (參閱 Simkovics, 1998 獲取更詳細的描述)。 關於系統表的更多信息,請參考 Date, 1994

1.4.5. 嵌入的SQL

在這一節裏,我們將勾勒如何把 SQL 嵌入到一種宿主語言裏(例如, C)。 我們需要從一種宿主語言裏使用SQL的原因主要有兩個:

 

  • 有一些查詢不可能用純 SQL 表示(比如,遞歸查詢)。 要執行這樣的查詢,我們需要一種比 SQL 更有表達能力的宿主語言。

  • 我們只是希望能從用宿主語言寫的應用裏面訪問數據庫 (例如,一個圖形用戶界面的門票預定系統可能用 C 寫, 而餘票狀況存儲在一個可以用嵌入 SQL訪問的數據庫裏面)。

 

一個在宿主語言裏面使用嵌入 SQL 的程序包含宿主語言的語句和 嵌入SQLESQL)的語句。每條ESQL 語句以關鍵字 EXEC SQL 開始。 ESQL 語句被一個 預編譯器 (它通常向源文件中插入庫過程的調用以執行各種 SQL 命令)轉換成宿主語言。

當我們觀察例子 Select(選擇) 時, 我們認識到一個查詢的結果大多是記錄的集合。 大多數宿主語言不是爲集合而設計的, 因此我們需要一個機制用來訪問一條 SELECT 語句返回結果集中的每一條記錄。 這個機制可以通過定義一個遊標來實現。 之後我們就可以使用 FETCH 命令檢索一條記錄並把遊標定義到下一條記錄

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