【数据库】MySQL数据库--刷题题库

MySQL数据库-leetcode/牛客-面试题

  • MySQL数据库命令
  • MySQL面试知识点干货
  • Leetcode题库
    • 一、简单题
      • 1、查找重复的电子邮箱
      • 2、变更性别
      • 3、大的国家
      • 4、有趣的电影
      • 5、组合两个表
      • 6、 超过经理收入的员工
      • 7、从不订购的客户

MySQL数据库命令

MySQL面试知识点干货

Leetcode题库

一、简单题

1、查找重复的电子邮箱

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

示例:

Id Email
1 [email protected]
2 [email protected]
3 [email protected]

根据以上输入,你的查询应返回以下结果:

Email
[email protected]

说明:所有电子邮箱都是小写字母。

解题思路:group by … having

知识点:https://blog.csdn.net/m0_37882192/article/details/109827572

// 解法1
select email from person group by email having count(email)>1
//解法2
select email from (select count(1) as t,email from person group by email)r  where r.t>1;
//解法3
select distinct(p1.Email) from Person p1 join Person p2 on p1.Email = p2.Email AND p1.Id!=p2.Id

2、变更性别

给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。

注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。

例如:

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

解题思路:case…when…then…end、if
SQL语句 - case…when…then…end语句使用
case语句- 适用于一个条件判断有多种值情况下 分别执行不同的操作。

// 解法一
update salary set sex = case when sex = 'm' then 'f' else 'm' end;
//解法二
update salary set sex = if(sex='m','f','m');
//解法三
update salary set sex = char(ascii('m') + ascii('f') - ascii(sex));

3、大的国家

这里有张 World 表

name continent area population gdp
Afghanistan Asia 652230 25500100 20343000
Albania Europe 28748 2831741 12960000
Algeria Africa 2381741 37100000 188681000
Andorra Europe 468 78115 3712000
Angola Africa 1246700 20609294 100990000

如果一个国家的面积超过 300 万平方公里,或者人口超过 2500 万,那么这个国家就是大国家。

编写一个 SQL 查询,输出表中所有大国家的名称、人口和面积。

例如,根据上表,我们应该输出:

name population area
Afghanistan 25500100 652230
Algeria 37100000 2381741

解题思路:or

// 解法一
select name,population,area from world group by population,area having population > 25000000 or area > 3000000;
//解法二
select name,population,area from world where population > 25000000 or area > 3000000;

4、有趣的电影

某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 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

解题思路:!=、and、order by …desc

// 解法一
select id,movie,description,rating from cinema where description != 'boring' and id%2 != 0 order by rating desc;

5、组合两个表

表1: Person

列名 类型
PersonId int
FirstName varchar
LastName varchar

PersonId 是上表主键
表2: Address

列名 类型
AddressId int
PersonId int
City varchar
State varchar

AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State

解题思路:left join 保留左表所有记录,右表不存在,字段为NULL

知识点: https://blog.csdn.net/m0_37882192/article/details/109961198

// 解法一
select Person.FirstName,Person.LastName,Address.City,Address.State from Person left join Address on Person.PersonId = Address.PersonId;

6、 超过经理收入的员工

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

Id Name Salary ManagerId
1 Joe 70000 3
2 Henry 80000 4
3 Sam 60000 NULL
4 Max 90000 NULL

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

Employee
Joe

解题思路:自链接、子链接

// 解法一:自链接
select e1.Name as Employee
from employee e1, employee e2
where e1.ManagerId= e2.Id
and e1.Salary > e2.Salary
//解法二:子链接
select e.Name as Employee
from employee e
where salary > (select salary from employee where Id = e.ManagerId)

7、从不订购的客户

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。
Customers 表:

Id Name
1 Joe
2 Henry
3 Sam
4 Max

Orders 表:

Id CustomerId
1 3
2 1

例如给定上述表格,你的查询应返回:

Customers
Henry
Max

解题思路:not in 、left join、not exists
链接: https://blog.csdn.net/m0_37882192/article/details/111185449

// 375 ms, 在所有 MySQL 提交中击败了71.87%的用户
select name as Customers from Customers a where a.Id not in (select CustomerId from Orders);
//498ms
select c.Name as Customers from Customers c left join Orders o on o.CustomerId = c.Id where o.Id is null;
//532ms
select c.Name as Customers from Customers c where not exists (select 1 from Orders o where o.CustomerId = c.Id);

你可能感兴趣的:(数据库,mysql,sql,数据库)