sql查询练习题(下)

简介: sql查询练习题

Orders表


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 语句,使用子查询来确定哪些订单(在 OrderItems 中)购买了 prod_id 为 "BR01" 的产品,然后从 Orders 表中返回每个产品对应的顾客 ID(cust_id)和订单日期(order_date),按订购日期对结果进行升序排序(提示:这一次使用联结和简单的等联结语法)。


答案:select cust_id,order_date from Orders where order_num in (select order_num from OrderItems where prod_id='BR01') order by order_date;


40、描述


有表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date;Customers表含有cust_email 顾客邮件和cust_id顾客id


OrderItems表


prod_id order_num
BR01 a0001
BR01 a0002
BR02 a0003
BR02 a0013


Orders表


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


Customers表代表顾客信息,cust_id为顾客id,cust_email为顾客email


cust_id cust_email
cust10 cust10@cust.com
cust1 cust1@cust.com
cust2 cust2@cust.com


返回购买 prod_id 为BR01 的产品的所有顾客的电子邮件(Customers 表中的 cust_email),结果无需排序(提示:涉及到 SELECT 语句,最内层的从 OrderItems 表返回 order_num,中间的从 Customers 表返回 cust_id,但是必须使用 INNER JOIN 语法)。


答案:


  1. select cust_email from Customers where cust_id in (select cust_id from Orders where order_num in
    (select order_num from OrderItems where prod_id = 'BR01'));


  1. select cust_email from Customers inner join Orders on Customers.cust_id=Orders.cust_id inner join OrderItems on Orders.order_num=OrderItems.order_num where prod_id='BR01';


41、描述


OrderItems表代表订单信息,确定最佳顾客的另一种方式是看他们花了多少钱,OrderItems表有订单order_num和item_price商品售出价格、quantity商品数量


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


Orders表含有字段order_num 订单号、cust_id顾客id


order_num cust_id
a1 cust10
a2 cust1
a3 cust2
a4 cust22
a5 cust221
a7 cust2217


顾客表Customers有字段cust_id 客户id、cust_name 客户姓名


cust_id cust_name
cust10 andy
cust1 ben
cust2 tony
cust22 tom
cust221 an
cust2217 hex


编写 SQL 语句,返回订单总价不小于1000 的客户名称和总额(OrderItems 表中的order_num)(提示:需要计算总和(item_price 乘以 quantity)。按总额对结果进行排序,请使用INNER JOIN 语法)。


答案:select cust_name,total_price from Customers inner join Orders on Customers.cust_id = Orders.cust_id inner join (select order_num,sum(item_price*quantity) as total_price from OrderItems group by order_num) t1 on t1.order_num = Orders.order_num where total_price >= 1000 order by total_price;


42、描述


Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name


cust_id cust_name
cust10 andy
cust1 ben
cust2 tony
cust22 tom
cust221 an
cust2217 hex


Orders表代表订单信息含有订单号order_num和顾客id cust_id


order_num cust_id
a1 cust10
a2 cust1
a3 cust2
a4 cust22
a5 cust221
a7 cust2217


使用 INNER JOIN 编写 SQL语句,检索每个顾客的名称(Customers表中的 cust_name)和所有的订单号(Orders 表中的 order_num),最后根据顾客姓名cust_name升序返回。


答案:select cust_name,order_num from Customers inner join Orders on Orders.cust_id=Customers.cust_id order by cust_name;


43、描述


Orders表代表订单信息含有订单号order_num和顾客id cust_id


order_num cust_id
a1 cust10
a2 cust1
a3 cust2
a4 cust22
a5 cust221
a7 cust2217


Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name


cust_id cust_name
cust10 andy
cust1 ben
cust2 tony
cust22 tom
cust221 an
cust2217 hex
cust40 ace


检索每个顾客的名称(Customers表中的 cust_name)和所有的订单号(Orders 表中的 order_num),列出所有的顾客,即使他们没有下过订单。最后根据顾客姓名cust_name升序返回。


答案:select cust_name,order_num from Customers left join Orders on Customers.cust_id=Orders.cust_id order by cust_name;


分析:关键词:left join


用法:


  • 内联结:inner join。取两列的交集。


  • 外联结:


  • left join。左连接,以左边表的列为主,取两列的交集,对于不在右边列存在的名称取null。


  • right join。右连接,以右边表的列为主,取两列的交集,对于不在左边列存在的名称取null。


44、描述


Products表为产品信息表含有字段prod_id产品id、prod_name产品名称


prod_id prod_name
a0001 egg
a0002 sockets
a0013 coffee
a0003 cola
a0023 soda


OrderItems表为订单信息表含有字段order_num订单号和产品id prod_id


prod_id order_num
a0001 a105
a0002 a1100
a0002 a200
a0013 a1121
a0003 a10
a0003 a19
a0003 a5


使用 OUTER JOIN 联结 Products 表和 OrderItems 表,返回产品名称(prod_name)和与之相关的订单号(order_num)的列表,并按照产品名称升序排序。

答案:select prod_name,order_num from Products left join OrderItems on Products.prod_id=OrderItems.prod_id order by prod_name;


45、描述


Products表为产品信息表含有字段prod_id产品id、prod_name产品名称


prod_id prod_name
a0001 egg
a0002 sockets
a0013 coffee
a0003 cola
a0023 soda


OrderItems表为订单信息表含有字段order_num订单号和产品id prod_id


prod_id order_num
a0001 a105
a0002 a1100
a0002 a200
a0013 a1121
a0003 a10
a0003 a19
a0003 a5


使用 OUTER JOIN 联结 Products 表和 OrderItems 表,返回产品名称(prod_name)和每一项产品的总订单数(不是订单号),并按产品名称升序排序。


答案:select prod_name,if(orders is null,0,orders) as orders from Products left join (select prod_id,count(prod_id) as orders from OrderItems group by prod_id) as t1 on Products.prod_id = t1.prod_id order by prod_name;


46、描述


有Vendors表含有vend_id供应商id.


vend_id
a0002
a0013
a0003
a0010


有Products表含有供应商id和供应产品id


vend_id prod_id
a0001 egg
a0002 prod_id_iphone
a00113 prod_id_tea
a0003 prod_id_vivo phone
a0010 prod_id_huawei phone


列出供应商(Vendors 表中的 vend_id)及其可供产品的数量,包括没有产品的供应商。你需要使用 OUTER JOIN 和 COUNT()聚合函数来计算 Products 表中每种产品的数量,最后根据vend_id 升序排序(注意:vend_id 列会显示在多个表中,因此在每次引用它时都需要完全限定它)。


答案:select Vendors.vend_id,if(prod_num is null,0,prod_num) as prod_id from Vendors left join (select vend_id,count(prod_id) as prod_num from Products group by vend_id) t1 on t1.vend_id=Vendors.vend_id order by Vendors.vend_id;


47、描述


表OrderItems包含订单产品信息,字段prod_id代表产品id、quantity代表产品数量


prod_id quantity
a0001 105
a0002 100
a0002 200
a0013 1121
a0003 10
a0003 19
a0003 5
BNBG 10002


将两个 SELECT 语句结合起来,以便从 OrderItems表中检索产品 id(prod_id)和 quantity。其中,一个 SELECT 语句过滤数量为 100 的行,另一个 SELECT 语句过滤 id 以 BNBG 开头的产品,最后按产品 id 对结果进行升序排序。


答案:select prod_id,quantity from OrderItems where quantity=100 union select prod_id,quantity from OrderItems where prod_id like 'BNBG%' order by prod_id;


分析


关键词:union


用法:


  • join---连接表,对列操作


  • union--连接表,对行操作。


  • union--将两个表做行拼接,同时自动删除重复的行。


  • union all---将两个表做行拼接,保留重复的行。


48、描述


表OrderItems包含订单产品信息,字段prod_id代表产品id、quantity代表产品数量。


prod_id quantity
a0001 105
a0002 100
a0002 200
a0013 1121
a0003 10
a0003 19
a0003 5
BNBG 10002


将两个 SELECT 语句结合起来,以便从 OrderItems表中检索产品 id(prod_id)和 quantity。其中,一个 SELECT 语句过滤数量为 100 的行,另一个 SELECT 语句过滤 id 以 BNBG 开头的产品,最后按产品 id 对结果进行升序排序(注意:这次仅使用单个 SELECT 语句)。


答案:select prod_id,quantity from OrderItems where quantity = 100 or prod_id like 'BNBG%' order by prod_id;


49、描述


Products表含有字段prod_name代表产品名称


prod_name
flower
rice
ring
umbrella


Customers表代表顾客信息,cust_name代表顾客名称


cust_name
andy
ben
tony
tom
an
lee
hex


编写 SQL 语句,组合 Products 表中的产品名称(prod_name)和 Customers 表中的顾客名称(cust_name)并返回,然后按产品名称对结果进行升序排序。


答案:select prod_name from Products union select cust_name from Customers order by prod_name;


50、描述


表Customers含有字段cust_name顾客名、cust_contact顾客联系方式、cust_state顾客州、cust_email顾客email


cust_name cust_contact cust_state cust_email
cust10 8695192 MI cust10@cust.com
cust1 8695193 MI cust1@cust.com
cust2 8695194 IL cust2@cust.com


【问题】修正下面错误的SQL


SELECT cust_name, cust_contact, cust_email 
FROM Customers 
WHERE cust_state = 'MI' 
ORDER BY cust_name; 
UNION 
SELECT cust_name, cust_contact, cust_email 
FROM Customers 
WHERE cust_state = 'IL'ORDER BY cust_name;


【示例结果】


返回顾客名称:cust_name、顾客联系方式:cust_contact、顾客email:cust_email


cust_name cust_contact cust_email
cust1 8695193 cust1@cust.com
cust10 8695192 cust10@cust.com
cust2 8695194 cust2@cust.com


【示例解析】


返回住在"IL"和"MI"的顾客信息,最后根据顾客名称升序排序。


答案:


SELECT cust_name, cust_contact, cust_email 
FROM Customers 
WHERE cust_state = 'MI' 
UNION 
SELECT cust_name, cust_contact, cust_email 
FROM Customers 
WHERE cust_state = 'IL'ORDER BY cust_name;
相关文章
|
3天前
|
SQL 资源调度 数据库
深入探究SQL查询语句执行过程
深入探究SQL查询语句执行过程
14 2
|
3天前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
11 1
|
27天前
|
SQL 存储 缓存
高基数 GroupBy 在 SLS SQL 中的查询加速
本文详细介绍了SLS中的高基数GroupBy查询加速技术。
|
26天前
|
SQL 运维 程序员
一个功能丰富的SQL审核查询平台
一个功能丰富的SQL审核查询平台
|
8天前
|
SQL
SQL: 巧妙使用CASE WHEN实现查询
文章演示了如何利用SQL中的CASE WHEN语句来有效地进行条件性聚合查询,通过具体示例展示了CASE WHEN在统计分析中的应用技巧。
21 0
|
2月前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age > 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
39 0
|
2月前
|
SQL 关系型数据库 MySQL
|
2月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
60 0
|
2月前
|
Java UED 开发者
当错误遇上Struts 2:一场优雅的异常处理盛宴,如何让错误信息成为用户体验的救星?
【8月更文挑战第31天】在Web应用开发中,异常处理对确保用户体验和系统稳定性至关重要。Struts 2 提供了完善的异常处理机制,包括 `exception` 拦截器、`ActionSupport` 类以及 OGNL 表达式,帮助开发者优雅地捕获和展示错误信息。本文详细介绍了 Struts 2 的异常处理策略,涵盖拦截器配置、错误信息展示及自定义全局异常处理器的实现方法,使应用程序更加健壮和用户友好。
36 0
|
2月前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
94 0
下一篇
无影云桌面