22.3.31 WIL集約演算子&階層クエリー


Standard SQL


かんけいだいすう


リレーショナル・データベースから必要な情報を取得する基本演算セット
  • 通常集約演算:UNION、INTERSECT、EXCEPT、CROSS JOIN
  • 純関係演算:選択(所在節)、生産(選択節)、結合(多種類結合)、パーティション
  • 集合演算子


    2つ以上のテーブルの結合を使用しない、関連するデータをクエリーする方法です.
    テーブル内のSELECTのカラム数と各カラムのデータ型は、テーブル間で互いに互換性がある必要があります.

  • UNION(パラレル)
    UNIX用の列数とデータフォーマットを一致させ、集計後にテーブルから重複データを削除する必要があります.
    *UNIXは、テーブルのマージ時にソートされます.

  • UNION ALL
    UNIXとは異なり、重複除外に整列しない特性を有する

  • INTERSECT(交差)
    2つのテーブルの重複部分を抽出する演算;抽出後の重複結果を除去する
  • EXCEPT(差分)
    2つのテーブルから重複する部分を抽出する演算->抽出後の重複除外演算
  • 警告)INTERSECTおよびEXCEPTはOracleおよびMariaデータベースでサポートされ、MySQLではサポートX->Joinクエリーを使用します.

    階層型クエリー


    テーブルに階層化されたデータがある場合は、データを表示します.

    階層データとは?


    親と子を含むデータを同じテーブルに階層化
    例)従業員-管理者

    階層クエリーの例


    CTE(Common Table Expression)を使用して再帰を呼び出す
    WITH RECURSIVE CTE(member_id, manager_id, lvl)
    AS (
    	SELECT member_id, manager_id, 0 AS lvl
    	FROM MEMBER
    	WHERE manager_id IS NULL
    	
    	UNION ALL
    	
    	SELECT a.member_id, a.manager_id, b.lvl + 1
    	FROM MEMBER a
    	JOIN CTE AS b
    	ON a.manager_id = b.member_id
    )
    // 이 전체 쿼리가 재귀적으로 돌면서 쿼리가 한번 돌면은 CTE 테이블에 저장이 된다. -> 다시 재귀 -> CTE 테이블에 변화가 없을때 재귀가 끝난다.
    // CTE를 Recursive하게 변화시키며 저장
    
    SELECT member_id, manager_id, lvl
    FROM CTE
    ORDER BY member_id, lvl;
    
    自動接続は、階層クエリーにも使用できます.
    Select a.column1, b.column2
    	from table as a, table as b
    Where a.column1 = b.column2
    
    셀프조인 예시 
    
    Select name, salary
    	from EMPLOYEE
    Where (department_id, salary) in (
    	select department_id, max(salary)
    		from EMPLOYEE
    	group by department_id
    );
    階層検索のような状況は、無知というより、理解と使用でしょう.