SQL中的重複值與null值處理
阿新 • • 發佈:2022-05-15
目錄
資料準備
-- 建表 CREATE TABLE IF NOT EXISTS TEST01.A ( ID VARCHAR(50) COMMENT 'ID號' -- 01 ,NUMS INT COMMENT '數字' -- 02 ,NAME VARCHAR(50) COMMENT '名字' -- 03 ) COMMENT 'A表' STORED AS PARQUET ; -- 插數 INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('01',1,NULL); INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('02',2,''); INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('03',3,'c'); -- 刪數 DELETE FROM TEST01.A WHERE ID = '04'; -- 刪表 DROP TABLE IF EXISTS TEST01.A;
null空值處理
空值 ''
- 只有字元型欄位可以插入'',數值型欄位無法插入''
- ''可以認為是正常的字元
- 注意關聯欄位為‘’的情況
空值 null
count與distinct
SELECT COUNT(`NAME`) FROM TEST01.A; -- 2 不算null 但算‘’ SELECT COUNT(DISTINCT `NAME`) FROM TEST01.A; -- 2 不算null 但算‘’ SELECT DISTINCT `NAME` FROM TEST01.A; -- 3 null ''都算 SELECT `NAME` FROM TEST01.A GROUP BY `NAME`; -- 3 null ''都算 SELECT COUNT(1) FROM (SELECT `NAME` FROM TEST01.A)T; -- 3 null ''都算 SELECT COUNT(1) FROM (SELECT DISTINCT `NAME` FROM TEST01.A)T; -- 3 null ''都算 SELECT COUNT(`NAME`) FROM (SELECT DISTINCT `NAME` FROM TEST01.A)T; -- 2 不算null 但算‘’
count
不保留空值mull,保留重複值。(針對空值null處理,去掉空值null)distinct
保留空值null,所有重複空值合併,所有重複值合併。(針對重複值處理,合併重複值)count
+distinct
不保留空值null,所有重複值合併。(針對空值null處理,去掉空值null;針對重複值處理,合併重複值)
綜上:只要count(欄位名),會忽略null
union與distinct
-- 01 SELECT `NAME` FROM TEST01.A UNION SELECT `NAME` FROM TEST01.B; -- 3 null ''都算 -- 02 SELECT DISTINCT `NAME` FROM TEST01.A UNION SELECT DISTINCT `NAME` FROM TEST01.B; -- 3 null ''都算 -- 03 SELECT COUNT(1) FROM ( -- 3 null ''都算 SELECT DISTINCT `NAME` FROM TEST01.A UNION SELECT DISTINCT `NAME` FROM TEST01.B -- 3 null ''都算 )T;
sum與null
sum(列)
是對所有列的值求和。
- 如果沒查到資料,sum的值為null
- 如果查到的資料這一列值為null,sum的值為null
- 如果查到資料有null,也有不是null的,那麼sum的值為所有非空值的和
重複值處理
group by、distinct與row_number互換
- 下面2種寫法結果一樣
-- 寫法01
SELECT DISTINCT ID,`NAME`
FROM A;
-- 寫法02
SELECT ID,`NAME`
FROM A
GROUP BY ID,`NAME`;
- 下面2種寫法結果一樣
-- 寫法01
SELECT COUNT(DISTINCT ID)
FROM A;
-- 寫法02
SELECT COUNT(1)
(SELECT ID
FROM A
GROUP BY ID
) B
WHERE B.ID IS NOT NULL;
- 下面3種寫法結果不同
-- 寫法01
SELECT COUNT(DISTINCT ID)
FROM A;
-- 寫法02 與 寫法01 意義不同,但有其他用途
SELECT COUNT(ID)
FROM A
GROUP BY ID;
-- 寫法03
-- 可以找出那些重複出現的行id
SELECT ID,COUNT(ID)
FROM A
GROUP BY ID
HAVING COUNT(ID)>1;
- 下面2種寫法結果一樣
-- 寫法01
SELECT COUNT(DISTINCT ID)
FROM A;
-- 寫法02
SELECT COUNT(1)
(SELECT ID
FROM A
GROUP BY ID
) B
WHERE B.ID IS NOT NULL;
- 下面2種寫法結果一樣
-- 寫法01
SELECT COUNT(DISTINCT COALESCE(ID,'NULL'))
FROM A;
-- 寫法02
SELECT COUNT(1)
(SELECT ID
FROM A
GROUP BY ID
) B;
- 下面2種寫法結果一樣
-- 寫法01
-- 會顯示出所有去重後的id
-- count(id)=0,表示該id為null
SELECT ID,COUNT(ID) FROM A GROUP BY ID;
-- 寫法02
-- 顯示去重後的id,以及此時id對應的name
SELECT ID,`NAME` FROM
(SELECT ID,`NAME`,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) AS RN FROM A
) B
WHERE RN = 1;