成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

提升查詢技能,這7條SQL查詢錯(cuò)誤必須解決

數(shù)據(jù)庫 SQL Server
本文將指出一些常見但卻總是被忽略的錯(cuò)誤,請靜下心來,準(zhǔn)備好提升查詢技能吧!

 本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)

 本文將指出一些常見但卻總是被忽略的錯(cuò)誤,請靜下心來,準(zhǔn)備好提升查詢技能吧!

[[377879]]

讓我們以一個(gè)虛構(gòu)的業(yè)務(wù)為例。假設(shè)你是亞馬遜電子商務(wù)分析團(tuán)隊(duì)的一員,需要運(yùn)行幾個(gè)簡單的查詢。你手頭有兩個(gè)表,分別為“product(產(chǎn)品)”和“discount (折扣)”。

 

提升查詢技能,這7條SQL查詢錯(cuò)誤必須解決

 

1.計(jì)算NULL字段的數(shù)目

為了計(jì)算null字段的數(shù)目,要掌握COUNT函數(shù)的工作原理。假設(shè)計(jì)算產(chǎn)品數(shù)量時(shí),要求計(jì)入表格“product”的“product id”主鍵列中遺漏的字段。

 

  1. SELECT COUNT(product_id) 
  2. FROM product;Result: 3 

 

由于要求計(jì)入“product id”列中的null值,查詢結(jié)果應(yīng)該為4,但COUNT()函數(shù)不會將null值計(jì)數(shù)。

解決方法:使用COUNT(*)函數(shù)。該函數(shù)可以將null值計(jì)數(shù)。

 

  1. Select Count(*) 
  2. From product;Result: 4 

 

這個(gè)操作很簡單,但是在編寫復(fù)雜的查詢時(shí)總會被忽略。

2.使用保留字作為列名

 

  1. SELECT product_id, 
  2. RANK() OVER (ORDER BY price descAs Rank 
  3. FROM product; 

 

由于列名“Rank”是Rank函數(shù)的保留字,該查詢結(jié)果出錯(cuò)。

解決方法:

 

  1. SELECT product_id, 
  2. RANK() OVER (ORDER BY price descAs ‘Rank’ 
  3. FROM product; 

 

加上單引號,即可得到想要的結(jié)果。

3.NULL的比較運(yùn)算

 

  1. SELECT product_name 
  2. FROM product 
  3. WHERE product_id=NULL

 

由于使用了比較運(yùn)算符“=”,此處運(yùn)算會出現(xiàn)異常,使用另一比較運(yùn)算符“!=”運(yùn)算也會出現(xiàn)異常。這里的邏輯問題在于,你編寫的查詢得出的是“product id”列的值是否未知,而無法得出這一列的值是否是未知的產(chǎn)品。

解決方法:

 

  1. SELECT product_name 
  2. FROM product 
  3. WHERE product_id ISNULL

 

4.ON子句過濾和WHERE子句過濾的區(qū)別

這是一個(gè)非常有趣的概念,會提高你對于ON子句過濾和WHERE子句過濾之間區(qū)別的基本理解。這并不完全是一個(gè)錯(cuò)誤,只是演示了兩者的用法,你可以根據(jù)業(yè)務(wù)需求選擇最佳方案。

 

  1. SELECT d.product_id, 
  2. price, 
  3. discount 
  4. FROM product p RIGHT JOIN discount d ON 
  5. p.product_id=d.product_id 
  6. WHERE p.product_id>1; 

 

結(jié)果:

 

提升查詢技能,這7條SQL查詢錯(cuò)誤必須解決

 

在這種情況下,過濾條件在兩個(gè)表格連接之后生效。因此,所得結(jié)果不包含d.product_id≤1的行(同理,顯然也不包含p.product≤1的行)。

解決方法:使用AND,注意結(jié)果上的不同。

 

  1. SELECT d.product_id, 
  2. price, 
  3. discount 
  4. FROM product p RIGHT JOIN discount d ON 
  5. p.product_id=d.product_id 
  6. AND p.product_id>1; 

 

結(jié)果:

 

提升查詢技能,這7條SQL查詢錯(cuò)誤必須解決

 

在這里,條件語句AND在兩個(gè)表格連接發(fā)生之前計(jì)算。可以把此查詢看作只適用于一個(gè)表(“product”表)的WHERE子句。現(xiàn)在,由于右連接,結(jié)果中出現(xiàn)了d.product_id≤1的行(顯然還有p.product_id>1的行)。

請注意,ON子句過濾和WHERE子句過濾只在左/右/外連接時(shí)不同,而在內(nèi)連接時(shí)相同。

5.在同一查詢的WHERE子句中使用Windows函數(shù)生成的列&使用CASE WHEN子句

注意,不要在同一查詢的WHERE子句中使用通過Windows函數(shù)生成的列名以及CASE WHEN子句。

 

  1. SELECT product_id, 
  2. RANK() OVER (ORDER BY price descAS rk 
  3. FROM product 
  4. WHERE rk=2; 

 

因?yàn)榱衦k由Windows函數(shù)生成,并且在同一查詢的WHERE子句中使用了該列,這個(gè)查詢結(jié)果會出現(xiàn)異常。

解決方法:這一問題可以通過使用臨時(shí)表或者子查詢解決。

 

  1. WITH CTE AS 
  2. SELECT product_id, 
  3.  
  4.  
  5.  
  6.  
  7. RANK() OVER (ORDER BY price descAS rk 
  8. FROM product 
  9. SELECT product_id 
  10. FROM 
  11. CTE 
  12. WHERE rk=2; 

 

 

  1. SELECT product_id 
  2. FROM 
  3. SELECT product_id, 
  4. RANK() OVER (ORDER BY price descAS rk 
  5. FROM product; 
  6. WHERE rk=2; 

 

同樣的方法也適用于使用CASE WHEN子句創(chuàng)建的列。請記住,Windows函數(shù)只能出現(xiàn)在SELECT或ORDER BY子句中。

6.BETWEEN的使用不正確

如果不清楚BETWEEN的有效范圍,也許會得不到想要的查詢結(jié)果。BETWEEN x AND y語句的有效范圍包含x和y。

 

  1. SELECT * 
  2. FROM discount 
  3. WHERE offer_valid_till BETWEEN ‘2019/01/01’ AND ‘2020/01/01’ 
  4. ORDER BY offer_valid_till; 

 

結(jié)果:

 

提升查詢技能,這7條SQL查詢錯(cuò)誤必須解決

 

在查詢中,也許我們只想得到2019年的所有日期,但是結(jié)果中還包含了2020年1月1日。這是因?yàn)锽ETWEEN語句的有效范圍包含2019/01/01和2020/01/01。

解決方法:相應(yīng)地調(diào)整范圍可以解決這個(gè)問題。

 

  1. SELECT * 
  2. FROM discount 
  3. WHERE offer_valid_till BETWEEN ‘2019/01/01’ AND ‘2019/12/31’ 
  4. ORDER BY offer_valid_till; 

 

結(jié)果:

 

提升查詢技能,這7條SQL查詢錯(cuò)誤必須解決

 

現(xiàn)在,所有查詢結(jié)果均為2019年的日期。

7.在GROUP BY語句后使用WHERE子句

在編寫GROUP BY語句時(shí),請注意WHERE子句的位置。

 

  1. SELECT category, 
  2. AVG (price) 
  3. FROM product p INNER JOIN discount d ON 
  4. p.product_id=d.product_id 
  5. GROUP BY category 
  6. WHERE discount_amount>10; 

 

由于將WHERE子句放在GROUP BY語句后,此查詢是錯(cuò)誤的。這是為什么呢?

WHERE子句用于過濾查詢結(jié)果,這一步要在將查詢結(jié)果分組之前實(shí)現(xiàn),而不是先分組再過濾。正確的做法是先應(yīng)用WHERE條件過濾減少數(shù)據(jù),再使用GROUP BY子句通過聚合函數(shù)將數(shù)據(jù)分組(此處使用聚合函數(shù)AVG)。

解決方法:

 

  1. SELECT category, 
  2. AVG (price) 
  3. FROM product p INNER JOIN discount d ON 
  4. p.product_id=d.product_id 
  5. WHERE discount_amount>10 
  6. GROUP BY category; 

 

請注意主要SQL語句的執(zhí)行順序:

  • FROM 子句
  • WHERE 子句
  • GROUP BY 子句
  • HAVING 子句
  • SELECT 子句
  • ORDER BY 子句

以上包含了大部分讓人不解的錯(cuò)誤,尤其是對初學(xué)者而言。正如亨利·福特所說:“唯一的錯(cuò)誤是我們從中學(xué)不到任何東西”,希望這篇文章能幫助你精進(jìn)查詢技能。

 

責(zé)任編輯:華軒 來源: 讀芯術(shù)
相關(guān)推薦

2021-06-16 14:40:46

CIO首席信息官IT領(lǐng)導(dǎo)者

2023-12-05 07:45:35

SQL數(shù)據(jù)庫

2011-02-23 13:26:01

SQL查詢優(yōu)化

2024-08-19 00:40:00

SQL數(shù)據(jù)庫

2024-07-10 09:07:09

2024-02-22 10:36:13

SELECT 語句PostgreSQL數(shù)據(jù)查詢

2014-07-29 10:09:40

iwatch

2017-12-05 13:41:02

SQL數(shù)據(jù)庫SQL查詢

2017-01-10 11:32:19

2024-01-02 18:01:12

SQLSELECT查詢

2011-08-24 11:22:38

SQL ServerUNION代替OR

2009-01-14 09:16:24

SQL Server查SQL Server查SQL Server

2010-06-22 10:00:31

SQL查詢

2022-02-11 14:43:53

SQL語句C/S架構(gòu)

2010-09-26 15:29:13

sql查詢分頁

2011-07-07 14:22:24

SQL查詢update

2020-12-03 08:00:00

SQL數(shù)據(jù)庫MySQL

2023-09-25 13:15:50

SQL數(shù)據(jù)庫

2019-12-03 18:51:36

SQL數(shù)據(jù)庫MySQL

2020-07-27 10:37:01

編程技巧開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品18 | 亚洲激情在线 | 国产a区 | 成人av一区| 韩日一区二区 | 91在线免费视频 | 亚洲一区二区三区免费视频 | 在线免费看毛片 | 精品自拍视频在线观看 | 中文字幕国产 | 国产精品theporn | 北条麻妃一区二区三区在线视频 | 国产激情在线 | 午夜在线影院 | 午夜av电影 | 欧美日韩中 | 成人av网站在线观看 | 国产三区视频在线观看 | 日韩激情免费 | 九九伊人sl水蜜桃色推荐 | 欧美极品视频在线观看 | 亚洲狠狠爱 | 欧美激情一区二区三区 | 亚洲精品在线视频 | 国产一区二区在线91 | 一区二区三区四区免费视频 | 中文字幕日韩三级 | 无码日韩精品一区二区免费 | 国产精久久久 | 欧美美女爱爱视频 | 欧美日韩高清 | 亚洲一区二区三区免费视频 | 日本成人在线观看网站 | 国产精品成人69xxx免费视频 | 日韩一级 | 成人国产精品久久 | 在线观看国产视频 | 国产在线播放一区二区三区 | 精品亚洲一区二区三区 | 99久久精品国产一区二区三区 | 国产一区二区精华 |