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