SQL力扣练习(十一)

这篇具有很好参考价值的文章主要介绍了SQL力扣练习(十一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.树节点(608)

示例 1

解法一(case when)

解法二(not in)

2.判断三角形(610)

示例 1

解法一(case when)

解法二(if)

解法三(嵌套if)

3.只出现一次的最大数字(619)

示例 1

解法一(count limit)

解法二(max)

4.有趣的电影(620)

解法一

5.换座位(626)

示例 1

解法一(case when)

解法二(count mod case-when)

解法三(union)

解法四(Lag/Lead)

6.变更性别(627)

示例 1

解法一(case when)

解法二(if)

7.买下所以产品的客户(1045)

示例 1

解法一(count)

解法二(嵌套select)


1.树节点(608)

表:Tree

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| p_id        | int  |
+-------------+------+
id 是该表中具有唯一值的列。
该表的每行包含树中节点的 id 及其父节点的 id 信息。
给定的结构总是一个有效的树。

树中的每个节点可以是以下三种类型之一:

  • "Leaf":节点是叶子节点。
  • "Root":节点是树的根节点。
  • "lnner":节点既不是叶子节点也不是根节点。

编写一个解决方案来报告树中每个节点的类型。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1

SQL力扣练习(十一),SQL练习(力扣版),sql,java,数据库

输入:
Tree table:
+----+------+
| id | p_id |
+----+------+
| 1  | null |
| 2  | 1    |
| 3  | 1    |
| 4  | 2    |
| 5  | 2    |
+----+------+
输出:
+----+-------+
| id | type  |
+----+-------+
| 1  | Root  |
| 2  | Inner |
| 3  | Leaf  |
| 4  | Leaf  |
| 5  | Leaf  |
+----+-------+
解释:
节点 1 是根节点,因为它的父节点为空,并且它有子节点 2 和 3。
节点 2 是一个内部节点,因为它有父节点 1 和子节点 4 和 5。
节点 3、4 和 5 是叶子节点,因为它们有父节点而没有子节点。

解法一(case when)

首先根节点很好判断,先用一个flag 区分出根和非根,然后用p_id是否含有id,根据这个标准判断是否叶节点.

# Write your MySQL query statement below
select id,case 
when flag=0 then 'Root'
when p_id is not null then 'Inner' 
else 'Leaf'
end as type
from  (select id,if((p_id is null),0,1) flag from tree ) a 
left join
(select p_id from tree where p_id is not null group by p_id) b 
on a.id=b.p_id

解法二(not in)

用case when,先判断是否根节点,然后根据一个内查询再区分是否叶节点,这个方法虽然简单点,但not in 较为损耗性能,总体速度与解法一差不多.

SELECT
    id,
    (
        CASE
            WHEN p_id IS NULL THEN 'Root'
            WHEN id NOT IN(
                SELECT
                    p_id
                FROM tree
                WHERE p_id IS NOT NULL
            ) THEN 'Leaf'
            ELSE 'Inner'
        END
    )as type
FROM tree

2.判断三角形(610)

表: Triangle

+-------------+------+
| Column Name | Type |
+-------------+------+
| x           | int  |
| y           | int  |
| z           | int  |
+-------------+------+
在 SQL 中,(x, y, z)是该表的主键列。
该表的每一行包含三个线段的长度。

对每三个线段报告它们是否可以形成一个三角形。

以 任意顺序 返回结果表。

查询结果格式如下所示。

示例 1

输入: 
Triangle 表:
+----+----+----+
| x  | y  | z  |
+----+----+----+
| 13 | 15 | 30 |
| 10 | 20 | 15 |
+----+----+----+
输出: 
+----+----+----+----------+
| x  | y  | z  | triangle |
+----+----+----+----------+
| 13 | 15 | 30 | No       |
| 10 | 20 | 15 | Yes      |
+----+----+----+----------+

解法一(case when)

利用三角形两边之和大于第三边性质.

# Write your MySQL query statement below
select *,
case when (x+y)>z and  (x+z)>y and (y+z)>x then 'Yes'
else 'No'
end as triangle
from triangle

解法二(if)

Select *,IF(x+y>z and x+z>y and y+z>x, "Yes", "No") AS triangle
FROM triangle

解法三(嵌套if)

这个是力扣上的友友写的,他的速度是最快的.

原理:x + y + z > 2 * max(x, y, z) [x + y + z > z + z, 三条件组合]

select x, y, z, 
if(x + y + z > 2 * if(x > y and x > z, x, if(y > x and y > z, y, z)), 'Yes', 'No') triangle 
from Triangle

3.只出现一次的最大数字(619)

MyNumbers 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| num         | int  |
+-------------+------+
该表可能包含重复项(换句话说,在SQL中,该表没有主键)。
这张表的每一行都含有一个整数。

单一数字 是在 MyNumbers 表中只出现一次的数字。

找出最大的 单一数字 。如果不存在 单一数字 ,则返回 null 。

查询结果如下例所示。

示例 1

输入:
MyNumbers 表:
+-----+
| num |
+-----+
| 8   |
| 8   |
| 3   |
| 3   |
| 1   |
| 4   |
| 5   |
| 6   |
+-----+
输出:
+-----+
| num |
+-----+
| 6   |
+-----+
解释:单一数字有 1、4、5 和 6 。
6 是最大的单一数字,返回 6 。

解法一(count limit)

首先根据count()选出只出现一次的数,然后排序加分页选出最大一个.

# Write your MySQL query statement below
select 
case 
when count(*)=1 then num
when num is null then null
end as 'num' from MyNumbers group by num  order by num desc limit 1

解法二(max)

因为本题出现了null.所以我们需要null的数据,下面是从网上找的一些总结,发现,原来一些聚合函数自带null.本方法较快

# Write your MySQL query statement below
# 表格为空,加入任何SUM/AVG/MAX/MIN函数,都可以得到null值的结果。
# 可以使用聚合函数进行空值null值的转换,具体的聚合函数包括SUM/AVG/MAX/MIN
# 可以使用select语句进行转换,但空值应直接写在select中而非from中
# limit语句无法出现新的null值
# where和having同样无法出现新的null值

# ifnull函数定位:用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
#   IFNULL(expression, alt_value)

SELECT
    MAX(num) AS num
FROM
    (SELECT
        num
    FROM
        MyNumbers
    GROUP BY num
    HAVING COUNT(num) = 1) AS t
;

4.有趣的电影(620)

某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。

作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

例如,下表 cinema:

+---------+-----------+--------------+-----------+
|   id    | movie     |  description |  rating   |
+---------+-----------+--------------+-----------+
|   1     | War       |   great 3D   |   8.9     |
|   2     | Science   |   fiction    |   8.5     |
|   3     | irish     |   boring     |   6.2     |
|   4     | Ice song  |   Fantacy    |   8.6     |
|   5     | House card|   Interesting|   9.1     |
+---------+-----------+--------------+-----------+

对于上面的例子,则正确的输出是为:

+---------+-----------+--------------+-----------+
|   id    | movie     |  description |  rating   |
+---------+-----------+--------------+-----------+
|   5     | House card|   Interesting|   9.1     |
|   1     | War       |   great 3D   |   8.9     |
+---------+-----------+--------------+-----------+

解法一

# Write your MySQL query statement below
select * from cinema where description !='boring' and id%2=1 order by rating desc

5.换座位(626)

表: Seat

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
id是该表的主键(唯一值)列。
该表的每一行都表示学生的姓名和 ID。
id 是一个连续的增量。

编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。

按 id 升序 返回结果表。

查询结果格式如下所示。

示例 1

输入: 
Seat 表:
+----+---------+
| id | student |
+----+---------+
| 1  | Abbot   |
| 2  | Doris   |
| 3  | Emerson |
| 4  | Green   |
| 5  | Jeames  |
+----+---------+
输出: 
+----+---------+
| id | student |
+----+---------+
| 1  | Doris   |
| 2  | Abbot   |
| 3  | Green   |
| 4  | Emerson |
| 5  | Jeames  |
+----+---------+
解释:
请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。

解法一(case when)

用左连接将三个表连接起来,然后用case when判断是否空就行.这个是修改名字

select a.id,case when b.student is not null then b.student
when c.student is not null then c.student
else a.student
end as 'student' from seat a left join seat b on a.id=b.id-1 and a.id%2=1 
left join seat c on a.id=c.id+1 and a.id%2=0

解法二(count mod case-when)

用count区分总数是单还是双,然后用case判断id,这个是变相修改id

SELECT
    (CASE
        WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
        WHEN MOD(id, 2) != 0 AND counts = id THEN id
        ELSE id - 1
    END) AS id,
    student
FROM
    seat,
    (SELECT
        COUNT(*) AS counts
    FROM
        seat) AS seat_counts
ORDER BY id ASC;

解法三(union)

使用left join和union实现 先改奇数id学生的名字,再改偶数id学生的名字,全改过来后,

再union合并所有的id

select a.id as id,ifnull(b.student,a.student) as student from Seat as a
left join (
  select * from Seat
  where mod(id,2) = 0
) as b
on (a.id+1) = b.id
where mod(a.id,2) = 1
union
select c.id as id,d.student as student from Seat as c
left join (
  select * from Seat
  where mod(id,2) = 1
) as d
on (c.id-1) = d.id
where mod(c.id,2) = 0
order by id asc;

解法四(Lag/Lead)

Lag/Lead(col,n,DEFAULT) 用于统计窗口内当前行往前或者往后第n行值

  • 第一个参数为列名,
  • 第二个参数为往后/前第n行(可选,默认为1),
  • 第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

需要注意的是lag 取得是当前行之前的数据,lead 取的实当前行之后的数据

SELECT 
    id,
    IF(id % 2 = 0, last, next) student
FROM (
    SELECT 
    id,student,
    lag(student,1,student) over(order by id) last,
    lead(student,1,student) over(order by id) next
    FROM seat
) t;

6.变更性别(627)

Salary 表:

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| id          | int      |
| name        | varchar  |
| sex         | ENUM     |
| salary      | int      |
+-------------+----------+
id 是这个表的主键。
sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
本表包含公司雇员的信息。

请你编写一个 SQL 查询来交换所有的 'f' 和 'm' (即,将所有 'f' 变为 'm' ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。

注意,你必须仅使用一条 update 语句,且 不能 使用 select 语句。

查询结果如下例所示。

示例 1

输入:
Salary 表:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1  | A    | m   | 2500   |
| 2  | B    | f   | 1500   |
| 3  | C    | m   | 5500   |
| 4  | D    | f   | 500    |
+----+------+-----+--------+
输出:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1  | A    | f   | 2500   |
| 2  | B    | m   | 1500   |
| 3  | C    | f   | 5500   |
| 4  | D    | m   | 500    |
+----+------+-----+--------+
解释:
(1, A) 和 (3, C) 从 'm' 变为 'f' 。
(2, B) 和 (4, D) 从 'f' 变为 'm' 。

解法一(case when)

# Write your MySQL query statement below
update salary set sex=(
  case when sex='m' then 'f'
  else 'm'
  end
)

解法二(if)

# Write your MySQL query statement below
update salary set sex=(if(sex='m','f','m'))

解法三(replace)

最快

# replace(‘总字符串’,要下场的字符,要上场的字符)
update salary set sex = replace("fm", sex, "")

7.买下所以产品的客户(1045)

Customer 表:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| customer_id | int     |
| product_key | int     |
+-------------+---------+
该表可能包含重复的行。
customer_id 不为 NULL。
product_key 是 Product 表的外键(reference 列)。

Product 表:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_key | int     |
+-------------+---------+
product_key 是这张表的主键(具有唯一值的列)。

编写解决方案,报告 Customer 表中购买了 Product 表中所有产品的客户的 id。

返回结果表 无顺序要求 。

返回结果格式如下所示。

示例 1

输入:
Customer 表:
+-------------+-------------+
| customer_id | product_key |
+-------------+-------------+
| 1           | 5           |
| 2           | 6           |
| 3           | 5           |
| 3           | 6           |
| 1           | 6           |
+-------------+-------------+
Product 表:
+-------------+
| product_key |
+-------------+
| 5           |
| 6           |
+-------------+
输出:
+-------------+
| customer_id |
+-------------+
| 1           |
| 3           |
+-------------+
解释:
购买了所有产品(5 和 6)的客户的 id 是 1 和 3 。

解法一(count)

根据数量判断

# Write your MySQL query statement below
select customer_id from customer group by customer_id 
having count(distinct product_key)=(select count(*) from product)

解法二(嵌套select)

SELECT customer_id, product_key 

FROM Customer GROUP BY customer_id, product_key

这段用来去重,然后从这里再分组count,最后根据产品数量比较文章来源地址https://www.toymoban.com/news/detail-658420.html

# Write your MySQL query statement below
SELECT customer_id 
FROM (SELECT customer_id, COUNT(*) AS 'number' 
FROM (SELECT customer_id, product_key 
FROM Customer GROUP BY customer_id, product_key) a
GROUP BY customer_id) b 
WHERE number = (SELECT COUNT(DISTINCT product_key) FROM Product);

到了这里,关于SQL力扣练习(十一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Linux操作系统中的MySQL数据库SQL语句(三十一)

    MySQL数据库SQL语句 目录 一、SQL语句类型 1、DDL 2、DML 3、DCL 4、DQL 二、数据库操作 1、查看 2、创建 2.1、默认字符集 2.2、指定字符集 3、进入  4、删除 5、更改 6、练习 三、数据表操作 (一)数据类型 1、数值类型 1.1、TINYINT 1.2、SMALLINT 1.3、INT 1.4、BIGINT 1.5、FLOAT(M,D) 2、时间

    2024年02月15日
    浏览(68)
  • SQL力扣练习(四)

    表: Employee   编写一个SQL查询来查找收入比经理高的员工。   示例 1: 在这里普及一下连接小知识。 1.​Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全

    2024年02月12日
    浏览(30)
  • SQL力扣练习(九)

    目录 1.订单最多的用户(586) 示例 1 解法一(limit) 解法二(dense_rank()) 2.体育馆的人流量 示例 1 解法一(临时表) 解法二(三表法) 表:  Orders 查找下了  最多订单  的客户的  customer_number  。 测试用例生成后,  恰好有一个客户  比任何其他客户下了更多的订单。 查询结果格式如

    2024年02月14日
    浏览(34)
  • SQL力扣练习(六)

    目录 1. 部门工资前三高的所有员工(185) 题解一(dense_rank()窗口函数) 题解二(自定义函数)  2.删除重复的电子邮箱(196) 题解一 题解二(官方解析) 3.上升的温度(197) 解法一(DATEDIFF()) 解法二(TIMESTAMPDIFF()) 解法三(ADDDATE()力扣) 表:  Employee 表:  Department 公司的主管们感

    2024年02月13日
    浏览(32)
  • SQL力扣练习(八)

    目录 1.至少有五名直接下属的经理(570) 方法一(in) 方法二(join) 方法三(row_number) 方法四(自连接) 2.员工奖金(577) 方法一(left join) 3.寻找用户推荐人(584) 方法一 4.2016年的投资(585) 示例 方法一(join,count) 方法二(in) 方法四(连接加 in) 表:  Employee 查询 至少有5名直接下属 的经理   。

    2024年02月15日
    浏览(32)
  • SQL力扣练习(七)

    目录 1.行程和用户(262) 方法一(Left Join) 方法二(NOT IN) 方法三(Join) 2.游戏玩法分析I(511) 方法一(min) 3.游戏玩法分析I(550) 方法一(AVG) 表: Trips 表: Users 取消率  的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数

    2024年02月15日
    浏览(33)
  • SQL力扣练习(十)

    目录 1.体育馆的人流量(501) 示例 1 解法一(row_number()) 解法二(自定义变量) 解法三 2.好友申请(602) 示例 解法一(union all) 解法二 3.销售员(607) 示例 解法一 解法二 表: Stadium 编写一个 SQL 查询以找出每行的人数大于或等于  100  且  id  连续的三行或更多行记录

    2024年02月14日
    浏览(35)
  • SQL力扣练习(五)

    目录  1.从不订购的客户(183) 解法一(not in) 解法二(is) 解法三(not exists) 解法四(isnull函数) 2.部门工资最高的员工(184) 解法一(in) 解法二(rank窗口函数) 某网站包含两个表, Customers  表和  Orders  表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。 Customers  表:

    2024年02月12日
    浏览(35)
  • 用MariaDB创建数据库,SQL练习,MarialDB安装和使用

    前言:MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。  Download MariaDB Server - MariaDB.org 注意:安装路径别选C盘 期间

    2024年02月13日
    浏览(42)
  • 数据库SQL语言实战(五)(数据库系统概念第三章练习题)

    目录 前言知识 一、 关系模式 二、 属性域 例子 介绍 作用 三、Select常数 举例 解释  四、集合差运算 本质 举例  结论 练习题 3.17 3.18  3.21  总结  注:本文的SQL语言适用的是 Oracle数据库 与mySQL可能存在略微不同 模式的定义 :模式则是指数据库中 所有关系模式 的集合,它

    2024年04月22日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包