1. 程式人生 > >SQL 語句易錯點講解

SQL 語句易錯點講解

我想 world pan region 條件 比較 進行 哪些 過濾

1.NULL 值不要與其他具體值進行比較,NULL也不能與NULL進行比較

比如: 哪些國家的GDP 比在歐洲任何一個國家的GDP都高

錯誤示範"

SELECT name FROM bbc
 WHERE gdp > ALL (SELECT gdp FROM bbc WHERE region = ‘Europe‘ AND gdp<>NULL);

用 gpd <> NULL 這樣是無法排除 gdp 是 NULL的情況

正確做法:

SELECT name FROM bbc
 WHERE gdp > ALL (SELECT gdp FROM bbc WHERE region = ‘Europe‘ AND gdp>0);

另外: NULL = NULL 這樣比較是沒有用的

2.WHERE 和 HAVING 分不清楚

WHERE 過濾行,而HAVING 過濾分組

給出兩個例子分別HAVING 和WHERE

表格格式:

world(name, continent, area, population, gdp)

技術分享圖片

例1: 每個大陸有多少個 人口在200000000的國家.

SELECT continent,count(name)
FROM world
WHERE population > 200000000
GROUP BY continent

例2; 展示總人口在500000000的大陸

SELECT continent,sum(population)
FROM world
GROUP BY continent
HAVING sum(population) >= 500000000;

從上面的例子,我們可以 把 WHERE 比作過濾發生在分組前,而HAVING 是分組後進行過濾

比如WHERE 先把人口 200000000 的 行 先過濾了,而HAVING是在分組之上,把組內不符合條件的 數據 過濾

另外一個例子: 我想要知道總和面積大於

BBC表格:

技術分享圖片

15000000 的區域 和 區域總和面積

 SELECT region, SUM(area)
   FROM bbc 
  WHERE SUM(area) > 15000000 
  GROUP BY region

 WHERE 無法根據區域總和來過濾行.

正確做法應該是:

 SELECT region, SUM(area)
   FROM bbc 
  GROUP BY region
  HAVING SUM(area) > 15000000 

SQL 語句易錯點講解