복붙노트

[SQL] 조인 가입 및 다른 유형의 SQL 지

SQL

조인 가입 및 다른 유형의 SQL 지

는 SQL은 무엇 가입하고 다른 유형은 무엇입니까?

해결법

  1. ==============================

    1.W3 스쿨에서 그림 :

    W3 스쿨에서 그림 :

  2. ==============================

    2.SQL은 가입 두 개 이상의 데이터베이스 테이블에서 데이터를 검색하는 방법입니다.

    SQL은 가입 두 개 이상의 데이터베이스 테이블에서 데이터를 검색하는 방법입니다.

    총 5 조인이 있습니다. 그들은 :

      1. JOIN or INNER JOIN
      2. OUTER JOIN
    
         2.1 LEFT OUTER JOIN or LEFT JOIN
         2.2 RIGHT OUTER JOIN or RIGHT JOIN
         2.3 FULL OUTER JOIN or FULL JOIN
    
      3. NATURAL JOIN
      4. CROSS JOIN
      5. SELF JOIN
    

    A는 가입 이런 종류의, 우리는보고되지 않습니다 일치하지 않는 두 테이블의 모든 두 테이블에서 조건에 맞는 기록, 기록을 얻을.

    BOTH 테이블 만 일치하는 항목이 나열되어야한다 : 즉, INNER는 그 하나의 사실에 기초 JOIN.

    A는 다른없이 가입하는 것이 주 (INNER, OUTER, LEFT, 등 같은) 내부 조인입니다 키워드를 가입. 즉, IS 가입 INNER하는 문법적는 가입 (참조 : 가입 및 내부 조인의 차이를).

    OUTER가를 검색 가입

    어느 한 쪽,        다른 테이블에서 한 테이블에서 일치하는 행과 모든 행      또는,        모든 테이블의 모든 행 (일치가 있는지 여부는 중요하지 않습니다).

    외부 세 가지 종류가 가입 있습니다 :

    2.1 LEFT OUTER는 가입 또는 가입은 LEFT

    이것은에서 일치하는 행과 함께 반환에게 왼쪽 테이블의 모든 행에 합류      바로 테이블. 오른쪽 테이블에 일치하는 열이없는 경우 NULL 값을 반환합니다.

    2.2 RIGHT OUTER는 가입 또는 가입 권리

    이것은에서 일치하는 행과 함께 반환을 오른쪽 테이블의 모든 행을 가입      왼쪽 테이블. 왼쪽 테이블에 일치하는 열이없는 경우 NULL 값을 반환합니다.

    2.3 FULL OUTER은 JOIN 또는 FULL은 가입

    이 콤바인 왼쪽 외부 조인 및 RIGHT OUTER JOIN은. 조건이 충족되고 일치가없는 경우 반환 값을 NULL 때 그것은 두 테이블에서 행을 반환합니다.

    BOTH 테이블 (FULL) 또는 테이블 (오른쪽 또는 왼쪽) 중 하나에 만 일치하는 항목이 나열되어야한다 : 즉, OUTER는 사실을 기반으로 JOIN.

    Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
    

    그것은 두 가지 조건을 기반으로합니다 :

    이것은 자연에 그 결과 (아마도) 대부분의 DBMS로 더 이론적 인의 것으로 보인다 심지어이 지원 귀찮게하지 않습니다.

    그것은 관련된 두 테이블의 데카르트 제품입니다. 십자가의 결과는 이해가되지 않습니다 가입 상황의 대부분이다. 또한, 우리는 (정확히 말하면, 또는 적어도 필요) 모두에서이 필요하지 않습니다.

    그것은 오히려 그것은 그 자체로 테이블의 (INNER, OUTER 등)을 가입하고, 가입의 다른 양식을하지 않습니다.

    JOIN를 절에 사용되는 연산자에 따라,의 조인 두 가지 유형이있을 수있다. 그들은

    우리가 만 항등 연산자 (=)를 사용하는 경우 무엇을 위해, 우리는 말, 유형 (INNER, OUTER 등) 가입 는 EQUI이 가입 조인.

    EQUI 조인 이것은 동일하지만 다른 사업자 등>, <,> = 등을 허용

  3. ==============================

    3.정의:

    정의:

    JOINS 동시에 여러 테이블에서 함께 결합하는 데이터를 조회하는 방법입니다.

    RDBMS에 대한 우려 조인의 5 종류가 있습니다 :

    SQL의 관심과 발전에 따라,이 조인의 3 종류가 있습니다 모든 RDBMS는의 조인이 유형을 사용하여 얻을 수 있습니다 조인.

    참고 : 자체 조인에 의해 달성 될 수있다 INNER이 조인, 외부 조인 및 CROSS-JOIN 요구 사항을 기반으로하지만, 테이블 자체에 가입해야 하나.

    자세한 내용은:

    1.1 : INNER가-가입 : 구현을 동등 조인

    SELECT  *
    FROM Table1 A 
     INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;
    

    1.2 : INNER가-가입 : 구현을 자연 조인

    Select A.*, B.Col1, B.Col2          --But no B.ForeignKeyColumn in Select
     FROM Table1 A
     INNER JOIN Table2 B On A.Pk = B.Fk;
    

    1.3와 INNER이 조인 구현을 비 동등 조인

    Select *
     FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;
    

    1.4 :와 INNER-는 가입 자체 조인

    Select *
     FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;
    

    2.1 : OUTER은 (완전 외부 조인)에 가입

    Select *
     FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;
    

    2.2 : LEFT는 가입

    Select *
     FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;
    

    2.3 : RIGHT 가입

    Select *
     FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;
    

    3.1 : CROSS는 가입

    Select *
     FROM TableA CROSS JOIN TableB;
    

    3.2 : CROSS은 가입-자기가 가입

    Select *
     FROM Table1 A1 CROSS JOIN Table1 A2;
    

    //또는//

    Select *
     FROM Table1 A1,Table1 A2;
    
  4. ==============================

    4.흥미롭게도 다른 대부분의 답변은이 두 가지 문제로 고통 :

    흥미롭게도 다른 대부분의 답변은이 두 가지 문제로 고통 :

    A는 아마 불완전, 많은 다른 방법에 대한 포괄적 인 가이드 SQL에서 테이블을 조인, 내가 여기에 요약 것이다 : 나는 최근에 주제에 대한 기사를 작성했습니다.

    A는이 개 조인 된 테이블 사이 카티 제품을 만들어 가입하기 때문에 벤 다이어그램, 그래서 잘못을 설명하는 이유입니다. 위키 백과는 멋지게 보여

    직교 제품에 대한 SQL 구문은 CROSS 조인입니다. 예를 들면 :

    SELECT *
    
    -- This just generates all the days in January 2017
    FROM generate_series(
      '2017-01-01'::TIMESTAMP,
      '2017-01-01'::TIMESTAMP + INTERVAL '1 month -1 day',
      INTERVAL '1 day'
    ) AS days(day)
    
    -- Here, we're combining all days with all departments
    CROSS JOIN departments
    

    어떤 콤바인에게 다른 테이블의 모든 행이 한 테이블에서 모든 행 :

    출처:

    +--------+   +------------+
    | day    |   | department |
    +--------+   +------------+
    | Jan 01 |   | Dept 1     |
    | Jan 02 |   | Dept 2     |
    | ...    |   | Dept 3     |
    | Jan 30 |   +------------+
    | Jan 31 |
    +--------+
    

    결과:

    +--------+------------+
    | day    | department |
    +--------+------------+
    | Jan 01 | Dept 1     |
    | Jan 01 | Dept 2     |
    | Jan 01 | Dept 3     |
    | Jan 02 | Dept 1     |
    | Jan 02 | Dept 2     |
    | Jan 02 | Dept 3     |
    | ...    | ...        |
    | Jan 31 | Dept 1     |
    | Jan 31 | Dept 2     |
    | Jan 31 | Dept 3     |
    +--------+------------+
    

    우리가 테이블의 쉼표로 구분 된 목록을 작성하는 경우, 우리는 같은를 얻을 수 있습니다 :

    -- CROSS JOINing two tables:
    SELECT * FROM table1, table2
    

    내부는 필터링 CROSS는 필터 조건은 관계 대수에 세타라고 곳에 가입 만되어 JOIN.

    예를 들어 :

    SELECT *
    
    -- Same as before
    FROM generate_series(
      '2017-01-01'::TIMESTAMP,
      '2017-01-01'::TIMESTAMP + INTERVAL '1 month -1 day',
      INTERVAL '1 day'
    ) AS days(day)
    
    -- Now, exclude all days/departments combinations for
    -- days before the department was created
    JOIN departments AS d ON day >= d.created_at
    

    키워드 INNER가 (MS Access에서 제외) 선택 사항입니다.

    (결과 예에 대한 기사 봐)

    세타가-가입의 특별한 종류의 동등은 우리가 가장 많이 사용하는 가입이다. 술어는 다른 테이블의 외래 키와 한 테이블의 기본 키를 결합한다. 우리가 그림에 대한 Sakila 데이터베이스를 사용하는 경우, 우리는 쓸 수 있습니다 :

    SELECT *
    FROM actor AS a
    JOIN film_actor AS fa ON a.actor_id = fa.actor_id
    JOIN film AS f ON f.film_id = fa.film_id
    

    이것은 그들의 영화와 모든 배우를 결합합니다.

    또는 또한, 일부 데이터베이스에 :

    SELECT *
    FROM actor
    JOIN film_actor USING (actor_id)
    JOIN film USING (film_id)
    

    은 USING () 신택스는 동작의 테이블을 가입하고 그 두 열에 동등 술어를 작성 양쪽 있어야 열을 지정 가능하다.

    다른 답변이 별도로 "유형 가입하세요"나열했습니다,하지만 그건 이해가되지 않습니다. 그것은의 특별한 경우이다 동등 조인을 위해 단지 구문 설탕 형태의 세타 - JOIN 또는 INNER가 가입. 자연은 가입 단순히 두 테이블에 공통이 결합되는 등) (그 열을 사용 조인 모든 열을 수집합니다. 어떤합니다 (Sakila 데이터베이스에 LAST_UPDATE 열 등)로 인해 우발적 인 성냥, 좀처럼 유용합니다.

    여기 구문입니다 :

    SELECT *
    FROM actor
    NATURAL JOIN film_actor
    NATURAL JOIN film
    

    이제, OUTER JOIN은 INNER에서 약간의 다른는 여러 직교 제품의 UNION을 만들어으로 JOIN입니다. 우리는 쓸 수있다:

    -- Convenient syntax:
    SELECT *
    FROM a LEFT JOIN b ON <predicate>
    
    -- Cumbersome, equivalent syntax:
    SELECT a.*, b.*
    FROM a JOIN b ON <predicate>
    UNION ALL
    SELECT a.*, NULL, NULL, ..., NULL
    FROM a
    WHERE NOT EXISTS (
      SELECT * FROM b WHERE <predicate>
    )
    

    우리가 OUTER 쓰기 (일반적으로 더 나은 데이터베이스 최적화 된) 가입, 그래서 아무도, 후자를 작성하고자합니다.

    INNER처럼 키워드 OUTER 여기, 선택 사항입니다.

    세 가지 맛에서 외부 조인을 제공 :

    이 모든이 키워드 (사용) 또는 자연과 함께 할 수 있습니다 (I 실제로 자연 전체에 대한 실제 사용 사례를 했어 최근에 가입)

    SQL 표준은 이것에 대한 구문을 가지고 전에 OUTER 이미 가입 지원 Oracle과 SQL Server의 일부 역사, 사용되지 않는 구문이 있습니다 :

    -- Oracle
    SELECT *
    FROM actor a, film_actor fa, film f
    WHERE a.actor_id = fa.actor_id(+)
    AND fa.film_id = f.film_id(+)
    
    -- SQL Server
    SELECT *
    FROM actor a, film_actor fa, film f
    WHERE a.actor_id *= fa.actor_id
    AND fa.film_id *= f.film_id
    

    이 구문을 사용하지 않기 때문에 가졌어요. 당신은 오래된 블로그 게시물 / 레거시 코드에서 인식 할 수 있도록 난 그냥 여기를 나열합니다.

    소수의 사람들이 알고 있지만, SQL 표준 지정은 외부 조인 (오라클 구현이) 분할. 이 같은 일을 쓸 수 있습니다 :

    WITH
    
      -- Using CONNECT BY to generate all dates in January
      days(day) AS (
        SELECT DATE '2017-01-01' + LEVEL - 1
        FROM dual
        CONNECT BY LEVEL <= 31
      ),
    
      -- Our departments
      departments(department, created_at) AS (
        SELECT 'Dept 1', DATE '2017-01-10' FROM dual UNION ALL
        SELECT 'Dept 2', DATE '2017-01-11' FROM dual UNION ALL
        SELECT 'Dept 3', DATE '2017-01-12' FROM dual UNION ALL
        SELECT 'Dept 4', DATE '2017-04-01' FROM dual UNION ALL
        SELECT 'Dept 5', DATE '2017-04-02' FROM dual
      )
    SELECT *
    FROM days 
    LEFT JOIN departments 
      PARTITION BY (department) -- This is where the magic happens
      ON day >= created_at
    

    결과의 일부 :

    +--------+------------+------------+
    | day    | department | created_at |
    +--------+------------+------------+
    | Jan 01 | Dept 1     |            | -- Didn't match, but still get row
    | Jan 02 | Dept 1     |            | -- Didn't match, but still get row
    | ...    | Dept 1     |            | -- Didn't match, but still get row
    | Jan 09 | Dept 1     |            | -- Didn't match, but still get row
    | Jan 10 | Dept 1     | Jan 10     | -- Matches, so get join result
    | Jan 11 | Dept 1     | Jan 10     | -- Matches, so get join result
    | Jan 12 | Dept 1     | Jan 10     | -- Matches, so get join result
    | ...    | Dept 1     | Jan 10     | -- Matches, so get join result
    | Jan 31 | Dept 1     | Jan 10     | -- Matches, so get join result
    

    여기서 포인트는이 "가입의 다른 쪽의"에 일치하는 것을 가입하는 경우 가입의 파티션 측면에서 모든 행에 관계없이 결과에 바람 것입니다. 긴 이야기를 짧게 :이 보고서에 스파 스 데이터를 채우는 것입니다. 매우 유용한!

    진심으로? 다른 대답이 없어? 이 SQL의 기본 구문을 갖고 있지 않기 때문에 당연하지, 불행히도 (단지 ANTI처럼 아래 가입). 그러나 우리는 IN ()를 사용하여) (예를 들어, 존재 수 영화에서 연주 한 모든 배우를 찾을 수 있습니다 :

    SELECT *
    FROM actor a
    WHERE EXISTS (
      SELECT * FROM film_actor fa
      WHERE a.actor_id = fa.actor_id
    )
    

    반은 술어 가입과 같이 WHERE a.actor_id = fa.actor_id 술어는 역할을합니다. 당신이 그것을 믿지 않는 경우에, 실행 계획, 예를 들어, 체크 아웃 오라클한다. 당신은 데이터베이스가 SEMI가 아닌 EXISTS () 술어를 조작 가입하세요 실행하는 것을 볼 수 있습니다.

    이 SEMI의 정반대 조인 (하지만 NOT IN 사용하지 않도록주의가 중요한주의를 가지고로)

    여기에 영화없이 모든 배우가 있습니다 :

    SELECT *
    FROM actor a
    WHERE NOT EXISTS (
      SELECT * FROM film_actor fa
      WHERE a.actor_id = fa.actor_id
    )
    

    어떤 사람들 (특히 MySQL의 사람들)도 ANTI 쓰기는 다음과 같이 가입 :

    SELECT *
    FROM actor a
    LEFT JOIN film_actor fa
    USING (actor_id)
    WHERE film_id IS NULL
    

    나는 역사적인 이유는 성능라고 생각합니다.

    OMG,이 사람은 냉각 너무입니다. 나는 그것을 언급하는 유일한 사람이야? 여기에 멋진 쿼리는 다음과 같습니다

    SELECT a.first_name, a.last_name, f.*
    FROM actor AS a
    LEFT OUTER JOIN LATERAL (
      SELECT f.title, SUM(amount) AS revenue
      FROM film AS f
      JOIN film_actor AS fa USING (film_id)
      JOIN inventory AS i USING (film_id)
      JOIN rental AS r USING (inventory_id)
      JOIN payment AS p USING (rental_id)
      WHERE fa.actor_id = a.actor_id -- JOIN predicate with the outer query!
      GROUP BY f.film_id
      ORDER BY revenue DESC
      LIMIT 5
    ) AS f
    ON true
    

    그것은 배우마다 영화를 생산하는 TOP 5 수익을 찾을 수 있습니다. 때마다 당신은 당신의 친구가 될 것입니다 가입 측면하는 TOP-N 당 뭔가 질의를 필요로한다. 당신은 SQL 서버 사람이 있다면, 당신은이 적용 이름으로 유형을 가입 알고

    SELECT a.first_name, a.last_name, f.*
    FROM actor AS a
    OUTER APPLY (
      SELECT f.title, SUM(amount) AS revenue
      FROM film AS f
      JOIN film_actor AS fa ON f.film_id = fa.film_id
      JOIN inventory AS i ON f.film_id = i.film_id
      JOIN rental AS r ON i.inventory_id = r.inventory_id
      JOIN payment AS p ON r.rental_id = p.rental_id
      WHERE fa.actor_id = a.actor_id -- JOIN predicate with the outer query!
      GROUP BY f.film_id
      ORDER BY revenue DESC
      LIMIT 5
    ) AS f
    

    의 부정 행위 확인, 아마도 것을하는 JOIN 또는 적용 측면 표현이 정말 여러 행을 생성하는 "상관 하위 쿼리"이기 때문이다. 우리가 "상관 하위 쿼리"를 허용한다면, 우리는 또한에 대해 이야기 할 수 ...

    이것은 단지 정말 오라클과 (내 지식) 인포믹스로 구현됩니다 만, 그것은 XML을 사용하여 PostgreSQL을 사용하여 배열 및 / 또는 XML과 SQL Server의 에뮬레이트 할 수 있습니다.

    MULTISET는 상관 서브 쿼리를 생성하여 외부 쿼리의 행의 결과 세트 둥지. 쿼리 아래의 모든 배우를 선택하고 각 배우에 대한 중첩 된 컬렉션 자신의 영화를 수집합니다 :

    SELECT a.*, MULTISET (
      SELECT f.*
      FROM film AS f
      JOIN film_actor AS fa USING (film_id)
      WHERE a.actor_id = fa.actor_id
    ) AS films
    FROM actor
    

    당신이 본 바와 같이, 단지 "지루한"INNER, OUTER 및 CROSS은 일반적으로 언급되는 가입보다 가입의 많은 종류가 있습니다. 내 문서의 자세한 내용. 그리고 그들을 설명하기 위해 벤 다이어그램을 사용을 중지하십시오.

  5. ==============================

    5.내 의견으로는, 말보다 더 나은 설명하는 그림을 만들었습니다 :

    내 의견으로는, 말보다 더 나은 설명하는 그림을 만들었습니다 :

  6. ==============================

    6.은 USING 키워드 : 내 애완 동물 초조을 밀어거야.

    은 USING 키워드 : 내 애완 동물 초조을 밀어거야.

    의 양쪽에 두 테이블은 외국 키가 제대로라는 이름의 한 가입하는 경우 (즉, 같은 이름이 아니라 "ID는) 다음이 사용할 수 있습니다 :

    SELECT ...
    FROM customers JOIN orders USING (customer_id)
    

    나는이를 찾을 매우 실용적인 읽기 및 자주 사용되지 않습니다.

  7. from https://stackoverflow.com/questions/17946221/sql-join-and-different-types-of-joins by cc-by-sa and MIT license