• 【SQL刷题】DAY16----SQL高级联结专项练习


    博主昵称:跳楼梯企鹅
    博主主页面链接:主页传送门
    博主专栏页面连接:网络安全专栏传送么门
    创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
    博主座右铭:发现光,追随光,成为光,散发光;
    博主研究方向:渗透测试、机器学习 ;
    博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

    牛客刷题:网站传送门


    目录

     一、SQL联结表

    二、刷题

    1.题目一

    (1)题目

    (2)题目难度

    (3)示例

    (4)代码

    (5)运行截图

    2.题目二

    (1)题目

    (2)题目难度

    (3)示例

    (4)代码

    (5)运行截图

    3.题目三

    (1)题目

    (2)题目难度

    (3)示例

    (4)代码

    (5)运行截图

    4.题目四

    (1)题目

    (2)题目难度

    (3)示例

    (4)代码

    (5)运行截图

    5.题目五

    (1)题目

    (2)题目难度

    (3)示例

    (4)代码

    (5)运行截图


     一、SQL联结表

    SQL最强大的功能之一就是在select中执行联结表(inner)。联结表是利用SQL的select语句能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极其重要的部分。

    二、刷题

    1.题目一

    (1)题目

    题目:检索每个顾客的名称和所有的订单号(一)

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

     

    (2)题目难度

    本题难易程度:中等

    (3)示例

    1. 输入:
    2. DROP TABLE IF EXISTS `Customers`;
    3. CREATE TABLE IF NOT EXISTS `Customers`(
    4. cust_id VARCHAR(255) NOT NULL COMMENT '客户id',
    5. cust_name VARCHAR(255) NOT NULL COMMENT '客户姓名'
    6. );
    7. INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex');
    8. DROP TABLE IF EXISTS `Orders`;
    9. CREATE TABLE IF NOT EXISTS `Orders`(
    10. order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',
    11. cust_id VARCHAR(255) NOT NULL COMMENT '顾客id'
    12. );
    13. INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
    14. 输出:
    15. an|a5
    16. andy|a1
    17. ben|a2
    18. hex|a7
    19. tom|a4
    20. tony|a3

    (4)代码

    1. SELECT
    2. C.cust_name, O.order_num
    3. FROM
    4. Customers AS C
    5. INNER JOIN Orders AS O USING(cust_id)
    6. ORDER BY
    7. C.cust_name

    (5)运行截图

    2.题目二

    (1)题目

    题目:检索每个顾客的名称和所有的订单号(二)

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

    (2)题目难度

    本题难易程度:中等

    (3)示例

    1. 输入:
    2. DROP TABLE IF EXISTS `Customers`;
    3. CREATE TABLE IF NOT EXISTS `Customers`(
    4. cust_id VARCHAR(255) NOT NULL COMMENT '客户id',
    5. cust_name VARCHAR(255) NOT NULL COMMENT '客户姓名'
    6. );
    7. INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex'),('cust40','ace');
    8. DROP TABLE IF EXISTS `Orders`;
    9. CREATE TABLE IF NOT EXISTS `Orders`(
    10. order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',
    11. cust_id VARCHAR(255) NOT NULL COMMENT '顾客id'
    12. );
    13. INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
    14. 输出:
    15. ace|None
    16. an|a5
    17. andy|a1
    18. ben|a2
    19. hex|a7
    20. tom|a4
    21. tony|a3

    (4)代码

    1. select
    2. cust_name,
    3. order_num
    4. from
    5. Customers
    6. left join Orders using(cust_id)
    7. order by
    8. cust_name asc

    (5)运行截图

    3.题目三

    (1)题目

    题目:返回产品名称和与之相关的订单号

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

    (2)题目难度

    本题难易程度:简单

    (3)示例

    1. 输入:
    2. DROP TABLE IF EXISTS `Products`;
    3. CREATE TABLE IF NOT EXISTS `Products` (
    4. `prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
    5. `prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称'
    6. );
    7. INSERT INTO `Products` VALUES ('a0001','egg'),
    8. ('a0002','sockets'),
    9. ('a0013','coffee'),
    10. ('a0003','cola'),
    11. ('a0023','soda');
    12. DROP TABLE IF EXISTS `OrderItems`;
    13. CREATE TABLE IF NOT EXISTS `OrderItems`(
    14. prod_id VARCHAR(255) NOT NULL COMMENT '产品id',
    15. order_num VARCHAR(255) NOT NULL COMMENT '商品数量'
    16. );
    17. INSERT `OrderItems` VALUES ('a0001','a105'),('a0002','a1100'),('a0002','a200'),('a0013','a1121'),('a0003','a10'),('a0003','a19'),('a0003','a5');
    18. 输出:
    19. coffee|a1121
    20. cola|a5
    21. cola|a19
    22. cola|a10
    23. egg|a105
    24. sockets|a200
    25. sockets|a1100
    26. soda|None

    (4)代码

    1. select prod_name, order_num
    2. from Products a left join OrderItems b using(prod_id)
    3. union
    4. select prod_name, order_num
    5. from Products a right join OrderItems b using(prod_id)
    6. order by prod_name

    (5)运行截图

    4.题目四

    (1)题目

    题目:返回产品名称和每一项产品的总订单数

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

    (2)题目难度

    本题难易程度:中等

    (3)示例

    1. 输入:
    2. DROP TABLE IF EXISTS `Products`;
    3. CREATE TABLE IF NOT EXISTS `Products` (
    4. `prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
    5. `prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称'
    6. );
    7. INSERT INTO `Products` VALUES ('a0001','egg'),
    8. ('a0002','sockets'),
    9. ('a0013','coffee'),
    10. ('a0003','cola'),
    11. ('a0023','soda');
    12. DROP TABLE IF EXISTS `OrderItems`;
    13. CREATE TABLE IF NOT EXISTS `OrderItems`(
    14. prod_id VARCHAR(255) NOT NULL COMMENT '产品id',
    15. order_num VARCHAR(255) NOT NULL COMMENT '商品数量'
    16. );
    17. INSERT `OrderItems` VALUES ('a0001','a105'),('a0002','a1100'),('a0002','a200'),('a0013','a1121'),('a0003','a10'),('a0003','a19'),('a0003','a5');
    18. 输出:
    19. coffee|1
    20. cola|3
    21. egg|1
    22. sockets|2
    23. soda|0

    (4)代码

    1. select
    2. prod_name,
    3. count(order_num) as orders
    4. from Products
    5. left join OrderItems using(prod_id)
    6. group by prod_name
    7. order by 1

    (5)运行截图

    5.题目五

    (1)题目

    题目:列出供应商及其可供产品的数量

    描述:列出供应商(Vendors 表中的 vend_id)及其可供产品的数量,包括没有产品的供应商。你需要使用 OUTER JOIN 和 COUNT()聚合函数来计算 Products 表中每种产品的数量,最后根据vend_id 升序排序。

    注意:vend_id 列会显示在多个表中,因此在每次引用它时都需要完全限定它。

    (2)题目难度

    本题难易程度:简单

    (3)示例

    1. 输入:
    2. DROP TABLE IF EXISTS `Vendors`;
    3. CREATE TABLE IF NOT EXISTS `Vendors` (
    4. `vend_id` VARCHAR(255) NOT NULL COMMENT 'vend名称'
    5. );
    6. INSERT INTO `Vendors` VALUES ('a0002'),
    7. ('a0013'),
    8. ('a0003'),
    9. ('a0010');
    10. DROP TABLE IF EXISTS `Products`;
    11. CREATE TABLE IF NOT EXISTS `Products` (
    12. `vend_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
    13. `prod_id` VARCHAR(255) NOT NULL COMMENT '产品名称'
    14. );
    15. INSERT INTO `Products` VALUES ('a0001','egg'),
    16. ('a0002','prod_id_iphone'),
    17. ('a00113','prod_id_tea'),
    18. ('a0003','prod_id_vivo phone'),
    19. ('a0010','prod_id_huawei phone');
    20. 输出:
    21. a0002|1
    22. a0003|1
    23. a0010|1
    24. a0013|0

    (4)代码

    1. select a.vend_id, count(prod_id) as prod_id
    2. from Vendors a
    3. left join Products b
    4. using(vend_id)
    5. group by a.vend_id
    6. order by a.vend_id

    (5)运行截图

     三、小结

    本篇文章为SQL刷题第16天

    欢迎大家一起和博主来刷题SQL刷题点击开始学习

  • 相关阅读:
    Windows共享文件夹
    【OpenCV】 车辆识别 运动目标检测
    【Unity3D编辑器开发】Unity3D中实现Transform组件拓展,快速复制、粘贴、复原【非常实用】
    vue+python基于django框架酒店餐饮管理系统
    阻止IP地址追踪的意义和编程实现
    Redis 备份恢复(持久化)手册
    【UNIX网络编程】|【06】基本UDP套接字编程【数据报丢失、性能、流量控制....】
    被报表需求逼疯的银行数据人,是时候放弃用Excel做报表了
    Js获取指定字符串指定字符位置&指定字符位置区间的子串【简单详细】
    如何理解vue声明式渲染
  • 原文地址:https://blog.csdn.net/weixin_50481708/article/details/126801264