【SQL合集-SQL必知必会】

题库【牛客】
1、编写 SQL 语句,从 Customers 表中检索所有的cust_id

select cust_id from Customers ;

避免使用*

2、表OrderItems含有非空的列prod_id代表商品id,包含了所有已订购的商品(有些已被订购多次);编写SQL 语句,检索并列出所有已订购商品(prod_id)的去重后的清单。

select distinct prod_id  from OrderItems ;

distinct去重的使用,在列的前面使用

3、现在有Customers 表(表中含有列cust_id代表客户id,cust_name代表客户姓名);需要编写 SQL语句,检索所有列。

select cust_id, cust_name from Customers ;

题目意思就是查询全表,尽量不要使用*

4、有表Customers,cust_id代表客户id,cust_name代表客户姓名;从 Customers 中检索所有的顾客名称(cust_name),并按从 Z 到 A 的顺序显示结果。

select cust_name from Customers order by cust_name DESC;

排序order by ,倒叙DESC

5、有Orders表;编写 SQL 语句,从 Orders 表中检索顾客 ID(cust_id)和订单号(order_num),并先按顾客 ID 对结果进行排序,再按订单日期倒序排列;

select cust_id, order_num from Orders order by cust_id, order_date DESC;

按多个列排序时,只需要一个order,排序规则依次顺序。

6、假设有一个OrderItems表;编写 SQL 语句,显示 OrderItems 表中的数量(quantity)和价格(item_price),并按数量由多到少、价格由高到低排序。

select quantity, item_price from OrderItems order by quantity DESC, item_price DESC;

7、有Vendors表
vend_name
海底捞
小龙坎
大龙燚
【问题】下面的 SQL 语句有问题吗?尝试将它改正确,使之能够正确运行,并且返回结果根据vend_name逆序排列

SELECT vend_name, 
FROM Vendors 
ORDER vend_name DESC;

错误

SELECT vend_name FROM Vendors ORDER BY vend_name DESC;

8、有表Products,从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9.49 美元的产品。

select  prod_id,  prod_name from Products where prod_price = 9.49;

where 查询

9、Products 表;编写 SQL 语句,从 Products 表中检索产品 ID(prod_id)和产品名称(prod_name),只返回价格为 9 美元或更高的产品。

select prod_id, prod_name from Products where prod_price >= 9;

10、有Products 表;编写 SQL 语句,返回 Products 表中所有价格在 3 美元到 6 美元之间的产品的名称(prod_name)和价格(prod_price),然后按价格对结果进行排序

select
  prod_name,
  prod_price
from
  Products
where
  prod_price >= 3
  and prod_price <= 6
order by
  prod_price;

或者

select
  prod_name,
  prod_price
from
  Products
where
  prod_price between 3 and 6
order by
  prod_price;

使用between或者两段逻辑判断

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

select DISTINCT order_num from OrderItems where quantity >= 100;

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

select vend_name from Vendors where vend_country = 'USA' and vend_state = 'CA';

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

select
  order_num,
  prod_id,
  quantity
from
  OrderItems
where
  quantity >= 100
  and prod_id in ('BR01', 'BR02', 'BR03');

prod_id 是字符串,里面的元素同样为字符串结构

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

select
  prod_name,
  prod_price
from
  Products
where
  prod_price between 3 and 6
order by
  prod_price;

15、纠错

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

where在order by 之前

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

16、Products表;编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回描述中包含 toy 一词的产品名称

select
  prod_name,
  prod_desc
from
  Products
where
  prod_desc like '%toy%';

17、Products表;编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回描述中未出现 toy 一词的产品,最后按”产品名称“对结果进行排序。

select
  prod_name,
  prod_desc
from
  Products
where
  prod_desc not like '%toy%'
order by
  prod_name;

18、Products表;编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回描述中同时出现 toy 和 carrots 的产品。有好几种方法可以执行此操作,但对于这个挑战题,请使用 AND 和两个 LIKE 比较。

select
  prod_name,
  prod_desc
from
  Products
where
  prod_desc like '%toy%'
  and prod_desc like '%carrots%';

19、Products表;编写 SQL 语句,从 Products 表中检索产品名称(prod_name)和描述(prod_desc),仅返回在描述中以先后顺序同时出现 toy 和 carrots 的产品。提示:只需要用带有三个 % 符号的 LIKE 即可。

select
  prod_name,
  prod_desc
from
  Products
where
  prod_desc like '%toy%carrots%';

指定先后顺序

20、别名的常见用法是在检索出的结果中重命名表的列字段(为了符合特定的报表要求或客户需求)。有表Vendors代表供应商信息,vend_id供应商id、vend_name供应商名称、vend_address供应商地址、vend_city供应商城市;编写 SQL 语句,从 Vendors 表中检索vend_id、vend_name、vend_address 和 vend_city,将 vend_name重命名为 vname,将 vend_city 重命名为 vcity,将 vend_address重命名为 vaddress,按供应商名称对结果进行升序排序。

select
  vend_id,
  vend_name as vname,
  vend_address as vaddress,
  vend_city as vcity
from
  Vendors
order by
  vname;

使用AS别名列名,最后的排序可以使用别名也可以使用原列名。

21、我们的示例商店正在进行打折促销,所有产品均降价 10%。Products表包含prod_id产品id、prod_price产品价格;编写 SQL语句,从 Products 表中返回 prod_id、prod_price 和 sale_price。sale_price 是一个包含促销价格的计算字段。提示:可以乘以 0.9,得到原价的 90%(即 10%的折扣)

select
  prod_id,
  prod_price,
  prod_price * 0.9 as sale_price
from
  Products;

AS可以不加,效果一样

22、我们的商店已经上线了,正在创建顾客账户。所有用户都需要登录名,默认登录名是其名称和所在城市的组合;
给出 Customers表 如下:
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(cust_id)、顾客名称(cust_name)和登录名(user_login),其中登录名全部为大写字母,并由顾客联系人的前两个字符(cust_contact)和其所在城市的前三个字符(cust_city)组成。提示:需要使用函数、拼接和别名。

select
  cust_id,
  cust_name,
  UPPER(
    concat(
      substring(cust_contact, 1, 2),
      substring(cust_city, 1, 3)
    )
  ) AS user_login
from
  Customers;

三个知识点:
1、大小写,语法和python类似,upper;
2、拼接,concat;
3、取字符串字符,substring;

23、Orders订单表;编写 SQL 语句,返回 2020 年 1 月的所有订单的订单号(order_num)和订单日期(order_date),并按订单日期升序排序

select
  order_num,
  order_date
from
  Orders
where
  DATE_FORMAT(order_date, '%Y-%m') = '2020-01'
order by
  order_date;

date_format函数,分割

24、OrderItems表代表售出的产品,quantity代表售出商品数量;编写 SQL 语句,确定已售出产品的总数;返回items_ordered列名,表示已售出商品的总数。

select
  sum(quantity) as items_ordered
from
  OrderItems;

sum()计数函数

25、OrderItems表代表售出的产品,quantity代表售出商品数量,产品项为prod_id;修改创建的语句,确定已售出产品项(prod_id)为"BR01"的总数;返回商品项已订购订单数;

select
  sum(quantity) as items_ordered
from
  OrderItems
where
  prod_id = 'BR01';

26、Products 表;编写 SQL 语句,确定 Products 表中价格不超过 10 美元的最贵产品的价格(prod_price)。将计算所得的字段命名为 max_price;

select 
  max(prod_price) as max_price
from
  Products
where
  prod_price <= 10;

27、OrderItems 表包含每个订单的每个产品;编写 SQL 语句,返回每个订单号(order_num)各有多少行数(order_lines),并按 order_lines对结果进行升序排序;返回订单号order_num和对应订单号的行数order_lines

select
  order_num,
  count(order_num) as order_lines
from
  OrderItems
GROUP BY
  order_num
order by
  order_lines;

需要加group by order_num ,去重

28、有Products表,含有字段prod_price代表产品价格,vend_id代表供应商id;编写 SQL 语句,返回名为 cheapest_item 的字段,该字段包含每个供应商成本最低的产品(使用 Products 表中的 prod_price),然后从最低成本到最高成本对结果进行升序排序;返回供应商id vend_id和对应供应商成本最低的产品cheapest_item。

select
  vend_id,
  min(prod_price) as cheapest_item
from
  Products
group by
  vend_id
order by
  cheapest_item;

29、OrderItems代表订单商品表,包括:订单号order_num和订单数量quantity;请编写 SQL 语句,返回订单数量总和不小于100的所有订单号,最后结果按照订单号升序排序。
【示例结果】返回order_num订单号。

select
  order_num
from
  OrderItems
group by
  order_num
having
  sum(quantity) >= 100
order by
  order_num;

having的用法,先分组再过滤;where 不能跟聚合函数一起使用

30、OrderItems表代表订单信息,包括字段:订单号order_num和item_price商品售出价格、quantity商品数量;编写 SQL 语句,根据订单号聚合,返回订单总价不小于1000 的所有订单号,最后的结果按订单号进行升序排序。
提示:总价 = item_price 乘以 quantity

select
  order_num,
  sum(item_price * quantity) as total_price
from
  OrderItems
group by
  order_num
having total_price >= 1000
order by
  order_num;

31、OrderItems表含有order_num订单号;将下面代码修改正确后执行;返回订单号order_num和出现的次数items
原始

SELECT order_num, COUNT(*) AS items 
FROM OrderItems 
GROUP BY items 
HAVING COUNT(*) >= 3 
ORDER BY items, order_num;

修改后

SELECT
  order_num,
  COUNT(order_num) AS items
FROM
  OrderItems
GROUP BY
  order_num
HAVING
  items  >= 3
ORDER BY
    items,
    order_num;

修改位置:group by

32、OrderItems表示订单商品表,含有字段订单号:order_num、订单价格:item_price;Orders表代表订单信息表,含有顾客id:cust_id和订单号:order_num;使用子查询,返回购买价格为 10 美元或以上产品的顾客列表,结果无需排序。
注意:你需要使用 OrderItems 表查找匹配的订单号(order_num),然后使用Order 表检索这些匹配订单的顾客 ID(cust_id)。

select
  cust_id
from
  Orders
where
  order_num in (
    select
      order_num
    from
      OrderItems
    where
      item_price >= 10
  );

子查询

33、表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date
OrderItems表;编写 SQL 语句,使用子查询来确定哪些订单(在 OrderItems 中)购买了 prod_id 为 “BR01” 的产品,然后从 Orders 表中返回每个产品对应的顾客 ID(cust_id)和订单日期(order_date),按订购日期对结果进行升序排序;返回顾客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 ;

34、你想知道订购 BR01 产品的日期,有表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date;Customers表含有cust_email 顾客邮件和cust_id顾客id;Customers表代表顾客信息,cust_id为顾客id,cust_email为顾客email;返回购买 prod_id 为BR01 的产品的所有顾客的电子邮件(Customers 表中的 cust_email),结果无需排序。
提示:这涉及 SELECT 语句,最内层的从 OrderItems 表返回 order_num,中间的从 Customers 表返回 cust_id。

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'
      )
  )

35、我们需要一个顾客 ID 列表,其中包含他们已订购的总金额。
OrderItems表代表订单信息,OrderItems表有订单号:order_num和商品售出价格:item_price、商品数量:quantity;Orders表订单号:order_num、顾客id:cust_id;编写 SQL语句,返回顾客 ID(Orders 表中的 cust_id),并使用子查询返回total_ordered 以便返回每个顾客的订单总数,将结果按金额从大到小排序。
提示:你之前已经使用 SUM()计算订单总数。

select
  cust_id,
  sum(quantity * item_price) as total_ordered
from
  Orders, OrderItems
where Orders.order_num = OrderItems.order_num
GROUP BY cust_id
order by
  total_ordered desc;

36、Products 表中检索所有的产品名称:prod_name、产品id:prod_id;OrderItems代表订单商品表,订单产品:prod_id、售出数量:quantity;编写 SQL 语句,从 Products 表中检索所有的产品名称(prod_name),以及名为 quant_sold 的计算列,其中包含所售产品的总数(在 OrderItems 表上使用子查询和 SUM(quantity)检索);返回产品名称prod_name和产品售出数量总和

select
  prod_name,
  (
    select
      sum(quantity)
    from
      OrderItems
    where
      Products.prod_id = OrderItems.prod_id
    group by
      prod_id
  ) as quant_sold
from
  Products;

37、Customers 表有字段顾客名称cust_name、顾客id cust_id;Orders订单信息表,含有字段order_num订单号、cust_id顾客id;编写 SQL 语句,返回 Customers 表中的顾客名称(cust_name)和Orders 表中的相关订单号(order_num),并按顾客名称再按订单号对结果进行升序排序。你可以尝试用两个不同的写法,一个使用简单的等联结语法,另外一个使用 INNER JOIN。

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

38、Customers 表有字段,顾客名称:cust_name、顾客id:cust_id;Orders订单信息表,含有字段,订单号:order_num、顾客id:cust_id;OrderItems表有字段,商品订单号:order_num、商品数量:quantity、商品价格:item_price;除了返回顾客名称和订单号,返回 Customers 表中的顾客名称(cust_name)和Orders 表中的相关订单号(order_num),添加第三列 OrderTotal,其中包含每个订单的总价,并按顾客名称再按订单号对结果进行升序排序。

【示例结果】返回顾客名称 cust_name、订单号order_num、订单总额OrderTotal

select
  c.cust_name,
  o2.order_num,
  sum(quantity * item_price) as OrderTotal
from
  Customers as c
  inner join Orders as o1 on c.cust_id = o1.cust_id
  inner join OrderItems as o2 on o2.order_num = o1.order_num
group by
  cust_name,
  o2.order_num
order by
  cust_name,
  o2.order_num;

39、表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date
OrderItems表;编写 SQL 语句,使用子查询来确定哪些订单(在 OrderItems 中)购买了 prod_id 为 “BR01” 的产品,然后从 Orders 表中返回每个产品对应的顾客 ID(cust_id)和订单日期(order_date),按订购日期对结果进行升序排序。
提示:这一次使用联结和简单的等联结语法。
【示例结果】
返回顾客id cust_id和定单日期order_date

select
  o2.cust_id,
  o2.order_date
from
  Orders o2
  inner join OrderItems  o1 on o1.order_num = o2.order_num
where
  o1.prod_id = 'BR01'
order by
  o2.order_date;

40、有表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date;Customers表含有cust_email 顾客邮件和cust_id顾客id;回购买 prod_id 为BR01 的产品的所有顾客的电子邮件(Customers 表中的 cust_email),结果无需排序。
提示:涉及到 SELECT 语句,最内层的从 OrderItems 表返回 order_num,中间的从 Customers 表返回 cust_id,但是必须使用 INNER JOIN 语法。
【示例结果】返回顾客email cust_email

select
  c.cust_email
from
  Customers as c
  inner join Orders as o2 on o2.cust_id = c.cust_id
  inner join OrderItems as o1 on o1.order_num = o2.order_num
where
  o1.prod_id = 'BR01';

41、OrderItems表代表订单信息,确定最佳顾客的另一种方式是看他们花了多少钱,OrderItems表有订单号order_num和item_price商品售出价格、quantity商品数量;编写 SQL 语句,返回订单总价不小于1000 的客户名称和总额(OrderItems 表中的order_num)。
提示:需要计算总和(item_price 乘以 quantity)。按总额对结果进行排序,请使用INNER JOIN 语法。

select
  c.cust_name,
  tb.total_price
from
  Customers as c
  inner join Orders as o2 on o2.cust_id = c.cust_id
  inner join (
    select
      o1.order_num,
      sum(o1.item_price * o1.quantity) as total_price
    from
      OrderItems as o1
    group by
      o1.order_num
    having
      total_price >= 1000
  ) as tb on o2.order_num = tb.order_num
order by
  tb.total_price;

转一个表连接

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

select
  c.cust_name,
  o.order_num
from
  Customers as c
  inner join Orders as o on c.cust_id = o.cust_id
order by
  c.cust_name;

43、Orders表代表订单信息含有订单号order_num和顾客id cust_id;Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name;检索每个顾客的名称(Customers表中的 cust_name)和所有的订单号(Orders 表中的 order_num),列出所有的顾客,即使他们没有下过订单。最后根据顾客姓名cust_name升序返回。
【示例结果】
返回顾客名称cust_name和订单号order_num

select
  c.cust_name,
  o.order_num
from
  Customers as c
  left join Orders as o on o.cust_id = c.cust_id
order by
  cust_name;

44、Products表为产品信息表含有字段prod_id产品id、prod_name产品名称;OrderItems表为订单信息表含有字段order_num订单号和产品id prod_id;使用 OUTER JOIN 联结 Products 表和 OrderItems 表,返回产品名称(prod_name)和与之相关的订单号(order_num)的列表,并按照产品名称升序排序。
【示例结果】
返回产品名称prod_name和订单号order_num

select
  p.prod_name,
  o.order_num
from
  Products as p 
  left outer join OrderItems as o on p.prod_id = o.prod_id
order by
  p.prod_name;

45、Products表为产品信息表含有字段prod_id产品id、prod_name产品名称;OrderItems表为订单信息表含有字段order_num订单号和产品id prod_id;使用 OUTER JOIN 联结 Products 表和 OrderItems 表,返回产品名称(prod_name)和每一项产品的总订单数(不是订单号),并按产品名称升序排序;返回产品名称prod_name和订单号订单数orders

select
  a.prod_name,
  count(b.order_num) as orders
from
  Products a
  left join OrderItems b on a.prod_id = b.prod_id
group by
  a.prod_name
order by
  a.prod_name asc;

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

select
  v.vend_id,
  count(p.vend_id) as prod_id
from
  Vendors as v
  left join Products as p on v.vend_id = p.vend_id
group by
  v.vend_id
order by
  v.vend_id;

47、表OrderItems包含订单产品信息,字段prod_id代表产品id、quantity代表产品数量;将两个 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;

48、表OrderItems包含订单产品信息,字段prod_id代表产品id、quantity代表产品数量;将两个 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代表产品名称;Customers表代表顾客信息,cust_name代表顾客名称;编写 SQL 语句,组合 Products 表中的产品名称(prod_name)和 Customers 表中的顾客名称(cust_name)并返回,然后按产品名称对结果进行升序排序。

select
  prod_name
from
  Products
union
select
  cust_name as prod_name
from
  Customers
order by
  prod_name;

50、表Customers含有字段cust_name顾客名、cust_contact顾客联系方式、cust_state顾客州、cust_email顾客email;返回顾客名称:cust_name、顾客联系方式:cust_contact、顾客email:cust_email;返回住在"IL"和"MI"的顾客信息,最后根据顾客名称升序排序。
纠错:

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;

改正:order by使用union组合查询时,只能使用一条order by字句,他必须位于最后一条select语句之后,因为对于结果集不存在对于一部分数据进行排序,而另一部分用另一种排序规则的情况。

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值