sqlserver 聯接查詢的一些註意點
阿新 • • 發佈:2019-04-06
運算 生成 bug nbsp rda HERE 表連接 聚合 inner
1、內連接的安全性
(1) inner join 是ANSI SQL-92 語法、等值聯接是ANSI SQL-89 的語法 ,兩者已相同方式解釋、在性能上沒有差別
(2)但是強烈建議使用ANSI SQL - 92 聯接語法、因為它更安全、 當忘記寫聯接條件、SQL-92 語法會報錯,也就是沒有ON 會報錯、這種安全實際是編碼習慣導致的
2、包含缺失值
2.1 需求
查詢TSQL2102庫中、Order表,要求20060101~20081231每天都有數據輸出、對於沒有包含訂單的日期,以NULL 標記作為訂單屬性占位符輸出
2.2 解決思路
(1)創建數字輔助表dbo.Nums , 具有n 的列,將其填充整數 123.....,使用該表生成範圍內所有日期的序列
select dateadd(day,n-1,‘20060101‘) as orderdate from dbo.Nums where n <= datediff(day, ‘20060101‘, ‘20081231‘)+1 order by orderdate;
(2) 通過Nums 和 Order 做左外連接即可
3.外部連接的邏輯順序
(1)在單表查詢中 from 、where 後面的子句具有“同時操作”的特性,但是在外聯接中,from 後面的表連接運算符,按從左往右的邏輯順序計算
(2)由於邏輯順序的存在,在外聯結多張表是要考慮到拿NULL 去做比較的情況、NULL 做比較結果一定是UNKONWN, 會被ON直接過濾掉
4、外連接使用count聚合引發的一個bug
(1) 使用外連接,若果直接使用count(*)的話,會將null也計算其中
(2) 但是如果count(col) ,且col 是外部列就不會將NULL的記錄計算進來
sqlserver 聯接查詢的一些註意點