資料庫設計/SQL 資料操作語言
SQL 資料操作語言 (DML) 用於查詢和修改資料庫資料。本章將介紹如何使用 SELECT、INSERT、UPDATE 和 DELETE SQL DML 命令語句,這些語句定義如下。
- SELECT – 查詢資料庫中的資料
- INSERT – 將資料插入表中
- UPDATE – 更新表中的資料
- DELETE – 從表中刪除資料
在 SQL DML 語句中
- 語句中的每個子句都應從新行開始。
- 每個子句的開頭應與其他子句的開頭對齊。
- 如果一個子句有多個部分,它們應該出現在單獨的行上,並且縮排在子句的開頭下方,以顯示它們之間的關係。
- 大寫字母用於表示保留字。
- 小寫字母用於表示使用者定義的字。
SELECT 語句或命令允許使用者根據特定條件從表中提取資料。它是按照以下順序處理的
SELECT DISTINCT item(s)
FROM table(s)
WHERE predicate
GROUP BY field(s)
ORDER BY fields
我們可以使用 SELECT 語句從 Employees 表生成一個員工電話列表,如下所示
SELECT FirstName, LastName, phone
FROM Employees
ORDER BY LastName
此操作將顯示來自 Employees 表的員工姓氏、名字和電話號碼,如表 16.1 所示。
| 姓氏 | 名字 | 電話號碼 |
| Hagans | Jim | 604-232-3232 |
| Wong | Bruce | 604-244-2322 |
表 16.1. Employees 表。
在下一個示例中,我們將使用 Publishers 表(表 16.2)。(你會注意到,在 Example Publishing 和 ABC Publishing 的出版社國家欄位中,Canada 拼寫錯誤。要更正拼寫錯誤,請使用 UPDATE 語句將國家欄位標準化為 Canada - 請參閱本章後面介紹的 UPDATE 語句。)
| 出版社名稱 | 出版社城市 | 出版社省份 | 出版社國家 |
| Acme Publishing | Vancouver | BC | Canada |
| Example Publishing | Edmonton | AB | Cnada |
| ABC Publishing | Toronto | ON | Canda |
表 16.2. Publishers 表。
如果你要添加出版社的名稱和城市,你將使用 SELECT 語句,後面跟著用逗號分隔的欄位名稱
SELECT PubName, city
FROM Publishers
此操作將顯示來自 Publishers 表的出版社名稱和城市。
如果你只想要出版社名稱在顯示名稱“城市”下,你將使用 SELECT 語句,沒有逗號分隔 pub_name 和 city
SELECT PubName city
FROM Publishers
執行此操作將僅顯示來自 Publishers 表的 pub_name,標題為“城市”。 如果你沒有包含逗號,SQL Server 會假設你想要一個新的 pub_name 列名。
有時你可能想關注 Publishers 表的一部分,比如只關注位於 Vancouver 的出版社。在這種情況下,你將使用帶有 WHERE 條件的 SELECT 語句,即 WHERE city = ‘Vancouver’。
前兩個示例說明了如何使用 BETWEEN 限制 WHERE 條件的記錄選擇。這些示例中的每一個都為庫存量介於 20 到 50 之間的商店專案提供相同的結果。
示例 #1 使用數量,qty BETWEEN 20 and 50。
SELECT StorID, qty, TitleID
FROM Sales
WHERE qty BETWEEN 20 and 50 (包括 20 和 50)
另一方面,示例 #2 使用 qty >=20 and qty <=50 。
SELECT StorID, qty, TitleID
FROM Sales
WHERE qty >= 20 and qty <= 50
示例 #3 說明了如何使用 NOT BETWEEN 限制 WHERE 條件的記錄選擇。
SELECT StorID, qty, TitleID
FROM Sales
WHERE qty NOT BETWEEN 20 and 50
接下來的兩個示例展示了使用 IN 限制 WHERE 條件的記錄選擇的兩種不同方法,每種方法都產生相同的結果。
示例 #4 展示瞭如何在 WHERE 語句中使用 province= 來選擇記錄。
SELECT *
FROM Publishers
WHERE province = ‘BC’ OR province = ‘AB’ OR province = ‘ON’
示例 #5 使用 WHERE 語句中的 province IN 來選擇記錄。
SELECT *
FROM Publishers
WHERE province IN (‘BC’, ‘AB’, ‘ON’)
最後兩個示例說明了如何使用 NULL 和 NOT NULL 來選擇記錄。對於這些示例,將使用一個 Books 表(未顯示),其中包含名為 Title、Quantity 和 Price(書籍價格)的欄位。每個出版商都有一個 Books 表,其中列出了其所有書籍。
示例 #6 使用 NULL。
SELECT price, title
FROM Books
WHERE price IS NULL
示例 #7 使用 NOT NULL。
SELECT price, title
FROM Books
WHERE price IS NOT NULL
LIKE 關鍵字選擇包含與指定字元字串部分匹配的欄位的行。LIKE 用於 char、varchar、text、datetime 和 smalldatetime 資料。萬用字元允許使用者匹配包含某些字母的欄位。例如,萬用字元 province = ‘N%’ 將給出所有以字母“N”開頭的省份。表 16.3 展示了在 SELECT 語句中指定萬用字元的四種方法,使用正則表示式格式。
| % | 任何包含零個或多個字元的字串 |
| _ | 任何單個字元 |
| [ ] | 指定範圍內(例如,[a-f])或集中(例如,[abcdef])的任何單個字元 |
| [^] | 指定範圍之外(例如,[^a – f])或集(例如,[^abcdef])的任何單個字元 |
表 16.3. 如何在 SELECT 語句中指定萬用字元。
在示例 #1 中,LIKE ‘Mc%’ 搜尋所有以字母“Mc”開頭的姓氏(例如,McBadden)。
SELECT LastName
FROM Employees
WHERE LastName LIKE ‘Mc%’
對於示例 #2:LIKE ‘%inger’ 搜尋所有以字母“inger”結尾的姓氏(例如,Ringer、Stringer)。
SELECT LastName
FROM Employees
WHERE LastName LIKE ‘%inger’
在示例 #3 中:LIKE ‘%en%’ 搜尋所有包含字母“en”的姓氏(例如,Bennett、Green、McBadden)。
SELECT LastName
FROM Employees
WHERE LastName LIKE ‘%en%’
使用 ORDER BY 子句對結果列表中的記錄進行排序。使用 ASC 對結果進行升序排序,使用 DESC 對結果進行降序排序。
例如,使用 ASC
SELECT *
FROM Employees
ORDER BY HireDate ASC
使用 DESC
SELECT *
FROM Books
ORDER BY type, price DESC
GROUP BY 子句用於為每個組建立一個輸出行,並生成所選列的彙總值,如下所示。
SELECT type
FROM Books
GROUP BY type
以下是一個使用上述語句的示例。
SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’
FROM Books
WHERE royalty > 10
GROUP BY type
如果 SELECT 語句包含一個 WHERE 條件,其中 price is not null,
SELECT type, price
FROM Books
WHERE price is not null
那麼包含 GROUP BY 子句的語句將如下所示
SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’
FROM Books
WHERE price is not null
GROUP BY type
我們可以使用 COUNT 來統計容器中包含的專案數量。但是,如果我們想將不同型別的專案分別分組計數,例如顏色不同的彈珠,那麼我們將使用帶 GROUP BY 命令的 COUNT 函式。
以下 SELECT 語句說明了如何使用帶 GROUP BY 子句的 COUNT 函式來對資料組進行計數。
SELECT COUNT(*)
FROM Books
GROUP BY type
我們可以使用 AVG 函式來獲取任何組的平均值,使用 SUM 來獲取總計。
示例 1 使用 AVG 函式與 GROUP BY type。
SELECT AVG(qty)
FROM Books
GROUP BY type
示例 2 使用 SUM 函式與 GROUP BY type。
SELECT SUM(qty)
FROM Books
GROUP BY type
示例 3 在 SELECT 語句中使用 AVG 和 SUM 函式與 GROUP BY type。
SELECT ‘Total Sales’ = SUM(qty), ‘Average Sales’ = AVG(qty), stor_id
FROM Sales
GROUP BY StorID ORDER BY ‘Total Sales’
HAVING 子句可以用於限制行。它類似於 WHERE 條件,不同的是 HAVING 可以包含聚合函式;WHERE 無法做到這一點。
HAVING 子句的行為類似於 WHERE 子句,但適用於組。在本例中,我們使用 HAVING 子句來排除省份為 ‘BC’ 的組。
SELECT au_fname AS ‘Author”s First Name’, province as ‘Province’
FROM Authors
GROUP BY au_fname, province
HAVING province <> ‘BC’
INSERT 語句 將行新增到表中。此外,
- INSERT 指定將資料插入到的表或檢視。
- Column_list 列出將受 INSERT 影響的列。
- 如果省略了列,則必須提供每個值。
- 如果您要包含列,則可以按任何順序列出它們。
- VALUES 指定要插入表中的資料。VALUES 是必需的。
- 具有 IDENTITY 屬性的列不應在 column_list 或 values_clause 中顯式列出。
INSERT 語句的語法如下
INSERT [INTO] Table_name | view name [column_list]
DEFAULT VALUES | values_list | select statement
在使用 INSERT 語句插入行時,將應用以下規則
- 將空字串 (‘ ‘) 插入 varchar 或 text 列將插入一個空格。
- 所有 char 列都向右填充到定義的長度。
- 從插入 varchar 列的所有尾隨空格中刪除,除了僅包含空格的字串。這些字串將截斷為一個空格。
- 如果 INSERT 語句違反了約束、預設值或規則,或者型別錯誤,則該語句將失敗,SQL Server 將顯示一條錯誤訊息。
當您僅為 column_list 中的一些列指定值時,可能會對沒有值的列發生以下三種情況之一
- 如果列具有 DEFAULT 約束,如果預設值繫結到列,或者如果預設值繫結到底層使用者定義的資料型別,則將輸入預設值。
- 如果列允許 NULL,並且列不存在預設值,則將輸入 NULL。
- 如果列定義為 NOT NULL 並且不存在預設值,則將顯示一條錯誤訊息,並且行將被拒絕。
本示例使用 INSERT 向釋出商的 Authors 表新增一條記錄。
INSERT INTO Authors
VALUES(‘555-093-467’, ‘Martin’, ‘April’, ‘281 555-5673’, ‘816 Market St.,’ , ‘Vancouver’, ‘BC’, ‘V7G3P4’, 0)
以下示例說明了如何使用列列表將部分行插入 Publishers 表。country 列具有預設值 Canada,因此您無需將其包含在您的值中。
INSERT INTO Publishers (PubID, PubName, city, province)
VALUES (‘9900’, ‘Acme Publishing’, ‘Vancouver’, ‘BC’)
要將行插入具有 IDENTITY 列的表,請遵循以下示例。不要在列列表中提供 IDENTITY 的值或列的名稱。
INSERT INTO jobs
VALUES (‘DBA’, 100, 175)
預設情況下,無法將資料直接插入 IDENTITY 列;但是,如果不小心刪除了行,或者 IDENTITY 列值存在間隙,則可以插入行並指定 IDENTITY 列值。
IDENTITY_INSERT 選項
要允許插入具有特定標識值的插入,可以使用 IDENTITY_INSERT 選項,如下所示。
SET IDENTITY_INSERT jobs ON
INSERT INTO jobs (job_id, job_desc, min_lvl, max_lvl)
VALUES (19, ’DBA2’, 100, 175)
SET IDENTITY_INSERT jobs OFF
我們有時可以從大型表中建立一個小型臨時表。為此,我們可以使用 SELECT 語句插入行。使用此命令時,沒有唯一性的驗證。因此,在下面的示例中,可能存在許多具有相同 pub_id 的行。
本示例使用 CREATE TABLE 語句建立一個較小的臨時 Publishers 表。然後,使用帶 SELECT 語句的 INSERT 將記錄從 publis 表新增到此臨時 Publishers 表。
CREATE TABLE dbo.tmpPublishers (
PubID char (4) NOT NULL ,
PubName varchar (40) NULL ,
city varchar (20) NULL ,
province char (2) NULL ,
country varchar (30) NULL DEFAULT (‘Canada’)
)
INSERT tmpPublishers
SELECT * FROM Publishers
在本示例中,我們正在複製資料的子集。
INSERT tmpPublishers (pub_id, pub_name)
SELECT PubID, PubName
FROM Publishers
在本示例中,釋出商資料被複制到 tmpPublishers 表,並且 country 列被設定為 Canada。
INSERT tmpPublishers (PubID, PubName, city, province, country)
SELECT PubID, PubName, city, province, ‘Canada’
FROM Publishers
UPDATE 語句 透過新增新資料或修改現有資料來更改現有行中的資料。
本示例使用 UPDATE 語句將 Publishers 表中所有記錄的 country 欄位標準化為 Canada。
UPDATE Publishers
SET country = ‘Canada’
本示例將介於 10 和 20 之間的版稅金額提高 10%。
UPDATE roysched
SET royalty = royalty + (royalty * .10)
WHERE royalty BETWEEN 10 and 20
來自 Employees 表的僱員,在 2010 年被髮布商錄用,被提升到其工作型別的最高工作級別。這是 UPDATE 語句的樣子。
UPDATE Employees
SET job_lvl =
(SELECT max_lvl FROM jobs
WHERE employee.job_id = jobs.job_id)
WHERE DATEPART(year, employee.hire_date) = 2010
DELETE 語句 從記錄集中刪除行。DELETE 指定包含將被刪除行的表或檢視,並且一次只能列出一個表或行。WHERE 是一個標準的 WHERE 子句,它將刪除限制為選擇記錄。
DELETE 語法如下所示。
DELETE [FROM] {table_name | view_name }
[WHERE clause]
DELETE 語句的規則是
- 如果省略 WHERE 子句,則將刪除表中的所有行(索引、表、約束除外)。.
- DELETE 不能與 FROM 子句中命名了多個表的檢視一起使用。(一次只能影響一個基本表。)
以下是三種不同的 DELETE 語句,可供使用。
1. 從表中刪除所有行。
DELETE
FROM Discounts
2. 刪除選定的行
DELETE
FROM Sales
WHERE stor_id = ‘6380’
3. 基於子查詢中的值刪除行
DELETE FROM Sales
WHERE title_id IN
(SELECT title_id FROM Books WHERE type = ‘mod_cook’)
內建函式
[edit | edit source]SQL Server 中有許多內建函式,例如
- 聚合:返回彙總值
- 轉換:將一種資料型別轉換為另一種資料型別
- 日期:顯示有關日期和時間的相關資訊
- 數學:對數值資料執行運算
- 字串:對字元字串、二進位制資料或表示式執行運算
- 系統:從資料庫返回特殊資訊
- 文字和影像:對文字和影像資料執行運算
以下將詳細介紹前四種函式並提供示例。
聚合函式
[edit | edit source]聚合函式對一組值進行計算,並返回單個值或彙總值。表 16.4 列出了這些函式。
| 函式 | 描述 |
| AVG | 返回表示式中所有值的平均值,或僅返回 DISTINCT 值的平均值。 |
| COUNT | 返回表示式中非空值的個數。當指定 DISTINCT 時,COUNT 會查詢唯一的非空值的個數。 |
| COUNT(*) | 返回行數。COUNT(*) 不接受任何引數,不能與 DISTINCT 一起使用。 |
| MAX | 返回表示式中的最大值。MAX 可用於數值、字元和日期時間列,但不能用於位列。對於字元列,MAX 會查詢排序順序中的最高值。MAX 會忽略任何空值。 |
| MIN | 返回表示式中的最小值。MIN 可用於數值、字元和日期時間列,但不能用於位列。對於字元列,MIN 會查詢排序順序中的最低值。MIN 會忽略任何空值。 |
| SUM | 返回表示式中所有值的總和,或僅返回 DISTINCT 值的總和。SUM 只能用於數值列。 |
表 16.4 聚合函式及其描述的列表。
以下是表 16.4 中列出的每個聚合函式的示例。
示例 #1: AVG
SELECT AVG (price) AS ‘平均標題價格’
FROM Books
示例 #2: COUNT
SELECT COUNT(PubID) AS ‘出版商數量’
FROM Publishers
示例 #3: COUNT
SELECT COUNT(province) AS ‘出版商數量’
FROM Publishers
示例 #3: COUNT (*)
SELECT COUNT(*)
FROM Employees
WHERE job_lvl = 35
示例 #4: MAX
SELECT MAX (HireDate)
FROM Employees
示例 #5: MIN
SELECT MIN (price)
FROM Books
示例 #6: SUM
SELECT SUM(discount) AS ‘折扣總額’
FROM Discounts
轉換函式
[edit | edit source]轉換函式將一種資料型別轉換為另一種資料型別。
在下面的示例中,包含兩個 9 的價格將轉換為五個字元。此語句的語法為 SELECT ‘The date is ‘ + CONVERT(varchar(12), getdate()).
SELECT CONVERT(int, 10.6496)
SELECT title_id, price
FROM Books
WHERE CONVERT(char(5), price) LIKE ‘%99%’
在此第二個示例中,轉換函式將資料更改為大小不同的資料型別。
SELECT title_id, CONVERT(char(4), ytd_sales) as ‘Sales’
FROM Books
WHERE type LIKE ‘%cook’
日期函式
[edit | edit source]日期函式透過向指定日期新增時間間隔來生成日期。結果是等於日期加上日期部分個數的日期時間值。如果 date 引數是 smalldatetime 值,則結果也是 smalldatetime 值。
DATEADD 函式用於新增和遞增日期值。此函式的語法為 DATEADD(datepart, number, date)。
SELECT DATEADD(day, 3, hire_date)
FROM Employees
在此示例中,使用了 DATEDIFF(datepart, date1, date2) 函式。
此命令返回兩個指定日期之間跨越的 datepart “邊界” 的個數。跨越邊界計數的方法使 DATEDIFF 給出的結果在所有資料型別(如分鐘、秒和毫秒)中保持一致。
SELECT DATEDIFF(day, HireDate, ‘Nov 30 1995’)
FROM Employees
對於任何特定日期,我們可以從年份到毫秒檢查該日期的任何部分。
SQL Server 識別的日期部分 (DATEPART) 及其縮寫以及可接受的值列於表 16.5 中。
| 日期部分 | 縮寫 | 值 |
| 年 | yy | 1753-9999 |
| 季度 | 1-4 | |
| 月 | mm | 1-12 |
| 年中的日期 | dy | 1-366 |
| 日 | dd | 1-31 |
| 周 | wk | 1-53 |
| 星期幾 | dw | 1-7 (週日-週六) |
| 小時 | hh | 0-23 |
| 分鐘 | mi | 0-59 |
| 秒 | ss | 0-59 |
| 毫秒 | ms | 0-999 |
表 16.5. 日期部分縮寫及其值。
數學函式
[edit | edit source]數學函式對數值資料執行運算。以下示例列出了出版商銷售的每本書的當前價格以及如果所有價格上漲 10% 的價格。
SELECT Price, (price * 1.1) AS ‘新價格’, title
FROM Books
SELECT ‘平方根’ = SQRT(81)
SELECT ‘四捨五入’ = ROUND(4567.9876,2)
SELECT FLOOR (123.45)
聯接表
[edit | edit source]聯接兩個或多個表是指比較指定列中的資料,並使用比較結果從符合條件的行中形成新表的過程。聯接語句
- 指定每個表中的一列
- 逐行比較這些列中的值
- 將具有合格值的行列組合成新行
雖然比較通常是針對相等性(完全匹配的值)進行的,但也可能指定其他型別的聯接。以下將介紹所有不同的聯接,例如內部聯接、左(外部)聯接、右(外部)聯接和交叉聯接。
內部聯接
[edit | edit source]內部聯接根據資料型別相同的列將兩個表連線起來。只返回列值匹配的行;不匹配的行將被丟棄。
示例 #1
SELECT jobs.job_id, job_desc
FROM jobs
INNER JOIN Employees ON employee.job_id = jobs.job_id
WHERE jobs.job_id < 7
示例 #2
SELECT authors.au_fname, authors.au_lname, books.royalty, title
FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id
INNER JOIN books ON titleauthor.title_id=books.title_id
GROUP BY authors.au_lname, authors.au_fname, title, title.royalty
ORDER BY authors.au_lname
左外部聯接
[edit | edit source]左外部聯接指定返回所有左外部行。結果集中包含來自左側表中未滿足指定條件的所有行,而來自另一個表的輸出列將設定為 NULL。
此第一個示例使用了左外部聯接的新語法。
SELECT publishers.pub_name, books.title
FROM Publishers
LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id
以下是用舊語法表示的左外部聯接示例。
SELECT publishers.pub_name, books.title
FROM Publishers, Books
WHERE publishers.pub_id *= books.pub_id
右外部聯接
[edit | edit source]右外部聯接在結果集中包含來自右側表中未滿足指定條件的所有行。對應於另一個表的輸出列將設定為 NULL。
以下是用新語法表示的右外部聯接示例。
SELECT titleauthor.title_id, authors.au_lname, authors.au_fname
FROM titleauthor
RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id
ORDERY BY au_lname
第二個示例展示了用於右外部聯接的舊語法。
SELECT titleauthor.title_id, authors.au_lname, authors.au_fname
FROM titleauthor, authors
WHERE titleauthor.au_id =* authors.au_id
ORDERY BY au_lname
完全外部聯接
[edit | edit source]完全外部聯接 指定如果來自任一表的行與選擇條件不匹配,則該行將包含在結果集中,並且其對應於另一表的輸出列將設定為 NULL。
這是一個完全外部聯接的示例。
SELECT books.title, publishers.pub_name, publishers.province
FROM Publishers
FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id
WHERE (publishers.province <> “BC” and publishers.province <> “ON”)
ORDER BY books.title_id
交叉聯接
[edit | edit source]交叉聯接 是將兩個表組合在一起的乘積。此聯接返回與未指定 WHERE 子句時相同的結果行。例如
SELECT au_lname, pub_name,
FROM Authors CROSS JOIN Publishers
關鍵詞
[edit | edit source]聚合函式:返回彙總值
ASC:升序
轉換函式:將一種資料型別轉換為另一種資料型別
交叉聯接:將兩個表組合在一起的乘積
日期函式:顯示有關日期和時間的資訊
DELETE 語句:從記錄集中刪除行
DESC:降序
完全外部聯接:指定如果來自任一表的行與選擇條件不匹配
GROUP BY:用於為每個組建立一個輸出行,併為所選列生成彙總值
內部聯接:根據具有相同資料型別的列連線兩個表
INSERT 語句:向表中新增行
左外部聯接:指定返回所有左外部行
數學函式:對數值資料執行操作
右外部聯接:包括來自右表的所有未滿足指定條件的行
SELECT 語句:用於查詢資料庫中的資料
字串函式:對字元字串、二進位制資料或表示式執行操作
系統函式:從資料庫返回特殊資訊
文字和影像函式:對文字和影像資料執行操作
UPDATE 語句:透過新增新資料或修改現有資料來更改現有行中的資料
萬用字元:允許使用者匹配包含某些字母的欄位。
練習
[edit | edit source]對於問題 1 到 18,請使用 Microsoft 建立的 PUBS 示例資料庫。要下載生成此資料庫的指令碼,請訪問以下網站:http://www.microsoft.com/en-ca/download/details.aspx?id=23654。
- 顯示 2011 年出版的出版日期和標題(書籍)列表。
- 顯示已歸類為傳統烹飪或現代烹飪的標題列表。使用 Books 表。
- 顯示所有名字是五個字母的作者。
- 從 Books 表中顯示:型別、價格、pub_id、標題,這些資訊是關於每個出版商出版的書籍的。將列型別重新命名為“書籍類別”。按型別(降序)然後價格(升序)排序。
- 使用 Books 表顯示 title_id、pubdate 和 pubdate 加上三天。
- 使用 datediff 和 getdate 函式確定 Books 表中的書籍自出版以來經過了多少個月。
- 列出所有銷量超過 30 本的書籍的 title ID 和數量。
- 顯示住在安大略省(ON)的所有作者的姓氏和居住城市。
- 顯示所有在 payterms 欄位中包含 60 的行。使用 Sales 表。
- 顯示所有名字是五個字母長,以 O 或 A 結尾,並以 M 或 P 開頭的作者。
- 顯示所有價格超過 30 美元的標題,這些標題要麼以 T 開頭,要麼釋出商 ID 為 0877。
- 從 Employees 表中顯示那些工作級別大於 200 的員工的姓名(fname)、姓氏(lname)、員工 ID(emp_id)和工作級別(job_lvl)列;並將列標題重新命名為:“姓名”、“姓氏”、“身份#”和“工作級別”。
- 顯示版稅、版稅加上 50% 作為“版稅加上 50”和 title_id。使用 Roysched 表。
- 使用 STUFF 函式從字串“1234567”建立字串“12xxxx567”。
- 顯示每個標題的前 40 個字元,以及該標題截至目前的月平均銷量(ytd_sales/12)。使用 Title 表。
- 顯示有多少本書有指定的價格。
- 顯示烹飪書的列表,以及每種型別所有書籍的平均成本。使用 GROUP BY。
高階問題(Union、Intersect 和 Minus)
[edit | edit source]- 關係集運算子 UNION、INTERSECT 和 MINUS 僅在關係是並集相容時才能正常工作。並集相容是什麼意思,以及如何檢查此條件?
- UNION 和 UNION ALL 之間的區別是什麼?寫出每種的語法。
- 假設您有兩個表,Employees 和 Employees_1。Employees 表包含三個員工的記錄:Alice Cordoza、John Cretchakov 和 Anne McDonald。Employees_1 表包含員工的記錄:John Cretchakov 和 Mary Chen。鑑於這些資訊,UNION 查詢的查詢輸出是什麼?列出查詢輸出。
- 給定問題 3 中的員工資訊,UNION ALL 查詢的查詢輸出是什麼?列出查詢輸出。
- 給定問題 3 中的員工資訊,INTERSECT 查詢的查詢輸出是什麼?列出查詢輸出。
- 給定問題 3 中的員工資訊,EXCEPT 查詢的查詢輸出是什麼?列出查詢輸出。
- 什麼是交叉聯接?舉一個其語法的例子。
- 解釋以下三種聯接型別
- 左外部聯接
- 右外部聯接
- 完全外部聯接
- 什麼是子查詢,其基本特徵是什麼?
- 什麼是相關子查詢?舉個例子。
- 假設一個 Product 表包含兩個屬性,PROD_CODE 和 VEND_CODE。PROD_CODE 的值是:ABC、DEF、GHI 和 JKL。它們與 VEND_CODE 的以下值匹配:125、124、124 和 123(例如,PROD_CODE 值 ABC 對應於 VEND_CODE 值 125)。Vendor 表包含單個屬性 VEND_CODE,其值為 123、124、125 和 126。(Product 表中的 VEND_CODE 屬性是 Vendor 表中 VEND_CODE 的外部索引鍵。)
- 給定問題 11 中的資訊,以下查詢的輸出是什麼?顯示值。
- 基於這兩個表的 UNION 查詢
- 基於這兩個表的 UNION ALL 查詢
- 基於這兩個表的 INTERSECT 查詢
- 基於這兩個表的 MINUS 查詢
高階問題(使用聯接)
[edit | edit source]- 顯示 Books 和 Sales 表中所有標題和銷售數量的列表,包括沒有銷售的標題。使用聯接。
- 顯示作者姓氏和每個作者已出版的所有相關標題的列表,按作者姓氏排序。使用聯接。將它儲存為名為“已出版作者”的檢視。
- 使用子查詢,顯示所有版稅為 100% 且居住在艾伯塔省的作者(顯示姓氏和名字、郵政編碼)。將其儲存為名為“AuthorsView”的檢視。建立檢視時,將作者的姓氏和名字重新命名為“姓氏”和“名字”。
- 顯示沒有出售標題為“憤怒是敵人嗎?”的商店。
- 顯示 2013 年之後(訂單日期大於 2013 年)的銷售的商店名稱列表。顯示商店名稱和訂單日期。
- 顯示在“News & Brews”商店出售的書籍標題的列表。顯示商店名稱、標題和訂單日期。
- 列出按標題的總銷量(qty)。顯示總數量和標題列。
- 列出按型別的總銷量(qty)。顯示總數量和型別列。
- 列出按型別的總銷量(qty*price)。顯示總美元值和型別列。
- 計算每個出版商的書籍型別總數。顯示出版商名稱和每個出版商的書籍型別總數。
- 顯示沒有任何型別書籍的出版商名稱。僅顯示出版商名稱。