文章目录
组合两个表(简单)
解题
SELECT p.FirstName,p.LastName,a.City,a.State
FROM Person p
LEFT JOIN Address a
ON p.PersonId=a.PersonId;
第二高的薪水(简单)
解题
SELECT
IFNULL(
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1,1),
NULL) SecondHighestSalary;
超过经理收入的员工(简单)
解题
SELECT
IFNULL(e3.n1,NULL) Employee
FROM
(SELECT
e1.Name n1,e1.Salary s1,e2.Name n2,e2.Salary s2
FROM
Employee e1,Employee e2
WHERE
e2.Id=e1.ManagerId) e3
WHERE
e3.s1>e3.s2;
查找重复的电子邮箱(简单)
解题
# Write your MySQL query statement below
SELECT IFNULL(Email,NULL) Email
FROM (SELECT COUNT(Id) count_id,Email FROM Person GROUP BY Email) p1
WHERE p1.count_id>1;
SELECT Email
FROM Person
GROUP BY Email
HAVING COUNT(Email)>1;
从不订购的客户(简单)
解题
# Write your MySQL query statement below
SELECT IFNULL(c.name,NULL) Customers
FROM Customers c
WHERE c.id NOT IN (SELECT o.CustomerId FROM Orders o);
删除重复的电子邮箱(简单)
解题
该做法要注意删除语句不能作用于查询后修改的表,也就是group by之后应该建临时表来保存
DELETE FROM Person
WHERE Id NOT IN (
SELECT id FROM
(
SELECT MIN(Id) AS Id
FROM Person
GROUP BY Email
) AS temp
);
自连接做法
# Write your MySQL query statement below
DELETE p1
FROM Person p1,Person p2
WHERE p1.Email=p2.Email AND p1.Id>p2.Id;
上升的温度(简单)
日期的比较要用DATEDIFF函数
# Write your MySQL query statement below
SELECT IFNULL(w1.Id,null) Id
FROM Weather w1,Weather w2
WHERE DATEDIFF(w1.RecordDate, w2.RecordDate) = 1 AND w1.Temperature>w2.Temperature
大的国家(简单)
使用OR
# Write your MySQL query statement below
SELECT name,population,area
FROM World
WHERE area>3000000 OR population>25000000
使用UNION连接子查询,UNION默认DISTINCT
SELECT name, population, area
FROM world
WHERE area > 3000000
UNION
SELECT name, population, area
FROM world
WHERE population > 25000000
;
通过对比,发现UNION的速度更快
超过5名学生的课(简单)
# Write your MySQL query statement below
SELECT IFNULL(class,null) class
FROM courses
GROUP BY class
HAVING COUNT(DISTINCT student)>=5
有趣的电影(简单)
- 用%运算,效率低
# Write your MySQL query statement below
SELECT *
FROM cinema
WHERE description<>"boring" AND id%2=1
ORDER BY rating DESC
- 用MOD函数,效率高
# Write your MySQL query statement below
SELECT *
FROM cinema
WHERE description<>"boring" AND MOD(id,2)=1
ORDER BY rating DESC
交换工资(简单)
这个好理解,但是效率低
# Write your MySQL query statement below
UPDATE salary
SET sex=IF(sex='f','m','f');
用CASE表达式
# Write your MySQL query statement below
UPDATE salary
SET sex=CASE sex WHEN 'f' THEN 'm' ELSE 'f' END;
重新格式化部门表(简单)
# Write your MySQL query statement below
SELECT id,
SUM(CASE `month` WHEN 'Jan' THEN revenue END) Jan_Revenue,
SUM(CASE `month` WHEN 'Feb' THEN revenue END) Feb_Revenue,
SUM(CASE `month` WHEN 'Mar' THEN revenue END) Mar_Revenue,
SUM(CASE `month` WHEN 'Apr' THEN revenue END) Apr_Revenue,
SUM(CASE `month` WHEN 'May' THEN revenue END) May_Revenue,
SUM(CASE `month` WHEN 'Jun' THEN revenue END) Jun_Revenue,
SUM(CASE `month` WHEN 'Jul' THEN revenue END) Jul_Revenue,
SUM(CASE `month` WHEN 'Aug' THEN revenue END) Aug_Revenue,
SUM(CASE `month` WHEN 'Sep' THEN revenue END) Sep_Revenue,
SUM(CASE `month` WHEN 'Oct' THEN revenue END) Oct_Revenue,
SUM(CASE `month` WHEN 'Nov' THEN revenue END) Nov_Revenue,
SUM(CASE `month` WHEN 'Dec' THEN revenue END) Dec_Revenue
FROM Department
GROUP BY id;