一、两表连接题
175、 Combine Two Tables
select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId
181、 Employees Earning More Than Their Managers
SELECT a.Name AS Employee
FROM Employee a JOIN Employee b
ON a.ManagerId = b.Id
WHERE a.Salary > b.Salary;
SELECT *
FROM
Logs l1,
Logs l2,
Logs l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num
AND l2.Num = l3.Num
197、 Rising Temperature
SELECT
weather.id AS 'Id'
FROM
weather
JOIN
weather w ON DATEDIFF(weather.date, w.date) = 1
AND weather.Temperature > w.Temperature
select distinct t1.*
from stadium t1, stadium t2, stadium t3
where t1.people >= 100 and t2.people >= 100 and t3.people >= 100
and
(
(t1.id - t2.id = 1 and t1.id - t3.id = 2 and t2.id - t3.id =1) #t1, t2, t3
or
(t2.id - t1.id = 1 and t2.id - t3.id = 2 and t1.id - t3.id =1) #t2, t1, t3
or
(t3.id - t2.id = 1 and t2.id - t1.id =1 and t3.id - t1.id = 2) #t3, t2, t1
)
order by t1.id
SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM
Employee
JOIN
Department ON Employee.DepartmentId = Department.Id
WHERE
(Employee.DepartmentId , Salary) IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
知识点总结:假设有A,B两表,A为左边表,B为右边表
1.inner join(等值连接):只返回两个表中联接字段相等的行, 产生的结果是两表的交集;
SELECT * FROM Table A INNER JOIN Table B ON TableA.name = TableB.name
2.left [outer] join (左连接):以A表为基础,输出为A表的全部数据,B表有的组合。没有的为null
SELECT * FROM Table A LEFT OUTER JOIN Table B ON TableA.name = TableB.name
3.right [outer] join(右连接):以B表为基础,输出为B表的全部数据,A表的有的组合。没有的为null
SELECT * FROM Table A RIGHT OUTER JOIN Table B ON TableA.name = TableB.name
4.full [outer] join(全连接):产生A和B的并集。对于没有匹配的记录,则会以null做为值。
SELECT * FROM Table A FULL OUTER JOIN Table B ON TableA.name = TableB.name
5. cross join(交叉连接,笛卡尔积) 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。
SELECT * FROM Table A CROSS JOIN Table B
二、Delete语句
196、Delete Duplicate Emails
DELETE p1
FROM Person p1, Person p2
WHERE p1.Email = p2.Email AND p1.Id > p2.Id;
格式:DELETE [*] FROM table_name;
三、Update语句
627、Swap Salary
UPDATE salary
SET sex = CASE sex
WHEN 'm' THEN 'f'
ELSE 'm'
END;
626、 Exchange Seats
SELECT
(CASE
WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
WHEN MOD(id, 2) != 0 AND counts = id THEN id
ELSE id - 1
END) AS id,
student
FROM
seat,
(SELECT
COUNT(*) AS counts
FROM
seat) AS seat_counts
ORDER BY id ASC;
- update格式:
UPDATE table_name
SET column1 = value1, column2 = value2, …
WHERE condition; - CASE 格式:
CASE input_expression
WHEN when_expression THEN result_expression
[ …n ]
ELSE else_result_expression
END
四、排等级类题
176、Second Highest Salary
SELECT
(SELECT DISTINCT
Salary
FROM
Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1) AS SecondHighestSalary
;
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M=N-1;
RETURN (
# Write your MySQL query statement below.
SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1
);
END
178、Rank Scores
SELECT
Score,
(SELECT count(*) FROM (SELECT distinct Score s FROM Scores) tmp WHERE s >= Score) Rank
FROM Scores
ORDER BY Score desc
185、Department Top Three Salaries
SELECT
d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
Employee e1
JOIN
Department d ON e1.DepartmentId = d.Id
WHERE
3 > (SELECT
COUNT(DISTINCT e2.Salary)
FROM
Employee e2
WHERE
e2.Salary > e1.Salary
AND e1.DepartmentId = e2.DepartmentId
)
五、基础知识点题目
182、Duplicate Emails
select Email
from Person
group by Email
having count(Email) > 1;
183、 Customers Who Never Order
select customers.name as 'Customers'
from customers
where customers.id not in
(
select customerid from orders
);
595、Big Countries
SELECT
name, population, area
FROM
world
WHERE
area > 3000000 OR population > 25000000
596、Classes More Than 5 Students
SELECT
class
FROM
courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5
select *
from cinema
where mod(id, 2) = 1 and description != 'boring'
order by rating DESC