数据库设计/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)。显示总美元值和类型列。
- 计算每个出版商的书籍类型总数。显示出版商名称和每个出版商的书籍类型总数。
- 显示没有任何类型书籍的出版商名称。仅显示出版商名称。