当前位置: 首页 > article >正文

leetcode 难度【简单模式】标签【数据库】题型整理大全

文章目录

  • 175. 组合两个表
  • 181. 超过经理收入的员工
  • 182. 查找重复的电子邮箱
    • COUNT(*)
      • COUNT(*) 与 COUNT(column) 的区别
    • where和vaing之间的区别用法
  • 183.从不订购的客户
  • 196.删除重复的电子邮箱

175. 组合两个表

表: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+

personId 是该表的主键(具有唯一值的列)。该表包含一些人的 ID 和他们的姓和名的信息。

表: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+

addressId 是该表的主键(具有唯一值的列)。该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。

**编写解决方案,报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为 null 。**以 任意顺序 返回结果表。结果格式如下所示。

示例 1:输入: Person表:

+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1        | Wang     | Allen     |
| 2        | Alice    | Bob       |
+----------+----------+-----------+

Address表:

+-----------+----------+---------------+------------+
| addressId | personId | city          | state      |
+-----------+----------+---------------+------------+
| 1         | 2        | New York City | New York   |
| 2         | 3        | Leetcode      | California |
+-----------+----------+---------------+------------+

输出:

+-----------+----------+---------------+----------+
| firstName | lastName | city          | state    |
+-----------+----------+---------------+----------+
| Allen     | Wang     | Null          | Null     |
| Bob       | Alice    | New York City | New York |
+-----------+----------+---------------+----------+

解释: 地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。

解答如下

select firstName, lastName,city, state from Person left join Address on
    Person.personId = Address.personId;

主要考察的是left join的使用

181. 超过经理收入的员工

表:Employee

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| salary      | int     |
| managerId   | int     |
+-------------+---------+

id 是该表的主键(具有唯一值的列)。该表的每一行都表示雇员的ID、姓名、工资和经理的ID。编写解决方案,找出收入比经理高的员工。以 任意顺序 返回结果表。结果格式如下所示。

示例 1:输入: Employee 表:

+----+-------+--------+-----------+
| id | name  | salary | managerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | Null      |
| 4  | Max   | 90000  | Null      |
+----+-------+--------+-----------+

输出:

+----------+
| Employee |
+----------+
| Joe      |
+----------+

解释: Joe 是唯一挣得比经理多的雇员。

解答如下

select e1.name as Employee from Employee e1,Employee e2 where e1.ManagerId = e2.id
            and e1.Salary > e2.Salary;

考察笛卡尔积的用法

SELECT * FROM Employee e1, Employee e2;

生成的结果是 笛卡尔积(也叫 交叉连接 或 Cartesian Join)。这是两张表之间的所有组合行的集合。

182. 查找重复的电子邮箱

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+

id 是该表的主键(具有唯一值的列)。此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。
编写解决方案来报告所有重复的电子邮件。 请注意,可以保证电子邮件字段不为 NULL。以 任意顺序 返回结果表。

结果格式如下例。

示例 1:输入: Person 表:

+----+---------+
| id | email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

输出:

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

解释: a@b.com 出现了两次。

解答如下

select email as Email from Person group by email having count(*) > 1;

考察对于count(*)和having的用法

COUNT(*)

COUNT(*) 会统计表中符合查询条件的所有行的数量,包括 NULL 值的行。也就是说,它会对查询结果中的每一行进行计数,而不管这一行的具体列值是什么。

COUNT(*) 与 COUNT(column) 的区别

COUNT(*):计算所有行数,不论列值是否为 NULL。
COUNT(column):只计算某一列中非 NULL 值的行数。NULL 值不会被计算在内。

where和vaing之间的区别用法

1. WHERE 与 HAVING 的区别

  • WHERE:用于过滤原始数据行,在 GROUP BY 之前执行,也就是说,WHERE 子句无法使用聚合函数(如 COUNT()、SUM() 等)。它只能应用在数据的原始列上,不能用于过滤基于分组后的结果

  • HAVING:font color=“red”>用于过滤 GROUP BY 分组后的结果,允许你基于聚合函数的结果进行筛选。HAVING 在 GROUP BY 之后执行,因此你可以使用 COUNT() 这样的聚合函数。

183.从不订购的客户

Customers 表:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

在 SQL 中,id 是该表的主键。该表的每一行都表示客户的 ID 和名称。
Orders 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| customerId  | int  |
+-------------+------+

在 SQL 中,id 是该表的主键。customerId 是 Customers 表中 ID 的外键( Pandas 中的连接键)。该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。找出所有从不点任何东西的顾客。以 任意顺序 返回结果表。结果格式如下所示。

示例 1:输入:Customers table:

+----+-------+
| id | name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+

Orders table:

+----+------------+
| id | customerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+

输出:

+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

解答如下

select name as Customers from customers left join Orders on customers.id = Orders.customerid where Orders.customerid is NULL;

本题考察 对于空值的用法
在 MySQL 中,要筛选某一列为空 (NULL) 的值,可以使用 IS NULL 来进行筛选。

NULL 与空字符串或零不同:NULL 表示没有值,而空字符串 (‘’) 或零 (0) 是有效的值,IS NULL 只会筛选出那些确实没有值的记录。
IS NULL 与 = 的区别:在 MySQL 中,NULL 是特殊的,不能直接用 = 比较。因此,不能使用 WHERE column_name = NULL,而是要使用 WHERE column_name IS NULL

196.删除重复的电子邮箱

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+

id 是该表的主键列(具有唯一值的列)。该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id 的唯一电子邮件。
对于 SQL 用户,请注意你应该编写一个 DELETE 语句而不是 SELECT 语句。)
对于 Pandas 用户,请注意你应该直接修改 Person 表。)
运行脚本后,显示的答案是 Person 表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person 表。Person 表的最终顺序 无关紧要 。
返回结果格式如下示例所示。

示例 1:输入: Person 表:

+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

输出:

+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

解释: john@example.com重复两次。我们保留最小的Id = 1。

解答如下

delete from Person where id not in (
    select * from (
          select min(id) from Person GROUP BY email) t);

考察在delete中进行查询,以及派生表的用法

在 DELETE 或 UPDATE 操作中,你不能同时对一个表进行修改并在子查询中查询该表.换句话说,你不能在 DELETE 语句中修改 Person 表,同时在 FROM 子查询中查询 Person 表。

我们需要用一个额外的嵌套子查询(也就是派生表)来规避这个限制,t 是派生表(子查询结果)的别名,虽然这个别名在查询中没有进一步的使用,但它是 MySQL 的一个要求,每个子查询都必须有别名。通过使用派生表,可以避免 MySQL 中同时修改和查询同一个表时产生的错误。


http://www.kler.cn/a/306169.html

相关文章:

  • 软件工程笔记二—— 软件生存期模型
  • 【C++】string类(附题)
  • Java NIO 深度解析:构建高效的 I/O 操作
  • 机器学习【激活函数】
  • 3D编辑器教程:如何实现3D模型多材质定制效果?
  • 解锁微前端的优秀库
  • 【网络安全的神秘世界】渗透测试基础
  • 【C#】添加临时环境变量
  • linux第二课(docker的安装使用)
  • 微软九月补丁星期二发现了 79 个漏洞
  • 《ImageNet Classification with Deep Convolutional Neural Networks》论文导读
  • 漫画元素检测系统源码分享
  • AutoSar AP通信的事件订阅
  • Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
  • 通俗理解低秩分解
  • 【webpack4系列】设计可维护的webpack4.x+vue构建配置(终极篇)
  • (182)时序收敛--->(32)时序收敛三二
  • 如何通过网络找到自己想要的LabVIEW知识?
  • Pocketpair澄清表示《幻兽帕鲁》无意转型免费游戏
  • 儿童编程与AI辅助编程:未来教育的机遇与挑战
  • 窗口框架frame(HTML前端)
  • 福建科立讯通信 指挥调度管理平台 SQL注入漏洞
  • 【算法篇】哈希类(笔记)
  • Ubuntu 不重装系统增加交换空间大小
  • 我的IP地址经常变化对我的账号安全有影响吗?
  • 【STM32】DAC数字模拟转换