1.合并两个表
2.查找第N高的数据
3.查找第N高的数据
4.查找超过经理收入的员工
o( ̄▽ ̄)ブ
1.合并两个表
(第一次在leetcode刷SQL!疯狂合影咔咔咔
175题
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。
例如,可能需要使用联结来完成以下工作:
对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
列出所有产品以及订购数量,包括没有人订购的产品;
计算平均销售规模,包括那些至今尚未下订单的客户。
在上述例子中,联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结。
SELECT语句使用了关键字OUTER JOIN来指定联结的类型(而不是在WHERE子句中指定)。但是,与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字
指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。
SELECT FirstName,LastName,City,State
FROM Person LEFT OUTER JOIN Address
ON Person.PersonId = Address.PersonId;`
2.查找第2高的数据
176题
使用limit和offset
limit n字句表示查询结果返回前n条数据
offset n字句表示跳过n条语句
limit x offset y表示跳过y条数据返回前x条
例如寻找第二大的值,先进行降序排序,然后利用limit和offset跳过第一条返回前一条
如果遇到没有第N高的特殊情况,用ifnull函数
ifnull(a, b) 的含义是:
如果value1 值非空,则返回a;
如果value1 值空,则返回b
考虑到可能存在同样的值,用distinct去重
SELECT ifnull(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1,1), null)as SecondHighestSalary
3.同2,查找第N高的值
177题(竟然超过了100%我好牛逼噻!
但要注意limit在存储中不能使用参数,要在RETURN之前,BEGIN之后
进行
SET n = N - 1
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET n = N - 1;
RETURN ( # Write your MySQL query statement below.
SELECT ifnull(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT n, 1 ), null
)as NthHighestSalary );
END
4.超过经理收入的员工
第1题
解决一个问题需要使用表中有联系的两列,可以看做是将内容完全相同的两张表使用两次
这就涉及到一个知识点,即表别名,这样做有两个主要理由:
缩短SQL语句;
允许在单条SELECT语句中多次使用相同的表。
应该注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。
此外,这里还涉及到自联结,如前所述,使用表别名的主要原因之一是能在单条SELECT语句中不止一次引用相同表。查询中需要的两个表实际上是相同的表,即同一张表FROM子句中出现了两次。虽然这是完全合法的,但对同一张表的引用具有二义性,因为MySQL不知道你引用的是表中的哪个实例。为解决此问题,使用了表别名。
SELECT a.Name AS Employee
FROM Employee AS a, Employee AS b
WHERE a.ManagerId = b.Id
AND a.Salary > b.Salary
另一种方法,考虑到两张表相同,所以可以用内部联结来做,等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。
两个表之间的关系是FROM子句的组成部分,以INNER
JOIN指定。在使用这种语法时,联结条件用特定的ON子句不是WHERE子句给出。传递给ON的实际条件与传递WHERE的相同。(此处必须要用ON指出条件,不然会形成笛卡尔积
SELECT a.Name AS Employee
FROM Employee AS a INNER JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
此处惊讶的发现!!使用内部联结的效率远远高于使用自联结!!所以两种方式一定要对比着来~
第一天刷题准备到此为止啦★,°:.☆( ̄▽ ̄)/$:.°★ 。计划六点起来开刷但是很自然??的失败了,现在厨房里的香味已经超出了我的控制范围,我要不顾一切冲出去了!不过还是收获满满,甚至有点喜欢这种做题的感觉~坚持每天刷,时间能久一点更好,冲鸭!!盯着目标不动摇!