[データベース]SQL JOIN


  • https://www.youtube.com/playlist?list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq
  • SQL Joins Visualizerサイト
  • 机を割る


    複数のテーブルの情報を1つのテーブルに組み合わせる技術.
  • RDBで最も重要な機能はJOINです.
  • 例を挙げる.


    1、3番の調音には重複する情報があります.メリットは一目でわかりますが、データベース容量が大量に消費され、データの変更時に問題が発生します.
    読みやすいですが、書き込みが不便です.



    topic、author、profileを3つのテーブルに分けることで、重複データを減らすことができます.データの変更は簡単ですが、一目瞭然ではありません.
    データの変更は便利だが、読むのは不便だ.
    📌この両者の関係を解決するために,RDBのJOIN演算が存在する.

    JOIN可視化



    JOIN





  • トピック・テーブルの4番目のチュートリアルでは、authorテーブルの情報は参照されません.
  • authorテーブルの3番目のチュートリアルは、トピックテーブルでは参照されません.
  • LEFT (OUTER) JOIN ⭐


    SELECT * FROM TableA A 
    LEFT JOIN TableB B ON 
    A.key = B.key WHERE B.key IS NULL
    SELECT * FROM TableA A 
    LEFT JOIN TableB B ON 
    A.key = B.key
    SELECT * FROM topic 
    LEFT JOIN author 
    ON topic.author_id = author.aid
  • トピック・テーブルのすべてのチュートリアルがインポートされます.
  • トピックテーブルの左側にauthorテーブルの釘を貼ります.
    (ただしtopic.author id=author.aidのみ)
  • トピック・テーブルでauthorテーブルを参照しないチュートリアルがある場合はnullで値を入力します.
  • SELECT * FROM topic 
    LEFT JOIN author 
    ON topic.author_id = author.aid 
    LEFT JOIN profile 
    ON author.profile_id = profile.pid;
    
    SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aidの結果表と概要表はLEFTOUTER JOIN
    SELECT tid, topic.title, author_id, name, profile.title 
    AS job_title FROM topic 
    LEFT JOIN author 
    ON topic.author_id = author.aid 
    LEFT JOIN profile 
    ON author.profile_id = profile.pid;
    SELECT tid, topic.title, author_id, name, profile.title 
    AS job_title FROM topic 
    LEFT JOIN author 
    ON topic.author_id = author.aid 
    LEFT JOIN profile 
    ON author.profile_id = profile.pid WHERE aid = 1;

    RIGHT OUTER JOIN


    SELECT * FROM TableA A 
    RIGHT JOIN TableB B 
    ON A.key = B.key
    SELECT * FROM TableA A 
    RIGHT JOIN TableB B ON 
    A.key = B.key WHERE A.key IS NULL
    大部分はLEFTOUTER JOINに還元して使用(非常用)

    INNER JOIN ⭐⭐


    SELECT * FROM TableA A 
    INNER JOIN TableB B ON 
    A.key = B.key
  • NULL値のtupleは存在しません.
  • は一般的に性能が良好である.
  • の内部接続で必要なデータを取得するのが難しい場合は、左外部接続を使用します.
  • SELECT * FROM topic 
    INNER JOIN author 
    ON topic.author_id = author.aid

    左側のoutherjoin結果からnull値を持つtupleを削除します.
    SELECT * FROM topic 
    INNER JOIN author 
    ON topic.author_id = author.id 
    INNER JOIN profile 
    ON profile.pid = author.profile_id

    これから現れるjoinは難しいが、重要ではない.

    FULL OUTER JOIN


    SELECT * FROM TableA A 
    FULL OUTER JOIN TableB B 
    ON A.key = B.key
  • 多くのRDBはサポートされていません.
  • 左外部接続と右外部接続の結果を合わせて重複を解消します.
    full outer joinの結果と同じです.
  • は重要ではありませんが、私たちはこのようなものがあることを知る必要があります.
  • -- full outer join
    SELECT * FROM topic 
    FULL OUTER JOIN author 
    ON topic.author_id = author.aid
    
    -- left outer join + right outer join 에서 중복 제거
    (SELECT * FROM topic 
    LEFT JOIN author 
    ON topic.author_id = author.aid) 
    UNION -- DISTINCT가 생략되어있다.
    (SELECT * FROM topic 
    RIGHT JOIN author 
    ON topic.author_id = author.aid)

    EXCLUSIVE LEFT JOIN


    SELECT * FROM TableA A 
    FULL OUTER JOIN TableB B 
    ON A.key = B.key 
    WHERE A.key IS NULL OR B.key IS NULL
    SELECT * FROM topic 
    LEFT JOIN author 
    ON topic.author_id = author.aid 
    WHERE author.aid is NULL

    CROSS JOIN


    SELECT
    A.NAME, B.AGE
    FROM EX_TABLE A
    CROSS JOIN JOIN_TABLE B
  • は、すべての状況のすべての数字を表す方法です.
  • SELF JOIN


    SELECT
    A.NAME, B.AGE
    FROM EX_TABLE A, EX_TABLE B
  • は自分と契約した.
  • のテーブルを何度もコピーすれば、サインとみなすことができます.
  • は、通常、自分のコラムを変形するために使用されます.