SQL常见面试题总结(1)
> 题目来源于:[牛客题霸 - SQL 必知必会](https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=298) [检
题目来源于:牛客题霸 SQL 必知必会 检索数据 用于从数据库中查询数据。 从 Customers 表中检索所有的 ID 现有表 如下: | cust\ id | | | | A | | B | | C | 编写 SQL 语句,从 表中检索所有的 。 答案: 检索并列出已订购产品的清单 表 含有非空的列 代表商品 id,包含了所有已订购的商品(有些已被订购多次)。 | prod\ id | | | | a1 | | a2 | | a3 | | a4 | | a5 | | a6 | | a7 | 编写 SQL 语句,检索并列出所有已订购商品( )的去重后的清单。 答案: 知识点: 用于返回列中的唯一不同值。 检索所有列 现在有 表(表中含有列 代表客户 id, 代表客户姓名) | cust\ id | cust\ name | | | | | a1 | andy | | a2 | ben | | a3 | tony | | a4 | tom | | a5 | an | | a6 | lee | | a7 | hex | 需要编写 SQL 语句,检索所有列。 答案: 排序检索数据 用于对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序,如果需要按照降序对记录进行排序,可以使用 关键字。 检索顾客名称并且排序 有表 , 代表客户 id, 代表客户姓名。 | cust\ id | cust\ name | | | | | a1 | andy | | a2 | ben | | a3 | tony | | a4 | tom | | a5 | an | | a6 | lee | | a7 | hex | 从 中检索所有的顾客名称( ),并按从 Z 到 A 的顺序显示结果。 答案: 对顾客 ID 和日期排序 有 表: | cust\ id | order\ num | order\ date | | | | | | andy | aaaa | 2021 01 01 00:00:00 | | andy | bbbb | 2021 01 01 12:00:00 | | bob | cccc | 2021 01 10 12:00:00 | | dick | dddd | 2021 01 11 00:00:00 | 编写 SQL 语句,从 表中检索顾客 ID( )和订单号( ),并先按顾客 ID 对结果进行排序,再按订单日期倒序排列。 答案: 知识点: 对多列排序的时候,先排序的列放前面,后排序的列放后面。并且,不同的列可以有不同的排序规则。 按照数量和价格排序 假设有一个 表: | quantity | item\ price | | | | | 1 | 100 | | 10 | 1003 | | 2 | 500 | 编写 SQL 语句,显示 表中的数量( )和价格( ),并按数量由多到少、价格由高到低排序。 答案: 检查 SQL 语句 有 表: | vend\ name | | | | 海底捞 | | 小龙坎 | | 大龙燚 | 下面的 SQL 语句有问题吗?尝试将它改正确,使之能够正确运行,并且返回结果根据 逆序排列。 改正后: 知识点: 逗号作用是用来隔开列与列之间的。 ORDER BY 是有 BY 的,需要撰写完整,且位置正确。 过滤数据 可以过滤返回的数据。 下面的运算符可以在 子句中使用: | 运算符 | 描述 | | | | | = | 等于 | | < | 不等于。 注释: 在 SQL 的一些版本中,该操作符可被写成 != | | | 大于 | | < | 小于 | | = | 大于等于 | | <= | 小于等于 | | BETWEEN | 在某个范围内 | | LIKE | 搜索某种模式 | | IN | 指定针对某个列的多个可能值 | 返回固定价格的产品 有表 : | prod\ id | prod\ name | prod\ price | | | | | | a0018 | sockets | 9.49 | | a0019 | iphone13 | 600 | | b0018 | gucci t shirts | 1000 | 【问题】从 表中检索产品 ID( )和产品名称( ),只返回价格为 9.49 美元的产品。 答案: 返回更高价格的产品 有表 : | prod\ id | prod\ name | prod\ price | | | | | | a0018 | sockets | 9.49 | | a0019 | iphone13 | 600 | | b0019 | gucci t shirts | 1000 | 【问题】编写 SQL 语句,从 表中检索产品 ID( )和产品名称( ),只返回价格为 9 美元或更高的产品。 答案: 返回产品并且按照价格排序 有表 : | prod\ id | prod\ name | prod\ price | | | | | | a0011 | egg | 3 | | a0019 | sockets | 4 | | b0019 | coffee | 15 | 【问题】编写 SQL 语句,返回 表中所有价格在 3 美元到 6 美元之间的产品的名称( )和价格( ),然后按价格对结果进行排序。 答案: 返回更多的产品 表含有:订单号 , 产品数量 | order\ num | quantity | | | | | a1 | 105 | | a2 | 1100 | | a2 | 200 | | a4 | 1121 | | a5 | 10 | | a2 | 19 | | a7 | 5 | 【问题】从 表中检索出所有不同且不重复的订单号( ),其中每个订单都要包含 100 个或更多的产品。 答案: 高级数据过滤 和 运算符用于基于一个以上的条件对记录进行过滤,两者可以结合使用。 必须 2 个条件都成立, 只要 2 个条件中的一个成立即可。 检索供应商名称 表有字段供应商名称( )、供应商国家( )、供应商州( ) | vend\ name | vend\ country | vend\ state | | | | | | apple | USA | CA | | vivo | CNA | shenzhen | | huawei | CNA | xian | 【问题】编写 SQL 语句,从 表中检索供应商名称( ),仅返回加利福尼亚州的供应商(这需要按国家[USA]和州[CA]进行过滤,没准其他国家也存在一个 CA) 答案: 检索并列出已订购产品的清单 表包含了所有已订购的产品(有些已被订购多次)。 | prod\ id | order\ num | quantity | | | | | | BR01 | a1 | 105 | | BR02 | a2 | 1100 | | BR02 | a2 | 200 | | BR03 | a4 | 1121 | | BR017 | a5 | 10 | | BR02 | a2 | 19 | | BR017 | a7 | 5 | 【问题】编写 SQL 语句,查找所有订购了数量至少 100 个的 、 或 的订单。你需要返回 表的订单号( )、产品 ID( )和数量( ),并按产品 ID 和数量进行过滤。 答案: 返回所有价格在 3 美元到 6 美元之间的产品的名称和价格 有表 : | prod\ id | prod\ name | prod\ price | | | | | | a0011 | egg | 3 | | a0019 | sockets | 4 | | b0019 | coffee | 15 | 【问题】编写 SQL 语句,返回所有价格在 3 美元到 6 美元之间的产品的名称( )和价格( ),使用 AND 操作符,然后按价格对结果进行升序排序。 答案: 检查 SQL 语句 供应商表 有字段供应商名称 、供应商国家 、供应商省份 | vend\ name | vend\ country | vend\ state | | | | | | apple | USA | CA | | vivo | CNA | shenzhen | | huawei | CNA | xian | 【问题】修改正确下面 sql,使之正确返回。 修改后: 语句必须放在 之后。 用通配符进行过滤 SQL 通配符必须与 运算符一起使用 在 SQL 中,可使用以下通配符: | 通配符 | 描述 | | | | | | 代表零个或多个字符 | | | 仅替代一个字符 | | | 字符列中的任何单一字符 | | 或者 | 不在字符列中的任何单一字符 | 检索产品名称和描述(一) 表如下: | prod\ name | prod\ desc | | | | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t shirts | | c0019 | gucci toy | | d0019 | lego toy | 【问题】编写 SQL 语句,从 表中检索产品名称( )和描述( ),仅返回描述中包含 一词的产品名称。 答案: 检索产品名称和描述(二) 表如下: | prod\ name | prod\ desc | | | | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t shirts | | c0019 | gucci toy | | d0019 | lego toy | 【问题】编写 SQL 语句,从 表中检索产品名称( )和描述( ),仅返回描述中未出现 一词的产品,最后按”产品名称“对结果进行排序。 答案: 检索产品名称和描述(三) 表如下: | prod\ name | prod\ desc | | | | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t shirts | | c0019 | gucci toy | | d0019 | lego carrots toy | 【问题】编写 SQL 语句,从 表中检索产品名称( )和描述( ),仅返回描述中同时出现 和 的产品。有好几种方法可以执行此操作,但对于这个挑战题,请使用 和两个 比较。 答案: 检索产品名称和描述(四) 表如下: | prod\ name | prod\ desc | | | | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t shirts | | c0019 | gucci toy | | d0019 | lego toy carrots | 【问题】编写 SQL 语句,从 Products 表中检索产品名称(prod\ name)和描述(prod\ desc),仅返回在描述中以 先后顺序 同时出现 toy 和 carrots 的产品。提示:只需要用带有三个 符号的 即可。 答案: 创建计算字段 别名 别名的常见用法是在检索出的结果中重命名表的列字段(为了符合特定的报表要求或客户需求)。有表 代表供应商信息, 供应商 id、 供应商名称、 供应商地址、 供应商城市。 | vend\ id | vend\ name | vend\ address | vend\ city | | | | | | | a001 | tencent cloud | address1 | shenzhen | | a002 | huawei cloud | address2 | dongguan | | a003 | aliyun cloud | address3 | hangzhou | | a003 | netease cloud | address4 | guangzhou | 【问题】编写 SQL 语句,从 表中检索 、 、 和 ,将 重命名为 ,将 重命名为 ,将 重命名为 ,按供应商名称对结果进行升序排序。 答案: 打折 我们的示例商店正在进行打折促销,所有产品均降价 10%。 表包含 产品 id、 产品价格。 【问题】编写 SQL 语句,从 表中返回 、 和 。 是一个包含促销价格的计算字段。提示:可以乘以 0.9,得到原价的 90%(即 10%的折扣)。 答案: 注意: 是对计算结果的命名,而不是原有的列名。 使用函数处理数据 顾客登录名 我们的商店已经上线了,正在创建顾客账户。所有用户都需要登录名,默认登录名是其名称和所在城市的组合。 给出 表 如下: | cust\ id | cust\ name | cust\ contact | cust\ city | | | | | | | a1 | Andy Li | Andy Li | Oak Park | | a2 | Ben Liu | Ben Liu | Oak Park | | a3 | Tony Dai | Tony Dai | Oak Park | | a4 | Tom Chen | Tom Chen | Oak Park | | a5 | An Li | An Li | Oak Park | | a6 | Lee Chen | Lee Chen | Oak Park | | a7 | Hex Liu | Hex Liu | Oak Park | 【问题】编写 SQL 语句,返回顾客 ID( )、顾客名称( )和登录名( ),其中登录名全部为大写字母,并由顾客联系人的前两个字符( )和其所在城市的前三个字符( )组成。提示:需要使用函数、拼接和别名。 答案: 知识点: 截取函数 :截取字符串, (n 表示起始截取位置,m 表示要截取的字符个数)表示返回字符串 str 从第 n 个字符开始截取 m 个字符; 拼接函数 :将两个或多个字符串连接成一个字符串,select concat(A,B):连接字符串 A 和 B。 大写函数 :将指定字符串转换为大写。 返回 2020 年 1 月的所有订单的订单号和订单日期 订单表如下: | order\ num | order\ date | | | | | a0001 | 2020 01 01 00:00:00 | | a0002 | 2020 01 02 00:00:00 | | a0003 | 2020 01 01 12:00:00 | | a0004 | 2020 02 01 00:00:00 | | a0005 | 2020 03 01 00:00:00 | 【问题】编写 SQL 语句,返回 2020 年 1 月的所有订单的订单号( )和订单日期( ),并按订单日期升序排序 答案: 也可以用通配符来做: 知识点: 日期格式: 时间格式: 日期和时间处理相关的常用函数: | 函 数 | 说 明 | | | | | | 增加一个日期(天、周等) | | | 增加一个时间(时、分等) | | | 返回当前日期 | | | 返回当前时间 | | | 返回日期时间的日期部分 | | | 计算两个日期之差 | | | 返回一个格式化的日期或时间串 | | | 返回一个日期的天数部分 | | | 对于一个日期,返回对应的星期几 | | | 返回一个时间的小时部分 | | | 返回一个时间的分钟部分 | | | 返回一个日期的月份部分 | | | 返回当前日期和时间 | | | 返回一个时间的秒部分 | | | 返回一个日期时间的时间部分 | | | 返回一个日期的年份部分 | 汇总数据 汇总数据相关的函数: | 函 数 | 说 明 | | | | | | 返回某列的平均值 | | | 返回某列的行数 | | | 返回某列的最大值 | | | 返回某列的最小值 | | | 返回某列值之和 | 确定已售出产品的总数 表代表售出的产品, 代表售出商品数量。 | quantity | | | | 10 | | 100 | | 1000 | | 10001 | | 2 | | 15 | 【问题】编写 SQL 语句,确定已售出产品的总数。 答案: 确定已售出产品项 BR01 的总数 表代表售出的产品, 代表售出商品数量,产品项为 。 | quantity | prod\ id | | | | | 10 | AR01 | | 100 | AR10 | | 1000 | BR01 | | 10001 | BR010 | 【问题】修改创建的语句,确定已售出产品项( )为"BR01"的总数。 答案: 确定 Products 表中价格不超过 10 美元的最贵产品的价格 表如下, 代表商品的价格。 | prod\ price | | | | 9.49 | | 600 | | 1000 | 【问题】编写 SQL 语句,确定 表中价格不超过 10 美元的最贵产品的价格( )。将计算所得的字段命名为 。 答案: 分组数据 : 子句将记录分组到汇总行中。 为每个组返回一个记录。 通常还涉及聚合 , , , 等。 可以按一列或多列进行分组。 按分组字段进行排序后, 可以以汇总字段来进行排序。 : 用于对汇总的 结果进行过滤。 必须要与 连用。 和 可以在相同的查询中。 vs : :过滤指定的行,后面不能加聚合函数(分组函数)。 :过滤分组,必须要与 连用,不能单独使用。 返回每个订单号各有多少行数 表包含每个订单的每个产品 | order\ num | | | | a002 | | a002 | | a002 | | a004 | | a007 | 【问题】编写 SQL 语句,返回每个订单号( )各有多少行数( ),并按 对结果进行升序排序。 答案: 知识点: 1. , 都可以,区别在于, 是统计非 NULL 的行数; 2. 最后执行,所以可以使用列别名; 3. 分组聚合一定不要忘记加上 ,不然只会有一行结果。 每个供应商成本最低的产品 有 表,含有字段 代表产品价格, 代表供应商 id | vend\ id | prod\ price | | | | | a0011 | 100 | | a0019 | 0.1 | | b0019 | 1000 | | b0019 | 6980 | | b0019 | 20 | 【问题】编写 SQL 语句,返回名为 的字段,该字段包含每个供应商成本最低的产品(使用 表中的 ),然后从最低成本到最高成本对结果进行升序排序。 答案: 返回订单数量总和不小于 100 的所有订单的订单号 代表订单商品表,包括:订单号 和订单数量 。 | order\ num | quantity | | | | | a1 | 105 | | a2 | 1100 | | a2 | 200 | | a4 | 1121 | | a5 | 10 | | a2 | 19 | | a7 | 5 | 【问题】请编写 SQL 语句,返回订单数量总和不小于 100 的所有订单号,最后结果按照订单号升序排序。 答案: 知识点: :过滤过滤指定的行,后面不能加聚合函数(分组函数)。 :过滤分组,与 连用,不能单独使用。 计算总和 表代表订单信息,包括字段:订单号 和 商品售出价格、 商品数量。 | order\ num | item\ price | quantity | | | | | | a1 | 10 | 105 | | a2 | 1 | 1100 | | a2 | 1 | 200 | | a4 | 2 | 1121 | | a5 | 5 | 10 | | a2 | 1 | 19 | | a7 | 7 | 5 | 【问题】编写 SQL 语句,根据订单号聚合,返回订单总价不小于 1000 的所有订单号,最后的结果按订单号进行升序排序。 提示:总价 = item\ price 乘以 quantity 答案: 检查 SQL 语句 表含有 订单号 | order\ num | | | | a002 | | a002 | | a002 | | a004 | | a007 | 【问题】将下面代码修改正确后执行 修改后: 使用子查询 子查询是嵌套在较大查询中的 SQL 查询,也称内部查询或内部选择,包含子查询的语句也称为外部查询或外部选择。简单来说,子查询就是指将一个 查询(子查询)的结果作为另一个 SQL 语句(主查询)的数据来源或者判断条件。 子查询可以嵌入 、 、 和 语句中,也可以和 、 、 、 、 、 等运算符一起使用。 子查询常用在 子句和 子句后边: 当用于 子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为 WHERE 子句查询条件的值。 当用于 子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合 后面是表的规则。这种做法能够实现多表联合查询。 注意:MySQL 数据库从 4.1 版本才开始支持子查询,早期版本是不支持的。 用于 子句的子查询的基本语法如下: 子查询需要放在括号 内。 表示用于 子句的运算符,可以是比较运算符(如 , , , 等)或逻辑运算符(如 , , , 等),具体根据需求来确定。 用于 子句的子查询的基本语法如下: 用于 的子查询返回的结果相当于一张临时表,所以需要使用 AS 关键字为该临时表起一个名字。 子查询需要放在括号 内。 可以指定多个临时表名,并使用 语句连接这些表。 返回购买价格为 10 美元或以上产品的顾客列表 表示订单商品表,含有字段订单号: 、订单价格: ; 表代表订单信息表,含有顾客 和订单号: 表: | order\ num | item\ price | | | | | a1 | 10 | | a2 | 1 | | a2 | 1 | | a4 | 2 | | a5 | 5 | | a2 | 1 | | a7 | 7 | 表: | order\ num | cust\ id | | | | | a1 | cust10 | | a2 | cust1 | | a2 | cust1 | | a4 | cust2 | | a5 | cust5 | | a2 | cust1 | | a7 | cust7 | 【问题】使用子查询,返回购买价格为 10 美元或以上产品的顾客列表,结果无需排序。 答案: 确定哪些订单购买了 prod\ id 为 BR01 的产品(一) 表 代表订单商品信息表, 为产品 id; 表代表订单表有 代表顾客 id 和订单日期 表: | prod\ id | order\ num | | | | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | 表: | order\ num | cust\ id | order\ date | | | | | | a0001 | cust10 | 2022 01 01 00:00:00 | | a0002 | cust1 | 2022 01 01 00:01:00 | | a0003 | cust1 | 2022 01 02 00:00:00 | | a0013 | cust2 | 2022 01 01 00:20:00 | 【问题】 编写 SQL 语句,使用子查询来确定哪些订单(在 中)购买了 为 "BR01" 的产品,然后从 表中返回每个产品对应的顾客 ID( )和订单日期( ),按订购日期对结果进行升序排序。 答案: 返回购买 prod\ id 为 BR01 的产品的所有顾客的电子邮件(一) 你想知道订购 BR01 产品的日期,有表 代表订单商品信息表, 为产品 id; 表代表订单表有 代表顾客 id 和订单日期 ; 表含有 顾客邮件和 顾客 id 表: | prod\ id | order\ num | | | | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | 表: | order\ num | cust\ id | order\ date | | | | | | a0001 | cust10 | 2022 01 01 00:00:00 | | a0002 | cust1 | 2022 01 01 00:01:00 | | a0003 | cust1 | 2022 01 02 00:00:00 | | a0013 | cust2 | 2022 01 01 00:20:00 | 表代表顾客信息, 为顾客 id, 为顾客 email | cust\ id | cust\ email | | | | | cust10 | cust10@cust.com | | cust1 | cust1@cust.com | | cust2 | cust2@cust.com | 【问题】返回购买 为 的产品的所有顾客的电子邮件( 表中的 ),结果无需排序。 提示:这涉及 语句,最内层的从 表返回 ,中间的从 表返回 。 答案: 返回每个顾客不同订单的总金额 我们需要一个顾客 ID 列表,其中包含他们已订购的总金额。 表代表订单信息, 表有订单号: 和商品售出价格: 、商品数量: 。 | order\ num | item\ price | quantity | | | | | | a0001 | 10 | 105 | | a0002 | 1 | 1100 | | a0002 | 1 | 200 | | a0013 | 2 | 1121 | | a0003 | 5 | 10 | | a0003 | 1 | 19 | | a0003 | 7 | 5 | 表订单号: 、顾客 id: | order\ num | cust\ id | | | | | a0001 | cust10 | | a0002 | cust1 | | a0003 | cust1 | | a0013 | cust2 | 【问题】 编写 SQL 语句,返回顾客 ID( 表中的 ),并使用子查询返回 以便返回每个顾客的订单总数,将结果按金额从大到小排序。 答案: 关于写法一详细介绍可以参考: issue 2402:写法 1 存在的错误以及修改方法。 从 Products 表中检索所有的产品名称以及对应的销售总数 表中检索所有的产品名称: 、产品 id: | prod\ id | prod\ name | | | | | a0001 | egg | | a0002 | sockets | | a0013 | coffee | | a0003 | cola | 代表订单商品表,订单产品: 、售出数量: | prod\ id | quantity | | | | | a0001 | 105 | | a0002 | 1100 | | a0002 | 200 | | a0013 | 1121 | | a0003 | 10 | | a0003 | 19 | | a0003 | 5 | 【问题】 编写 SQL 语句,从 表中检索所有的产品名称( ),以及名为 的计算列,其中包含所售产品的总数(在 表上使用子查询和 检索)。 答案: 连接表 JOIN 是“连接”的意思,顾名思义,SQL JOIN 子句用于将两个或者多个表联合起来进行查询。 连接表时需要在每个表中选择一个字段,并对这些字段的值进行比较,值相同的两条记录将合并为一条。 连接表的本质就是将不同表的记录合并起来,形成一张新表。当然,这张新表只是临时的,它仅存在于本次查询期间 。 使用 连接两个表的基本语法如下: 是连接条件,只有满足此条件的记录才会合并为一行。您可以使用多个运算符来连接表,例如 =、 、<、< 、<=、 =、!=、 、 或者 ,但是最常见的是使用 =。 当两个表中有同名的字段时,为了帮助数据库引擎区分是哪个表的字段,在书写同名字段名时需要加上表名。当然,如果书写的字段名在两个表中是唯一的,也可以不使用以上格式,只写字段名即可。 另外,如果两张表的关联字段名相同,也可以使用 子句来代替 ,举个例子: 和 的区别 : 连接表时,SQL 会根据连接条件生成一张新的临时表。 就是连接条件,它决定临时表的生成。 是在临时表生成以后,再对临时表中的数据进行过滤,生成最终的结果集,这个时候已经没有 JOIN ON 了。 所以总结来说就是: SQL 先根据 ON 生成一张临时表,然后再根据 WHERE 对临时表进行筛选 。 SQL 允许在 左边加上一些修饰性的关键词,从而形成不同类型的连接,如下表所示: | 连接类型 | 说明 | | | | | INNER JOIN 内连接 | (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。 | | LEFT JOIN / LEFT OUTER JOIN 左(外)连接 | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 | | RIGHT JOIN / RIGHT OUTER JOIN 右(外)连接 | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 | | FULL JOIN / FULL OUTER JOIN 全(外)连接 | 只要其中有一个表存在满足条件的记录,就返回行。 | | SELF JOIN | 将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。 | | CROSS JOIN | 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。 | 下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。 如果不加任何修饰词,只写 ,那么默认为 对于 来说,还有一种隐式的写法,称为 “ 隐式内连接 ”,也就是没有 关键字,使用 语句实现内连接的功能 返回顾客名称和相关订单号 表有字段顾客名称 、顾客 id | cust\ id | cust\ name | | | | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | 订单信息表,含有字段 订单号、 顾客 id | order\ num | cust\ id | | | | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | 【问题】编写 SQL 语句,返回 表中的顾客名称( )和 表中的相关订单号( ),并按顾客名称再按订单号对结果进行升序排序。你可以尝试用两个不同的写法,一个使用简单的等连接语法,另外一个使用 INNER JOIN。 答案: 返回顾客名称和相关订单号以及每个订单的总价 表有字段,顾客名称: 、顾客 id: | cust\ id | cust\ name | | | | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | 订单信息表,含有字段,订单号: 、顾客 id: | order\ num | cust\ id | | | | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | 表有字段,商品订单号: 、商品数量: 、商品价格: | order\ num | quantity | item\ price | | | | | | a1 | 1000 | 10 | | a2 | 200 | 10 | | a3 | 10 | 15 | | a4 | 25 | 50 | | a5 | 15 | 25 | | a7 | 7 | 7 | 【问题】除了返回顾客名称和订单号,返回 表中的顾客名称( )和 表中的相关订单号( ),添加第三列 ,其中包含每个订单的总价,并按顾客名称再按订单号对结果进行升序排序。 注意,可能有小伙伴会这样写: 这是错误的!只对 进行聚类确实符合题意,但是不符合 的语法。 select 语句中,如果没有 语句,那么 、 会返回若干个值,而 只返回一个值,通过 可以让 和 一一对应起来,或者说 聚类 ,所以同样的,也要对 进行聚类。 一句话,select 中的字段要么都聚类,要么都不聚类 确定哪些订单购买了 prod\ id 为 BR01 的产品(二) 表 代表订单商品信息表, 为产品 id; 表代表订单表有 代表顾客 id 和订单日期 表: | prod\ id | order\ num | | | | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | 表: | order\ num | cust\ id | order\ date | | | | | | a0001 | cust10 | 2022 01 01 00:00:00 | | a0002 | cust1 | 2022 01 01 00:01:00 | | a0003 | cust1 | 2022 01 02 00:00:00 | | a0013 | cust2 | 2022 01 01 00:20:00 | 【问题】 编写 SQL 语句,使用子查询来确定哪些订单(在 中)购买了 为 "BR01" 的产品,然后从 表中返回每个产品对应的顾客 ID( )和订单日期( ),按订购日期对结果进行升序排序。 提示:这一次使用连接和简单的等连接语法。 返回购买 prod\ id 为 BR01 的产品的所有顾客的电子邮件(二) 有表 代表订单商品信息表, 为产品 id; 表代表订单表有 代表顾客 id 和订单日期 ; 表含有 顾客邮件和 cust\ id 顾客 id 表: | prod\ id | order\ num | | | | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | 表: | order\ num | cust\ id | order\ date | | | | | | a0001 | cust10 | 2022 01 01 00:00:00 | | a0002 | cust1 | 2022 01 01 00:01:00 | | a0003 | cust1 | 2022 01 02 00:00:00 | | a0013 | cust2 | 2022 01 01 00:20:00 | 表代表顾客信息, 为顾客 id, 为顾客 email | cust\ id | cust\ email | | | | | cust10 | cust10@cust.com | | cust1 | cust1@cust.com | | cust2 | cust2@cust.com | 【问题】返回购买 为 BR01 的产品的所有顾客的电子邮件( 表中的 ),结果无需排序。 提示:涉及到 语句,最内层的从 表返回 ,中间的从 表返回 ,但是必须使用 INNER JOIN 语法。 确定最佳顾客的另一种方式(二) 表代表订单信息,确定最佳顾客的另一种方式是看他们花了多少钱, 表有订单号 和 商品售出价格、 商品数量 | order\ num | item\ price | quantity | | | | | | a1 | 10 | 105 | | a2 | 1 | 1100 | | a2 | 1 | 200 | | a4 | 2 | 1121 | | a5 | 5 | 10 | | a2 | 1 | 19 | | a7 | 7 | 5