Union, Minus & Intersect: Databases for Developers #15

나는 두 개의 장난감 테이블을 가지고있다 나는 두 테이블에서 모두 같은 장난감을 찾고 싶다

조인을 사용하여이 작업을 수행 할 수 있습니다 그러나 다른 방법이 있습니다 연산자를 설정하십시오! 집합 연산자를 사용하면 두 테이블의 모든 행을 합집합 할 수 있습니다 교차하는 두 테이블에 모두 존재하는 것 또는 하나의 테이블에는 있지만 마이너스는없는 테이블에는 없습니다

이들을 사용하려면 테이블을 쿼리하고 관련 연산자를 사이에두면됩니다 그들 하지만 이렇게하려면 테이블이 같은 모양이어야합니다 이는 각 위치에서 동일한 데이터 유형을 가진 같은 수의 열을 반환합니다 서로 다르면 오류가 발생합니다

두 가지 모두에있는 열을 선택하면이를 극복 할 수 있습니다 유니언은 가장 많이 사용할 연산자입니다 이것을 사용하여 유사한 데이터가있는 테이블을 결합합니다 예를 들어, 테디 테이블과 벽돌 테이블이 있다고 가정 해보십시오 그리고 그것들을 하나의 장난감 테이블에 결합하려고합니다

이렇게하려면 각 쿼리에서 적절한 열을 선택하고 두 쿼리를 결합해야합니다 이 작업을 수행하면 결과에서 고유 한 장난감마다 하나의 행이 생성됩니다 모든 중복 된 벽돌은 버려집니다 그럼 왜 이래요? 어떻게 피할 수 있습니까? Well union은 결과에 고유 한 연산자를 추가합니다 이것은 중복을 스쿼시합니다

모든 행을 보려면 union 후에 all 키워드를 추가해야합니다 따라서 원하는 답을 얻으려면이 작업이 필요할 수 있습니다 그러나 중복이 없다고 확신하는 테이블을 결합하더라도 여전히 노동 조합의 모든 변형을 사용할 가치가 있습니다 별개의 작업을 수행하면 쿼리가 더 많은 작업을 수행 할 수 있기 때문입니다 테이블이 거대한 경우 SQL을 실제로 느리게 할 수 있습니다

집합 연산자를 사용하는 또 다른 일반적인 이유는 한 테이블에서 모든 행을 찾는 것입니다 다른 곳에 있지 않다 예를 들어이 테이블에있는 모든 브릭을 찾고 싶지만 존재하지 않는 경우 다른 하나 첫 번째 테이블의 모든 열을 두 번째 테이블에 조인하여 존재하지 않는 상태에서이 작업을 수행 할 수 있습니다 서브 쿼리에서

그러나 테이블에 두 개 이상의 열이 있으면이 작업이 지루합니다 그리고 null은 다시 길을 얻는다! 컬럼 중 하나라도 널 (NULL)이 될 수있는 경우, 올바르게 처리해야합니다 빼기는이 모든 것을 단순화합니다 당신이해야 할 일은 두 테이블 모두를 쿼리하고 그들 사이에 빼기를 붙이는 것뿐입니다 이것은 Null 값이 동일한 것으로 간주되는 드문 경우 중 하나입니다

따라서 데이터베이스는 추가 작업없이 이러한 작업을 올바르게 처리합니다 노동 조합과 마찬가지로 마이너스는 중복을 제거합니다 그래서 당신이 이것들을 볼 필요가 있다면, 당신은 존재하지 않아야 만합니다 유니온과 마이너스를 결합하면 고전적인 사용 사례가됩니다 두 테이블이 정확히 일치하는지 확인합니다

같은 행 내 딸들 사이에 벽돌을 나눠 놓고 있다고 가정 해 봅시다 그리고, 싸움을 피하기 위해, 나는 여기에 두 개의 테이블이 정확히 동일하게하고 싶습니다 그들에 벽돌 이를 위해 먼저이 테이블에 어떤 벽돌이 있는지 확인할 수 있지만이 테이블에는 존재하지 않습니다

그리고 그 반대입니다 여기에 존재하지 않는 것들을 찾으십시오 마지막으로, 우리는 결과를 노동 조합과 결합하여 모든 차이점을 볼 수 있습니다 집합 연산자를 사용하면 간단합니다 각 테이블을 빼고 결과를 합집합니다

그러나 이것을 실행하면 우리가 얻는 것은 첫 번째 테이블이 아닌 두 번째 테이블입니다 무슨 일이야?! Oracle Database에서 집합 운영자는 모두 동일한 우선 순위를 갖습니다 따라서 쿼리는 두 번째 테이블에없는 첫 번째 테이블의 모든 행을 찾습니다 그런 다음 두 번째 행의 행에 다시 추가됩니다 마침내 첫 번째 행에서 행을 제거하기 전에

첫 번째를 두 번째에서 빼내는 것과 같습니다 모든 수학 연산에서 우선 순위를 강요하는 것과 같은 방법으로이를 수정합니다 두 개의 빼기 하위 쿼리를 대괄호로 묶습니다 이렇게하면 데이터베이스가 먼저이를 처리합니다 그런 다음 결과를 결합하십시오

이것이 테이블을 비교하는 고전적인 방법이지만 두 테이블 모두에서 모든 행을 읽어야하며, 두번! 특히 테이블이 방대한 경우에는 피해야 할 것입니다 각 테이블의 행을 한 번 읽는 것이 좋습니다 우리가 이것을 할 수 있는지 알아 보려면 요구 사항을 다시 살펴 봅시다 우리는 두 테이블에 같은 벽돌이 있음을보고 싶습니다 그래서 우리는 그것들을 결합한 후에 테이블에 각 행을 2 부씩 가지고 있어야합니다

한 번 나타나는 항목이 있으면 불일치가 발생합니다 테이블을 합집합으로 조합하여이 작업을 수행 할 수 있습니다 그런 다음 우리는 각 벽돌을 2 부씩 검사합니다 작업별로 고전적인 그룹 그리고 having 절을 사용하면 두 개의 복사본이없는 행을 걸러 낼 수 있으므로 볼 수 있습니다

단지 불일치 여기서는 각 테이블에 중복이 없다고 가정합니다 이 테이블에 벽돌의 복사본이 두 개 있는데이 테이블에는 나타나지 않습니다 여전히 2의 수를 얻고 결과에서 잘못 필터링하십시오 대신에 수행해야 할 작업은 각 유형별로 얼마나 많은 벽돌을 가지고 있는지 계산 한 다음 이건 비교해 봐

이 작업은 유니온의 각 테이블에 두 개의 추가 열을 추가하여 수행 할 수 있습니다 상단 테이블의 경우 첫 번째 테이블은 1과 두 번째 0을 반환합니다 그리고 여러분은 아래쪽 테이블을 반대합니다 외부 쿼리에서 이들을 합산하면 각 벽돌의 개수를 알 수 있습니다 각 테이블에서 입력하십시오

그래서 having 절에서 이것을 비교하여 불일치를 찾을 수 있습니다 보너스로 추가 행이있는 테이블을 볼 수도 있습니다 선택의 합계를 비교하고 테이블의 이름을 반환하여이 작업을 수행합니다 더있다 그래서 우리는 마이너스와 노조를 다뤘습니다

이제 마이너스가 존재하지 않는 것과 유사하다면 반드시 교차해야한다고 생각할 수도 있습니다 일반 오래된 존재와 유사합니다 그렇다면 축하드립니다 인터 섹트는 뚜렷한 것으로 존재하는 것과 같은 방식으로 작동합니다 그래서 두 테이블에 존재하는 모든 행을 얻습니다

이 기능을 유용하게 사용할 수는 있지만 실제 코드에서 사용해야하는 경우는 드뭅니다 그래서 집합 연산자에 대한 간단한 개요였습니다 그것들은 테이블을 비교할 수있는 편리한 방법입니다 특히 널 (null)을 처리해야하는 경우에 유용합니다 그러나 그것도 다른 용도가 있습니다

특히 우리가 다음 주제에서 사용할 노동 조합 SQL 트리 만들기! 보고 주셔서 감사합니다! 집합 연산자를 사용 했습니까? 의견을 통해 알려주십시오 그리고 미래의 업데이 트에 가입하는 것을 잊지 마십시오