目录
[1.SELECT语句最少包括SELECT子句和( )子句。](#1.SELECT语句最少包括SELECT子句和( )子句。)
[2.可以去掉重复结果的关键字是( )。](#2.可以去掉重复结果的关键字是( )。)
[3.( )子句是创建新表并将来自查询的结果行插入该表中。](#3.( )子句是创建新表并将来自查询的结果行插入该表中。)
[4.( )子句是指定查询返回的行的搜索条件。](#4.( )子句是指定查询返回的行的搜索条件。)
[5.在SELECT语句中,定义字段别名的一种方法是在字段名的后面加上关键字( )。](#5.在SELECT语句中,定义字段别名的一种方法是在字段名的后面加上关键字( )。)
[6.在查询语句的where子句中,如果出现了"age between 30 and 40",这个表达式等同于( )。](#6.在查询语句的where子句中,如果出现了“age between 30 and 40”,这个表达式等同于( )。)
[7.书名title中包含"网络"两个字的查询语句,条件是( )。](#7.书名title中包含“网络”两个字的查询语句,条件是( )。)
[8.要查询book表中书名book中以"计算机"开头的书籍的价格,可用( )语句。](#8.要查询book表中书名book中以“计算机”开头的书籍的价格,可用( )语句。)
[9.( )子句是对数据按照某个或者多个字段进行分组。](#9.( )子句是对数据按照某个或者多个字段进行分组。)
[10.SELECT查询中,要把结果中的行按照某一列的值进行排列,所用到的子句是( )。](#10.SELECT查询中,要把结果中的行按照某一列的值进行排列,所用到的子句是( )。)
[11.SELECT语句中,下列( )子句用于对分组统计进一步设置条件。](#11.SELECT语句中,下列( )子句用于对分组统计进一步设置条件。)
[12.SQL的聚集函数count、sum、avg、max、min不允许出现在查询语句的( )子句之中。](#12.SQL的聚集函数count、sum、avg、max、min不允许出现在查询语句的( )子句之中。)
[13.当一个select查询中有where、having、order by和group by子句时,应该书写在最后的是( )。](#13.当一个select查询中有where、having、order by和group by子句时,应该书写在最后的是( )。)
[14.学生表中有学号、姓名、性别、入学成绩、身高字段。下面SQL 语句的功能为( )。](#14.学生表中有学号、姓名、性别、入学成绩、身高字段。下面SQL 语句的功能为( )。)
[15.学生表中有学号、姓名、性别、入学成绩、身高字段。现需查询女生中身高最高的前三个学生的记录信息,正确的SQL语句是( )。](#15.学生表中有学号、姓名、性别、入学成绩、身高字段。现需查询女生中身高最高的前三个学生的记录信息,正确的SQL语句是( )。)
[16.要查询 "每个教师的姓名、所属部门名称",需关联 Teacher 和 Department 表,以下内连接写法错误的是( )](#16.要查询 “每个教师的姓名、所属部门名称”,需关联 Teacher 和 Department 表,以下内连接写法错误的是( ))
[17.要查询 "所有教师的姓名、授课课程名称(未授课的教师也需显示)",正确的 SQL 语句是( )](#17.要查询 “所有教师的姓名、授课课程名称(未授课的教师也需显示)”,正确的 SQL 语句是( ))
[18.执行以下 SQL 语句,其含义是( )](#18.执行以下 SQL 语句,其含义是( ))
[19.以下 SQL 语句中,实现全外连接(FULL OUTER JOIN)的是( )](#19.以下 SQL 语句中,实现全外连接(FULL OUTER JOIN)的是( ))
[20.全外连接(FULL OUTER JOIN)的结果集包含( )](#20.全外连接(FULL OUTER JOIN)的结果集包含( ))
[21.已知 Teacher 表有 10 条记录,Department 表有 5 条记录,且所有教师都属于存在的部门,执行SELECT * FROM Teacher INNER JOIN Department ON Teacher.DeptID = Department.DeptID; 返回的记录数是( )](#21.已知 Teacher 表有 10 条记录,Department 表有 5 条记录,且所有教师都属于存在的部门,执行SELECT * FROM Teacher INNER JOIN Department ON Teacher.DeptID = Department.DeptID; 返回的记录数是( ))
[22.以下关于连接条件的说法,错误的是( )](#22.以下关于连接条件的说法,错误的是( ))
[23.执行SELECT T.TName, D.DeptName FROM Teacher T RIGHT JOIN Department D ON T.DeptID = D.DeptID WHERE T.TID IS NULL;,返回的结果是( )](#23.执行SELECT T.TName, D.DeptName FROM Teacher T RIGHT JOIN Department D ON T.DeptID = D.DeptID WHERE T.TID IS NULL;,返回的结果是( ))
[24.关于 T-SQL 中连接的优先级,正确的是( )](#24.关于 T-SQL 中连接的优先级,正确的是( ))
[25.已知 Teacher 表有 8 条记录,其中 DeptID 为 1 的有 3 条,DeptID 为 2 的有 5 条;Department 表有 2 条记录(DeptID=1 和 2)。执行SELECT * FROM Department D LEFT JOIN Teacher T ON D.DeptID = T.DeptID; 返回的记录数是( )](#25.已知 Teacher 表有 8 条记录,其中 DeptID 为 1 的有 3 条,DeptID 为 2 的有 5 条;Department 表有 2 条记录(DeptID=1 和 2)。执行SELECT * FROM Department D LEFT JOIN Teacher T ON D.DeptID = T.DeptID; 返回的记录数是( ))
[26.以下关于 SQL Server 嵌套查询的描述,正确的是( )](#26.以下关于 SQL Server 嵌套查询的描述,正确的是( ))
[27.现有学生表 Student(Sno varchar (10), Sname varchar (20), Sage int),要查询年龄大于 "张三" 的所有学生信息,正确的嵌套查询语句是( )](#27.现有学生表 Student(Sno varchar (10), Sname varchar (20), Sage int),要查询年龄大于 “张三” 的所有学生信息,正确的嵌套查询语句是( ))
[28.现有课程表 Course(Cno varchar (10), Cname varchar (20), Credit int)和选课表 SC(Sno varchar (10), Cno varchar (10), Grade int),要查询选修了 "数据库原理" 课程的学生学号,正确的嵌套查询是( )](#28.现有课程表 Course(Cno varchar (10), Cname varchar (20), Credit int)和选课表 SC(Sno varchar (10), Cno varchar (10), Grade int),要查询选修了 “数据库原理” 课程的学生学号,正确的嵌套查询是( ))
[29.要查询 Student 表中年龄最大的学生姓名,以下嵌套查询语句正确的是( )](#29.要查询 Student 表中年龄最大的学生姓名,以下嵌套查询语句正确的是( ))
[30.现有 SC 表(Sno, Cno, Grade),要查询所有课程成绩都大于 60 分的学生学号,正确的嵌套查询是( )](#30.现有 SC 表(Sno, Cno, Grade),要查询所有课程成绩都大于 60 分的学生学号,正确的嵌套查询是( ))
[31.在 SQL Server 中,使用 ANY 运算符时,以下描述正确的是( )](#31.在 SQL Server 中,使用 ANY 运算符时,以下描述正确的是( ))
[32.关于 EXISTS 子查询,以下说法正确的是( )](#32.关于 EXISTS 子查询,以下说法正确的是( ))
[33.姓名name是"李四"的查询语句,其查询条件是( )。](#33.姓名name是“李四”的查询语句,其查询条件是( )。)
[34.姓名name中姓"李"的查询语句,其查询条件是( )](#34.姓名name中姓“李”的查询语句,其查询条件是( ))
[35.下面聚集函数中,用于统计个数的函数是( )。](#35.下面聚集函数中,用于统计个数的函数是( )。)
[36.下面聚集函数中,只能用于计算数值类型数据的是( )。](#36.下面聚集函数中,只能用于计算数值类型数据的是( )。)
[37.SQL语句中,下列涉及空值的操作,不正确的是( )。](#37.SQL语句中,下列涉及空值的操作,不正确的是( )。)
[38.用于测试跟随的子查询中的行是否存在的关键字是( )。](#38.用于测试跟随的子查询中的行是否存在的关键字是( )。)
[1.在SELECT语句中选择满足条件的记录使用关键字where,分组之后进行选择使用关键字having 。](#1.在SELECT语句中选择满足条件的记录使用关键字where,分组之后进行选择使用关键字having 。)
[2.使用关键字distinct 可以把查询结果中的重复行屏蔽。](#2.使用关键字distinct 可以把查询结果中的重复行屏蔽。)
[3.用来返回特定字段中所有值的总和的聚合函数是SUM ( ) 。](#3.用来返回特定字段中所有值的总和的聚合函数是SUM ( ) 。)
[4.编写查询语句时,使用% 通配符可以匹配多个字符。](#4.编写查询语句时,使用% 通配符可以匹配多个字符。)
5.有两个表的记录数分别是7和9,现对两个表执行交叉连接查询,查询结果中最多可以得到63条记录。
1.使用T-SQL语句实现商品销售管理数据库Goods中的相关查询,具体操作要求如下
(2)查询大米的品牌、规格、单价和库存数量,并显示为汉字标题。
(3)查询每个商品的库存金额(库存金额=单价*库存数量),结果显示为商品编号、商品名称和库存金额。
(9)查询每个商品的商品编号、商品名称和库存金额,并将查询结果存放到临时表"库存"中。
2.使用T-SQL语句实现商品销售管理数据库Goods中的相关查询,具体操作要求如下。
(5)查询各类商品的库存金额,结果显示为商品类别编号和库存金额,并按照库存金额降序排序输出。
(6)查询各类商品中库存金额高于5000的商品信息,结果显示为商品类别编号和库存金额。
(7)统计查询2020年8月份每天的销售总量,结果显示为下单日期和销售总量。
(8)统计查询每种商品的销售总量,结果显示为商品编号和销售数量。
3.使用T-SQL语句实现商品销售管理数据库Goods中的相关查询,具体操作要求如下。
(1)查询所有商品的商品编号、商品名称、商品类别编号和商品类别名称。
(2)查询所有已销售商品的情况,结果显示为商品编号、商品名称、订单日期和订单状态,并且按照商品编号升序排序。
(3)查询Shop_goods表中所有商品的销售情况,结果显示为商品编号、商品名称、订单日期和订单状态,没有销售记录的商品其订单日期和订单状态显示为NULL。
(4)统计查询每个客户的消费金额,结果显示为客户编号、消费金额。
(5)查询不低于"鸡蛋"价格的商品编号、商品名称和商品单价,查询后的结果按照商品单价升序排序。(使用自身连接查询)
4.使用SQL子查询实现商品销售管理数据库Goods中的相关查询,具体操作要求如下。
(3)查询与客户"C0002"购买相同商品的客户信息,结果显示为客户编号、客户姓名和电话。
(4)查询粮油类用品的库存情况,结果显示为商品编号、商品名称和库存金额。
(5)查询购买过任一商品的客户信息,结果显示为客户编号、客户姓名和电话。(使用谓词Any)
[(7)查询还没有销售的商品的详细信息。(使用谓词Not Exists)](#(7)查询还没有销售的商品的详细信息。(使用谓词Not Exists))
一、单选题
1.SELECT语句最少包括SELECT子句和( )子句。
- *A、*where
- *B、*from
- *C、*into
- *D、*having
答案:B
解析:SELECT 语句的最小结构是
SELECT 字段 FROM 表,FROM 子句用于指定数据来源表,是必选子句;WHERE、INTO、HAVING 均为可选子句。
2.可以去掉重复结果的关键字是( )。
- *A、*where
- *B、*with
- *C、*distinct
- *D、*order by
答案:C
解析:
DISTINCT关键字的作用是去除查询结果集中的重复行;WHERE 用于条件筛选,WITH 用于定义公用表表达式,ORDER BY 用于结果排序。
3.( )子句是创建新表并将来自查询的结果行插入该表中。
- *A、*where
- *B、*from
- *C、*select
- *D、*into
答案:D
解析:
INTO子句可以实现创建新表,并将查询结果行插入该新表,语法格式为SELECT * INTO 新表 FROM 原表。
4.( )子句是指定查询返回的行的搜索条件。
- *A、*where
- *B、*from
- *C、*having
- *D、*into
答案:A
解析:WHERE 子句用于指定查询返回行的筛选条件,在分组前对数据进行过滤;HAVING 是分组后筛选,FROM 指定表,INTO 用于创建新表。
5.在SELECT语句中,定义字段别名的一种方法是在字段名的后面加上关键字( )。
- *A、*where
- *B、*by
- *C、*as
- *D、*group
答案:C
解析:定义字段别名的标准方式是
字段名 AS 别名,也可以省略 AS 直接写字段名 别名;WHERE、BY、GROUP 无此功能。
6.在查询语句的where子句中,如果出现了"age between 30 and 40",这个表达式等同于( )。
- *A、*age>=30 and age<=40
- *B、*age>=30 or age<=40
- *C、*age>30 and age<40
- *D、*age>30 or age<40
答案:A
解析:
BETWEEN 30 AND 40表示闭区间范围,等价于age>=30 and age<=40,包含 30 和 40 两个临界值。
7.书名title中包含"网络"两个字的查询语句,条件是( )。
- *A、*title is '-网络-'
- *B、*title =='%网络%'
- *C、*title like '%网络%'
- *D、*title not like '%网络%'
答案:C
解析:模糊查询需要使用
LIKE关键字,%通配符可以匹配任意多个字符,title like '%网络%'表示书名中包含 "网络" 二字;SQL 中没有==运算符,IS 用于判断 NULL 值。
8.要查询book表中书名book中以"计算机"开头的书籍的价格,可用( )语句。
- *A、*select price from book where name = '计算机*'
- *B、*select price from book where name like '计算机*'
- *C、*select price from book where name = '计算机%'
- *D、*select price from book where name like '计算机%'
答案:D
解析:以 "计算机" 开头的模糊查询,语法为
name like '计算机%';%是 SQL 中的通配符,*不具备通配功能,=是精确匹配,无法实现开头匹配的需求。
9.( )子句是对数据按照某个或者多个字段进行分组。
- *A、*where
- *B、*having
- *C、*order by
- *D、*group by
答案:D
解析:
GROUP BY子句的作用是按照一个或多个字段对查询结果进行分组,方便后续对分组数据进行聚合统计。
10.SELECT查询中,要把结果中的行按照某一列的值进行排列,所用到的子句是( )。
- *A、*where
- *B、*having
- *C、*order by
- *D、*group by
答案:C
解析:
ORDER BY子句用于将查询结果按照指定列的值进行升序(ASC)或降序(DESC)排列;GROUP BY 是分组,不负责排序。
11.SELECT语句中,下列( )子句用于对分组统计进一步设置条件。
- *A、*order by
- *B、*having
- *C、*where
- *D、*group by
答案:B
解析:HAVING 子句必须配合 GROUP BY 使用,用于对分组统计后的结果设置筛选条件;WHERE 是分组前的筛选,不作用于聚合结果。
12.SQL的聚集函数count、sum、avg、max、min不允许出现在查询语句的( )子句之中。
- *A、*select
- *B、*having
- *C、*group by... having
- *D、*where
答案:D
解析:聚集函数(COUNT、SUM、AVG 等)不能直接出现在 WHERE 子句中,因为 WHERE 执行于聚合计算之前;聚集函数可以出现在 SELECT、HAVING 以及
GROUP BY...HAVING结构中。
13.当一个select查询中有where、having、order by和group by子句时,应该书写在最后的是( )。
- *A、*where子句
- *B、*having子句
- *C、*order by子句
- *D、*group by子句
答案:C
解析:SELECT 语句中子句的书写顺序为:WHERE → GROUP BY → HAVING → ORDER BY,ORDER BY 必须写在最后。
14.学生表中有学号、姓名、性别、入学成绩、身高字段。下面SQL 语句的功能为( )。
select 性别,AVG(入学成绩) from 学生 group by 性别
- *A、*计算并显示学生表中所有学生入学成绩的平均分
- *B、*对学生表中的记录行按性别分组显示所有学生的入学平均分
- *C、*计算并显示学生表中所有学生的性别和入学成绩的平均值
- *D、*对学生表中的记录行按性别分组显示性别及对应的入学成绩的平均分
答案:D
解析:该语句通过
GROUP BY 性别按性别分组,再用AVG(入学成绩)计算每组的入学成绩平均分,最终输出性别和对应分组的平均分。
15.学生表中有学号、姓名、性别、入学成绩、身高字段。现需查询女生中身高最高的前三个学生的记录信息,正确的SQL语句是( )。
- *A、*select * from 学生 where 性别="女" group by 身高
- *B、*select * from 学生 where 性别="女" order by 身高
- *C、*select top 3 * from 学生 where 性别="女" group by 身高
- *D、*select top 3 * from 学生 where 性别="女" order by 身高
答案:D
解析:查询前三条记录用
TOP 3,按身高排序用ORDER BY 身高(若要查询身高最高的,需补充DESC关键字);GROUP BY 是分组,不适合此场景。
16.要查询 "每个教师的姓名、所属部门名称",需关联 Teacher 和 Department 表,以下内连接写法错误的是( )
- *A、*SELECT T.TName, D.DeptName FROM Teacher T JOIN Department D ON T.DeptID = D.DeptID;
- *B、*SELECT T.TName, D.DeptName FROM Teacher T INNER JOIN Department D ON T.DeptID = D.DeptID;
- *C、*SELECT T.TName,DeptName FROM Teacher T, Department D WHERE T.DeptID = D.DeptID;
- *D、*SELECT T.TName, D.DeptName FROM Teacher T LEFT JOIN Department D ON T.DeptID = D.DeptID;
答案:D
解析:题目要求的是内连接,A、B 是标准内连接写法,C 是隐式内连接写法;D 是左外连接,会返回左表(Teacher)的所有记录,不符合内连接的要求。
17.要查询 "所有教师的姓名、授课课程名称(未授课的教师也需显示)",正确的 SQL 语句是( )
- *A、*SELECT T.TName, C.CName FROM Teacher T INNER JOIN Course C ON T.TID = C.TID;
- *B、*SELECT T.TName,CName FROM Teacher T LEFT JOIN Course C ON T.TID = C.TID;
- *C、*SELECT T.TName, C.CName FROM Teacher T RIGHT JOIN Course C ON T.TID = C.TID;
- *D、*SELECT T.TName, C.CName FROM Teacher T CROSS JOIN Course C;
答案:B
解析:要显示所有教师(包括未授课的),需要使用左外连接(LEFT JOIN),以 Teacher 表为左表,保证左表记录全部返回,未授课的教师对应的课程名称显示为 NULL。
18.执行以下 SQL 语句,其含义是( )
sql
SELECT COUNT(*)
FROM Teacher T1 JOIN Teacher T2 ON T1.DeptID = T2.DeptID
WHERE T1.TID <> T2.TID;
- *A、*统计所有教师的数量
- *B、*统计同部门且编号不同的教师配对数量
- *C、*统计不同部门的教师数量
- *D、*统计工资相同的教师数量
答案:B
解析:该语句是 Teacher 表的自连接,连接条件是部门编号相同,
T1.TID <> T2.TID保证是不同教师,最终统计的是同部门且编号不同的教师配对数量。
19.以下 SQL 语句中,实现全外连接(FULL OUTER JOIN)的是( )
- *A、*SELECT T.TName, C.CName FROM Teacher T FULL JOIN Course C ON T.TID = C.TID;
- *B、*SELECT T.TName,CName FROM Teacher T JOIN Course C ON T.TID = C.TID;
- *C、*C. SELECT T.TName, C.CName FROM Teacher T LEFT JOIN Course C ON T.TID = C.TID;
- *D、*SELECT T.TName, C.CName FROM Teacher T RIGHT JOIN Course C ON T.TID = C.TID;
答案:A
解析:全外连接的标准语法是
FULL JOIN或FULL OUTER JOIN,会返回左右两个表的所有记录。
20.全外连接(FULL OUTER JOIN)的结果集包含( )
- *A、*仅左表满足条件的记录
- *B、*仅右表满足条件的记录
- *C、*左表和右表所有记录,满足连接条件的匹配显示,不满足的显示 NULL
- *D、*仅左表和右表匹配的记录
答案:C
解析:全外连接的结果集包含左表和右表的所有记录,满足连接条件的记录会匹配显示,不满足连接条件的记录,对应另一张表的字段会显示为 NULL。
21.已知 Teacher 表有 10 条记录,Department 表有 5 条记录,且所有教师都属于存在的部门,执行SELECT * FROM Teacher INNER JOIN Department ON Teacher.DeptID = Department.DeptID; 返回的记录数是( )
- *A、*5
- *B、*10
- *C、*15
- *D、*50
答案:B
解析:内连接只返回两张表中满足连接条件的记录,所有教师都属于存在的部门,因此返回的记录数等于 Teacher 表的记录数 10。
22.以下关于连接条件的说法,错误的是( )
- *A、*内连接的连接条件可以写在 ON 子句或 WHERE 子句中
- *B、*外连接的连接条件写在 ON 子句中,筛选条件写在 WHERE 子句中
- *C、*交叉连接可以通过 ON 子句指定连接条件
- *D、*自身连接的连接条件需要区分表的别名
答案:C
解析:交叉连接(CROSS JOIN)是返回两张表的笛卡尔积,不能通过 ON 子句指定连接条件;A、B、D 的说法均正确。
23.执行SELECT T.TName, D.DeptName FROM Teacher T RIGHT JOIN Department D ON T.DeptID = D.DeptID WHERE T.TID IS NULL;,返回的结果是( )
- *A、*所有有教师的部门信息
- *B、*所有无教师的部门信息
- *C、*所有教师的信息
- *D、*所有既有教师又有部门的信息
答案:B
解析:右外连接以 Department 表为右表,
WHERE T.TID IS NULL会筛选出右表中有但左表(Teacher)中没有匹配的记录,即无教师的部门信息。
24.关于 T-SQL 中连接的优先级,正确的是( )
- *A、*交叉连接 > 内连接 > 外连接
- *B、*内连接 > 外连接 > 交叉连接
- *C、*外连接 > 内连接 > 交叉连接
- *D、*所有连接优先级相同,按书写顺序执行
答案:A
解析:T-SQL 中连接的优先级从高到低为:交叉连接 > 内连接 > 外连接。
25.已知 Teacher 表有 8 条记录,其中 DeptID 为 1 的有 3 条,DeptID 为 2 的有 5 条;Department 表有 2 条记录(DeptID=1 和 2)。执行SELECT * FROM Department D LEFT JOIN Teacher T ON D.DeptID = T.DeptID; 返回的记录数是( )
- *A、*2
- *B、*8
- *C、*10
- *D、*16
答案:B
解析:左外连接以 Department 表为左表,返回左表所有记录以及右表(Teacher)中满足连接条件的记录,最终记录数等于右表 Teacher 的记录数 8。
26.以下关于 SQL Server 嵌套查询的描述,正确的是( )
- *A、*嵌套查询只能有一层子查询
- *B、*子查询必须放在括号中
- *C、*子查询的执行结果无法被主查询使用
- *D、*嵌套查询只能用于 SELECT 语句中
答案:B
解析:嵌套查询可以有多级子查询;子查询必须放在括号中;子查询的执行结果会被主查询使用;嵌套查询不仅可以用于 SELECT 语句,还可以用于 INSERT、UPDATE、DELETE 等语句。
27.现有学生表 Student(Sno varchar (10), Sname varchar (20), Sage int),要查询年龄大于 "张三" 的所有学生信息,正确的嵌套查询语句是( )
- *A、*SELECT * FROM Student WHERE Sage > (SELECT Sage FROM Student WHERE Sname=' 张三 ')
- *B、*SELECT * FROM Student WHERE Sage > SELECT Sage FROM Student WHERE Sname=' 张三 '
- *C、*SELECT * FROM Student WHERE Sage > (SELECT Sage FROM Student WHERE Sname=' 张三 ') GROUP BY Sage
- *D、*SELECT * FROM Student WHERE Sage > ALL (SELECT Sage FROM Student WHERE Sname=' 张三 ')
答案:A
解析:子查询
SELECT Sage FROM Student WHERE Sname='张三'会返回张三的年龄,主查询筛选年龄大于该值的学生;子查询必须加括号,B 错误;此场景不需要分组,C 错误;ALL 用于多值子查询,此处子查询是单值,D 错误。
28.现有课程表 Course(Cno varchar (10), Cname varchar (20), Credit int)和选课表 SC(Sno varchar (10), Cno varchar (10), Grade int),要查询选修了 "数据库原理" 课程的学生学号,正确的嵌套查询是( )
- *A、*SELECT Sno FROM SC WHERE Cno = (SELECT Cno FROM Course WHERE Cname=' 数据库原理 ')
- *B、*SELECT Sno FROM SC WHERE Cname=' 数据库原理 '
- *C、*SELECT Sno FROM Course WHERE Cname=' 数据库原理 ' AND SC.Cno=Course.Cno
- *D、*SELECT Sno FROM SC WHERE Cno IN (SELECT Cname FROM Course WHERE Cname=' 数据库原理 ')
答案:A
解析:先通过子查询从 Course 表获取 "数据库原理" 的课程编号,再在 SC 表中根据课程编号筛选对应的学生学号;B 中 SC 表无 Cname 字段,C 语法错误,D 子查询返回字段错误。
29.要查询 Student 表中年龄最大的学生姓名,以下嵌套查询语句正确的是( )
- *A、*SELECT Sname FROM Student WHERE Sage = (SELECT MAX (Sage) FROM Student)
- *B、*SELECT Sname FROM Student WHERE Sage = MAX (Sage)
- *C、*SELECT Sname FROM Student WHERE Sage > (SELECT MAX (Sage) FROM Student)
- *D、*SELECT Sname FROM Student WHERE Sage IN (SELECT MAX (Sage) FROM Student)
答案:A
解析:子查询
SELECT MAX(Sage) FROM Student返回学生的最大年龄,主查询筛选年龄等于该值的学生姓名;聚集函数不能直接用在 WHERE 子句中,B 错误;C 条件逻辑错误,D 中 IN 适合多值匹配,此处单值用=更合适。
30.现有 SC 表(Sno, Cno, Grade),要查询所有课程成绩都大于 60 分的学生学号,正确的嵌套查询是( )
- *A、*SELECT Sno FROM SC WHERE Sno NOT IN (SELECT Sno FROM SC WHERE Grade<=60)
- *B、*SELECT Sno FROM SC WHERE Grade>60
- *C、*SELECT Sno FROM SC WHERE ALL Grade>60
- *D、*SELECT Sno FROM SC WHERE Grade>60 GROUP BY Sno
答案:A
解析:该语句的逻辑是 "查询没有任何一门课程成绩小于等于 60 分的学生学号",通过子查询找出成绩≤60 的学生学号,再用 NOT IN 排除这些学生;B、D 无法保证所有课程成绩都大于 60,C 语法错误。
31.在 SQL Server 中,使用 ANY 运算符时,以下描述正确的是( )
- *A、*主查询的条件需满足子查询结果中的所有值
- *B、*主查询的条件只需满足子查询结果中的任意一个值
- *C、*ANY 只能和 = 运算符结合使用
- *D、*ANY 运算符不能用于嵌套查询
答案:B
解析:ANY 运算符表示主查询的条件只需满足子查询结果中的任意一个值;ALL 表示满足所有值,ANY 可以和 >、<、= 等多种运算符结合,且用于嵌套查询。
32.关于 EXISTS 子查询,以下说法正确的是( )
- *A、*EXISTS 子查询返回具体的查询结果
- *B、*EXISTS 判断子查询是否有返回结果,有则为 TRUE,无则为 FALSE
- *C、*EXISTS 子查询必须返回多行数据
- *D、*EXISTS 可以和 = 运算符结合使用
答案:B
解析:EXISTS 子查询不返回具体结果,只判断子查询是否有记录返回,有则为 TRUE,无则为 FALSE;EXISTS 子查询不要求返回多行数据,也不能和 = 运算符结合。
33.姓名name是"李四"的查询语句,其查询条件是( )。
- *A、*name is '李四'
- *B、*name like '李四*'
- *C、*name ='李四'
- *D、*name == '李四'
答案:C
解析:精确匹配姓名为 "李四",条件是
name ='李四';SQL 中无==运算符,IS 用于判断 NULL,LIKE 用于模糊查询。
34.姓名name中姓"李"的查询语句,其查询条件是( )
- *A、*name is '李_'
- *B、*name = '李%'
- *C、*name like '李_*
- *D、*name like '李%'
答案:D
解析:查询姓李的姓名,需要用模糊查询
name like '李%',%匹配 "李" 之后的任意多个字符;_只匹配单个字符,*不是 SQL 通配符。
35.下面聚集函数中,用于统计个数的函数是( )。
- *A、*COUNT()
- *B、*MAX()
- *C、*MIN()
- *D、*SUM()
答案:A
解析:COUNT () 是用于统计记录条数或非空值个数的聚合函数;MAX () 求最大值,MIN () 求最小值,SUM () 求和。
36.下面聚集函数中,只能用于计算数值类型数据的是( )。
- *A、*COUNT( )
- *B、*MAX( )
- *C、*MIN( )
- *D、*SUM( )
答案:D
解析:SUM () 函数只能用于数值类型数据的求和运算;COUNT () 可以统计任意类型,MAX () 和 MIN () 可以用于数值、字符、日期等类型。
37.SQL语句中,下列涉及空值的操作,不正确的是( )。
- *A、*age is null
- *B、*age is not null
- *C、*age=null
- *D、*not(age is null)
答案:C
解析:在 SQL 中,判断 NULL 值必须使用
IS NULL或IS NOT NULL,不能使用=或<>运算符,因此age=null的写法是错误的。
38.用于测试跟随的子查询中的行是否存在的关键字是( )。
- *A、*MOVE
- *B、*EXISTS
- *C、*UNION
- *D、*HAVING
答案:B
解析:EXISTS 关键字用于测试子查询中的行是否存在;MOVE 不是 SQL 关键字,UNION 用于合并结果集,HAVING 用于分组后筛选。
二、填空题
1.在SELECT语句中选择满足条件的记录使用关键字where,分组之后进行选择使用关键字having 。
2.使用关键字distinct 可以把查询结果中的重复行屏蔽。
3.用来返回特定字段中所有值的总和的聚合函数是SUM ( ) 。
4.编写查询语句时,使用% 通配符可以匹配多个字符。
5.有两个表的记录数分别是7和9,现对两个表执行交叉连接查询,查询结果中最多可以得到63条记录。
三、实践题
数据库代码,适用如下所有题
sql
---创建数据库Goods
USE MASTER
IF EXISTS(SELECT * FROM sysdatabases WHERE name ='Goods') --判断数据库是否存在
DROP DATABASE Goods --如果存在,删除该数据库
GO
CREATE DATABASE Goods
ON PRIMARY
(NAME='Goods',
FILENAME='d:\database\Goods.mdf',
SIZE=10MB,
MAXSIZE=60MB,
FILEGROWTH=2MB)
LOG ON
(NAME='Goods_log',
FILENAME='d:\database\Goods_log.ldf',
SIZE=15MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=10%)
GO
--创建客户表Consumer表
USE Goods --将当前数据库设置为Goods.
GO
IF EXISTS(SELECT * FROM sys.sysobjects WHERE name='Consumer' and type='U')
DROP TABLE Consumer --如果存在,删除Consumer表
Go
CREATE TABLE Consumer
(Consumer_Id nvarchar(30) NOT NULL PRIMARY KEY,
Account varchar(20) NOT NULL UNIQUE,
Password varchar(20),
Name nvarchar(20),
Sex nchar(1),
Tel varchar(20),
Address nvarchar(60)
)
GO
--给Consumer表中的Sex字段设置检查约束,在输入值时只允许输入"男"或"女",约束名为CK_CSex。
ALTER TABLE Consumer
ADD CONSTRAINT CK_CSex CHECK(Sex='男' or Sex='女')
--创建员工表Employee
USE Goods --将当前数据库设置为Goods.
GO
IF EXISTS(SELECT * FROM sys.sysobjects WHERE name='Employee' and type='U')
DROP TABLE Employee --如果存在,删除Employee表
Go
CREATE TABLE Employee
(Employee_Id nvarchar(30) Not null PRIMARY KEY,
Account varchar(20) Not null UNIQUE,
Password varchar(20),
Name nvarchar(20),
Sex nchar(1),
Tel varchar(20)
)
GO
--给Employee表中的Sex字段设置检查约束,在输入值时只允许输入"男"或"女",约束名为CK_ESex。
ALTER TABLE Employee
ADD CONSTRAINT CK_ESex CHECK(Sex='男' or Sex='女')
--创建商品类别表Category表
USE Goods
IF EXISTS(SELECT * FROM sys.sysobjects WHERE NAME='Category' and TYPE='U')
DROP TABLE Category
GO
CREATE TABLE Category
(Category_Id nvarchar(30) Not null PRIMARY KEY,
Name nvarchar(30)
)
GO
--创建商品表Shop_goods
USE Goods
IF OBJECT_ID('Shop_goods') is NOT NULL
DROP TABLE Shop_goods
GO
CREATE TABLE Shop_goods
(Goods_Id nvarchar(30) Not null PRIMARY KEY,
Name nvarchar(30) Not null,
Brand nvarchar(30),
Size nvarchar(30),
Price decimal(8,2) Not null check(Price>0),
Stock int Not null check(Stock>0 or Stock=0),
Image_Url varchar(50),
Description nvarchar(100),
Category_Id nvarchar(30) Not null,
CONSTRAINT FK_goods_Category FOREIGN KEY(Category_Id) REFERENCES Category(Category_Id)
)
GO
--创建订单表Shop_Order
USE Goods
IF OBJECT_ID('Shop_Order') is NOT NULL
DROP TABLE Shop_Order
GO
CREATE TABLE Shop_Order
(Order_Id nvarchar(30) Not null PRIMARY KEY,
Goods_Id nvarchar(30) Not null,
Quantity int check(Quantity>0),
Order_Date date,
Status nvarchar(10),
Consumer_Id nvarchar(30) Not null,
Comment nvarchar(100),
Employee_Id nvarchar(30) Not null,
Shipping_Date date,
CONSTRAINT FK_Order_Goods FOREIGN KEY(Goods_Id) REFERENCES Shop_goods(Goods_Id),
CONSTRAINT FK_Order_Consumer FOREIGN KEY(Consumer_Id) REFERENCES Consumer(Consumer_Id),
CONSTRAINT FK_Order_Employee FOREIGN KEY(Employee_Id) REFERENCES Employee(Employee_Id)
)
GO
--往Consumer表中添加记录
INSERT INTO Consumer VALUES('c0001','356985284','fgg32658','陈梅','女','13897565789','西安市荣成花园')
INSERT INTO Consumer VALUES('c0002','987546562','khe65489','郭琳','女','13759846248','西安市翡翠大厦')
INSERT INTO Consumer VALUES('c0003','898475681','rkb46822','王亮','男','13526897524','西安市荣成花园')
INSERT INTO Consumer VALUES('c0004','345698752','kdr58854','张晶','女','13562595326','西安市科创小区')
INSERT INTO Consumer VALUES('c0005','659875421','iua25867','李丽','女','13798265256','咸阳市彩虹花园')
INSERT INTO Consumer VALUES('c0006','957894532','itv18866','赵静','女','13657892384','咸阳市彩虹花园')
INSERT INTO Consumer VALUES('c0007','459726863','psj25632','王甜','女','13789524561','咸阳市中天小区')
INSERT INTO Consumer VALUES('c0008','985423853','tfj95632','郭凯','男','13895456232','西安市枫林华府')
INSERT INTO Consumer VALUES('c0009','689413352','pub4983','李馨','女','13894578923 ','西安市西仪小区')
INSERT INTO Consumer VALUES('c0010','796325633','sef36971','陈媛','女','13789546289','西安市恒大城')
--往Employee表中添加记录
INSERT INTO Employee VALUES('e001','2018001', 'xs18001','张兴龙','男','13897654224')
INSERT INTO Employee VALUES('e002','2018002', 'xs18002','李小萌','女','13789221453')
INSERT INTO Employee VALUES('e003','2018003', 'xs18003 ','赵春燕','女','13678248632')
INSERT INTO Employee VALUES('e004','2018004', 'xs18004','王凯强','男','13679525421')
INSERT INTO Employee VALUES('e005','2019001', 'fh19001','陈东强','男','13892463262')
INSERT INTO Employee VALUES('e006','2019002', 'fh19002','马家辉','男','13756921532')
INSERT INTO Employee VALUES('e007','2019003', 'fh19003','蔡春涛','男','13952153685' )
INSERT INTO Employee VALUES('e008','2019004', 'fh19004 ','何萌萌','女','13895214832' )
INSERT INTO Employee VALUES('e009','2020001', 'kf20001','李晓敏','女','13789542789' )
INSERT INTO Employee VALUES('e010','2020002', 'kf20001','张小慧','女','13689326854' )
GO
--往Category表中添加记录
INSERT INTO Category VALUES('b001','蔬菜')
INSERT INTO Category VALUES('b002','水果')
INSERT INTO Category VALUES('b003','肉蛋')
INSERT INTO Category VALUES('b004','美食')
INSERT INTO Category VALUES('b005','饮品')
INSERT INTO Category VALUES('b006','零食')
INSERT INTO Category VALUES('b007','粮油')
INSERT INTO Category VALUES('b008','日化')
INSERT INTO Category VALUES('b009','百货')
Go
--往Shop_goods 表中添加记录
INSERT INTO Shop_goods VALUES('g0001','胡萝卜','秦农','500g',2.3,600,'d:\b001\g0001.jpg','脆嫩多汁无农药残留','b001')
INSERT INTO Shop_goods VALUES('g0002','青菜','秦农','500g',4.2,300,'d:\b001\g0002.jpg','本地鲜菜','b001')
INSERT INTO Shop_goods VALUES('g0003','西瓜','绿源','500g',1.2,800,'d:\b002\g0003.jpg','宁夏富硒西瓜','b002')
INSERT INTO Shop_goods VALUES('g0004','石榴','绿源','500g',3.5,500,'d:\b002\g0004.jpg','临潼石榴酸甜多汁','b002')
INSERT INTO Shop_goods VALUES('g0005','鸡蛋','凤鸣','500g',4.5,800,'d:\b003\g0005.jpg','天然谷物饲养','b003')
INSERT INTO Shop_goods VALUES('g0006','鸡小腿','凤鸣','500g',8.9,600,'d:\b003\g0006.jpg','天然谷物饲养','b003')
INSERT INTO Shop_goods VALUES('g0007','手抓饼','安井','400g',6.3,300,'d:\b004\g0007.jpg','葱香浓郁','b004')
INSERT INTO Shop_goods VALUES('g0008','素水饺','思念','500g',7.2,250,'d:\b004\g0008.jpg','皮薄馅大','b004')
INSERT INTO Shop_goods VALUES('g0009','饮用水','康师傅','1.5L*6',7.99,800,'d:\b005\g0009.jpg','纯净健康','b005')
INSERT INTO Shop_goods VALUES('g0010','酸牛奶','蒙牛','200g*10',38.8,200,'d:\b005\g0010.jpg','点滴纯粹乳此简单','b005')
INSERT INTO Shop_goods VALUES('g0011','巧克力','金帝','135g',19.5,100,'d:\b006\g0011.jpg','颗颗香浓粒粒丝滑','b006')
INSERT INTO Shop_goods VALUES('g0012','麻花','于香缘','330g',6.9,100,'d:\b006\g0012.jpg','酥脆可口唇齿留香','b006')
INSERT INTO Shop_goods VALUES('g0013','大米','五湖','5kg',31.9,100,'d:\b007\g0013.jpg','香软可口','b007')
INSERT INTO Shop_goods VALUES('g0014','小麦粉','金沙河','5kg',19.9,100,'d:\b007\g0014.jpg','绿色种植光照充足','b007')
INSERT INTO Shop_goods VALUES('g0015','洗衣皂','中华','110g*6',9.9,200,'d:\b008\g0015.jpg','天然材料安心健康','b008')
INSERT INTO Shop_goods VALUES('g0016','牙膏','两面针','105g*2',7.8,200,'d:\b008\g0016.jpg','草本护龈','b008')
INSERT INTO Shop_goods VALUES('g0017','早餐杯','玻爵','2个',8.8,100,'d:\b009\g0017.jpg','网红早餐杯','b009')
INSERT INTO Shop_goods VALUES('g0018','筷筒','东升','1个',5.88,50,'d:\b009\g0018.jpg','304食品级不锈钢','b009')
Go
--往Shop_Order表中添加记录
INSERT INTO Shop_Order VALUES('1','g0001',1,'2020-8-01','已发货','c0001','好评','e005','2020-8-01')
INSERT INTO Shop_Order VALUES('2','g0001',1,'2020-8-02','已发货','c0003','好评','e005','2020-8-02')
INSERT INTO Shop_Order VALUES('3','g0004',2,'2020-8-03','已发货','c0002','好评','e005','2020-8-03')
INSERT INTO Shop_Order VALUES('4','g0004',2,'2020-8-03','已发货','c0001','好评','e005','2020-8-03')
INSERT INTO Shop_Order VALUES('5','g0004',4,'2020-8-03','已发货','c0004','好评','e005','2020-8-03')
INSERT INTO Shop_Order VALUES('6','g0006',2,'2020-8-03','已发货','c0005','好评','e006','2020-8-03')
INSERT INTO Shop_Order VALUES('7','g0006',2,'2020-8-03','已发货','c0006','好评','e006','2020-8-03')
INSERT INTO Shop_Order VALUES('8','g0007',2,'2020-8-03','已发货','c0006','中评','e007','2020-8-04')
INSERT INTO Shop_Order VALUES('9','g0010',1,'2020-8-04','已发货','c0007','好评','e008','2020-8-04')
INSERT INTO Shop_Order VALUES('10','g0012',2,'2020-8-04','已下单','c0007','','e008','2020-8-05')
INSERT INTO Shop_Order VALUES('11','g0015',1,'2020-8-04','已下单','c0008','','e008','2020-8-05')
INSERT INTO Shop_Order VALUES('12','g0016',1,'2020-8-04','已下单','c0008','','e008','2020-8-05')
GO
1.使用T-SQL语句实现商品销售管理数据库Goods中的相关查询,具体操作要求如下
(1)查询所有商品的基本信息。
sql
use goods;
select * from shop_goods;
(2)查询大米的品牌、规格、单价和库存数量,并显示为汉字标题。
sql
use goods;
-- 查询大米相关信息,并通过as关键字设置汉字别名
select
brand as 品牌,
size as 规格,
price as 单价,
stock as 库存数量
from shop_goods
where name = '大米';
(3)查询每个商品的库存金额(库存金额=单价*库存数量),结果显示为商品编号、商品名称和库存金额。
sql
use goods;
-- 计算库存金额(单价*库存),并显示指定字段
select
goods_id as 商品编号,
name as 商品名称,
price * stock as 库存金额
from shop_goods;
(4)查询下单当天就发货的商品编号。
sql
use goods;
-- 筛选下单日期和发货日期相同的记录,提取商品编号
select goods_id as 商品编号
from shop_order
where convert(date, order_time) = convert(date, delivery_time);
(5)查询所有女员工的姓名、账号和电话号码。
sql
use goods;
-- 筛选性别为女的员工,显示指定字段
select
name as 姓名,
account as 账号,
phone as 电话号码
from employee
where gender = '女';
(6)查询所有姓张的员工的详细信息。
sql
use goods;
-- 模糊查询姓氏为"张"的员工,*表示查询所有字段
select * from employee
where name like '张%';
(7)查询收货地址为西安市的客户的详细信息。
sql
use goods;
-- 筛选收货地址包含"西安市"的客户,查询所有字段
select * from consumer
where receive_address like '%西安市%';
(8)查询反馈信息为空的商品编号。
sql
use goods;
-- 筛选feedback(反馈信息)为空的记录,提取商品编号
select goods_id as 商品编号
from goods_feedback
where feedback is null;
(9)查询每个商品的商品编号、商品名称和库存金额,并将查询结果存放到临时表"库存"中。
sql
use goods;
-- 先判断临时表是否存在,存在则删除(避免创建失败)
if object_id('tempdb..#库存') is not null
drop table #库存;
-- 创建临时表并插入查询结果
select
goods_id as 商品编号,
name as 商品名称,
price * stock as 库存金额
into #库存 -- 将查询结果存入临时表#库存
from shop_goods;
-- 验证临时表数据(可选)
select * from #库存;
2.使用T-SQL语句实现商品销售管理数据库Goods中的相关查询,具体操作要求如下。
(1)查询所有商品的基本信息,结果按照单价从低到高排序。
sql
select * from shop_goods order by price asc;
(2)查询单价最高的商品的编号、商品名称及品牌。
sql
select goods_id, name, brand
from shop_goods
where price = (select max(price) from shop_goods);
(3)统计男、女客户的人数。
sql
select sex, count(*) as 客户人数
from consumer
group by sex;
(4)查询已发货的订单信息,结果按照发货日期先后排序输出。
sql
select * from shop_order
where status = '已发货'
order by shipping_date asc;
(5)查询各类商品的库存金额,结果显示为商品类别编号和库存金额,并按照库存金额降序排序输出。
sql
select c.category_id, sum(s.price * s.stock) as 库存金额
from category c
join shop_goods s on c.category_id = s.category_id
group by c.category_id
order by 库存金额 desc;
(6)查询各类商品中库存金额高于5000的商品信息,结果显示为商品类别编号和库存金额。
sql
select c.category_id, sum(s.price * s.stock) as 库存金额
from category c
join shop_goods s on c.category_id = s.category_id
group by c.category_id
having sum(s.price * s.stock) > 5000;
(7)统计查询2020年8月份每天的销售总量,结果显示为下单日期和销售总量。
sql
select order_date as 下单日期, sum(quantity) as 销售总量
from shop_order
where order_date between '2020-08-01' and '2020-08-31'
group by order_date
order by order_date;
(8)统计查询每种商品的销售总量,结果显示为商品编号和销售数量。
sql
select goods_id as 商品编号, sum(quantity) as 销售数量
from shop_order
group by goods_id;
(9)统计查询发货地址为西安市和咸阳市的客户人数。
sql
select
case
when address like '%西安市%' then '西安市'
when address like '%咸阳市%' then '咸阳市'
end as 发货地址,
count(*) as 客户人数
from consumer
where address like '%西安市%' or address like '%咸阳市%'
group by
case
when address like '%西安市%' then '西安市'
when address like '%咸阳市%' then '咸阳市'
end;
3.使用T-SQL语句实现商品销售管理数据库Goods中的相关查询,具体操作要求如下。
(1)查询所有商品的商品编号、商品名称、商品类别编号和商品类别名称。
sql
select s.goods_id, s.name as 商品名称, s.category_id, c.name as 类别名称
from shop_goods s
join category c on s.category_id = c.category_id;
(2)查询所有已销售商品的情况,结果显示为商品编号、商品名称、订单日期和订单状态,并且按照商品编号升序排序。
sql
select s.goods_id, s.name as 商品名称, o.order_date, o.status
from shop_goods s
join shop_order o on s.goods_id = o.goods_id
order by s.goods_id asc;
(3)查询Shop_goods表中所有商品的销售情况,结果显示为商品编号、商品名称、订单日期和订单状态,没有销售记录的商品其订单日期和订单状态显示为NULL。
sql
select s.goods_id, s.name as 商品名称, o.order_date, o.status
from shop_goods s
left join shop_order o on s.goods_id = o.goods_id
order by s.goods_id asc;
(4)统计查询每个客户的消费金额,结果显示为客户编号、消费金额。
sql
select o.consumer_id as 客户编号, sum(s.price * o.quantity) as 消费金额
from shop_order o
join shop_goods s on o.goods_id = s.goods_id
group by o.consumer_id;
(5)查询不低于"鸡蛋"价格的商品编号、商品名称和商品单价,查询后的结果按照商品单价升序排序。(使用自身连接查询)
sql
select distinct s1.goods_id, s1.name, s1.price
from shop_goods s1
join shop_goods s2 on s1.price >= s2.price
where s2.name = '鸡蛋'
order by s1.price asc;
4.使用SQL子查询实现商品销售管理数据库Goods中的相关查询,具体操作要求如下。
(1)查询反馈评价为"好评"的商品编号和商品名称。
sql
select goods_id, name
from shop_goods
where goods_id in (select goods_id from shop_order where comment = '好评');
(2)查询反馈评价为"中评"的客户编号、客户姓名和电话。
sql
select c.consumer_id, c.name, c.tel
from consumer c
where c.consumer_id in (select consumer_id from shop_order where comment = '中评');
(3)查询与客户"C0002"购买相同商品的客户信息,结果显示为客户编号、客户姓名和电话。
sql
select c.consumer_id, c.name, c.tel
from consumer c
where c.consumer_id in (
select distinct consumer_id
from shop_order
where goods_id in (
select goods_id
from shop_order
where consumer_id = 'c0002'
) and consumer_id != 'c0002'
);
(4)查询粮油类用品的库存情况,结果显示为商品编号、商品名称和库存金额。
sql
select goods_id, name, (price * stock) as 库存金额
from shop_goods
where category_id = (select category_id from category where name = '粮油');
(5)查询购买过任一商品的客户信息,结果显示为客户编号、客户姓名和电话。(使用谓词Any)
sql
select consumer_id, name, tel
from consumer
where consumer_id = any (select consumer_id from shop_order);
(6)查询已销售商品的详细信息。(使用谓词Exists)
sql
select *
from shop_goods s
where exists (
select 1
from shop_order o
where o.goods_id = s.goods_id
);
(7)查询还没有销售的商品的详细信息。(使用谓词Not Exists)
sql
select *
from shop_goods s
where not exists (
select 1
from shop_order o
where o.goods_id = s.goods_id
);