복붙노트

[SQL] 어떻게 SQL 명령문 작업 존재?

SQL

어떻게 SQL 명령문 작업 존재?

나는 SQL을 배우려고 노력하고있어 이해가 문을 존재하는 힘든 시간을 보내고 있어요. 나는 "존재"뭔가를 이해하지 못하는 대한이 인용 건너 온 :

어떻게 하위 쿼리를 행 외부 쿼리의 노하우가 확인됩니다 않습니다 이해가 안 무엇입니까? 예를 들면 :

SELECT *
  FROM suppliers
 WHERE EXISTS (select *
                 from orders
                where suppliers.supplier_id = orders.supplier_id);

나는 공급 업체 및 주문 테이블 경기에서 ID가, 서브 쿼리는 공급 업체의 테이블에 일치하는 행에서 사실 모든 열을 반환 할 경우 출력을 이해합니다. 내가하지 않는 것은 어떤 특정 행 서브 쿼리가 통신이 경우 만 true 또는 false가 반환되고 인쇄되어야한다 (공급 업체 ID 25 행이 말할 수) 방법이다.

외부 쿼리와 하위 쿼리 사이에 관계가 없음을 나에게 나타납니다.

해결법

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

    1.그것을 이런 식으로 생각 :

    그것을 이런 식으로 생각 :

    공급자에서 '각'행, 검사가 '존재'경우 조건 Suppliers.supplier_id (이 외부 쿼리 현재 '행'에서 유래) = Orders.supplier_id을 충족 주문 테이블의 행하십시오. 첫 번째 일치하는 행을 찾을 때, 바로 거기 중지 - EXISTS 곳은 만족하고있다.

    외부 쿼리와 Supplier_id 평가 각 행의 서브 쿼리에 외부 쿼리에서 전달되는 사실에서 하위 쿼리 거짓말 사이의 마법 링크.

    또는, 다른 방법을 넣어, 서브 쿼리는 외부 쿼리의 각 테이블 행에 대해 실행됩니다.

    서브 쿼리가 전체에서 실행 한 후 '참 / 거짓'하고 외부 쿼리이 '참 / 거짓'조건을 일치 시키려고 얻는다처럼 그것은 아닙니다.

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

    2.(가) 예하고있다 EXISTS 내부에 무슨 일이 당신은 WHERE 절을 생각하십니까? 어떻게 공급 업체 참조가되지 않을 때의 그 결론에 도달하거나이 EXISTS 절에서 JOIN 절을합니까?

    (가) 예하고있다 EXISTS 내부에 무슨 일이 당신은 WHERE 절을 생각하십니까? 어떻게 공급 업체 참조가되지 않을 때의 그 결론에 도달하거나이 EXISTS 절에서 JOIN 절을합니까?

    기준의 첫 경기에서 TRUE로 TRUE / FALSE에 대한 valuates 및 종료 존재 - 더 빨리보다 할 수있는 이유입니다. 또한의 SELECT 절은 무시됩니다 존재한다는 것을 인식 - IE :

    SELECT s.*
      FROM SUPPLIERS s
     WHERE EXISTS (SELECT 1/0
                     FROM ORDERS o
                    WHERE o.supplier_id = s.supplier_id)
    

    ... 제로 오류로 부서를 공격해야하지만, 그것은하지 않습니다. WHERE 절은 가장 중요한 부분은 EXISTS 절입니다.

    부모에 관련된 하나 개 이상의 자식 레코드가 있다면 중복 부모 기록이있을 것이기 때문에 또한,이 조인이 존재 직접 대체 아니라는 것을주의하십시오.

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

    3.당신은 가입 중 하나를 사용하여 동일한 결과를 생성 할 수 있습니다, IN, 또는 INTERSECT 존재 :

    당신은 가입 중 하나를 사용하여 동일한 결과를 생성 할 수 있습니다, IN, 또는 INTERSECT 존재 :

    SELECT s.supplier_id
    FROM suppliers s
    INNER JOIN (SELECT DISTINCT o.supplier_id FROM orders o) o
        ON o.supplier_id = s.supplier_id
    
    SELECT s.supplier_id
    FROM suppliers s
    WHERE EXISTS (SELECT * FROM orders o WHERE o.supplier_id = s.supplier_id)
    
    SELECT s.supplier_id 
    FROM suppliers s 
    WHERE s.supplier_id IN (SELECT o.supplier_id FROM orders o)
    
    SELECT s.supplier_id
    FROM suppliers s
    INTERSECT
    SELECT o.supplier_id
    FROM orders o
    
  4. ==============================

    4.이처럼 보였다있는 곳에 절을 한 경우 :

    이처럼 보였다있는 곳에 절을 한 경우 :

    WHERE id in (25,26,27) -- and so on
    

    일부 행이 반환 일부가 아닌 이유를 쉽게 이해할 수있다.

    WHERE 절은 다음과 같은 경우 :

    WHERE EXISTS (select * from orders where suppliers.supplier_id = orders.supplier_id);
    

    그냥 의미 : 테 동일한 ID와 주문 테이블의 기존 기록이 반환 행.

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

    5.하자 우리가 일대 테이블 관계를 형성하는 우리의 데이타베이스는 다음과 같은 두 개의 테이블을 가지고 가정합니다.

    하자 우리가 일대 테이블 관계를 형성하는 우리의 데이타베이스는 다음과 같은 두 개의 테이블을 가지고 가정합니다.

    학생 테이블은 부모, 그리고 학생 테이블의 ID를 기본 키 열을 참조하는 student_id 외래 키 열이 있기 때문에 student_grade 자식 테이블입니다.

    학생 테이블은 다음과 같은 두 개의 레코드를 포함 :

    | id | first_name | last_name | admission_score |
    |----|------------|-----------|-----------------|
    | 1  | Alice      | Smith     | 8.95            |
    | 2  | Bob        | Johnson   | 8.75            |
    

    그리고, student_grade 테이블 저장 성적은 학생들 수신 :

    | id | class_name | grade | student_id |
    |----|------------|-------|------------|
    | 1  | Math       | 10    | 1          |
    | 2  | Math       | 9.5   | 1          |
    | 3  | Math       | 9.75  | 1          |
    | 4  | Science    | 9.5   | 1          |
    | 5  | Science    | 9     | 1          |
    | 6  | Science    | 9.25  | 1          |
    | 7  | Math       | 8.5   | 2          |
    | 8  | Math       | 9.5   | 2          |
    | 9  | Math       | 9     | 2          |
    | 10 | Science    | 10    | 2          |
    | 11 | Science    | 9.4   | 2          |
    

    하자 우리가 수학 클래스 10 등급을받은 모든 학생들을 얻을하고 싶은 말은.

    우리는 단지 학생 식별자에 관심이 있다면, 우리는 이와 같은 쿼리를 실행할 수 있습니다 :

    SELECT
        student_grade.student_id
    FROM
        student_grade
    WHERE
        student_grade.grade = 10 AND
        student_grade.class_name = 'Math'
    ORDER BY
        student_grade.student_id
    

    우리는 학생 테이블에서 정보뿐만 아니라 필요하므로하지만, 응용 프로그램, 학생의 이름 만이 아니라 식별자를 표시에 관심이있다.

    수학에서 10 등급이 학생 레코드를 필터링하기 위해, 우리는이 같은 SQL 연산자를 EXISTS 사용할 수 있습니다 :

    SELECT
        id, first_name, last_name
    FROM
        student
    WHERE EXISTS (
        SELECT 1
        FROM
            student_grade
        WHERE
            student_grade.student_id = student.id AND
            student_grade.grade = 10 AND
            student_grade.class_name = 'Math'
    )
    ORDER BY id
    

    쿼리를 위에 실행하는 경우, 우리는 앨리스 행이 선택되어 있는지를 확인할 수 있습니다 :

    | id | first_name | last_name |
    |----|------------|-----------|
    | 1  | Alice      | Smith     |
    

    외부 쿼리는 우리가 클라이언트에 반환에 관심이있는 학생 행 열을 선택합니다. 그러나, WHERE 절은 연관된 내부 부질와 연산자 존재 사용된다.

    서브 쿼리 반환 적어도 하나의 기록과 거짓 행이 선택되어 있지 않은 경우는 경우는 운영자 true를 반환 존재한다. 데이터베이스 엔진이 완전히 하위 쿼리를 실행할 필요가 없습니다. 하나의 기록이 일치하는 경우, 연산자는 true를 반환 존재하고, 관련된 다른 쿼리 행이 선택됩니다.

    student_grade 테이블의 student_id 열이 외부 학생 테이블의 ID 항목에 대해 일치하기 때문에 내부 부질는 상관된다.

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

    6.서브 쿼리 반환 적어도 하나의 행, 그건 정말 것을 의미 존재한다. 그것은 내부 테이블의 외측에 supplier_id 테이블 supplier_id을 확인하기 때문에 그 경우에는, 상관 부질이다. 이 쿼리는 사실상 말한다 :

    서브 쿼리 반환 적어도 하나의 행, 그건 정말 것을 의미 존재한다. 그것은 내부 테이블의 외측에 supplier_id 테이블 supplier_id을 확인하기 때문에 그 경우에는, 상관 부질이다. 이 쿼리는 사실상 말한다 :

    모든 공급 업체를 선택 주문이 공급이있는 경우, 각 공급 업체 ID를 들어, 참조 공급자가 주문 테이블에 존재하지 않는 경우, 결과에서 공급 업체를 제거 주문 테이블에서 해당 행이 모든 공급 업체를 반환

    당신은 INNER이 경우에 같은 일을 할 수있는 가입.

    SELECT suppliers.* 
      FROM suppliers 
     INNER 
      JOIN orders 
        ON suppliers.supplier_id = orders.supplier_id;
    

    조랑말의 의견은 정확합니다. 당신은 조인으로 그룹화 할 필요가, 또는 당신이 필요로하는 데이터에 따라 서로 다른 선택 것입니다.

  7. ==============================

    7.당신이 설명하는 것은 상관 하위 쿼리 소위 쿼리입니다.

    당신이 설명하는 것은 상관 하위 쿼리 소위 쿼리입니다.

    (일반적으로) 당신이 대신 조인을 사용하여 쿼리를 작성하여 피하기 위해 시도해야 뭔가 :

    SELECT suppliers.* 
    FROM suppliers 
    JOIN orders USING supplier_id
    GROUP BY suppliers.supplier_id
    

    그렇지 않으면 때문에, 서브 쿼리는 외부 쿼리의 각 행에 대해 실행됩니다.

  8. from https://stackoverflow.com/questions/5846882/how-do-sql-exists-statements-work by cc-by-sa and MIT license