本篇重點(diǎn)為大家講解組合數據、數據插入、更新和刪除數據相關(guān)內容。
多數SQL查詢(xún)只包含從一個(gè)或多個(gè)表中返回數據的單條SELECT語(yǔ)句。但是,SQL也允許執行多個(gè)查詢(xún),并將結果作為一個(gè)查詢(xún)結果集返回。這些組合查詢(xún)通常稱(chēng)為并(union)或復合查詢(xún)(compound query)。
主要有兩種情況需要使用組合查詢(xún):
? 在一個(gè)查詢(xún)中從不同的表返回結構數據;
? 對一個(gè)表執行多個(gè)查詢(xún),按一個(gè)查詢(xún)返回數據。
創(chuàng )建組合查詢(xún)
利用UNION,可給出多條SELECT語(yǔ)句,將它們的結果組合成一個(gè)結果集。
使用方法:給出每條SELECT語(yǔ)句,在各條語(yǔ)句之間放上關(guān)鍵字UNION。
假如需要Illinois、Indiana和Michigan等美國幾個(gè)州的所有顧客的報表,還想包括不管位于哪個(gè)州的所有的Fun4All。
示例:SELECT cust_name, cust_contact, cust_email FROM CustomersWHERE cust_state IN ('IL','IN','MI')UNIONSELECT cust_name, cust_contact, cust_email FROM CustomersWHERE cust_name = 'Fun4All'分析:這條語(yǔ)句由兩條SELECT語(yǔ)句組成,之間用UNION關(guān)鍵字分隔。UNION指示DBMS執行這兩條SELECT語(yǔ)句,并把輸出組合成一個(gè)查詢(xún)結果集。
在簡(jiǎn)單的例子中,使用UNION可能比使用WHERE子句更為復雜。但對于較復雜的過(guò)濾條件,或者從多個(gè)表中檢索數據的情形,使用UNION可能會(huì )使處理更簡(jiǎn)單。
1、UNION規則
? UNION必須由兩條或兩條以上的SELECT語(yǔ)句組成,語(yǔ)句之間用關(guān)鍵字UNION分隔。
? UNION中的每個(gè)查詢(xún)必須包含相同的列、表達式或聚集函數。
? 列數據類(lèi)型必須兼容:類(lèi)型不必完全相同,但必須是DBMS可以隱含轉換的類(lèi)型。
2、包含或取消重復的行
使用UNION時(shí),重復的行會(huì )被自動(dòng)取消,這是UNION的默認行為,如果想返回所有的匹配行,可使用UNION ALL。
示例:SELECT cust_name, cust_contact, cust_email FROM CustomersWHERE cust_state IN ('IL','IN','MI')UNION ALLSELECT cust_name, cust_contact, cust_email FROM CustomersWHERE cust_name = 'Fun4All'3、對組合查詢(xún)結果排序
在用UNION組合查詢(xún)時(shí),只能使用一條ORDER BY子句,它必須位于最后一條SELECT語(yǔ)句之后。
示例:SELECT cust_name, cust_contact, cust_email FROM CustomersWHERE cust_state IN ('IL','IN','MI')UNIONSELECT cust_name, cust_contact, cust_email FROM CustomersWHERE cust_name = 'Fun4All'ORDER BY cust_name, cust_contact除了SQL數據庫學(xué)習,還有大量數據分析知識和實(shí)操等你探索!
SELECT是最常用的SQL語(yǔ)句,還有其他3個(gè)常用的SQL語(yǔ)句需要學(xué)習,第一個(gè)就是INSERT,另外兩個(gè)之后為大家介紹。
INSERT用來(lái)將行插入或添加到數據庫表,插入有幾種方式:
? 插入完整的行;
? 插入行的一部分;
? 插入某些查詢(xún)的結果。
插入完整的行
把數據插入表中的最簡(jiǎn)單方法是使用基本的INSERT語(yǔ)法。
示例: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)分析:在插入行時(shí),DBMS將用VALUES列表中的相應值填入列表中的對應項。VALUES中的第一個(gè)值對應于第一個(gè)指定列名,第二個(gè)值對應于第二個(gè)列名,如此等等。
插入部分行
使用這種語(yǔ)法,還可以省略列,這表示可以只給某些列提供值,給其他列不提供值。
示例:INSERT INTO Customers (cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)VALUES (1000000006, 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA')分析:沒(méi)有給cust_contact和cust_email這兩列提供值,這表示沒(méi)必要在INSERT語(yǔ)句中包含它們。因此,這里的INSERT語(yǔ)句省略了這兩列及其對應的值。
插入檢索出的數據
INSERT一般用來(lái)給表插入具有指定列值的行。
INSERT還存在另一種形式,可以利用它將SELECT語(yǔ)句的結果插入表中,這就是所謂的INSERT SELECT。
假如想把另一表中的顧客列合并到Customers表中,不需要每次讀取一行再將它用INSERT插入,可以如下進(jìn)行:
INSERT INTO Customers (cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)SELECT (cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_countryFORM CustNew分析:使用INSERT SELECT從CustNew中將所有數據導入Customers。SELECT語(yǔ)句從CustNew檢索出要插入的值,SELECT中列出的每一列對應于Customers表名后所跟的每一列。
從一個(gè)表復制到另一個(gè)表
可以使用CREATE SELECT語(yǔ)句(或者在SQL Server里也可用SELECT INTO語(yǔ)句)。
與INSERT SELECT將數據添加到一個(gè)已經(jīng)存在的表不同,CREATE SELECT將數據復制到一個(gè)新表。
CREATE TABLE CustCopy AS SELECT * FROM Customer s使用SQL Server,可以這么寫(xiě):
SELECT * INTO CustCopy FROM Customers分析:創(chuàng )建一個(gè)名為CustCopy的新表,并把Customers表的整個(gè)內容復制到新表中。
在使用SELECT INTO時(shí),任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY;可利用連接從多個(gè)表插入數據;不管從多少個(gè)表中檢索數據,數據都只能插入到一個(gè)表中。
更新數據
更新表中的數據,可以使用UPDATE語(yǔ)句,使用UPDATE的方式有兩種:
? 更新表中的特定行;
? 更新表中的所有行。
基本UPDATE語(yǔ)句由三部分組成,分別是:
? 要更新的表;
? 列名和它們的新值;
? 確定要更新哪些行的過(guò)濾條件。
舉一個(gè)簡(jiǎn)單例子,客戶(hù)1現在有了電子郵件地址,因此他的記錄需要更新,語(yǔ)句如下:
UPDATE CustomersSET cust_email='kim@thetoystore.com'WHERE cust_id =1分析:UPDATE語(yǔ)句以要更新的表名開(kāi)始。要更新的表名為Customers。SET命令用來(lái)將新值賦給被更新的列。UPDATE語(yǔ)句以WHERE子句結束,它告訴DBMS更新哪一行。
更新多個(gè)列的語(yǔ)法稍有不同。
UPDATE CustomersSET cust_contact ='Sam Roberts', cust_email ='sam@toyland.com'WHERE cust_id = 1分析:在更新多個(gè)列時(shí),只需要使用一條SET命令,每個(gè)“列=值”對之間用逗號分隔(最后一列之后不用逗號)。
要刪除某個(gè)列的值,可設置它為NULL。
UPDATE CustomersSET cust_email = NULLWHERE cust_id = 1分析:NULL用來(lái)去除cust_email列中的值。
刪除數據
從一個(gè)表中刪除數據,使用DELETE語(yǔ)句,使用DELETE的方式有兩種:
? 從表中刪除特定的行;
? 從表中刪除所有行。
示例:DELETE FROM Customers WHERE cust_id =1分析:DELETEFROM要求指定刪除數據的表名,WHERE子句過(guò)濾要刪除的行。如果省略WHERE子句,它將刪除表中每個(gè)顧客。
DELETE不需要列名或通配符,DELETE刪除整行而不是刪除列,要刪除指定的列,使用UPDATE語(yǔ)句。
使用UPDATE或DELETE時(shí)所遵循的重要原則:
? 除非更新和刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATE或DELETE語(yǔ)句。
? 保證每個(gè)表都有主鍵,盡可能像WHERE子句那樣使用它。
? 在UPDATE或DELETE語(yǔ)句使用WHERE子句前,應該先用SELECT進(jìn)行測試,保證它過(guò)濾的是正確的記錄,以防編寫(xiě)的WHERE子句不正確。
? 使用強制實(shí)施引用完整性的數據庫,這樣DBMS將不允許刪除其數據與其他表相關(guān)聯(lián)的行。
? 有的DBMS允許數據庫管理員施加約束,防止執行不帶WHERE子句的UPDATE或DELETE語(yǔ)句。若是SQL沒(méi)有撤銷(xiāo)(undo)按鈕,應該非常小心地使用UPDATE和DELETE。
以上就是今天分享的全部?jì)热?,下期重點(diǎn)為大家介紹使用視圖和創(chuàng )建和操縱表,我們下期見(jiàn)!
聯(lián)系客服