1. 程式人生 > 其它 >SQL中的重複值與null值處理

SQL中的重複值與null值處理

目錄

資料準備

-- 建表
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空值處理

空值 ''

  1. 只有字元型欄位可以插入'',數值型欄位無法插入''
  2. ''可以認為是正常的字元
  3. 注意關聯欄位為‘’的情況

空值 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;