排序
dense_rank() over ():排序,相同的值會並列排序(比如:Salary是100,200,300,300,400則是1,2,3,3,4)
row_number() over():相當於Oracle中的列名,不會並列排序(比如:Salary是100,200,300,300,400則是1,2,3,4,5)
rank() over():相同的值會並列排序,但相同的值的下一個值依然展示的是個數(比如:Salary是100,200,300,300,400則是1,2,3,3,5)
分區函數
partition by:按照什麼進行分區
例題:
Employee 表工資前三名的員工並關聯Department表查出部門
select a.name as Department,b.name as Employee,b.Salary from Department as a,(select dense_rank() over (partition by DepartmentId order by Salary desc) as rmk,Salary,DepartmentId,name from Employee ) as b
where a.id = b.DepartmentId and rmk <=3
判斷是否爲null
ifnull(a,b):如果爲空則執行b,不爲空執行a
limit
limit i,j:i爲起始位置的索引(默認是0可省略,所以一般省略了),j是偏移量
例題:
輸出第二高的工資,如果沒有輸出null
select ifnull(
(select distinct(Salary) from Employee order by Salary desc limit 1,1 )
,NULL) as SecondHighestSalary ;
分組查詢
group by
例題:
超過2個的郵箱
select Email from (select Email,count(Email) as a from Person group by Email) as temp where temp.a>1
計算時間差
DATEDIFF(a,b):計算結束時間b與開始時間a之間的時間差
if
if(a,b,c):a滿足則返回b,不滿足返回c
case when
例子:
SELECT
case username
when ‘a’ then 1
when ‘b’ then 2
else 3
end
FROM users;
函數
- 定義函數:
create function 函數名(參數)returns 返回類型
begin
函數體
return(返回的);
end - 調用函數
SELECT function_name(parameter_value,…) - 刪除函數
drop function function_name
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
select Salary from (
select Salary,dense_rank() over(order by Salary desc) as rmk from Employee ) as tep where tep.rmk=N
);
END