长沙市设计网站公司手机数据线东莞网站建设技术支持
数据库操作
- 1、 表之间连接
MYSQL 题- 1、取第二高薪
 - 2、取第N高薪
 - 3、分数排名
 
 
inner join:2表值都存在
outer join:附表中值可能存在null的情况。
总结:
①A inner join B:取交集
②A left join B:取A全部,B没有对应的值,则为null
③A right join B:取B全部,A没有对应的值,则为null
④A full outer join B:取并集,彼此没有对应的值为null
1、取第二高薪
编写一个SQL查询以获得Employee表中第二高的薪水。
-  
---- + -------- +
| Id | 薪水| -  
---- + -------- +
| 1 | 100 |
| 2 | 200 |
| 3 | 300 | -  
---- + -------- +
例如,给定上面的Employee表,查询应该返回200为第二高薪水。如果没有第二高的薪水,那么查询应该返回null。 -  
--------------------- +
| SecondHighestSalary | -  
--------------------- +
| 200 | -  
--------------------- +
或者 -  
--------------------- +
| SecondHighestSalary | -  
--------------------- +
null -  
--------------------- +
 
关键字解释:
 1、子查询,第一个select 如果查询没有值 为null。没有第一个select不能保证没有第二高薪的为null。
 2、distinct 去重,如果一共两条数据,salary都是100,则第二个并不是第二高薪,因为查询结果并不能并列,所以将薪水为100,进行去重(薪水为100 保存一个,这样就起到一个并列的效果),这样第二高薪就为null,结果合理。
3、
 ① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
注意:
1.数据库数据计算是从0开始的
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit X,Y 中X表示跳过X个数据,读取Y个数据
这两个都是能完成需要,但是他们之间是有区别的:
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。
select(select distinct salary 
from Employee as em
order by em.salary asc
limit 1 offset 1) as SecondHighestSalary
 
2、第N高薪水
表: Employee
±------------±-----+
 | Column Name | Type |
 ±------------±-----+
 | id | int |
 | salary | int |
 ±------------±-----+
 在 SQL 中,id 是该表的主键。
 该表的每一行都包含有关员工工资的信息。
查询 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询结果应该为 null 。
 示例 1:
输入:
 Employee table:
 ±—±-------+
 | id | salary |
 ±—±-------+
 | 1 | 100 |
 | 2 | 200 |
 | 3 | 300 |
 ±—±-------+
 n = 2
 输出:
 ±-----------------------+
 | getNthHighestSalary(2) |
 ±-----------------------+
 | 200 |
 ±-----------------------+
 示例 2:
输入:
 Employee 表:
 ±—±-------+
 | id | salary |
 ±—±-------+
 | 1 | 100 |
 ±—±-------+
 n = 2
 输出:
 ±-----------------------+
 | getNthHighestSalary(2) |
 ±-----------------------+
 | null |
 ±-----------------------+
关键字声明
1、limit 和offset 上一个题中讲过。
 2、
//声明参数,将形参赋值给你定义的属性,因为数据库下标是从0开始的。所以-1操作。
DECLARE A INT;SET A=N-1;
 
3、整体代码
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE A INT;SET A=N-1;RETURN (# Write your MySQL query statement below.select (select distinct salaryfrom Employeeorder by salary desclimit 1 offset A )                   );
END
 
178. 分数排名
 Scores
±------------±--------+
 | Column Name | Type |
 ±------------±--------+
 | id | int |
 | score | decimal |
 ±------------±--------+
实例:
 输入:
 Scores 表:
 ±—±------+
 | id | score |
 ±—±------+
 | 1 | 3.50 |
 | 2 | 3.65 |
 | 3 | 4.00 |
 | 4 | 3.85 |
 | 5 | 4.00 |
 | 6 | 3.65 |
 ±—±------+
 输出:
 ±------±-----+
 | score | rank |
 ±------±-----+
 | 4.00 | 1 |
 | 4.00 | 1 |
 | 3.85 | 2 |
 | 3.65 | 3 |
 | 3.65 | 3 |
 | 3.50 | 4 |
 ±------±-----+
 关键字:
 mysql中排名函数有三个:
 1、row_number():表示排序,成绩相同,也不重复
 2、rank():表示排序,成绩相同,排名重复,但跳跃
 3、dense_rank():表示排序,排名重复,但不跳跃
解释:
 1、表示排序,成绩相同,也不重复(排名1,2)不会出现并列。
 
2、rank():表示排序,成绩相同,排名重复,但跳跃
 

3、dense_rank():表示排序,排名重复,但不跳跃

select score ,DENSE_RANK() OVER(ORDER BY score DESC) as 'rank'
from Scores
order by score DESC
