摘要:數(shù)據(jù)庫(kù)技術(shù)是計(jì)算機(jī)技術(shù)中的一個(gè)重要分支,SQL語(yǔ)句的一項(xiàng)強(qiáng)大同時(shí)也特別容易混淆的功能是能采用很多種不同的方法表達(dá)多表操作,本文在分析的基礎(chǔ)上以實(shí)例的形式探索了靈活學(xué)習(xí)掌握SQL語(yǔ)句的方法。
關(guān)鍵詞:數(shù)據(jù)庫(kù);SQL;聯(lián)接
中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A
1引言
計(jì)算機(jī)改變了世界,在對(duì)各行各業(yè)滲透最廣、介入最深、影響最大的為數(shù)不多的幾個(gè)計(jì)算機(jī)技術(shù)的分支中,數(shù)據(jù)庫(kù)技術(shù)占了重要的地位。40年來(lái),數(shù)據(jù)庫(kù)技術(shù)與時(shí)俱進(jìn),日新月異,不斷開(kāi)拓新的研究方向,推出新的軟件系統(tǒng),涌現(xiàn)新的應(yīng)用領(lǐng)域。數(shù)據(jù)庫(kù)技術(shù)已經(jīng)成為計(jì)算機(jī)科學(xué)基礎(chǔ)教育中重要的一門(mén)課程。
數(shù)據(jù)庫(kù)應(yīng)用技術(shù)是計(jì)算機(jī)本專(zhuān)科相關(guān)專(zhuān)業(yè)必修的一門(mén)課程,SQL語(yǔ)句操作是課程教學(xué)的重點(diǎn)內(nèi)容,學(xué)生能否對(duì)DML語(yǔ)句進(jìn)行靈活熟練掌握是學(xué)好該課程的關(guān)鍵,也是進(jìn)行與數(shù)據(jù)庫(kù)應(yīng)用相關(guān)軟件開(kāi)發(fā)的基礎(chǔ)。
結(jié)合從事教學(xué)的經(jīng)驗(yàn),探索一種靈活學(xué)習(xí)掌握SQL語(yǔ)句的方法,以改善課堂教學(xué)質(zhì)量。學(xué)習(xí)SQL語(yǔ)句解決的關(guān)鍵問(wèn)題是對(duì)SQL語(yǔ)句的聯(lián)接運(yùn)算可采用多種不同的方法表達(dá)。本文通過(guò)以多種方法實(shí)現(xiàn)的幾個(gè)實(shí)例來(lái)探索學(xué)習(xí)掌握SQL語(yǔ)句的方法。
2實(shí)例分析
在查詢(xún)語(yǔ)句中采用叉乘和聯(lián)接運(yùn)算符,在叉乘風(fēng)格中,所有的關(guān)系表被列于FROM子句中,而聯(lián)接條件則在WHERE子句中。在聯(lián)接運(yùn)算符風(fēng)格中可以在FROM子句中直接書(shū)寫(xiě)INNER JOIN…ON格式的聯(lián)接運(yùn)算符。聯(lián)接運(yùn)算符風(fēng)格的主要好處是,包含外聯(lián)接問(wèn)題可以采用這種格式很方便地用SQL語(yǔ)言表達(dá)出來(lái)。如果不采用各廠商特有的SQL擴(kuò)展,外聯(lián)接是不能使用叉乘表達(dá)出來(lái)的。
所謂嵌套查詢(xún)(又叫子查詢(xún)),就是一個(gè)在其內(nèi)部以包含一個(gè)查詢(xún)語(yǔ)句(SELECT語(yǔ)句)的查詢(xún)語(yǔ)句。一般說(shuō)來(lái)嵌套查詢(xún)常作為條件的一部分出現(xiàn)在WHERE或HAVING子句中。但是,嵌套查詢(xún)也可以出現(xiàn)在FROM子句中。子查詢(xún)又分為不相關(guān)子查詢(xún)與相關(guān)子查詢(xún)。
下面給出在學(xué)習(xí)中常用的三個(gè)表,Customers(顧客表),Products(產(chǎn)品表),Sales(銷(xiāo)售表),其結(jié)構(gòu)如下所示:
Customers
(
CustomerID INT IDENTITY PRIMARY KEY,
FirstName VARCHAR(50), LastName VARCHAR(50), City VARCHAR(50), State CHAR(2), Zip VARCHAR(10) )
Products
(ProductID TINYINT IDENTITY PRIMARY KEY,
ProductName VARCHAR(20),RecommendedPrice
MONEY,Category VARCHAR(10)
)
Sales
(SaleID INT IDENTITY
PRIMARY KEY,ProductID TINYINT NOT NULL
REFERENCES Products(ProductID),CustomerID INT
NOT NULL REFERENCES Customers(CustomerID),SalePrice
MONEY NOT NULL,SaleDate SMALLDATETIME NOT NULL)
例1:返回在2005年10月售出的所有產(chǎn)品的名稱(chēng)、價(jià)格和客戶(hù)姓名:
分析:要查詢(xún)產(chǎn)品的名稱(chēng)、價(jià)格和客戶(hù)姓名來(lái)源于三個(gè)表,要用到表的聯(lián)接查詢(xún),兩個(gè)表聯(lián)接要找公共字段,因此,Sales與Customers聯(lián)接,聯(lián)接條件為sales. CustomerID= customers.CustomerID,Customers與Products聯(lián)接,聯(lián)接條件為sales.ProductID= products.ProductID,根據(jù)以上分析可有兩種實(shí)現(xiàn)方法。
方法一:叉乘風(fēng)格法
SELECT
c.FirstName, c.LastName, p.ProductName, s.SalePrice
FROM Sales s, Customers c, Products p
WHERE s.CustomerID = c.CustomerID AND s.ProductID = p.ProductID AND
s.SaleDate >= '10/1/2005' AND s.SaleDate < '11/1/2005'
方法二:聯(lián)接運(yùn)算符風(fēng)格法
SELECT
c.FirstName, c.LastName, p.ProductName, s.SalePrice
FROM
Sales s
INNER JOIN Customers c ON s.CustomerID = c.CustomerID
INNER JOIN Products p ON s.ProductID = p.ProductID
WHERE
s.SaleDate >= '10/1/2005' AND
s.SaleDate < '11/1/2005'
例2:返回沒(méi)有購(gòu)買(mǎi)產(chǎn)品并且位于客戶(hù)表格上的人的姓名及其客戶(hù)ID:
分析:本實(shí)例返回的姓名及其客戶(hù)ID都來(lái)源于Customers,但返回的結(jié)果決定于Sales中的 CustomerID,因此也是兩個(gè)表的聯(lián)接查詢(xún),聯(lián)接條件為sales.CustomerID= customers.CustomerID,聯(lián)接查詢(xún)分為內(nèi)聯(lián)接和外聯(lián)接,內(nèi)聯(lián)接返回的結(jié)果為購(gòu)買(mǎi)產(chǎn)品的客戶(hù)信息,若返回沒(méi)有購(gòu)買(mǎi)產(chǎn)品的客戶(hù)信息需返回所有客戶(hù)信息再去除購(gòu)買(mǎi)產(chǎn)品的客戶(hù)信息。
方法一:叉乘風(fēng)格法
可以用*=定義左連接,=*定義右連接(適用于SQL SERVER2000,不同廠商的SQL擴(kuò)展不同)。
SELECT
c.CustomerID, c.FirstName, c.LastName
FROM
Sales s, Customers c
WHERE s.CustomerID = *c.CustomerID AND
s.CustomerID IS NULL
方法二:聯(lián)接運(yùn)算符風(fēng)格法
SELECT
c.CustomerID, c.FirstName, c.LastName
FROM
Sales s
RIGHT OUTER JOIN Customers c ON s.CustomerID = c.CustomerID
WHERE
s.CustomerID IS NULL
方法三:不相關(guān)子查詢(xún)法
SELECT
c.CustomerID, c.FirstName, c.LastName
FROM
Customers c
WHERE c.CustomerID NOT IN (SELECT s.CustomerID FROM Sales s)
方法三:相關(guān)子查詢(xún)法
SELECT Customerid,F(xiàn)irstname,Lastname FROM Customers WHERE NOT EXISTS(SELECT * FROM Sales WHERE Customers.Customerid=Sales.Customerid)
例3:從數(shù)據(jù)庫(kù)中刪除來(lái)自緬因洲(‘ME’)的客戶(hù):
分析:在Sales與Customers表中都存在客戶(hù)信息,兩個(gè)表都應(yīng)做刪除操作,但兩個(gè)表存在引用關(guān)系,Sales外鍵引用Customers(CustomerID),因此,先刪除Sales中的相關(guān)記錄,要?jiǎng)h除來(lái)自緬因洲(‘ME’)的客戶(hù),在Customers中由State = 'ME'找到相應(yīng)的CustomerID,由CustomerID刪除Sales中的相關(guān)記錄,再刪除Customers中State = 'ME'的記錄。
方法一:叉乘風(fēng)格法
DELETE s
FROM
Sales s, Customers c
WHERE s.CustomerID = c.CustomerID AND c.State = 'ME'
DELETE c
FROM
Customers c
WHERE
c.State = 'ME'
方法二:聯(lián)接運(yùn)算符風(fēng)格法
DELETE s
FROM
Sales s
JOIN Customers c ON s.CustomerID = c.CustomerID
WHERE
c.State = 'ME'
DELETE c
FROM
Customers c
WHERE
c.State = 'ME'
方法三:子查詢(xún)風(fēng)格法
DELETE s
FROM
Sales s
WHERE
s.CustomerID IN (SELECT c.CustomerID FROM Customers c WHERE c.State = 'ME' )
DELETE c
FROM
Customers c
WHERE
c.State = 'ME'
例4:將銷(xiāo)售在2005年6月10日到6月20日之間的產(chǎn)品的銷(xiāo)售價(jià)格升級(jí)為建議售價(jià):
分析:產(chǎn)品的價(jià)格在Sales中表示,需修改Sales表,但要修改記錄的銷(xiāo)售價(jià)格由Products中的建議售價(jià)表示,因此,是一個(gè)多表的DML操作,可用多表的聯(lián)接操作,可理解為Sales與Products表聯(lián)接后生成一個(gè)集合,在這個(gè)集合中修改銷(xiāo)售在2005年6月10日到6月20日之間的產(chǎn)品價(jià)格。
方法一:叉乘風(fēng)格法
UPDATE s
SET SalePrice = p.RecommendedPrice
FROM
Sales s, Products p
WHERE s.ProductID = P.ProductID AND
SaleDate >= '6/10/2005' AND
SaleDate < '6/21/2005'
方法二:聯(lián)接運(yùn)算符風(fēng)格法
UPDATE s
SET SalePrice = p.RecommendedPrice
FROM
Sales s
INNER JOIN Products p ON s.ProductID = s.ProductID
WHERE
SaleDate >= '6/10/2005' AND
SaleDate < '6/21/2005'
方法三:子查詢(xún)風(fēng)格法
UPDATE s
SET SalePrice = p.RecommendedPrice
FROM
Sales s, Products p
WHERE s.ProductID IN (SELECT ProductID FROM Products ) AND
SaleDate >= '6/10/2005' AND
SaleDate < '6/21/2005'
3總結(jié)
SELECT、DELETE、UPDATE、INSERT是數(shù)據(jù)庫(kù)操作中的重要內(nèi)容,也是數(shù)據(jù)庫(kù)應(yīng)用技術(shù)學(xué)習(xí)中的重點(diǎn),通過(guò)以上幾個(gè)實(shí)例的操作可以看出對(duì)于多表操作可以叉乘風(fēng)格法、聯(lián)接運(yùn)算符風(fēng)格法、子查詢(xún)風(fēng)格法靈活去解答。
參考文獻(xiàn)
[1] 趙松濤. SQL Server 2005系統(tǒng)管理實(shí)錄[M]. 北京:電子工業(yè)出版社,2006.
[2] 李勇平. Oracle9i基礎(chǔ)教程與上機(jī)指導(dǎo)[M]. 北京:科學(xué)出版社,2004.
[3] (美) Michael V. Mannino著. 數(shù)據(jù)庫(kù)設(shè)計(jì)、應(yīng)用開(kāi)發(fā)與管理[M]. 北京:高等教育出版社,2006.