1. 自連接實例
查詢類型相同的訂單信息。
SELECT O1 .*,O2.*FROM T_Order O1 JOIN T_Order O2ON O1 .FTypeId= O2.FTypeId AND O1.FID <O2. FId
子查詢允許將sql語句查詢結果作為結果集供其他語句使用。子查詢可以簡化復雜sql,但是使用不當會造成性能問題。
1.INSERT子查詢
INSERT...SELECT....可以將SELECT查詢結果導入到另外一個表中,并且可以在導入之前對數據進行處理。
例如:
INSERT INTO T_ReaderFavorite2( [FCategoryId],FReaderId )SELECT FCategoryId ,(FReaderId+ 1)FROM T_ReaderFavorite
2.UPDATE子查詢
可以在UPDATE的where子句中使用子查詢。
例如:
UPDATE T_BookSET FYearPublished =2014WHERE(SELECT COUNT (*)FROM T_Book b2 WHERE T_Book .FCategoryId= b2.FCategoryId)>3
3.DELETE子查詢
DELETE FROM T_ReaderFavoriteWHERE(SELECT COUNT (*) FROM T_ReaderFavorite T WHERE T. FCategoryId=T_ReaderFavorite .FCategoryId)>=5三、NULL
我們都知道,NULL在數據庫中表示某個字段的值為未知。
以下面的數據為例:
1.NULL與比較運算符
在比較運算符運算時,運算結果仍未NULL,因為DBMS認為無法確定NULL是否在某個取值范圍之內。例如:
SELECT * FROM T_Employee WHERE FSalary< 5000 OR FSalary>=5000
2.NULL與計算字段
如果NULL值出現在任何計算字段中,那么運算結果都為NULL。
可以根據具體業務需求進行處理,例如使用IS NOT NULL進行過濾,或者將Null處理成其他值。
例如:
SELECT FSalary /1000 FROM T_Employee WHERE FSalary IS NOT NULLSELECT (CASE WHEN FSalary IS NULL THEN 0 ELSE FSalary END)/1000 FROM T_Employee
3.NULL與字符串運算
如果NULL與字符串進行計算,那么結果也都是NULL.
SELECT 'dear ' +FName FROM T_Employee
4.NULL與函數
NULL值出現在普通函數時,結果還是NULL; 但當NULL值出現在聚合函數時,NULL值將被忽略。
SELECT FSalary +1000 FROM T_Employee
SELECT Count (Fid), COUNT(FSalary ) FROM T_Employee
1. OVER()
開窗函數可以對結果集進行聚合計算,但和平時用的聚合函數有些差別??磦€實際例子:
想查詢工資低于5k的員工姓名和年齡,并且每行都要展示符合條件人群總數。
SELECT FName ,FAGE , ( SELECT COUNT (*)FROM T_Person WHERE FSALARY< 5000)FROM T_PersonWHERE FSALARY <5000
通過子查詢方式實現的想要的結果,但是使用開窗函數可以更加簡單。
開創函數格式:函數(列) OVER()。
==》
SELECTFName,FAGE,COUNT(*)OVER()FROMT_PersonWHEREFSALARY<50002.PARTITION BY()
開窗函數OVER后面括號中可以使用PARTITION BY子句進行行的分區來進行聚合運算,而且可以創建多個分區。這些分區主要是用來進行聚合運算的,不會影響結果集。
COUNT (*) OVER (PARTITION BY FCITY )表示按照FCITY字段進行分區,并且返回當前行所屬的組的聚合計算結果。
實例:
SELECT FCITY ,FAGE, COUNT(*) OVER(PARTITION BY FCITY) AS NUM1 ,COUNT(*) OVER( PARTITION BY FAGE ) AS NUM2FROM T_PERSONORDER BY FAGE DESC
3.高級開窗函數
①計算排名
ROW_NUMBER()計算一行在結果集中的行號,可以當作是唯一的排名。
RANK()和DENSE_RANK()函數都是用來計算排名的,不同的是當名次重復時的處理方式。
如:
SELECT FName ,FSalary,ROW_NUMBER() OVER(ORDER BY FSalary DESC ) ,RANK() OVER(ORDER BY FSalary DESC ),DENSE_RANK() OVER(ORDER BY FSalary DESC )FROM T_Person
②NTILE(num)分區
NTILE()函數用來將結果集中的行按照某個列的值進行平均分割,然后返回當前行所在的區域編號。NTILE()函數接受一個整數類型的值,這個值表示把結果集分割成的份數。注意必須在NTILE()函數后的OVER()子句中使用ORDER BY指定排序。
SELECT FName , FSalary ,FAge,NTILE(3 ) OVER (ORDER BY FSalary )FROM T_Person ;
新聞熱點
疑難解答