LeetCode中SQL简单题目汇总解答

题目一:这是一道需要用到IN/NOT IN语法的题目,IN/NOT IN可以在where筛选语句中添加多个值,SQL中有关于IN/NOT IN的语法结构为:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

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

Customers 表:

+----+-------+

| Id | Name |

+----+-------+

| 1 | Joe |

| 2 | Henry |

| 3 | Sam |

| 4 | Max |

+----+-------+

Orders 表:

+----+------------+

| Id | CustomerId |

+----+------------+

| 1 | 3 |

| 2 | 1 |

+----+------------+

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

+-----------+

| Customers |

+-----------+

| Henry |

| Max |

+-----------+

题解:

select name as customers 
from customers
where id not in (select customerid from orders)

题目二:本题需要用到Group By语句以及Having语句,Group By语句用于对一个或者多个列的取值进行分组(切记Group By两个必须分开写),Having语句的存在是因为where筛选语句无法与聚合函数一起使用;

题目描述:

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

示例:

+----+---------+

| Id | Email |

+----+---------+

| 1 | a@b.com |

| 2 | c@d.com |

| 3 | a@b.com |

+----+---------+

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

+---------+

| Email |

+---------+

| a@b.com |

+---------+

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

题解:

select Email 
FROM Person 
GROUP BY Email  
HAVING COUNT(Email )>1;

题目三:此题需要用到join自连接来进行相关操作,join连接可以分为内连接、左连接、右连接、完整外部连接、自连接,具体区别可以参考w3cshcool的SQL教程

题目描述:

表:Employee

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| id | int |

| name | varchar |

| salary | int |

| managerId | int |

+-------------+---------+

Id是该表的主键。

该表的每一行都表示雇员的ID、姓名、工资和经理的ID。

编写一个SQL查询来查找收入比经理高的员工。

任意顺序 返回结果表。

查询结果格式如下所示。

示例 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 staff.name as Employee from Employee as staff 
join Employee as manager 
on staff.managerid=manager.id 
where staff.salary>manager.salary

题目四:组合两个表,这个题目需要看清题目要求并且需要掌握left join、right join以及full outer join的区别;

题目描述:

表: Person

+-------------+---------+

| 列名 | 类型 |

+-------------+---------+

| PersonId | int |

| FirstName | varchar |

| LastName | varchar |

+-------------+---------+

personId 是该表的主键列。

该表包含一些人的 ID 和他们的姓和名的信息。

表: Address

+-------------+---------+

| 列名 | 类型 |

+-------------+---------+

| AddressId | int |

| PersonId | int |

| City | varchar |

| State | varchar |

+-------------+---------+

addressId 是该表的主键列。

该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。

编写一个SQL查询来报告 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 person.lastname,person.firstname,address.city,address.state 
from person
left join address
on person.personid=address.personid

题目五:本题需要掌握delete的用法

题目描述:

表: Person

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| id | int |

| email | varchar |

+-------------+---------+

id是该表的主键列。

该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

编写一个 SQL 删除语句删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

查询结果格式如下所示。

示例 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 
    p1
from 
    Person p1,
    Person p2
where 
    (p1.email = p2.email) and (p1.id > p2.id)

题目六:本题需要掌握sql中DateDiff()函数的用法,注意在实际使用中该函数只需要输入两个时间参数,DateDiff(a,b)=a的时间减去b的时间;

题目描述:

表: Weather

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| id | int |

| recordDate | date |

| temperature | int |

+---------------+---------+

id 是这个表的主键

该表包含特定日期的温度信息

编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id

返回结果 不要求顺序

题解:

select w1.Id 
from 
 weather  w1,
 weather w2
 where DateDiff(w1.recordDate,w2.recordDate)=1 and w1.temperature >w2.temperature

题目七:本题需要掌握Group By、Having以及min()聚合函数的使用,因为where语句无法与聚合函数一起使用,所以在这里使用Having;

题目描述:

活动表 Activity

+--------------+---------+

| Column Name | Type |

+--------------+---------+

| player_id | int |

| device_id | int |

| event_date | date |

| games_played | int |

+--------------+---------+

表的主键是 (player_id, event_date)。

这张表展示了一些游戏玩家在游戏平台上的行为活动。

每行数据记录了一名玩家在退出平台之前,当天使用同一台设备登录平台后打开的游戏的数目(可能是 0 个)。

写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期

查询结果的格式如下所示:

Activity 表:

+-----------+-----------+------------+--------------+

| player_id | device_id | event_date | games_played |

+-----------+-----------+------------+--------------+

| 1 | 2 | 2016-03-01 | 5 |

| 1 | 2 | 2016-05-02 | 6 |

| 2 | 3 | 2017-06-25 | 1 |

| 3 | 1 | 2016-03-02 | 0 |

| 3 | 4 | 2018-07-03 | 5 |

+-----------+-----------+------------+--------------+

Result 表:

+-----------+-------------+

| player_id | first_login |

+-----------+-------------+

| 1 | 2016-03-01 |

| 2 | 2017-06-25 |

| 3 | 2016-03-02 |

+-----------+-------------+

题解:

select player_id,event_date as first_login
from activity
Group BY player_id
having event_date=min(event_date)

题目八:本题需要关注一个点,我一开始在where语句中只写了不等于2的条件,没有加上或者为空值,结果显示错误,原因在于null类型与int类型不一样,所以也需要加入筛选语句中;

题目描述:

给定表 customer ,里面保存了所有客户信息和他们的推荐人。

+------+------+-----------+

| id | name | referee_id|

+------+------+-----------+

| 1 | Will | NULL |

| 2 | Jane | NULL |

| 3 | Alex | 2 |

| 4 | Bill | NULL |

| 5 | Zack | 1 |

| 6 | Mark | 2 |

+------+------+-----------+

写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。

对于上面的示例数据,结果为:

+------+

| name |

+------+

| Will |

| Jane |

| Bill |

| Zack |

+------+

题解:

select name 
from customer 
where referee_id<>2 or referee_id is null

题目九:本题需要掌握limit用法,limit用来设置返回记录中的前几条,这就涉及排序order by语法,排序默认采用升序,如果要设置降序需要设置为desc;

题目描述:

表: Orders

+-----------------+----------+

| Column Name | Type |

+-----------------+----------+

| order_number | int |

| customer_number | int |

+-----------------+----------+

Order_number是该表的主键。

此表包含关于订单ID和客户ID的信息。

编写一个SQL查询,为下了 最多订单 的客户查找 customer_number

测试用例生成后, 恰好有一个客户 比任何其他客户下了更多的订单。

查询结果格式如下所示。

示例 1:

输入:

Orders 表:

+--------------+-----------------+

| order_number | customer_number |

+--------------+-----------------+

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

| 4 | 3 |

+--------------+-----------------+

输出:

+-----------------+

| customer_number |

+-----------------+

| 3 |

+-----------------+

解释:

customer_number 为 '3' 的顾客有两个订单,比顾客 '1' 或者 '2' 都要多,因为他们只有一个订单。

所以结果是该顾客的 customer_number ,也就是 3 。

题解:

select customer_number
from orders
group by customer_number
order by count(order_number) DESC
LIMIT 1

题目十:这一题目主要考察Group By以及Having的使用方法

题目描述:

表: Courses

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| student | varchar |

| class | varchar |

+-------------+---------+

(student, class)是该表的主键列。

该表的每一行表示学生的名字和他们注册的班级。

编写一个SQL查询来报告 至少有5个学生 的所有班级。

任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入:

Courses table:

+---------+----------+

| student | class |

+---------+----------+

| A | Math |

| B | English |

| C | Math |

| D | Biology |

| E | Math |

| F | Computer |

| G | Math |

| H | Math |

| I | Math |

+---------+----------+

输出:

+---------+

| class |

+---------+

| Math |

+---------+

解释:

-数学课有6个学生,所以我们包括它。

-英语课有1名学生,所以我们不包括它。

-生物课有1名学生,所以我们不包括它。

-计算机课有1个学生,所以我们不包括它。

题解:

select class
from courses
group by class
having count(student)>=5

题目十一:此题主要考察子查询,子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询;子查询不能直接用在聚合函数中;BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。

题目描述:

表: SalesPerson

+-----------------+---------+

| Column Name | Type |

+-----------------+---------+

| sales_id | int |

| name | varchar |

| salary | int |

| commission_rate | int |

| hire_date | date |

+-----------------+---------+

sales_id 是该表的主键列。

该表的每一行都显示了销售人员的姓名和 ID ,以及他们的工资、佣金率和雇佣日期。

表: Company

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| com_id | int |

| name | varchar |

| city | varchar |

+-------------+---------+

com_id 是该表的主键列。

该表的每一行都表示公司的名称和 ID ,以及公司所在的城市。

表: Orders

+-------------+------+

| Column Name | Type |

+-------------+------+

| order_id | int |

| order_date | date |

| com_id | int |

| sales_id | int |

| amount | int |

+-------------+------+

order_id 是该表的主键列。

com_id 是 Company 表中 com_id 的外键。

sales_id 是来自销售员表 sales_id 的外键。

该表的每一行包含一个订单的信息。这包括公司的 ID 、销售人员的 ID 、订单日期和支付的金额。

编写一个SQL查询,报告没有任何与名为 “RED” 的公司相关的订单的所有销售人员的姓名。

任意顺序 返回结果表。

查询结果格式如下所示。

示例:

输入:
SalesPerson 表:
+----------+------+--------+-----------------+------------+
| sales_id | name | salary | commission_rate | hire_date  |
+----------+------+--------+-----------------+------------+
| 1        | John | 100000 | 6               | 4/1/2006   |
| 2        | Amy  | 12000  | 5               | 5/1/2010   |
| 3        | Mark | 65000  | 12              | 12/25/2008 |
| 4        | Pam  | 25000  | 25              | 1/1/2005   |
| 5        | Alex | 5000   | 10              | 2/3/2007   |
+----------+------+--------+-----------------+------------+
Company 表:
+--------+--------+----------+
| com_id | name   | city     |
+--------+--------+----------+
| 1      | RED    | Boston   |
| 2      | ORANGE | New York |
| 3      | YELLOW | Boston   |
| 4      | GREEN  | Austin   |
+--------+--------+----------+
Orders 表:
+----------+------------+--------+----------+--------+
| order_id | order_date | com_id | sales_id | amount |
+----------+------------+--------+----------+--------+
| 1        | 1/1/2014   | 3      | 4        | 10000  |
| 2        | 2/1/2014   | 4      | 5        | 5000   |
| 3        | 3/1/2014   | 1      | 1        | 50000  |
| 4        | 4/1/2014   | 1      | 4        | 25000  |
+----------+------------+--------+----------+--------+
输出:
+------+
| name |
+------+
| Amy  |
| Mark |
| Alex |
+------+
解释:
根据表 orders 中的订单 '3' 和 '4' ,容易看出只有 'John' 和 'Pam' 两个销售员曾经向公司 'RED' 销售过。
所以我们需要输出表 salesperson 中所有其他人的名字。

题解:

select name
from salesperson 
where sales_id not in(
    select sales_id 
    from orders 
    where com_id = (
        select com_id 
        from company 
        where name="RED"))

题目十二:此题需要掌握字符串匹配符LIKE的用法,w3cschool中有详细教程自行查阅;还有一个知识点就是%是一个取余数的计算符;

题目描述:

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

+---------+-----------+--------------+-----------+

题解:

select *
from cinema
where description not like "boring" and id%2<>0 
order by rating desc

题目十三:此题目需要掌握case when then条件语句的使用,具体语法行式为:

CASE 列名
WHEN 条件值1 THEN 选项1
WHEN 条件值2 THEN 选项2
……
ELSE 默认值
END

题目描述:

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

题解:

update salary
set sex= 
 case sex 
 when 'm' then 'f' 
 else 'm' 
 end

题目十四:此题目只需要掌握group by可将多个列作为分组条件即可;另外,字符串也可以使用>/<进行比较;使用聚合函数min()、max()记得把where改成having;

题目描述:

ActorDirector 表:

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| actor_id | int |

| director_id | int |

| timestamp | int |

+-------------+---------+

timestamp 是这张表的主键.

写一条SQL查询语句获取合作过至少三次的演员和导演的 id 对 (actor_id, director_id)

示例:

ActorDirector 表:

+-------------+-------------+-------------+

| actor_id | director_id | timestamp |

+-------------+-------------+-------------+

| 1 | 1 | 0 |

| 1 | 1 | 1 |

| 1 | 1 | 2 |

| 1 | 2 | 3 |

| 1 | 2 | 4 |

| 2 | 1 | 5 |

| 2 | 1 | 6 |

+-------------+-------------+-------------+

Result 表:

+-------------+-------------+

| actor_id | director_id |

+-------------+-------------+

| 1 | 1 |

+-------------+-------------+

唯一的 id 对是 (1, 1),他们恰好合作了 3 次。

题解:

select actor_id,director_id
from actordirector
group by actor_id,director_id
having count(actordirector.timestamp)>=3

题目十五:此题还是需要掌握子查询的熟练度

题目描述:

Table: Product

+--------------+---------+

| Column Name | Type |

+--------------+---------+

| product_id | int |

| product_name | varchar |

| unit_price | int |

+--------------+---------+

Product_id是该表的主键。

该表的每一行显示每个产品的名称和价格。

Table: Sales

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| seller_id | int |

| product_id | int |

| buyer_id | int |

| sale_date | date |

| quantity | int |

| price | int |

+------ ------+---------+

这个表没有主键,它可以有重复的行。

product_id 是 Product 表的外键。

该表的每一行包含关于一个销售的一些信息。

编写一个SQL查询,报告2019年春季才售出的产品。即2019-01-012019-03-31(含)之间出售的商品。

任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入:
Product table:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+
Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 2          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 4        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
输出:
+-------------+--------------+
| product_id  | product_name |
+-------------+--------------+
| 1           | S8           |
+-------------+--------------+
解释:
id为1的产品仅在2019年春季销售。
id为2的产品在2019年春季销售,但也在2019年春季之后销售。
id 3的产品在2019年春季之后销售。
我们只退回产品1,因为它是2019年春季才销售的产品。

题解:

select product.product_id,product.product_name
from product
join sales
on sales.product_id=product.product_id
Group By product_id
Having min(sales.sale_date)>='2019-01-01' and max(sales.sale_date)<='2019-03-31'

题目十六:此题还是需要掌握Group By以及count(distinct column)的用法;此外一定要注意英文括号;

题目描述:

活动记录表:Activity

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| user_id | int |

| session_id | int |

| activity_date | date |

| activity_type | enum |

+---------------+---------+

该表是用户在社交网站的活动记录。

该表没有主键,可能包含重复数据。

activity_type 字段为以下四种值 ('open_session', 'end_session', 'scroll_down', 'send_message')。

每个 session_id 只属于一个用户。

请写SQL查询出截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。

任意顺序 返回结果表。

查询结果示例如下。

示例 1:

输入:

Activity table:

+---------+------------+---------------+---------------+

| user_id | session_id | activity_date | activity_type |

+---------+------------+---------------+---------------+

| 1 | 1 | 2019-07-20 | open_session |

| 1 | 1 | 2019-07-20 | scroll_down |

| 1 | 1 | 2019-07-20 | end_session |

| 2 | 4 | 2019-07-20 | open_session |

| 2 | 4 | 2019-07-21 | send_message |

| 2 | 4 | 2019-07-21 | end_session |

| 3 | 2 | 2019-07-21 | open_session |

| 3 | 2 | 2019-07-21 | send_message |

| 3 | 2 | 2019-07-21 | end_session |

| 4 | 3 | 2019-06-25 | open_session |

| 4 | 3 | 2019-06-25 | end_session |

+---------+------------+---------------+---------------+

输出:

+------------+--------------+

| day | active_users |

+------------+--------------+

| 2019-07-20 | 2 |

| 2019-07-21 | 2 |

+------------+--------------+

解释:注意非活跃用户的记录不需要展示。

题解:

select activity_date as day,count(distinct session_id)as active_users
from activity
group by activity_date
having activity_date > '2019-06-26' and activity_date <= '2019-07-27'

题目十七:这一题难点在于区别having子句和where子句,虽然二者都为筛选过滤,但是having子句是需要跟在group by后面,是针对一个组进行筛选,而where子句是在group by前面针对每一行进行筛选,这一点一定要搞清楚;order by不一定要分组之后使用,没有分组也是可以使用order by进行排序;

题目描述:

Views 表:

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| article_id | int |

| author_id | int |

| viewer_id | int |

| view_date | date |

+---------------+---------+

此表无主键,因此可能会存在重复行。

此表的每一行都表示某人在某天浏览了某位作者的某篇文章。

请注意,同一人的 author_id 和 viewer_id 是相同的。

请编写一条 SQL 查询以找出所有浏览过自己文章的作者,结果按照 id 升序排列。

查询结果的格式如下所示:

Views 表:

+------------+-----------+-----------+------------+

| article_id | author_id | viewer_id | view_date |

+------------+-----------+-----------+------------+

| 1 | 3 | 5 | 2019-08-01 |

| 1 | 3 | 6 | 2019-08-02 |

| 2 | 7 | 7 | 2019-08-01 |

| 2 | 7 | 6 | 2019-08-02 |

| 4 | 7 | 1 | 2019-07-22 |

| 3 | 4 | 4 | 2019-07-21 |

| 3 | 4 | 4 | 2019-07-21 |

+------------+-----------+-----------+------------+

结果表:

+------+

| id |

+------+

| 4 |

| 7 |

+------+

题解:

select distinct author_id as id 
from views
where author_id=viewer_id
order by author_id 

题目十八:此题需要深刻理解题意,一定要对重新创造的表有所设想才不容易出错;from前面不要出现逗号;此题还是有难度的;

题目描述:

部门表 Department

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| id | int |

| revenue | int |

| month | varchar |

+---------------+---------+

(id, month) 是表的联合主键。

这个表格有关于每个部门每月收入的信息。

月份(month)可以取下列值 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。

编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。

查询结果格式如下面的示例所示:

Department 表:

+------+---------+-------+

| id | revenue | month |

+------+---------+-------+

| 1 | 8000 | Jan |

| 2 | 9000 | Jan |

| 3 | 10000 | Feb |

| 1 | 7000 | Feb |

| 1 | 6000 | Mar |

+------+---------+-------+

查询得到的结果表:

+------+-------------+-------------+-------------+-----+-------------+

| id | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |

+------+-------------+-------------+-------------+-----+-------------+

| 1 | 8000 | 7000 | 6000 | ... | null |

| 2 | 9000 | null | null | ... | null |

| 3 | null | 10000 | null | ... | null |

+------+-------------+-------------+-------------+-----+-------------+

注意,结果表有 13 列 (1个部门 id 列 + 12个月份的收入列)。

题解:

select id ,sum(case month when 'Jan' then revenue else null end)as Jan_Revenue,
           sum(case month when 'Feb' then revenue else null end)as Feb_Revenue,
           sum(case month when 'Mar' then revenue else null end)as Mar_Revenue,
           sum(case month when 'Apr' then revenue else null end)as Apr_Revenue,
           sum(case month when 'May' then revenue else null end)as May_Revenue,
           sum(case month when 'Jun' then revenue else null end)as Jun_Revenue,
           sum(case month when 'Jul' then revenue else null end)as Jul_Revenue,
           sum(case month when 'Aug' then revenue else null end)as Aug_Revenue,
           sum(case month when 'Sep' then revenue else null end)as Sep_Revenue,
           sum(case month when 'Oct' then revenue else null end)as Oct_Revenue,
           sum(case month when 'Nov' then revenue else null end)as Nov_Revenue,
           sum(case month when 'Dec' then revenue else null end)as Dec_Revenue
from Department
group by id

题目十九:此题需要学习if条件语句,if条件语句与case when还是有所区别,通过查找资料可以轻松解答,日后出现更多区别再增加经验;此题还需要明白left join的用法,因为要求没有rides记录的也需要显示在新的表格中;

题目描述:

表:Users

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| id | int |

| name | varchar |

+---------------+---------+

id 是该表单主键。

name 是用户名字。

表:Rides

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| id | int |

| user_id | int |

| distance | int |

+---------------+---------+

id 是该表单主键。

user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。

写一段 SQL , 报告每个用户的旅行距离。

返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列

查询结果格式如下例所示。

Users 表:

+------+-----------+

| id | name |

+------+-----------+

| 1 | Alice |

| 2 | Bob |

| 3 | Alex |

| 4 | Donald |

| 7 | Lee |

| 13 | Jonathan |

| 19 | Elvis |

+------+-----------+

Rides 表:

+------+----------+----------+

| id | user_id | distance |

+------+----------+----------+

| 1 | 1 | 120 |

| 2 | 2 | 317 |

| 3 | 3 | 222 |

| 4 | 7 | 100 |

| 5 | 13 | 312 |

| 6 | 19 | 50 |

| 7 | 7 | 120 |

| 8 | 19 | 400 |

| 9 | 7 | 230 |

+------+----------+----------+

Result 表:

+----------+--------------------+

| name | travelled_distance |

+----------+--------------------+

| Elvis | 450 |

| Lee | 450 |

| Bob | 317 |

| Jonathan | 312 |

| Alex | 222 |

| Alice | 120 |

| Donald | 0 |

+----------+--------------------+

Elvis 和 Lee 旅行了 450 英里,Elvis 是排名靠前的旅行者,因为他的名字在字母表上的排序比 Lee 更小。

Bob, Jonathan, Alex 和 Alice 只有一次行程,我们只按此次行程的全部距离对他们排序。

Donald 没有任何行程, 他的旅行距离为 0。

题解:

select name,sum(if(distance>0,distance,0)) as travelled_distance
from users
left join rides
on users.id=rides.user_id
group by rides.user_id
order by travelled_distance desc,name

题目二十:此题需要掌握字符串拼接函数group_concat(),具体参数形式如下所示;

GROUP_CONCAT()

此种连接方法,主要是将某一字段的值连接成一行进行显示,具体可以参看上面的问题实例。

语法 :group_concat( [DISTINCT] 连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )

说明:可以连接多个字段,也可以对连接字段进行排序,默认以 逗号 分隔字段

题目描述:

Activities

+-------------+---------+

| 列名 | 类型 |

+-------------+---------+

| sell_date | date |

| product | varchar |

+-------------+---------+

此表没有主键,它可能包含重复项。

此表的每一行都包含产品名称和在市场上销售的日期。

编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。

每个日期的销售产品名称应按词典序排列。

返回按 sell_date 排序的结果表。

查询结果格式如下例所示。

示例 1:

输入:
Activities 表:
+------------+-------------+
| sell_date  | product     |
+------------+-------------+
| 2020-05-30 | Headphone   |
| 2020-06-01 | Pencil      |
| 2020-06-02 | Mask        |
| 2020-05-30 | Basketball  |
| 2020-06-01 | Bible       |
| 2020-06-02 | Mask        |
| 2020-05-30 | T-Shirt     |
+------------+-------------+
输出:
+------------+----------+------------------------------+
| sell_date  | num_sold | products                     |
+------------+----------+------------------------------+
| 2020-05-30 | 3        | Basketball,Headphone,T-shirt |
| 2020-06-01 | 2        | Bible,Pencil                 |
| 2020-06-02 | 1        | Mask                         |
+------------+----------+------------------------------+
解释:
对于2020-05-30,出售的物品是 (Headphone, Basketball, T-shirt),按词典序排列,并用逗号 ',' 分隔。
对于2020-06-01,出售的物品是 (Pencil, Bible),按词典序排列,并用逗号分隔。
对于2020-06-02,出售的物品是 (Mask),只需返回该物品名。

题解:

select sell_date,count(distinct product) as num_sold,
       group_concat(distinct product order by product) as products
from activities
group by sell_date
order by sell_date 

题目二十一:此题需要掌握字符串匹配符Like的使用;

题目描述:

患者信息表: Patients

+--------------+---------+

| Column Name | Type |

+--------------+---------+

| patient_id | int |

| patient_name | varchar |

| conditions | varchar |

+--------------+---------+

patient_id (患者 ID)是该表的主键。

'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。

这个表包含医院中患者的信息。

写一条 SQL 语句,查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1

任意顺序 返回结果表。

查询结果格式如下示例所示。

示例 1:

输入:
Patients表:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 1          | Daniel       | YFEV COUGH   |
| 2          | Alice        |              |
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 |
| 5          | Alain        | DIAB201      |
+------------+--------------+--------------+
输出:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 | 
+------------+--------------+--------------+
解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。

题解:

select patient_id,patient_name,conditions
from patients
where conditions like "%DIAB1%"

题目二十二:这一道题目因为要建立一个新的表,一开始没想到所以花了很长时间,现在算是比较难的;还有一个bug就是我通过建立子查询建立一个新的表,出现以下错误提示:Every derived table must have its own alias,要注意每个派生出来的表都应该有一个自己的别名;

题目描述:

表:Visits

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| visit_id | int |

| customer_id | int |

+-------------+---------+

visit_id 是该表的主键。

该表包含有关光临过购物中心的顾客的信息。

表:Transactions

+----------------+---------+

| Column Name | Type |

+----------------+---------+

| transaction_id | int |

| visit_id | int |

| amount | int |

+----------------+---------+

transaction_id 是此表的主键。

此表包含 visit_id 期间进行的交易的信息。

有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个 SQL 查询,来查找这些顾客的 ID ,以及他们只光顾不交易的次数。

返回以 任何顺序 排序的结果表。

查询结果格式如下例所示。

示例 1:

输入:
Visits
+----------+-------------+
| visit_id | customer_id |
+----------+-------------+
| 1        | 23          |
| 2        | 9           |
| 4        | 30          |
| 5        | 54          |
| 6        | 96          |
| 7        | 54          |
| 8        | 54          |
+----------+-------------+
Transactions
+----------------+----------+--------+
| transaction_id | visit_id | amount |
+----------------+----------+--------+
| 2              | 5        | 310    |
| 3              | 5        | 300    |
| 9              | 5        | 200    |
| 12             | 1        | 910    |
| 13             | 2        | 970    |
+----------------+----------+--------+
输出:
+-------------+----------------+
| customer_id | count_no_trans |
+-------------+----------------+
| 54          | 2              |
| 30          | 1              |
| 96          | 1              |
+-------------+----------------+
解释:
ID = 23 的顾客曾经逛过一次购物中心,并在 ID = 12 的访问期间进行了一笔交易。
ID = 9 的顾客曾经逛过一次购物中心,并在 ID = 13 的访问期间进行了一笔交易。
ID = 30 的顾客曾经去过购物中心,并且没有进行任何交易。
ID = 54 的顾客三度造访了购物中心。在 2 次访问中,他们没有进行任何交易,在 1 次访问中,他们进行了 3 次交易。
ID = 96 的顾客曾经去过购物中心,并且没有进行任何交易。
如我们所见,ID 为 30 和 96 的顾客一次没有进行任何交易就去了购物中心。顾客 54 也两次访问了购物中心并且没有进行任何交易。

题解:

select m.customer_id,count(*) count_no_trans
from(
    select v.customer_id,v.visit_id 
    from visits as v
    where v.visit_id not in (select distinct a.visit_id from transactions as a)
) as m
group by customer_id

题目二十三:此题目还是考察一个表的连接,表的连接是一个非常常用的操作,一定要熟练;

题目描述:

表: Users

+--------------+---------+

| Column Name | Type |

+--------------+---------+

| account | int |

| name | varchar |

+--------------+---------+

account 是该表的主键.

表中的每一行包含银行里中每一个用户的账号.

表: Transactions

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| trans_id | int |

| account | int |

| amount | int |

| transacted_on | date |

+---------------+---------+

trans_id 是该表主键.

该表的每一行包含了所有账户的交易改变情况.

如果用户收到了钱, 那么金额是正的; 如果用户转了钱, 那么金额是负的.

所有账户的起始余额为 0.

写一个 SQL, 报告余额高于 10000 的所有用户的名字和余额. 账户的余额等于包含该账户的所有交易的总和.

返回结果表单没有顺序要求.

查询结果格式如下例所示.

Users table:
+------------+--------------+
| account    | name         |
+------------+--------------+
| 900001     | Alice        |
| 900002     | Bob          |
| 900003     | Charlie      |
+------------+--------------+

Transactions table:
+------------+------------+------------+---------------+
| trans_id   | account    | amount     | transacted_on |
+------------+------------+------------+---------------+
| 1          | 900001     | 7000       |  2020-08-01   |
| 2          | 900001     | 7000       |  2020-09-01   |
| 3          | 900001     | -3000      |  2020-09-02   |
| 4          | 900002     | 1000       |  2020-09-12   |
| 5          | 900003     | 6000       |  2020-08-07   |
| 6          | 900003     | 6000       |  2020-09-07   |
| 7          | 900003     | -4000      |  2020-09-11   |
+------------+------------+------------+---------------+

Result table:
+------------+------------+
| name       | balance    |
+------------+------------+
| Alice      | 11000      |
+------------+------------+
Alice 的余额为(7000 + 7000 - 3000) = 11000.
Bob 的余额为1000.
Charlie 的余额为(6000 + 6000 - 4000) = 8000.

题解:

select  name,sum(amount) as balance
from users 
right join transactions 
on users.account=transactions.account
group by name
having sum(amount)>10000

题目二十四:本题需要对mysql中的大小写函数ucase()、lcase()了解清楚,他们是使整个列都变换大小写;需要掌握left()、substring()此类字符串截取函数;

题目描述:

表: Users

+----------------+---------+

| Column Name | Type |

+----------------+---------+

| user_id | int |

| name | varchar |

+----------------+---------+

user_id 是该表的主键。

该表包含用户的 ID 和名字。名字仅由小写和大写字符组成。

编写一个 SQL 查询来修复名字,使得只有第一个字符是大写的,其余都是小写的。

返回按 user_id 排序的结果表。

查询结果格式示例如下。

示例 1:

输入:

Users table:

+---------+-------+

| user_id | name |

+---------+-------+

| 1 | aLice |

| 2 | bOB |

+---------+-------+

输出:

+---------+-------+

| user_id | name |

+---------+-------+

| 1 | Alice |

| 2 | Bob |

+---------+-------+

题解:

select user_id , concat(ucase(left(name,1)),lcase(substring(name,2))) name
from users 
ORDER BY user_id

题目二十五:本题是常规考察group by的题目,需要知道group by也是可以根据两个字段分组的;

题目描述:

表:DailySales

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| date_id | date |

| make_name | varchar |

| lead_id | int |

| partner_id | int |

+-------------+---------+

该表没有主键。

该表包含日期、产品的名称,以及售给的领导和合伙人的编号。

名称只包含小写英文字母。

写一条 SQL 语句,使得对于每一个 date_idmake_name,返回不同lead_id 以及不同partner_id 的数量。

任意顺序 返回结果表。

查询结果格式如下示例所示。

示例 1:

输入:

DailySales 表:

+-----------+-----------+---------+------------+

| date_id | make_name | lead_id | partner_id |

+-----------+-----------+---------+------------+

| 2020-12-8 | toyota | 0 | 1 |

| 2020-12-8 | toyota | 1 | 0 |

| 2020-12-8 | toyota | 1 | 2 |

| 2020-12-7 | toyota | 0 | 2 |

| 2020-12-7 | toyota | 0 | 1 |

| 2020-12-8 | honda | 1 | 2 |

| 2020-12-8 | honda | 2 | 1 |

| 2020-12-7 | honda | 0 | 1 |

| 2020-12-7 | honda | 1 | 2 |

| 2020-12-7 | honda | 2 | 1 |

+-----------+-----------+---------+------------+

输出:

+-----------+-----------+--------------+-----------------+

| date_id | make_name | unique_leads | unique_partners |

+-----------+-----------+--------------+-----------------+

| 2020-12-8 | toyota | 2 | 3 |

| 2020-12-7 | toyota | 1 | 2 |

| 2020-12-8 | honda | 2 | 2 |

| 2020-12-7 | honda | 3 | 2 |

+-----------+-----------+--------------+-----------------+

解释:

在 2020-12-8,丰田(toyota)有领导者 = [0, 1] 和合伙人 = [0, 1, 2] ,同时本田(honda)有领导者 = [1, 2] 和合伙人 = [1, 2]。

在 2020-12-7,丰田(toyota)有领导者 = [0] 和合伙人 = [1, 2] ,同时本田(honda)有领导者 = [0, 1, 2] 和合伙人 = [1, 2]。

题解:

select date_id,make_name,count(distinct lead_id) unique_leads,
     count(distinct partner_id) unique_partners
from dailysales
group by date_id,make_name

题目二十六:此题比较简单,主要掌握group by的用法;

题目描述:

表: Followers

+-------------+------+

| Column Name | Type |

+-------------+------+

| user_id | int |

| follower_id | int |

+-------------+------+

(user_id, follower_id) 是这个表的主键。

该表包含一个关注关系中关注者和用户的编号,其中关注者关注用户。

写出 SQL 语句,对于每一个用户,返回该用户的关注者数量。

user_id 的顺序返回结果表。

查询结果的格式如下示例所示。

示例 1:

输入:

Followers 表:

+---------+-------------+

| user_id | follower_id |

+---------+-------------+

| 0 | 1 |

| 1 | 0 |

| 2 | 0 |

| 2 | 1 |

+---------+-------------+

输出:

+---------+----------------+

| user_id | followers_count|

+---------+----------------+

| 0 | 1 |

| 1 | 1 |

| 2 | 2 |

+---------+----------------+

解释:

0 的关注者有 {1}

1 的关注者有 {0}

2 的关注者有 {0,1}

题解:

select user_id,count(follower_id) followers_count
from followers
group by user_id
order by user_id

题目二十七:此题主要考察group by可以以多个字段作为分组依据,其次注意int类型的数据的运算符,不要与聚合函数搞混;

题目描述:

表: Employees

+-------------+------+

| Column Name | Type |

+-------------+------+

| emp_id | int |

| event_day | date |

| in_time | int |

| out_time | int |

+-------------+------+

(emp_id, event_day, in_time) 是这个表的主键。

该表显示了员工在办公室的出入情况。

event_day 是此事件发生的日期,in_time 是员工进入办公室的时间,而 out_time 是他们离开办公室的时间。

in_time 和 out_time 的取值在1到1440之间。

题目保证同一天没有两个事件在时间上是相交的,并且保证 in_time 小于 out_time。

编写一个SQL查询以计算每位员工每天在办公室花费的总时间(以分钟为单位)。 请注意,在一天之内,同一员工是可以多次进入和离开办公室的。 在办公室里一次进出所花费的时间为out_time 减去 in_time。

返回结果表单的顺序无要求。

查询结果的格式如下:

Employees table:

+--------+------------+---------+----------+

| emp_id | event_day | in_time | out_time |

+--------+------------+---------+----------+

| 1 | 2020-11-28 | 4 | 32 |

| 1 | 2020-11-28 | 55 | 200 |

| 1 | 2020-12-03 | 1 | 42 |

| 2 | 2020-11-28 | 3 | 33 |

| 2 | 2020-12-09 | 47 | 74 |

+--------+------------+---------+----------+

Result table:

+------------+--------+------------+

| day | emp_id | total_time |

+------------+--------+------------+

| 2020-11-28 | 1 | 173 |

| 2020-11-28 | 2 | 30 |

| 2020-12-03 | 1 | 41 |

| 2020-12-09 | 2 | 27 |

+------------+--------+------------+

雇员 1 有三次进出: 有两次发生在 2020-11-28 花费的时间为 (32 - 4) + (200 - 55) = 173, 有一次发生在 2020-12-03 花费的时间为 (42 - 1) = 41。

雇员 2 有两次进出: 有一次发生在 2020-11-28 花费的时间为 (33 - 3) = 30, 有一次发生在 2020-12-09 花费的时间为 (74 - 47) = 27。

题解:

select event_day as day,emp_id,sum(out_time-in_time) as total_time
from employees
group by event_day,emp_id

题目二十八:此题需要掌握if条件语句在sql中的应用,基本语法格式如下:

IF(expr1,expr2,expr3)

如果 expr1 是TRUE (或者expr1 <> 0 且 expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

题目描述:

表: Employees

+-------------+---------+

| 列名 | 类型 |

+-------------+---------+

| employee_id | int |

| name | varchar |

| salary | int |

+-------------+---------+

employee_id 是这个表的主键。

此表的每一行给出了雇员id ,名字和薪水。

写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以'M'开头,那么他的奖金是他工资的100%,否则奖金为0。

Return the result table ordered by employee_id.

返回的结果集请按照employee_id排序。

查询结果格式如下面的例子所示。

示例 1:

输入:

Employees 表:

+-------------+---------+--------+

| employee_id | name | salary |

+-------------+---------+--------+

| 2 | Meir | 3000 |

| 3 | Michael | 3800 |

| 7 | Addilyn | 7400 |

| 8 | Juan | 6100 |

| 9 | Kannon | 7700 |

+-------------+---------+--------+

输出:

+-------------+-------+

| employee_id | bonus |

+-------------+-------+

| 2 | 0 |

| 3 | 0 |

| 7 | 7400 |

| 8 | 0 |

| 9 | 7700 |

+-------------+-------+

解释:

因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。

雇员id为3的因为他的名字以'M'开头,所以,奖金是0。

其他的雇员得到了百分之百的奖金。

题解:

select employee_id,if(employee_id%2<>0 and name not like "M%",salary,0) bonus
from employees
order by employee_id

题目二十九:此题需要掌握一个知识就是常常在group by之后忘记where的作用,where通常在group by之前先对单行进行一个筛选,这个也是很重要的;

题目描述:

表: Logins

+----------------+----------+

| 列名 | 类型 |

+----------------+----------+

| user_id | int |

| time_stamp | datetime |

+----------------+----------+

(user_id, time_stamp) 是这个表的主键。

每一行包含的信息是user_id 这个用户的登录时间。

编写一个 SQL 查询,该查询可以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 包含 2020 年没有登录过的用户。

返回的结果集可以按 任意顺序 排列。

查询结果格式如下例。

示例 1:

输入:

Logins 表:

+---------+---------------------+

| user_id | time_stamp |

+---------+---------------------+

| 6 | 2020-06-30 15:06:07 |

| 6 | 2021-04-21 14:06:06 |

| 6 | 2019-03-07 00:18:15 |

| 8 | 2020-02-01 05:10:53 |

| 8 | 2020-12-30 00:46:50 |

| 2 | 2020-01-16 02:49:50 |

| 2 | 2019-08-25 07:59:08 |

| 14 | 2019-07-14 09:00:00 |

| 14 | 2021-01-06 11:59:59 |

+---------+---------------------+

输出:

+---------+---------------------+

| user_id | last_stamp |

+---------+---------------------+

| 6 | 2020-06-30 15:06:07 |

| 8 | 2020-12-30 00:46:50 |

| 2 | 2020-01-16 02:49:50 |

+---------+---------------------+

解释:

6号用户登录了3次,但是在2020年仅有一次,所以结果集应包含此次登录。

8号用户在2020年登录了2次,一次在2月,一次在12月,所以,结果集应该包含12月的这次登录。

2号用户登录了2次,但是在2020年仅有一次,所以结果集应包含此次登录。

14号用户在2020年没有登录,所以结果集不应包含。

题解:

select user_id,max(time_stamp) as last_stamp
from logins
where time_stamp between '2020-01-01' and '2020-12-31'
group by user_id

题目三十:此题需要掌握union的使用,可以详细参考w3cschool的教程掌握union与union all的不同之处;

题目描述:

表: Employees

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| employee_id | int |

| name | varchar |

+-------------+---------+

employee_id 是这个表的主键。

每一行表示雇员的id 和他的姓名。

表: Salaries

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| employee_id | int |

| salary | int |

+-------------+---------+

employee_id is 这个表的主键。

每一行表示雇员的id 和他的薪水。

写出一个查询语句,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:

  • 雇员的 姓名 丢失了,或者

  • 雇员的 薪水信息 丢失了,或者

返回这些雇员的id employee_id从小到大排序

查询结果格式如下面的例子所示。

示例 1:

输入:

Employees table:

+-------------+----------+

| employee_id | name |

+-------------+----------+

| 2 | Crew |

| 4 | Haven |

| 5 | Kristian |

+-------------+----------+

Salaries table:

+-------------+--------+

| employee_id | salary |

+-------------+--------+

| 5 | 76071 |

| 1 | 22517 |

| 4 | 63539 |

+-------------+--------+

输出:

+-------------+

| employee_id |

+-------------+

| 1 |

| 2 |

+-------------+

解释:

雇员1,2,4,5 都工作在这个公司。

1号雇员的姓名丢失了。

2号雇员的薪水信息丢失了。

题解:

select employees.employee_id
from employees
left join salaries
on employees.employee_id=salaries.employee_id
where salaries.salary is null 
union
select salaries.employee_id
from salaries
left join employees
on employees.employee_id=salaries.employee_id
where employees.name is null
order by employee_id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值