Leetcode刷SQL
(以下皆为简单题)
627.变更性别
给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表,不能用select
-- 方法1
UPDATE salary SET sex = CHAR(ASCII('f')+ASCII('m')-ASCII(sex))
-- 方法2
UPDATE salary SET
sex = CASE sex WHEN 'f' THEN 'm' ELSE 'f' END
182.查找重复的电子邮箱
编写一个 SQL 查询,查找 Person
表中所有重复的电子邮箱。
思路:用groupby计数作子表,再筛选出计数>1的邮箱ID
-- 方法1
SELECT Email
FROM (SELECT Email,count(Email) as c from Person GROUP BY Email) as t
WHERE t.c>1
-- 方法2
SELECT Email FROM Person GROUP BY Email HAVING COUNT(*)>1
注:group by col_name having … ,可以看作是根据某个字段的不同值划分成一个个table(包含表的所有列),而having 对这些table使用聚合函数(如果用过微软的power query的,应该能理解,这和power query的分组一样生成table)
620.有趣的电影
写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列
-- 方法1,142ms,not description = 'boring'比description <> 'boring'节约时间
SELECT * FROM cinema WHERE id%2=1 and not description = 'boring' order by rating desc
-- 方法2:id&1用于判断id为奇数,154ms
SELECT * FROM cinema WHERE id&1 and not description = 'boring' order by rating desc
175.组合两个表
无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
SELECT FirstName,LastName,City,State From (Person p LEFT join Address a ON p.PersonId =a.PersonId)
181.超过经理收入的员工
该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
SELECT e2.Name as Employee FROM Employee e1 ,Employee e2 WHERE e1.Id =e2.ManagerId and e2.Salary>e1.Salary
183.从不订购的客户
某网站包含两个表,Customers
表和 Orders
表。编写一个 SQL 查询,找出所有从不订购任何东西的客户
-- 方法1,用右连接
SELECT Name Customers FROM (Orders o right join Customers c on c.Id = o.CustomerId) where CustomerId is null
-- 方法2,用子查询
SELECT Name Customers FROM Customers WHERE Id not in (SELECT CustomerId FROM Orders)
196.删除重复的电子邮件
-- 自查询条件删除
DELETE p1
FROM Person p1,
Person p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
思路:
a. 从表p1取出3条记录;
b. 拿着第1条记录去表p2查找满足WHERE的记录,代入该条件p1.Email = p2.Email AND p1.Id > p2.Id后,发现没有满足的,所以不用删掉记录1;
c. 记录2同理;
d. 拿着第3条记录去表p2查找满足WHERE的记录,发现有一条记录满足,所以要从p1删掉记录3;
e. 3条记录遍历完,删掉了1条记录,这个DELETE也就结束了