SQL基礎(chǔ)語(yǔ)法筆記

1脆诉、數(shù)據(jù)檢索

  • 選擇單列

從Products中選出prod_name列

SELECT prod_name
FROM Products;
  • 選擇多個(gè)列

SELECT prod_id, prod_name, prod_price
FROM Products;
  • 選擇所有列

SELECT *
FROM Products;
  • 選擇前五行

SELECT TOP 5 prod_name
FROM Products;
  • 選擇從第5行開(kāi)始的5行數(shù)據(jù)

SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;

2晴楔、排序檢索

  • 排序數(shù)據(jù)

SELECT prod_name
FROM Products
ORDER BY prod_name;

提取prod-name葵礼,并且用它來(lái)排序。

  • 按照多個(gè)列排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
  • 按照列位置排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
  • 指定排序方向

  • 降序:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
  • 只降第一個(gè):
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
  • 所有的都降
    如果想在多個(gè)列上進(jìn)行降序排序,必須對(duì)每一列指定 DESC 關(guān)鍵字盾碗。

3、過(guò)濾數(shù)據(jù)

  • where子句

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

在同時(shí)使用 ORDER BY 和 WHERE 子句時(shí)舀瓢,應(yīng)該讓 ORDER BY 位于WHERE 之后廷雅,否則將會(huì)產(chǎn)生錯(cuò)誤。一般來(lái)說(shuō)京髓,order by一般都放在最后航缀。

  • where子句的操作符

be469e4d2f0882f0d8ef210254a0512.png
  • 列出所有價(jià)格小于 10 美元的產(chǎn)品
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;
  • 檢索所有價(jià)格小于等于 10 美元的產(chǎn)品
SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;
  • 列出所有不是供應(yīng)商 DLL01 制造的產(chǎn)品:
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';

觀察上述 WHERE 子句中的條件,會(huì)看到有的值括在單引號(hào)內(nèi)堰怨,而有的值未括起來(lái)芥玉。單引號(hào)用來(lái)限定字符串。如果將值與字符串類(lèi)型的列進(jìn)行比較备图,就需要限定引號(hào)飞傀。用來(lái)與數(shù)值列進(jìn)行比較的值不用引號(hào)。

  • 使用 BETWEEN 操作符诬烹,它檢索價(jià)格在 5 美元和 10美元之間的所有產(chǎn)品:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
  • 空值檢查
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
  • 組合where子句

  • AND
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
  • OR操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’;
  • 任何時(shí)候使用具有 AND 和 OR 操作符的 WHERE 子句砸烦,都應(yīng)該使用圓括號(hào)明確地分組操作符。不要過(guò)分依賴(lài)默認(rèn)求值順序绞吁,即使它確實(shí)如你希望的那樣幢痘。使用圓括號(hào)沒(méi)有什么壞處,它能消除歧義家破。
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
  • IN字符
    IN 操作符用來(lái)指定條件范圍颜说,范圍中的每個(gè)條件都可以進(jìn)行匹配购岗。 IN 取一組由逗號(hào)分隔、括在圓括號(hào)中的合法值门粪。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;

此 SELECT 語(yǔ)句檢索由供應(yīng)商 DLL01 和 BRS01 制造的所有產(chǎn)品喊积。 IN 操作符后跟由逗號(hào)分隔的合法值,這些值必須括在圓括號(hào)中玄妈。 IN 操作符完成了與 OR 相同的功能乾吻!

  • NOT字符
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;

這里的 NOT 否定跟在其后的條件,因此拟蜻, DBMS 不是匹配 vend_id 為DLL01绎签,而是匹配非 DLL01 之外的所有東西。

  • 通配符過(guò)濾

  • 找出所有以詞 Fish 起頭的產(chǎn)品:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';

如果使用的是 Microsoft Access酝锅,需要使用*而不是%诡必。

  • 可以使用多個(gè)通配符
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';

有一種情況下把通配符放在搜索模式中間是很有用的,就是根據(jù)郵件地 址 的 一 部 分 來(lái) 查 找 電 子 郵 件 搔扁, 例 如

WHERE email LIKE 'b%@forta.com'爸舒。

下劃線(xiàn)的用途與%一樣,但它只匹配單個(gè)字符稿蹲,而不是多個(gè)字符碳抄。

SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';

如果使用的是 Microsoft Access,需要使用?而不是_场绿。
方括號(hào)( [])通配符用來(lái)指定一個(gè)字符集剖效,它必須匹配指定位置(通配符的位置)的一個(gè)字符。
找出所有名字以 J 或 M 起頭的聯(lián)系人焰盗,可進(jìn)行如下查詢(xún):

SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;

這一搜索模式使用了兩個(gè)不
同的通配符璧尸。 [JM]匹配方括號(hào)中任意一個(gè)字符,它也只能匹配單個(gè)字符熬拒。因此爷光,任何多于一個(gè)字符的名字都不匹配。 [JM]之后的%通配符匹配第一個(gè)字符之后的任意數(shù)目的字符澎粟,返回所需結(jié)果蛀序。
注意:
不要過(guò)度使用通配符。如果其他操作符能達(dá)到相同的目的活烙,應(yīng)該使用其他操作符徐裸。

4、創(chuàng)建計(jì)算字段

  • 拼接

拼接(concatenate):將值聯(lián)結(jié)到一起(將一個(gè)值附加到另一個(gè)值)構(gòu)成單個(gè)值啸盏。
我們來(lái)舉一個(gè)簡(jiǎn)單例子重贺,創(chuàng)建由兩列組成的標(biāo)題。
Vendors 表包含供應(yīng)商名和地址信息。假如要生成一個(gè)供應(yīng)商報(bào)表气笙,需要在格式化的名稱(chēng)(位置)中列出供應(yīng)商的位置次企。此報(bào)表需要一個(gè)值,而表中數(shù)據(jù)存儲(chǔ)在兩個(gè)列 vend_name 和 vend_country 中潜圃。此外缸棵,需要用括號(hào)將 vend_country 括起來(lái),這些東西都沒(méi)有存儲(chǔ)在數(shù)據(jù)庫(kù)表中谭期。
解決辦法是把兩個(gè)列拼接起來(lái)堵第。在 SQL 中的 SELECT 語(yǔ)句中,可使用一個(gè)特殊的操作符來(lái)拼接兩個(gè)列崇堵。根據(jù)你所使用的 DBMS,此操作符可用加號(hào)( +)或兩個(gè)豎杠( ||)表示客燕。

SELECT vend_name + ' (' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;

有的時(shí)候可能帶來(lái)空格鸳劳,所以需要去掉空格,可以寫(xiě)成這個(gè)樣子:

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;

RTRIM()函數(shù)去掉值右邊的所有空格也搓。通過(guò)使用 RTRIM()赏廓,各個(gè)列都進(jìn)行了整理。
順便給這些新搞的數(shù)據(jù)取一個(gè)新名字:

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
  • 算術(shù)計(jì)算

Orders 表包含收到的所有訂單傍妒, OrderItems 表包含每個(gè)訂單中的各項(xiàng)物品幔摸。下面的 SQL 語(yǔ)句檢索訂單號(hào) 20008 中的所有物品:

SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;

item_price 列包含訂單中每項(xiàng)物品的單價(jià)。如下匯總物品的總價(jià)格

SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

5颤练、使用函數(shù)進(jìn)行計(jì)算

與 SQL 語(yǔ)句不一樣既忆, SQL 函數(shù)不是可移植的。這意味著為特定 SQL 實(shí)現(xiàn)編寫(xiě)的代碼在其他實(shí)現(xiàn)中可能不正常嗦玖。

  • 文本處理函數(shù)

1.png

SOUNDEX 是一個(gè)將任何文本串轉(zhuǎn)換為描述其語(yǔ)音表示的字母數(shù)字模式的算法患雇。 SOUNDEX 考慮了類(lèi)似的發(fā)音字符和音節(jié),使得能對(duì)字符串進(jìn)行發(fā)音比較而不是字母比較宇挫。雖然 SOUNDEX 不是 SQL 概念苛吱,但多數(shù)DBMS 都提供對(duì) SOUNDEX的支持。

  • 時(shí)間處理函數(shù)

不同 DBMS 的日期?時(shí)間處理函數(shù)可能不同器瘪。關(guān)于具體 DBMS 支持的日期?時(shí)間處理函數(shù)翠储,請(qǐng)參閱相應(yīng)的文檔。

  • 數(shù)值處理函數(shù)

2.png

6橡疼、匯總數(shù)據(jù)

  • 聚集函數(shù)

常用的聚集函數(shù)


3.png

舉例:

SELECT AVG(prod_price) AS avg_price
FROM Products;
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

第二條前一條的不同之處在于援所,它包含了 WHERE 子句。此WHERE 子句僅過(guò)濾出 vend_id 為 DLL01 的產(chǎn)品欣除,因此 avg_price 中返回的值只是該供應(yīng)商產(chǎn)品的平均值任斋。
使用 COUNT(*)對(duì)表中行的數(shù)目進(jìn)行計(jì)數(shù),不管表列中包含的是空值( NULL)還是非空值。使用COUNT(column)對(duì)特定列中具有值的行進(jìn)行計(jì)數(shù)废酷, 忽略 NULL 值瘟檩。
MAX()返回指定列中的最大值。 MAX()要求指定列名澈蟆。

  • 聚集不同值

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

只包含不同的值墨辛,指定 DISTINCT 參數(shù)。它與前面的 SELECT 語(yǔ)句相同趴俘,但使用了 DISTINCT 參數(shù)睹簇,因此平均值只考慮各個(gè)不同的價(jià)格。

  • 組合聚集函數(shù)

SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;

7寥闪、數(shù)據(jù)分組

  • 分組

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

上面的 SELECT 語(yǔ)句指定了兩個(gè)列: vend_id 包含產(chǎn)品供應(yīng)商的 ID太惠,num_prods 為計(jì)算字段(用 COUNT(*)函數(shù)建立)。 GROUP BY 子句指示DBMS 按 vend_id 排序并分組數(shù)據(jù)疲憋。這就會(huì)對(duì)每個(gè) vend_id 而不是整個(gè)表計(jì)算 num_prods 一次凿渊。從輸出中可以看到,供應(yīng)商 BRS01 有 3 個(gè)產(chǎn)品缚柳,供應(yīng)商 DLL01 有 4 個(gè)產(chǎn)品埃脏,而供應(yīng)商 FNG01 有 2 個(gè)產(chǎn)品。
因?yàn)槭褂昧?GROUP BY秋忙,就不必指定要計(jì)算和估值的每個(gè)組了彩掐。系統(tǒng)會(huì)自動(dòng)完成。 GROUP BY 子句指示 DBMS 分組數(shù)據(jù)灰追,然后對(duì)每個(gè)組而不是整個(gè)結(jié)果集進(jìn)行聚集堵幽。

  • 過(guò)濾分組

SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
  • select子句順序

1.png

8、子查詢(xún)

其實(shí)就是嵌套弹澎,完畢谐檀。

SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;

9、聯(lián)結(jié)

SQL 最強(qiáng)大的功能之一就是能在數(shù)據(jù)查詢(xún)的執(zhí)行中聯(lián)結(jié)( join)表裁奇。

  • 創(chuàng)建聯(lián)結(jié)關(guān)系

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

目前為止使用的聯(lián)結(jié)稱(chēng)為等值聯(lián)結(jié)( equijoin)桐猬,它基于兩個(gè)表之間的相等測(cè)試。這種聯(lián)結(jié)也稱(chēng)為內(nèi)聯(lián)結(jié)( inner join)刽肠。

  • 給表格改名

SELECT cust_name, cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01';

可以看到溃肪, FROM 子句中的三個(gè)表全都有別名。 Customers AS C 使用 C作為 Customers 的別名音五,如此等等惫撰。

  • 不同類(lèi)型聯(lián)結(jié)的區(qū)別

  • 自聯(lián)結(jié)

假如要給與 Jim Jones 同一公司的所有顧客發(fā)送一封信件。這個(gè)查詢(xún)要求首先找出 Jim Jones 工作的公司躺涝,然后找出在該公司工作的顧客:

SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name FROM Customers WHERE cust_contact = 'Jim Jones');

這就是自聯(lián)結(jié)厨钻,聯(lián)結(jié)自己。自聯(lián)結(jié)通常作為外部語(yǔ)句,用來(lái)替代從相同表中檢索數(shù)據(jù)的使用子查詢(xún)語(yǔ)句夯膀。雖然最終的結(jié)果是相同的诗充,但許多 DBMS 處理聯(lián)結(jié)遠(yuǎn)比處理子查詢(xún)快得多。

  • 外聯(lián)結(jié)

要檢索包括沒(méi)有訂單顧客在內(nèi)的所有顧客诱建,可如下進(jìn)行:

SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

這條 SELECT 語(yǔ)句使用了關(guān)鍵字 OUTER JOIN來(lái)指定聯(lián)結(jié)類(lèi)型(而不是在 WHERE 子句中指定)蝴蜓。但是,與內(nèi)聯(lián)結(jié)關(guān)聯(lián)兩個(gè)表中的行不同的是俺猿,外聯(lián)結(jié)還包括沒(méi)有關(guān)聯(lián)行的行茎匠。在使用 OUTERJOIN 語(yǔ)法時(shí),必須使用 RIGHT 或 LEFT 關(guān)鍵字指定包括其所有行的表( RIGHT 指出的是 OUTER JOIN 右邊的表押袍,而 LEFT 指出的是 OUTER JOIN左邊的表)诵冒。上面的例子使用 LEFT OUTER JOIN 從 FROM 子句左邊的表( Customers 表)中選擇所有行。為了從右邊的表中選擇所有行谊惭,需要使用 RIGHT OUTER JOIN汽馋,如下例所示:

SELECT Customers.cust_id, Orders.order_num
FROM Customers RIGHT OUTER JOIN Orders
ON Orders.cust_id = Customers.cust_id;
  • 使用帶集聚函數(shù)的聯(lián)結(jié)

要檢索所有顧客及每個(gè)顧客所下的訂單數(shù)

SELECT Customers.cust_id,
COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;

也可以這樣:

SELECT Customers.cust_id,
COUNT(Orders.order_num) AS num_ord
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id
GROUP BY Customers.cust_id;

10、組合查詢(xún)

兩次查詢(xún)一起進(jìn)行

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';

UNION 必須由兩條或兩條以上的 SELECT 語(yǔ)句組成午笛,語(yǔ)句之間用關(guān)鍵字 UNION分隔(因此惭蟋, 如果組合四條 SELECT語(yǔ)句苗桂,將要使用三個(gè) UNION關(guān)鍵字)药磺。
UNION 中的每個(gè)查詢(xún)必須包含相同的列、表達(dá)式或聚集函數(shù)(不過(guò)煤伟,各個(gè)列不需要以相同的次序列出)癌佩。
列數(shù)據(jù)類(lèi)型必須兼容:類(lèi)型不必完全相同,但必須是 DBMS 可以隱含轉(zhuǎn)換的類(lèi)型(例如便锨,不同的數(shù)值類(lèi)型或不同的日期類(lèi)型)围辙。
UNION 從查詢(xún)結(jié)果集中自動(dòng)去除了重復(fù)的行;換句話(huà)說(shuō)放案,它的行為與一條 SELECT 語(yǔ)句中使用多個(gè) WHERE 子句條件一樣姚建。
這是 UNION 的默認(rèn)行為,如果愿意也可以改變它吱殉。事實(shí)上掸冤,如果想返回所有的匹配行,可使用 UNION ALL 而不是 UNION友雳。

11稿湿、數(shù)據(jù)插入

  • insert

INSERT 用來(lái)將行插入(或添加)到數(shù)據(jù)庫(kù)表。插入有幾種方式:
? 插入完整的行押赊;
? 插入行的一部分饺藤;
? 插入某些查詢(xún)的結(jié)果。

INSERT INTO Customers
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);

這個(gè)例子將一個(gè)新顧客插入到 Customers 表中。存儲(chǔ)到表中每一列的數(shù)據(jù)在 VALUES 子句中給出涕俗,必須給每一列提供一個(gè)值罗丰。如果某列沒(méi)有值,如上面的 cust_contact 和 cust_email 列咽袜,則應(yīng)該使用 NULL 值(假定
表允許對(duì)該列指定空值)丸卷。各列必須以它們?cè)诒矶x中出現(xiàn)的次序填充。
編寫(xiě) INSERT 語(yǔ)句的更安全(不過(guò)更煩瑣)的方法如下:

INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);

這個(gè)例子與前一個(gè) INSERT 語(yǔ)句的工作完全相同询刹,但在表名后的括號(hào)里明確給出了列名谜嫉。在插入行時(shí), DBMS 將用 VALUES 列表中的相應(yīng)值填入列表中的對(duì)應(yīng)項(xiàng)凹联。 VALUES 中的第一個(gè)值對(duì)應(yīng)于第一個(gè)指定列名沐兰,第二個(gè)值對(duì)應(yīng)于第二個(gè)列名,如此等等蔽挠。
下面的 INSERT 語(yǔ)句填充所有列(與前面的一樣)住闯,但以一種不同的次序填充。因?yàn)榻o出了列名澳淑,所以插入結(jié)果仍然正確(因?yàn)橹付肆忻Q(chēng)比原,甚至可以只插入部分列,你指定哪個(gè)列就插入哪個(gè)列):

INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip)
VALUES('1000000006',
NULL,
NULL,
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111');

INSERT 還存在另一種形式杠巡,可以利用它將 SELECT 語(yǔ)句的結(jié)果插入表中量窘,這就是所謂的INSERT SELECT。顧名思義氢拥,它是由一條 INSERT 語(yǔ)句和一條 SELECT語(yǔ)句組成的蚌铜。假如想把另一表中的顧客列合并到 Customers 表中。不需要每次讀取一行再將它用 INSERT 插入嫩海,可以如下進(jìn)行:

INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM CustNew;

這 個(gè) 例 子 使 用 INSERT SELECT 從 CustNew 中 將 所 有 數(shù) 據(jù) 導(dǎo) 入Customers冬殃。 SELECT 語(yǔ)句從 CustNew 檢索出要插入的值,而不是列出它們叁怪。 SELECT 中列出的每一列對(duì)應(yīng)于 Customers 表名后所跟的每一列审葬。這條語(yǔ)句將插入多少行呢?這依賴(lài)于 CustNew 表有多少行奕谭。如果這個(gè)表為空涣觉,則沒(méi)有行被插入(也不產(chǎn)生錯(cuò)誤,因?yàn)椴僮魅匀皇呛戏ǖ模┱瓜洹H绻@個(gè)表確實(shí)有數(shù)據(jù)旨枯,則所有數(shù)據(jù)將被插入到 Customers。

  • 從一個(gè)表復(fù)制到另一個(gè)表

有一種數(shù)據(jù)插入不使用 INSERT 語(yǔ)句混驰。要將一個(gè)表的內(nèi)容復(fù)制到一個(gè)全新的表(運(yùn)行中創(chuàng)建的表)攀隔,可以使用 SELECT INTO 語(yǔ)句皂贩。
與 INSERT SELECT 將數(shù)據(jù)添加到一個(gè)已經(jīng)存在的表不同, SELECT INTO將數(shù)據(jù)復(fù)制到一個(gè)新表(有的 DBMS 可以覆蓋已經(jīng)存在的表昆汹,這依賴(lài)于所使用的具體 DBMS)明刷。

SELECT *
INTO CustCopy
FROM Customers;

這條 SELECT 語(yǔ)句創(chuàng)建一個(gè)名為 CustCopy 的新表,并把 Customers 表的整個(gè)內(nèi)容復(fù)制到新表中满粗。因?yàn)檫@里使用的是 SELECT 辈末,所以將在CustCopy 表中創(chuàng)建(并填充)與 Customers 表的每一列相同的列。要想只復(fù)制部分的列映皆,可以明確給出列名挤聘,而不是使用通配符。

12捅彻、數(shù)據(jù)更新與刪除

  • 更新數(shù)據(jù)

更新(修改)表中的數(shù)據(jù)组去,可以使用 UPDATE 語(yǔ)句。
基本的 UPDATE 語(yǔ)句由三部分組成步淹,分別是:
? 要更新的表从隆;
? 列名和它們的新值;
? 確定要更新哪些行的過(guò)濾條件缭裆。
舉一個(gè)簡(jiǎn)單例子键闺。客戶(hù) 1000000005 現(xiàn)在有了電子郵件地址澈驼,因此他的記錄需要更新辛燥,語(yǔ)句如下:

UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';

更新多個(gè)列的語(yǔ)法稍有不同:

UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';

在更新多個(gè)列時(shí),只需要使用一條 SET 命令盅藻。
要?jiǎng)h除某個(gè)列的值购桑,可設(shè)置它為 NULL(假如表定義允許 NULL 值)畅铭。如下進(jìn)行:

UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '1000000005';
  • 刪除數(shù)據(jù)

從一個(gè)表中刪除(去掉)數(shù)據(jù)氏淑,使用 DELETE 語(yǔ)句。有兩種使用 DELETE的方式:
? 從表中刪除特定的行硕噩;
? 從表中刪除所有行假残。
從 Customers 表中刪除一行:

DELETE FROM Customers
WHERE cust_id = '1000000006';

13、操縱表

  • 創(chuàng)建表

利用 CREATE TABLE 創(chuàng)建表炉擅,必須給出下列信息:
? 新表的名字辉懒,在關(guān)鍵字 CREATE TABLE 之后給出;
? 表列的名字和定義谍失,用逗號(hào)分隔眶俩;
? 有的 DBMS 還要求指定表的位置。

CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
CREATE TABLE Orders
(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL
);

這條語(yǔ)句創(chuàng)建本書(shū)中所用的 Orders 表快鱼。 Orders 包含三列:訂單號(hào)颠印、訂單日期和顧客 ID纲岭。這三列都需要,因此每一列的定義都含有關(guān)鍵字 NOTNULL线罕。這就會(huì)阻止插入沒(méi)有值的列止潮。如果插入沒(méi)有值的列,將返回錯(cuò)誤钞楼,且插入失敗喇闸。
下一個(gè)例子將創(chuàng)建混合了 NULL 和 NOT NULL 列的表:

CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) ,
vend_city CHAR(50) ,
vend_state CHAR(5) ,
vend_zip CHAR(10) ,
vend_country CHAR(50)
);

SQL 允許指定默認(rèn)值,在插入行時(shí)如果不給出值询件, DBMS 將自動(dòng)采用默認(rèn)值燃乍。默認(rèn)值在 CREATE TABLE 語(yǔ)句的列定義中用關(guān)鍵字 DEFAULT 指定。

CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
);
  • 更新表

更新表定義宛琅,可以使用 ALTER TABLE 語(yǔ)句橘沥。

ALTER TABLE Vendors
ADD vend_phone CHAR(20);
  • 刪除表

DROP TABLE CustCopy;
  • 創(chuàng)建視圖

CREAT VIEW

CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夯秃,隨后出現(xiàn)的幾起案子座咆,更是在濱河造成了極大的恐慌,老刑警劉巖仓洼,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件介陶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡色建,警方通過(guò)查閱死者的電腦和手機(jī)哺呜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箕戳,“玉大人某残,你說(shuō)我怎么就攤上這事×晡” “怎么了玻墅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)壮虫。 經(jīng)常有香客問(wèn)我澳厢,道長(zhǎng),這世上最難降的妖魔是什么囚似? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任剩拢,我火速辦了婚禮,結(jié)果婚禮上饶唤,老公的妹妹穿的比我還像新娘徐伐。我一直安慰自己,他們只是感情好募狂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布办素。 她就那樣靜靜地躺著魏保,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摸屠。 梳的紋絲不亂的頭發(fā)上谓罗,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音季二,去河邊找鬼檩咱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胯舷,可吹牛的內(nèi)容都是我干的刻蚯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼桑嘶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炊汹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起逃顶,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讨便,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后以政,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霸褒,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年盈蛮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了废菱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抖誉,死狀恐怖殊轴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袒炉,我是刑警寧澤旁理,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梳杏,受9級(jí)特大地震影響韧拒,放射性物質(zhì)發(fā)生泄漏淹接。R本人自食惡果不足惜十性,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塑悼。 院中可真熱鬧劲适,春花似錦、人聲如沸厢蒜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至愕贡,卻和暖如春草雕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背固以。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工墩虹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憨琳。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓诫钓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親篙螟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菌湃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容