SQL]集約演算子


この投稿では、ファストパスキャンパスの「データベースとSQL合格チャネルオンライン」コースをまとめました.

集合演算子のタイプ


タイプunion複数のSQL文の結果を示す集合重複行は、出力データを1行ずつ並べ替えて出力します.UNIOALLの複数のSQL文の結果の並列行を結果として表示し、INTERSECTの複数のSQL文の結果の交差行を出力EXCEPTの上にあるSQL文のセットから次のSQL文のセットを減算した結果を1行で表示します.

UNION, UNION ALL

  • UNIONコマンドデータのソート
  • SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
    UNION  
    SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE 
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
    ;
  • UNIOALLコマンドデータを並べ替えない
  • SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
    UNION ALL
    SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE 
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
    ;
  • UNIOALLコマンド重複行
  • を保持
    SELECT A.EMP_NM, A.BIRTH_DE
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
    UNION ALL
    SELECT A.EMP_NM, A.BIRTH_DE
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
    ;
  • UNIONコマンド表示重複行(非同期)が消去された値
  • SELECT A.EMP_NM, A.BIRTH_DE
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
    UNION  
    SELECT A.EMP_NM, A.BIRTH_DE
    FROM TB_EMP A 
    WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
    ;

    INTERSECT

  • INTERSECTを使用したSQLとEXISTSまたはJOINを使用したSQL文は同じ結果を示しています.
  • INTERSECTで書かれたSQL文はずっと長くて、効率が低くて、あまり使いにくいです.
  • SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
    FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
    WHERE A.EMP_NO = B.EMP_NO
    AND B.CERTI_CD = C.CERTI_CD
    AND C.CERTI_NM = 'SQLD'
    INTERSECT 
    SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
    FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
    WHERE A.EMP_NO = B.EMP_NO
    AND B.CERTI_CD = C.CERTI_CD
    AND A.ADDR LIKE '%용인%';
    SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
    FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
    WHERE A.EMP_NO = B.EMP_NO
    AND B.CERTI_CD = C.CERTI_CD
    AND C.CERTI_NM = 'SQLD'
    AND EXISTS ( SELECT 1 
                   FROM TB_EMP K 
                   WHERE K.EMP_NO = A.EMP_NO 
                     AND K.ADDR LIKE '%용인%')
    ;
    SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
      FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
     WHERE A.EMP_NO = B.EMP_NO
       AND B.CERTI_CD = C.CERTI_CD
       AND C.CERTI_NM = 'SQLD'
       AND A.ADDR LIKE '%용인%';

    MINUS演算

  • MINUS演算は、次の条件を除いた結果を示す差動セット概念である.
  • SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD FROM TB_EMP A 
    
    MINUS 
    SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A
    WHERE A.DEPT_CD = '100001'
    
    MINUS 
    SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A
    WHERE A.DEPT_CD = '100002'
    
    MINUS 
    SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A
    WHERE A.DEPT_CD = '100003'
    
    MINUS 
    SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A 
    
    WHERE A.SEX_CD = '1'
    ;
    上のSQL文
    除外後