SQL EXISTS 문은 어떻게 작동 작동합니까?
SQL을 배우려고하는 데 문을 이해하는 데 어려움을 겪고 있습니다. 나는 "존재한다"에 대한이 인용구를 이해가 않는다.
존재하는 연산자를 사용하면 하위 쿼리가 0 개, 1 개 또는 행을 반환 할 수 있고 여러 조건은 하위 쿼리가 행을 반환했는지 여부를 확인합니다. 하나의 단일 리터럴 (1)로 구성되어 있음을 알 수 있습니다. 포함 쿼리의 조건은 반환 된 행 수만 알면되기 때문에 하위 쿼리가 반환 한 실제 데이터는 관련이 없습니다.
내가 이해하지 못하는 것은 외부 쿼리가 하위 쿼리가 확인하는 행을 어떻게 알 수있는 것입니다. 예를 들면 :
SELECT *
FROM suppliers
WHERE EXISTS (select *
from orders
where suppliers.supplier_id = orders.supplier_id);
공급자와 주문 테이블의 ID가 일치하면 하위 쿼리가 true를 반환하고 공급자 테이블에서 일치하는 행의 모든 열이 출력되는 것을 이해합니다. 내가 얻지 못하는 것은 true 또는 false 만 반환되는 경우 하위 쿼리가 어떤 특정 행 (공급자 ID가 25 인 행이라고 말할 수 있음)을 인쇄 해야하는지 통신 방법입니다.
외부 쿼리와 하위 쿼리 사이에 관계가없는 것입니다.
다음과 같이 생각하십시오.
의 '각'의 행 Suppliers
경우 Order
테이블에보기 조건을 충족 하는 행이 '존재' 하는지 확인합니다 Suppliers.supplier_id
(이는 외부 쿼리 현재 '행'에서 가져옴) = Orders.supplier_id
. 일치하는 첫 번째 행을 찾으면 바로 거기에서 멈 멈 혹 다 WHERE EXISTS
.
외부 쿼리와 하위 쿼리 사이의 매직 링크는 Supplier_id
평가 된 각 행에 외부 쿼리에서 하위 쿼리로 전달되는 사실에 있습니다.
또는 다른 방법으로 작성, 하위 쿼리는 외부 쿼리의 각 테이블 행에 대해 실행됩니다.
하위 쿼리가 전체적으로 실행되고 'true / false'를 얻은 다음이 'true / false'조건을 외부 쿼리와 일치시키려는 것과 동일한 것입니다.
외부 쿼리와 하위 쿼리 사이에 관계가없는 것입니다.
존재하는 샘플 내의 어디에 절이 무엇을하고 생각하십니까? 공급자 참조는 절에없는 경우 어떻게 결론을 내릴 수 있습니까?
EXISTS는 TRUE / FALSE에 대해 평가하고 기준의 첫 번째 일치에서 TRUE로 종료합니다. 이것이보다 빠를 수있는 이유 IN
입니다. 또한 EXISTS의 SELECT 절이 무시 점에 유의하십시오 -IE :
SELECT s.*
FROM SUPPLIERS s
WHERE EXISTS (SELECT 1/0
FROM ORDERS o
WHERE o.supplier_id = s.supplier_id)
... 0으로 나누기 오류가 발생해야하지만. 절은 존재하는 곳에서 가장 중요한 부분입니다.
또한 JOIN은 EXISTS에 대한 대체가 아닙니다. 부모에 부모님이 많은 레코드가 둘 이상인 경우 부모가 있기 때문입니다.
당신이 중 하나를 사용하여 동일한 결과를 생성 할 수 있습니다 JOIN
, EXISTS
, 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
다음과 같은 절이있는 경우 :
WHERE id in (25,26,27) -- and so on
일부 행은 반환되고 일부는 반환되지 않는 이유를 쉽게 제거합니다.
여기서 절이 다음과 같을 때 :
WHERE EXISTS (select * from orders where suppliers.supplier_id = orders.supplier_id);
그것은 단지 의미합니다 : 동일한 ID를 가진 orders 테이블에 기존 레코드가있는 행을 반환합니다.
EXISTS는 하위 쿼리가 적어도 하나의 행을 반환한다는 것을 의미합니다. 이 경우 외부 테이블의 supplier_id와 내부 테이블의 supplier_id를 확인하므로 상관 된 하위 쿼리입니다. 이 쿼리는 실제로 다음과 같이 말합니다.
모든 공급자 선택 각 공급자 ID에 대해이 공급자에 대한 주문이 있는지 확인 공급자가 주문 테이블에없는 경우 결과에서 공급자를 제거합니다. 주문 테이블에 해당 행이있는 모든 공급자 반환
이 경우 INNER JOIN을 사용하여 동일한 작업을 수행 할 수 있습니다.
SELECT suppliers.*
FROM suppliers
INNER
JOIN orders
ON suppliers.supplier_id = orders.supplier_id;
조랑말 댓글이 맞습니다. 해당 조인으로 그룹화하거나 필요한 데이터에 따라 구별을 선택해야합니다.
설명하는 것은 상관 하위 쿼리가있는 소위 쿼리입니다 .
(일반적으로) 대신 조인을 사용하여 쿼리를 작성하여 피해야합니다.
SELECT suppliers.*
FROM suppliers
JOIN orders USING supplier_id
GROUP BY suppliers.supplier_id
그렇지 않으면 외부 쿼리의 각 행에 대해 하위 쿼리가 실행되기 때문입니다.
참고 URL : https://stackoverflow.com/questions/5846882/how-do-sql-exists-statements-work
'ProgramingTip' 카테고리의 다른 글
MySQL의 UUID 성능? (0) | 2020.10.14 |
---|---|
이메일에 이미지를 삽입하는 방법 (0) | 2020.10.14 |
DB의 특정 스키마에 대한 모든 권한을 PostgreSQL의 그룹 역할에 부여합니다. (0) | 2020.10.14 |
onclick () 및 onblur () 주문 문제 (0) | 2020.10.14 |
수입 주문 코딩 표준 (0) | 2020.10.14 |