注:這一系列的文章是《SQL必知必會》第四版的讀書筆記搀菩。
14.組合查詢
利用UNION操作符將多條SELECT語句組合成一個結果集呕臂。
14.1 組合查詢
主要有兩種情況需要使用組合查詢:
(1)在一個查詢中從不同的表返回結構數(shù)據
(2)對一個表執(zhí)行多個查詢,按一個查詢返回數(shù)據
14.2 創(chuàng)建組合查詢
14.2.1 使用UNION
給出每條SELECT語句肪跋,在各條語句之間放上關鍵字UNION歧蒋。
輸入:
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';
14.2.2 UNION規(guī)則
(1)UNION必須由兩條及以上的SELECT語句組成,語句之間用關鍵字UNION分隔州既。
(2)UNION中的每個查詢必須包含相同的列谜洽、表達式或聚集函數(shù)。
(3)列數(shù)據類型必須兼容吴叶。類型不必完全相同阐虚,但必須是DBMS可以隱含轉換的類型。
14.2.3 包含或取消重復的行
UNION從查詢結果集中自動去除了重復的行晤郑。若想返回所有的匹配行敌呈,可使用UNION ALL而不是UNION。
輸入:
SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION ALL
SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_name='Fun4All';
14.2.4 對組合查詢結果排序
在用UNION組合查詢時造寝,只能使用一條ORDER BY子句磕洪,必須位于最后一條SELECT語句之后。
輸入:
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'
ORDER BY cust_name,cust_contact;
15.插入數(shù)據
利用SQL的INSERT語句將數(shù)據插入表中诫龙。
15.1 數(shù)據插入
15.1.1 插入完整的行
輸入:
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);
使用列的列表更加安全析显。
15.1.2 插入部分行
輸入:
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');
如果表的定義允許,可以在INSERT操作中省略某些列签赃。省略的列必須滿足以下某個條件:
(1)該列定義為允許NULL值
(2)在表定義中給出默認值谷异。
15.1.3 插入檢索出的數(shù)據
輸入:
INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)
SELECT?cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country
FROM CustNew;
15.2 從一個表復制到另一個表
以MySQL為例。
輸入:
CREATE TABLE CustCopy AS
SELECT * FROM Customers;
16.更新和刪除數(shù)據
利用UPDATE和DELETE語句進一步操作表數(shù)據锦聊。
16.1 更新數(shù)據
有兩種使用UPDATE的方式:
(1)更新表中的特定行
(2)更新表中的所有行
要注意WHERE子句歹嘹,避免錯誤的更新表中的所有行。
輸入:
UPDATE Customers
SET cust_contact='Sam Roberts',cust_email='sam@toyland.com'
WHERE cust_id='1000000006';
刪除某個列的值孔庭,可設置它為NULL尺上。
輸入:
UPDATE Customers
SET cust_email=NULL
WHERE cust_id='1000000005';
16.2 刪除數(shù)據
有兩種使用DELETE的方式:
(1)從表中刪除特定的行
(2)從表中刪除所有行
同樣要注意WHERE子句,避免誤刪除所有行圆到。
輸入:
DELETE FROM Customers
WHERE cust_id='1000000006';
DELETE刪除整行怎抛,而不是刪除列。DELETE能刪除表中的所有行芽淡,但是DELETE不刪除表本身马绝。
16.3 更新和刪除的指導原則
(1)除非確實打算更新或刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATE或DELETE語句挣菲。
(2)保證每個表都有主鍵富稻。
(3)在UPDATE或DELETE語句使用WHERE子句前掷邦,應該先用SELECT進行測試,保證它過濾的是正確的記錄唉窃,以防編寫的WHERE子句不正確耙饰。
(4)使用強制實施引用完整性的數(shù)據庫纹笼,這樣DBMS將不允許刪除其數(shù)據與其他表相關聯(lián)的行纹份。
(5)如果DBMS允許數(shù)據庫管理員施加約束,防止執(zhí)行不帶WHERE子句的UPDATE或DELETE語句廷痘,則應該使用它蔓涧。
17.創(chuàng)建和操縱表
創(chuàng)建、更改和刪除表的基本知識笋额。
17.1 創(chuàng)建表
一般有兩種創(chuàng)建表的方法:
(1)多數(shù)DBMS都具有交互式創(chuàng)建和管理數(shù)據庫表的工具元暴。
(2)表也可以直接用SQL語句操縱。
輸入:
CREATE TABLE Products{
? ? prod_id? ? ? ? CHAR(10)? ? ? ? NOT NULL,
????vend_id? ? ? ? CHAR(10)? ? ? ? NOT NULL,
? ? prod_name? CHAR(10)? ? ? ? NOT NULL,
? ? prod_price? ?DECIMAL(8,2)? NOT NULL,
? ? prod_desc? ?TEXT(1000)? ? ? NULL
} ;
指定默認值:
輸入:
CREATE TABLE OrderItems{
????prod_id? ? ? ? CHAR(10)? ? ? ? ?NOT NULL,
????order_num? ?INTEGER? ? ? ? ?NOT NULL,
????order_item? ?INTEGER? ? ? ? ?NOT NULL,
? ? quantity? ? ? ? INTEGER? ? ? ? ?NOT NULL? ? ? ? DEFAULT 1,
? ? item_price? ? DECIMAL(8,2)? NOT NULL
} ;
17.2 更新表
輸入:
ALTER? TABLE? Vendors
ADD? vend_phone? CHAR(20);
17.3 刪除表
輸入:
DROP TABLE CustCopy;
18.使用視圖
什么是視圖兄猩,怎么工作茉盏,什么時候使用,利用視圖簡化SQL操作枢冤。
18.1 視圖
視圖是虛擬的表鸠姨,只包含使用時動態(tài)檢索數(shù)據的查詢。
18.1.1 為什么使用視圖
(1)重用SQL語句
(2)簡化復雜的SQL操作
(3)使用表的一部分而不是整個表
(4)保護數(shù)據淹真。
(5)更改數(shù)據格式和表示讶迁。
18.1.2 視圖的規(guī)則和限制
(1)視圖必須唯一命名
(2)創(chuàng)建視圖必須具有足夠的訪問權限
(3)視圖可以嵌套。
(4)許多DBMS禁止在視圖查詢中使用ORDER BY子句核蘸。
(5)有些DBMS要求對返回的所有列進行命名巍糯。
(6)視圖不能索引,也不能有關聯(lián)的觸發(fā)器或默認值客扎。
(7)有些DBMS把視圖作為只讀的查詢祟峦。
18.2 創(chuàng)建視圖
18.2.1 利用視圖簡化復雜的聯(lián)結
輸入:
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;
SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id='RGAN01';
18.2.2 用視圖重新格式化檢索出的數(shù)據
18.2.3 用視圖過濾不想要的數(shù)據
輸入:
CREATE VIEW CustomerEmailList AS
SELECT cust_id,cust_name,cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
SELECT *
FROM CustomerEmailList;
18.2.4 使用視圖與計算字段
輸入:
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,prod_id,quantity,item_price,quantity*item_price AS expanded_price
FROM OrderItems;
SELECT *
FROM OrderItemsExpanded
WHERE order_num=20008;