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

SQL最强大的功能之一就是在select中执行联结表(inner)。联结表是利用SQL的select语句能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极其重要的部分。
题目:检索每个顾客的名称和所有的订单号(一)
描述:使用 INNER JOIN 编写 SQL语句,检索每个顾客的名称(Customers表中的 cust_name)和所有的订单号(Orders 表中的 order_num),最后根据顾客姓名cust_name升序返回。

本题难易程度:中等
- 输入:
-
- DROP TABLE IF EXISTS `Customers`;
- CREATE TABLE IF NOT EXISTS `Customers`(
- cust_id VARCHAR(255) NOT NULL COMMENT '客户id',
- cust_name VARCHAR(255) NOT NULL COMMENT '客户姓名'
- );
- INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex');
-
- DROP TABLE IF EXISTS `Orders`;
- CREATE TABLE IF NOT EXISTS `Orders`(
- order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',
- cust_id VARCHAR(255) NOT NULL COMMENT '顾客id'
- );
- INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
-
- 输出:
-
- an|a5
- andy|a1
- ben|a2
- hex|a7
- tom|a4
- tony|a3
- SELECT
- C.cust_name, O.order_num
- FROM
- Customers AS C
- INNER JOIN Orders AS O USING(cust_id)
- ORDER BY
- C.cust_name

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

本题难易程度:中等
- 输入:
-
- DROP TABLE IF EXISTS `Customers`;
- CREATE TABLE IF NOT EXISTS `Customers`(
- cust_id VARCHAR(255) NOT NULL COMMENT '客户id',
- cust_name VARCHAR(255) NOT NULL COMMENT '客户姓名'
- );
- INSERT `Customers` VALUES ('cust10','andy'),('cust1','ben'),('cust2','tony'),('cust22','tom'),('cust221','an'),('cust2217','hex'),('cust40','ace');
-
- DROP TABLE IF EXISTS `Orders`;
- CREATE TABLE IF NOT EXISTS `Orders`(
- order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',
- cust_id VARCHAR(255) NOT NULL COMMENT '顾客id'
- );
- INSERT `Orders` VALUES ('a1','cust10'),('a2','cust1'),('a3','cust2'),('a4','cust22'),('a5','cust221'),('a7','cust2217');
-
- 输出:
-
- ace|None
- an|a5
- andy|a1
- ben|a2
- hex|a7
- tom|a4
- tony|a3
- select
- cust_name,
- order_num
- from
- Customers
- left join Orders using(cust_id)
- order by
- cust_name asc

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

本题难易程度:简单
- 输入:
-
- DROP TABLE IF EXISTS `Products`;
- CREATE TABLE IF NOT EXISTS `Products` (
- `prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
- `prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称'
- );
- INSERT INTO `Products` VALUES ('a0001','egg'),
- ('a0002','sockets'),
- ('a0013','coffee'),
- ('a0003','cola'),
- ('a0023','soda');
-
- DROP TABLE IF EXISTS `OrderItems`;
- CREATE TABLE IF NOT EXISTS `OrderItems`(
- prod_id VARCHAR(255) NOT NULL COMMENT '产品id',
- order_num VARCHAR(255) NOT NULL COMMENT '商品数量'
- );
- INSERT `OrderItems` VALUES ('a0001','a105'),('a0002','a1100'),('a0002','a200'),('a0013','a1121'),('a0003','a10'),('a0003','a19'),('a0003','a5');
-
- 输出:
-
- coffee|a1121
- cola|a5
- cola|a19
- cola|a10
- egg|a105
- sockets|a200
- sockets|a1100
- soda|None
- select prod_name, order_num
- from Products a left join OrderItems b using(prod_id)
- union
- select prod_name, order_num
- from Products a right join OrderItems b using(prod_id)
-
- order by prod_name

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

本题难易程度:中等
- 输入:
-
- DROP TABLE IF EXISTS `Products`;
- CREATE TABLE IF NOT EXISTS `Products` (
- `prod_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
- `prod_name` VARCHAR(255) NOT NULL COMMENT '产品名称'
- );
- INSERT INTO `Products` VALUES ('a0001','egg'),
- ('a0002','sockets'),
- ('a0013','coffee'),
- ('a0003','cola'),
- ('a0023','soda');
-
- DROP TABLE IF EXISTS `OrderItems`;
- CREATE TABLE IF NOT EXISTS `OrderItems`(
- prod_id VARCHAR(255) NOT NULL COMMENT '产品id',
- order_num VARCHAR(255) NOT NULL COMMENT '商品数量'
- );
- INSERT `OrderItems` VALUES ('a0001','a105'),('a0002','a1100'),('a0002','a200'),('a0013','a1121'),('a0003','a10'),('a0003','a19'),('a0003','a5');
-
- 输出:
-
- coffee|1
- cola|3
- egg|1
- sockets|2
- soda|0
- select
- prod_name,
- count(order_num) as orders
- from Products
- left join OrderItems using(prod_id)
-
- group by prod_name
-
- order by 1

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

本题难易程度:简单
- 输入:
-
- DROP TABLE IF EXISTS `Vendors`;
- CREATE TABLE IF NOT EXISTS `Vendors` (
- `vend_id` VARCHAR(255) NOT NULL COMMENT 'vend名称'
- );
- INSERT INTO `Vendors` VALUES ('a0002'),
- ('a0013'),
- ('a0003'),
- ('a0010');
-
- DROP TABLE IF EXISTS `Products`;
- CREATE TABLE IF NOT EXISTS `Products` (
- `vend_id` VARCHAR(255) NOT NULL COMMENT '产品 ID',
- `prod_id` VARCHAR(255) NOT NULL COMMENT '产品名称'
- );
- INSERT INTO `Products` VALUES ('a0001','egg'),
- ('a0002','prod_id_iphone'),
- ('a00113','prod_id_tea'),
- ('a0003','prod_id_vivo phone'),
- ('a0010','prod_id_huawei phone');
-
- 输出:
-
- a0002|1
- a0003|1
- a0010|1
- a0013|0
- select a.vend_id, count(prod_id) as prod_id
- from Vendors a
- left join Products b
- using(vend_id)
- group by a.vend_id
- order by a.vend_id

本篇文章为SQL刷题第16天
欢迎大家一起和博主来刷题SQL刷题点击开始学习