1.重新格式化部门
部门表 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 |
+------+-------------+-------------+-------------+-----+-------------+
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
2.超过5名学生的课
有一个courses
表 ,有: student (学生) 和 class (课程)。
请列出所有超过或等于5名学生的课。
例如,表:
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
应该输出:
+---------+
| class |
+---------+
| Math |
+---------+
select class from courses group by class having
count( distinct student) >= 5
3.上升的温度
表 Weather
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| recordDate | date |
| temperature | int |
+---------------+---------+
id 是这个表的主键
该表包含特定日期的温度信息
编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id
。
返回结果 不要求顺序 。
查询结果格式如下例:
Weather
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+----+------------+-------------+
Result table:
+----+
| id |
+----+
| 2 |
| 4 |
+----+
2015-01-02 的温度比前一天高(10 -> 25)
2015-01-04 的温度比前一天高(20 -> 30)
select b.id from weather a ,weather b where
date_add(a.recordDate, interval 1 day) = b.recordDate and a.temperature < b.temperature
4.删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person
表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person
表应返回以下几行:
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+
delete from person where id not in
(select id from
(select min(id) as id from person
group by email
)t)
不能使用如下sql,因为mysql中不能先select 一个表中的记录,再按照此条件update 或者delete同一个表中的记录
delete from person where id not in
(select min(id) as id from person
group by email
)
5. 从不订购的客户
某网站包含两个表,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 );
select c.name as customers from Customers c where not exists (select 1 from Orders o where o.CustomerId = c.Id);
select name customers From
Customers left join Orders on Customers.id = Orders.CustomerId where Orders.id is null;