• 不知道 MySQL 咋学?刷完牛客这 50 道题就够了!(第三篇)


    本次内容共分为十篇,每次五题,其它篇章都在我主页的Mysql专栏中!

    前言

    你是否还在烦恼 SQL 该从何学起,或者学了 SQL 想找个地方练练手?好巧不巧,最近在工作之余登上牛客,发现了牛客不知道啥时候上线了SQL 必知必会的练习题。

    《SQL 必知必会》作为麻省理工学院、伊利诺伊大学等众多大学的参考教材,由浅入深地讲解了SQL的基本概念和语法。涉及数据的排序、过滤和分组,以及表、视图、联结、子查询、游标、存储过程和触发器等内容。实例丰富,方便查阅,可以说作为一个 CRUD BOY/GIRL 必读书目。

    想着正好给它刷一遍,然后将自己刷题的一些想法总结下,于是有了今天这篇文章,希望能给需要的小伙伴一点点帮助

    SQL11 返回更多的产品

    描述

    OrderItems 表含有:订单号 order_num,quantity 产品数量

    order_numquantity
    a1105
    a21100
    a2200
    a41121
    a510
    a219
    a75

    问题

    从 OrderItems 表中检索出所有不同且不重复的订单号(order_num),其中每个订单都要包含 100 个或更多的产品。

    示例结果

    返回订单号列 order_num

    order_num
    a1
    a2
    a4

    示例

    1

    2

    3

    4

    5

    6

    DROP TABLE IF EXISTS `OrderItems`;

    CREATE TABLE IF NOT EXISTS `OrderItems`(

        order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',

        quantity VARCHAR(255) NOT NULL COMMENT '商品数量'

    );

    INSERT `OrderItems` VALUES ('a1','105'),('a2','1100'),('a2','200'),('a4','1121'),('a5','10'),('a2','19'),('a7','5')

    解答

    要筛选指定列中不重复的数据,则需要使用关键字 DISTINCT。此外,要筛选出满足指定条件的数据,则需要关键字 WHERE,然后根据题意,可以将条件写到一起,也可以将条件进行拆分后用关键字 OR 并联。

    1

    SELECT DISTINCT order_num FROM OrderItems WHERE quantity >= 100;

    1

    SELECT DISTINCT order_num FROM OrderItems WHERE quantity > 100 OR quantity = 100;

     

    SQL12 检索供应商名称

    描述

    Vendors 表有字段供应商名称(vend_name)、供应商国家(vend_country)、供应商州(vend_state)

    vend_namevend_countryvend_state
    appleUSACA
    vivoCNAshenzhen
    huaweiCNAxian

    问题

    编写 SQL 语句,从 Vendors 表中检索供应商名称(vend_name),仅返回加利福尼亚州的供应商(这需要按国家[USA]和州[CA]进行过滤,没准其他国家也存在一个 CA)

    示例答案

    返回供应商名称 vend_name

    vend_name
    apple

    示例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    DROP TABLE IF EXISTS `Vendors`;

    CREATE TABLE IF NOT EXISTS `Vendors` (

      `vend_name` VARCHAR(255) NOT NULL COMMENT 'vend名称',

      `vend_country` VARCHAR(255) NOT NULL COMMENT 'vend国家',

      `vend_state` VARCHAR(255) NOT NULL COMMENT 'vend州'

    );

    INSERT INTO `Vendors` VALUES ('apple','USA','CA'),

    ('vivo','CNA','shenzhen'),

    ('huawei','CNA','xian');

    解答

    既然要筛选出加利福利亚州的提供商,则首要条件是满足 vend_state = 'CA'。另外,除开美国有加利福利亚州之外,有可能其他国家也有加利福利亚州,所以需要对国家也进行限定,设置条件为 vend_country = 'USA'。然后用关键字 AND 将条件串联,满足这两个条件的数据则进行输出。

    1

    SELECT vend_name FROM Vendors WHERE vend_country = 'USA' AND vend_state = 'CA';

     

    SQL13 检索并列出已订购产品的清单

    描述

    OrderItems 表包含了所有已订购的产品(有些已被订购多次)。

    prod_idorder_numquantity
    BR01a1105
    BR02a21100
    BR02a2200
    BR03a41121
    BR017a510
    BR02a219
    BR017a75

    问题

    编写 SQL 语句,查找所有订购了数量至少 100 个的 BR01、BR02 或 BR03 的订单。你需要返回 OrderItems 表的订单号(order_num)、产品 ID(prod_id)和数量(quantity),并按产品 ID 和数量进行过滤。

    示例答案

    返回商品 id prod_id、订单 order_num、数量 quantity。

    order_numprod_idquantity
    a1BR01105
    a2BR021100
    a2BR02200
    a4BR031121

    示例解析

    返回的结果中,数量满足大于等于 100,且满足 prod_id 是 "BR01",“BR02”,“BR03" 中的任意一个。

    示例

    1

    2

    3

    4

    5

    6

    7

    8

    DROP TABLE IF EXISTS `OrderItems`;

    CREATE TABLE IF NOT EXISTS `OrderItems`(

        prod_id VARCHAR(255) NOT NULL COMMENT '商品号',

        order_num VARCHAR(255) NOT NULL COMMENT '商品订单号',

        quantity INT(255) NOT NULL COMMENT '商品数量'

    );

    INSERT `OrderItems` VALUES ('BR01','a1','105'),('BR02','a2','1100'),('BR02','a2','200'),('BR03','a4','1121'),('BR017','a5','10'),('BR02','a2','19'),('BR017','a7','5')

    解答

    多条件查询,将两个条件进行拆分,然后将两个查询条件进行串联即可。

    数量满足大于等于 100,则设置为 quantyty >= 100

    产品 id 满足 "BR01",“BR02”,“BR03” 中的任意一个,则使用关键字 in

    复制代码

    1

    SELECT order_num, prod_id, quantity FROM OrderItems WHERE quantity >= 100 AND prod_id IN ('BR01', 'BR02', 'BR03');

     

    SQL14 返回所有价格在 3 美元到 6 美元之间的产品的名称和价格

    描述

    有表 Products

    prod_idprod_nameprod_price
    a0011egg3
    a0019sockets4
    b0019coffee15

    问题

    编写 SQL 语句,返回所有价格在 3 美元到 6 美元之间的产品的名称(prod_name)和价格(prod_price),使用 AND 操作符,然后按价格对结果进行升序排序

    示例结果

    返回商品名称 prod_name 和商品价格 prod_price

    prod_nameprod_price
    egg3
    sockets4

    注:不需要考虑价格相同时的排序问题

    示例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    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 '产品名称',

    `prod_price` INT(255) NOT NULL COMMENT '产品价格'

    );

    INSERT INTO `Products` VALUES ('a0011','egg',3),

    ('a0019','sockets',4),

    ('b0019','coffee',15);

    解答

    两个条件,首先是价格介于 3 到 6 美元,则可以使用关键字 BETWEEN … AND …。另外,按价格升序排序,则使用关键字 ORDER BY

    1

    SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 3 AND 6 ORDER BY prod_price;

    题目中指定需要使用关键字 AND,则需要将价格条件替换成 prod_price >= 3prod_price <= 6 两个条件,然后将其串联。

    1

    SELECT prod_name, prod_price FROM Products WHERE prod_price >= 3 AND prod_price <= 6 ORDER BY prod_price;

     

    SQL15 纠错2

    描述

    供应商表 Vendors 有字段供应商名称 vend_name、供应商国家 vend_country、供应商省份 vend_state

    vend_namevend_countryvend_state
    appleUSACA
    vivoCNAshenzhen
    huaweiCNAxian

    问题

    修改正确下面 sql,使之正确返回

    1

    2

    3

    4

    SELECT vend_name

    FROM Vendors

    ORDER BY vend_name

    WHERE vend_country = 'USA' AND vend_state = 'CA';

    示例结果

    结果返回 vend_name

    vend_name
    apple

    示例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    DROP TABLE IF EXISTS `Vendors`;

    CREATE TABLE IF NOT EXISTS `Vendors` (

      `vend_name` VARCHAR(255) NOT NULL COMMENT 'vend名称',

      `vend_country` VARCHAR(255) NOT NULL COMMENT 'vend国家',

      `vend_state` VARCHAR(255) NOT NULL COMMENT 'vend州'

    );

    INSERT INTO `Vendors` VALUES ('apple','USA','CA'),

    ('beef noodle king','USA','CA'),

    ('vivo','CNA','shenzhen'),

    ('huawei','CNA','xian');

    解答

    主要是一处错误,搞错了关键字 WHEREORDER BY 的先后顺序,正确的 SQL 语句格式为:

    1

    SELECT [列名] FOMR [表名] WHERE [条件] ORDER BY [列名];

    1

    SELECT vend_name FROM Vendors WHERE vend_country = 'USA' AND vend_state = 'CA' ORD

     

  • 相关阅读:
    Ansible 面板工具之AWK ( Anssible Tower )界面介绍
    Android面试整理之SQLite数据库——sql语句和常用函数(一)
    公交查询系统
    结合protobuf和socket实现多进程通讯
    基于Echarts实现可视化数据大屏产业大数据指挥舱系统
    英语词典缩略词
    go并发操作且限制数量
    2.5 C++面向对象编程_类型转换
    poi-tl:基于Apache POI的轻量级Word模板引擎
    嵌入式分享合集24
  • 原文地址:https://blog.csdn.net/w20001118/article/details/125873017