집 >데이터 베이스 >MySQL 튜토리얼 >SQL문의 MINUS, INTERSECT, UNION ALL 분석
SQL 문의 세 가지 키워드: MINUS(뺄셈), INTERSECT(교차점) 및 UNION ALL(합집합)
집합의 개념은 누구나 중학교 때 배웠을 것입니다. 즉, 이 세 가지 키워드는 중국어 의미와 마찬가지로 주로 데이터베이스의 쿼리 결과를 조작하는 데 사용됩니다. 두 개의 쿼리, MINUS는 교차점이 있는 경우 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 빼는 것입니다. 교차 부분은 부분에서 뺍니다. 그렇지 않으면 첫 번째 쿼리 결과와 차이가 없습니다. INTERSECT는 두 쿼리 결과의 교집합이고, UNION ALL은 두 쿼리의 합집합입니다. 간단한 SQL문으로도 동일한 함수를 구현할 수 있지만 성능차이가 매우 큽니다. 누군가 실험을 해본 결과: made_order는 총 230,000개의 레코드를 가지고 있고, Charge_detail은 총 170,000개의 레코드를 가지고 있습니다.
SELECT order_id FROM made_order MINUS SELECT order_id FROM charge_detail 耗时:1.14 sec SELECT a.order_id FROM made_order a WHERE a.order_id NOT exists ( SELECT order_id FROM charge_detail WHERE order_id = a.order_id ) 耗时:18.19 sec
성능 차이는 다음과 같습니다. 15.956번! 따라서 이 문제가 발생하면 MINUS, INTERSECT 및 UNION ALL을 사용하여 문제를 해결하는 것이 좋습니다. 그렇지 않으면 비즈니스 어디에서나 볼 수 있는 수백만 건의 데이터 쿼리에 직면하게 됩니다. 서버는 우리에게 패하지 않을 것입니다.
PS: 두 가지 애플리케이션 세트를 빼고, 교차하고, 더할 때 엄격한 요구 사항이 있습니다. 1. 두 세트의 필드가 명확해야 합니다(*를 사용하면 작동하지 않습니다. 오류가 발생함). 2. 필드 유형과 순서는 동일합니다(이름은 다를 수 있음). 예: 세트 1의 필드 1은 NUMBER이고, 필드 2는 VARCHAR이며, 세트 2의 필드 1도 NUMBER여야 합니다. 필드 2는 VARCHAR이어야 합니다. 3. 정렬할 수 없습니다. 결과를 정렬하려면 설정 작업 후 외부에 설정하면 됩니다. 이전 예와 같이 정렬을
SELECT * FROM (SELECT order_id FROM made_order MINUS SELECT order_id FROM charge_detail) ORDER BY ORDER_ID ASC로 변경할 수 있습니다.
위 내용은 SQL문의 MINUS, INTERSECT, UNION ALL 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!