标签:ddr fir 相同 start 意思 distinct details function 通过
175. 组合两个表
表1: Person
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ PersonId 是上表主键
表2: Address
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+ AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
比较简单,使用左连接即可实现。左连接就是保证左边记录一定有,右连接就是保证右边记录一定有。另外注意语法是select * from 表1 left join 表2 on 表1.列名=表2.列名
提交答案:
select Person.FirstName, Person.LastName, Address.City, Address.State from Person left join Address on Person.PersonId=Address.PersonId;
176. 第二高的薪水
编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary) 。
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述 Employee
表,SQL查询应该返回 200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null
。
+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
这道题本来以为很简单,结果在对null的处理上费了很大劲,最后还是去网上找的别人的答案。以下引用自https://blog.csdn.net/havedream_one/article/details/45394127:
1、去重,所以使用group by进行分组
2、由于要得到第二大工资,所以需要进行排序,
3、max得到的最大值,但是要得到第二个最大值,所以要使用limit 1,1
limit start,len
start 表示页数,0,1,2,3....
len表示页的记录数
4、由于答案的列名是SecondHighestSalary,所以最后要使用as 重命名
5、需要使用两个select,第二个select用于重建列和列值。因为second highest salary 如果不存在的话,那么内部的select返回值是null,不符合答案。因此需要对内部select进行重建列和列值。
第五点需要两个select,通过mysql做实验确实如此,如果只有一层select,返回null,对其count返回0;两个select会返回一条null的记录,对其count返回1。具体原因还不清楚。
提交答案1(967ms):
SELECT MAX(Salary) as SecondHighestSalary
FROM Employee
WHERE Salary < (SELECT MAX(Salary) FROM Employee);
提交答案2(511ms):
select(select salary from Employee group by salary order by salary desc limit 1,1) as ‘SecondHighestSalary‘;
177. 第N高的薪水
编写一个 SQL 查询,获取 Employee
表中第 n 高的薪水(Salary)。
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述 Employee
表,n = 2 时,应返回第二高的薪水 200
。如果不存在第 n 高的薪水,那么查询应返回 null
。
+------------------------+ | getNthHighestSalary(2) | +------------------------+ | 200 | +------------------------+
如果直接来这道题可能觉得很难,不过在第二高薪水之后,只需要改limit后面的条件就可以了。这里使用了函数输入N,mysql的自定义函数之前没有用过。注意到Limit并不支持N-1这种计算,只能直接输入类似1,2,N这种数字。在Select上一行写N=N-1结果语法错误,其实应该写在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 ( SELECT salary FROM Employee GROUP BY salary ORDER BY salary DESC LIMIT N, 1 ) AS ‘SecondHighestSalary‘
);
END
178. 分数排名
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
+----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+
例如,根据上述给定的 Scores
表,你的查询应该返回(按分数从高到低排列):
+-------+------+ | Score | Rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | +-------+------+
名次实际上就是统计有几个人比我高,名次之间没有间隔就是需要去重。
提交答案:
select t.Score, (select count(distinct Score) from Scores where Score >= t.Score) as Rank from Scores t order by Score desc;
另外提一句,在调试语句的时候碰到了一个错误,err:1248 - Every derived table must have its own alias。这个错误的意思是说每个派生出来的表都必须有一个自己的别名。例如:
我的Mysql语句是:select count(*) from (select * from dede_spacemoney group by sid) ;
当我执行到这里的时候就抛出了这个异常,原来我进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名
把MySQL语句改成:select count(*) from (select * from list where name="xiao") as t;
问题就解决了。参考https://blog.csdn.net/cao478208248/article/details/28122113。
标签:ddr fir 相同 start 意思 distinct details function 通过
原文地址:https://www.cnblogs.com/jiang-s/p/9402544.html