mysql查詢語句進階

排序

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章