刷题-Leetcode刷SQL

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也就结束了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值