【LeetCode】【SQL】简单类别合集

本文精选了多个SQL数据库面试题目及解答,包括表的组合、查询特定排名的薪水、处理重复数据等,深入解析SQL查询语句,如左连接、子查询、分组与聚合函数的使用技巧。

题目来源:LeetCode For English    ||  力扣中文版

题目类别:数据库

题目难度:简单

题目范围:免会员版所有题目

目录

 

175.组合两个表

176.第二高的薪水

181.超过经理收入的员工

182.查找重复的电子邮箱

183.从不订购的客户

196.删除重复的电子邮箱

197.上升的温度

595.大的国家

596.超过5名学生的课

620.有趣的电影

627.交换工资

1179.重新格式化部门表


 

175.组合两个表

SELECT FirstName, LastName, City, State FROM Person LEFT JOIN Address ON
 Person.PersonId = Address.PersonId;

外连接

在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。如果基表的数据在另一张表没有记录。那么在相关联的结果集行中列显示为空值(NULL)。

查询的是左表所有数据以及其交集部分。

 

 

176.第二高的薪水

SELECT (SELECT DISTINCT Salary FROM Emplyee OEDER BY Salary DESC LIMIT 1,1) 
AS SecondHightestSalary; 

或者使用IFNULL 

SELECT IFNULL( (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1,1), null ) 
AS SecondHighestSalary;

SQL查询语句中的 limit 与 offset 的区别:

  • limit y 分句表示: 读取 y 条数据
  • limit x, y 分句表示: 跳过 x 条数据,读取 y 条数据
  • limit y offset x 分句表示: 跳过 x 条数据,读取 y 条数据

 

 

181.超过经理收入的员工

SELECT a.Name AS 'Employee' FROM Employee AS a, Employee AS b 
WHERE a.ManagerId = b.Id AND a.Salary > b.Salary;

 

 

182.查找重复的电子邮箱

SELECT Email FROM Person GROUP BY Email having count(Email)>1;

where 和 having的区别?

  1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
  2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。

 

 

183.从不订购的客户

SELECT Name AS 'Customers' 
FROM Customers 
WHERE  Customers.Id NOT IN 
    (SELECT CustomerId FROM orders);

 

196.删除重复的电子邮箱

DELETE p1.Email FROM Person p1, Person p2 WHERE p1.Email = p2.Email AND p1.Id > p2.Id;

 

 

197.上升的温度

SELECT w1.Id FROM Weather w1 INNER JOIN Weather w2 
DATEDIFF(day,w1.RecordDate,w2.RecordDate) = 1 
WHERE w1.Temperature < w2.Temperature;

这里的DATEDIFF有个坑

Mysql中DATEDIFF用法:

SELECT DATEDIFF('2008-12-29','2008-12-30') AS DiffDate;   
// 结果为-1,第一个参数是结束时间,第二个参数是开始时间

TIMESTAMPDIFF用法:

SELECT TIMESTAMPDIFF(DAY,'2008-12-29','2008-12-30') AS DiffDate;
 //结果为1,第一个为开始时间,第二个为结束时间

在使用在线AlaSQL内存型数据库测试的时候

SELECT DATEDIFF('2008-12-29','2008-12-30') AS DiffDate; 
// 结果为1,同样的语法在不同的数据库结果不同。

 

 

595.大的国家

SELECT Name, Population, Area FROM World WHERE Area > 3000000 OR Population > 25000000;

 

 

596.超过5名学生的课

SELECT class FROM courses GROUP BY class having COUNT(DISTINCT student)>=5;

DISTINCT用法:

  1. distinct一般是用来去除查询结果中的重复记录的,只能用在select语句中
  2. 对多列操作时,必须放到所有字段前面(否则报错),作用范围是其后面所有字段
  3. 不过滤Null

 

 

620.有趣的电影

SELECT *  FROM cinema    WHERE description != "boring" AND mod(id, 2)=1 ORDER BY rating DESC;

 

 

627.交换工资

UPDATE salary SET sex= CASE WHEN sex='m' THEN 'f' WHEN sex='f' THEN 'm' ELSE NULL END;

CASE WHEN THEN ELSE END

 

1179.重新格式化部门表

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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值