国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

讀《程序員的SQL金典》[3]--表連接、子查詢

2024-07-21 02:50:50
字體:
來源:轉載
供稿:網友
讀《程序員的SQL金典》[3]--表連接、子查詢一、表連接-JOIN

1. 自連接實例

查詢類型相同的訂單信息。

SELECT O1 .*,O2.*FROM T_Order O1 JOIN T_Order O2ON O1 .FTypeId= O2.FTypeId AND O1.FID <O2. FId

Image(3)

二、子查詢

子查詢允許將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在數據庫中表示某個字段的值為未知。

以下面的數據為例:

Image(4)

1.NULL與比較運算符

在比較運算符運算時,運算結果仍未NULL,因為DBMS認為無法確定NULL是否在某個取值范圍之內。例如:

SELECT * FROM T_Employee WHERE FSalary< 5000 OR FSalary>=5000

Image(5)

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

Image(6)

4.NULL與函數

NULL值出現在普通函數時,結果還是NULL; 但當NULL值出現在聚合函數時,NULL值將被忽略。

SELECT FSalary +1000 FROM T_Employee

Image(7)

SELECT Count (Fid), COUNT(FSalary ) FROM T_Employee

Image(8)

四、開窗函數

1. OVER()

開窗函數可以對結果集進行聚合計算,但和平時用的聚合函數有些差別。看個實際例子:

想查詢工資低于5k的員工姓名和年齡,并且每行都要展示符合條件人群總數。

SELECT FName ,FAGE , ( SELECT COUNT (*)FROM T_Person WHERE FSALARY< 5000)FROM T_PersonWHERE FSALARY <5000

Image(9)

通過子查詢方式實現的想要的結果,但是使用開窗函數可以更加簡單。

開創函數格式:函數(列) OVER()。

==》

SELECTFName,FAGE,COUNT(*)OVER()FROMT_PersonWHEREFSALARY<5000

2.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

Image(10)

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

Image(11)

②NTILE(num)分區

NTILE()函數用來將結果集中的行按照某個列的值進行平均分割,然后返回當前行所在的區域編號。NTILE()函數接受一個整數類型的值,這個值表示把結果集分割成的份數。注意必須在NTILE()函數后的OVER()子句中使用ORDER BY指定排序。

SELECT FName , FSalary ,FAge,NTILE(3 ) OVER (ORDER BY FSalary )FROM T_Person ;

Image(12)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金平| 克什克腾旗| 敖汉旗| 麟游县| 普格县| 胶州市| 沅陵县| 柳林县| 金沙县| 固原市| 岱山县| 将乐县| 曲阜市| 上高县| 阆中市| 旺苍县| 绥阳县| 凤冈县| 双辽市| 南乐县| 南昌县| 昌平区| 定远县| 治县。| 宁蒗| 清流县| 鹰潭市| 乌兰县| 杨浦区| 洱源县| 昌都县| 沅陵县| 望城县| 缙云县| 观塘区| 芜湖市| 玉山县| 平和县| 远安县| 息烽县| 西峡县|