venn 다이어그램으로 sql joins
sql의 join을 이해하는 데 어려움을 겪었는데 도움이 될 것 같은 이미지가 떠올랐습니다.문제는 내가 그것을 완전히 이해하지 못한다는 것이다.예를 들어 이미지의 오른쪽 상단 모서리에 있는 결합은 B원 전체를 빨간색으로 색칠하고 A에서 겹치는 부분만 색칠합니다.이미지상으로는 원B가 sql문의 주요 포커스로 보이지만 sql문 자체는 A로 시작하는 것(A에서 선택, boin)으로 반대되는 인상을 준다.즉, A가 sql문의 포커스가 되는 것이다.
마찬가지로 아래 이미지는 B원의 데이터만을 포함하고 있는데, 왜 A가 Join 스테이트먼트에 포함되어 있습니까?
질문:.오른쪽 위에서 시계방향으로 작업하고 중앙에서 마무리하면, 누군가가 각 SQL 이미지의 표현에 대해 더 많은 정보를 제공할 수 있습니다.
a) 각 경우에 결합이 필요한 이유(특히 A 또는 B에서 데이터를 가져오지 않은 상황, 즉 A 또는 B만 컬러링되고 둘 다 컬러링되지 않은 경우)
b) 및 이미지가 SQL을 잘 나타내는 이유를 명확히 하는 기타 상세 정보
나는 여기서 벤 다이어그램의 제한에 대해 케이드의 의견에 동의한다.보다 적절한 시각적 표현은 이것일 수 있습니다.
테이블
A를 선택합니다.색상, B.크로스 조인 B SQL 바이올린 색상
교차 결합(또는 데카르트 곱)은 두 표의 모든 행 조합에 대한 결과를 생성합니다.각 테이블에는 4개의 행이 있으므로 결과적으로 16개의 행이 생성됩니다.
A를 선택합니다.색상, B.A의 내부 결합 B에서 색상.색상 = B.컬러 SQL 바이올린
내부 결합은 결합 조건과 일치하는 교차 결합의 모든 행을 논리적으로 반환합니다.이 경우에는 5명이 한다.
A를 선택합니다.색상, B.A의 내부 결합 B에서 색상.색상이 포함되지 않음('녹색', '파란색') SQL 바이올린
내부 결합 조건은 반드시 동일 조건일 필요는 없으며 테이블의 양쪽(또는 둘 다)의 열을 참조할 필요도 없습니다. 중A.Colour NOT IN ('Green','Blue')
이치
가입 " " " "1=1
는 크로스 조인 내의 모든 행에 대해 true로 평가되므로 두 행이 동등합니다(SQL Fidle).
A를 선택합니다.색상, B.A의 좌측 아우터 조인트 B의 색상.색상 = B.컬러 SQL 바이올린
한 방법으로 단, 왼쪽조인의 의되지 않은 됩니다.NULL
오른쪽 열의 값입니다.
A를 선택합니다.색상, B.A의 좌측 아우터 조인트 B의 색상.색상 = B.색상 B.색상은 특수한 SQL 바이올린
하여 는는음 음음 음음 음음 음음음 where where where where where where where where where return where where return the return the return the the만 반환하도록 .B.Colour IS NULL
하는 행이 경우 는 테이블에서 하지 않는 행을 반환합니다.쿼리는 테이블에서 일치하지 않는 빨간색 행을 반환합니다.B
이것을 안티 세미 조인이라고 합니다.
'열을합니다.IS NULL
이 null이 아닌 것을 입니다.NULL
, 또, 이 패턴이 올바르게 동작하기 위해서는, 않게 .이 행에는, 「」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」, 「다」가 .NULL
일치하지 않는 행과 함께 해당 열의 값도 지정합니다.
A를 선택합니다.색상, B.A의 우측 외부 결합 B에서 색상.색상 = B.컬러 SQL 바이올린
오른쪽 외측 조인은 오른쪽 테이블에서 일치하지 않는 행을 유지하고 null로 왼쪽 열을 확장한다는 점을 제외하고는 왼쪽 외측 조인과 동일하게 작동합니다.
A를 선택합니다.색상, B.A의 전체 외부 결합 B에서 색상.색상 = B.컬러 SQL 바이올린
전체 외부 조인은 왼쪽 및 오른쪽 조인의 동작을 결합하여 왼쪽 및 오른쪽 테이블의 일치하지 않는 행을 유지합니다.
의 주된 근본적인 은 (를 들어) 만이 있을 때라고 합니다.A
빨간색으로 강조 표시되어 있는 것은 "쿼리는 "에서 데이터만 반환하지만 실제로는 "쿼리는 기록이 있는 경우에만 데이터를 반환한다"는 의미입니다.쿼리에 아직 B의 데이터가 포함되어 있을 수 있습니다.B
레코드가 없습니다. 쿼리가 대체됩니다.NULL
마찬가지로 아래 이미지는 B원의 데이터만을 포함하고 있는데, 왜 A가 Join 스테이트먼트에 포함되어 있습니까?
'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, .A
B
와 겹치지 않는 것A
「」: 「」A
A
있는 하는 방법입니다.B
(만A
벤 되지 않습니다A
됩니다.B
원하는 레코드와 원하지 않는 레코드를 구분할 수 없습니다.)
이미지상으로는 원B가 sql문의 주요 포커스로 보이지만 sql문 자체는 A로 시작하는 것(A에서 선택, boin)으로 반대되는 인상을 준다.즉, A가 sql문의 포커스가 되는 것이다.
이 때문에.RIGHT JOIN
는 는비 s를 합니다.LEFT JOIN
를 사용하기 위해 거의 항상 재주문할 수 있다RIGHT JOIN
그 의 경우도 ) 보통 with with대그 instead instead 그 、 그 、 그 、 음 、 음 、 음 、 음 、 음 、 음 、 음 、 음 음 음 음 instead 。LEFT JOIN
와 함께가 아니라RIGHT JOIN
.
벤 다이어그램은 UNION, CRESSTS, EXCEPT 등과 같은 세트 작업을 표현하는 데 적합합니다.
EXCEPT와 같은 집합 연산이 LEFT JOIN WHERE RH와 같은 것으로 시뮬레이션되는 범위에서만.KEY가 NULL입니다.이 그림은 정확합니다.
그렇지 않으면 오해의 소지가 있다.예를 들어 조인 기준이 1:1이 아닌 경우 조인 시 행이 증가할 수 있습니다.그러나 집합에는 개별 멤버만 포함될 수 있으므로 집합 연산으로 나타낼 수 없습니다.
다음으로 CROSS JOIN 또는 INSER JOIN ON 1 = 1이 있습니다. 이는 이 다이어그램에 표시된 것처럼 INSER JOIN과 유사하지 않으며 Venn 다이어그램으로 실제로 생성되는 세트를 설명할 수도 없습니다.다른 모든 가능한 삼각 결합은 말할 것도 없고, 다음과 같은 자가 결합 및 안티 결합은 다음과 같습니다.
lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)
또는
SELF self1
INNER JOIN SELF self2
ON self2.key <> self1.key
AND self1.type = self2.type
(자기 자신을 제외한 모든 유사한 가족 구성원을 찾기 위해 자기 교차 및 반동성 - self1과 self2는 동일한 집합이며 결과는 적절한 하위 집합입니다.)
튜토리얼의 처음 몇 분 동안은 키 조인을 고수하는 것이 좋을 수 있지만, 조인에 대해 학습하기 위한 경로가 좋지 않을 수 있습니다.이게 네가 찾은 거라고 생각해.
벤 다이어그램이 일반적으로 이 방법으로 JOIN을 나타낼 수 있다는 생각은 버려야 합니다.
조인할 때 두 테이블이 완전히 일치하지 않을 수 있습니다.특히, A의 행이 B의 행과 일치하지 않거나 A의 행이 중복되어 B의 단일 행과 일치하거나 그 반대일 수 있습니다.
이 경우 선택할 수 있습니다.
- 각 A에 대해 동작하는 단일 B가 있는 경우 선택합니다.(왼쪽 위)
- 완전히 일치하는 쌍(A 또는 B가 없는 쌍은 모두 삭제)
- 각 B에 대해 동작하는 단일 A가 있는 경우(오른쪽 위)를 선택합니다.
- 모두 가져가다(왼쪽 아래)
말하면더으로 쓸 수 있을 거예요.SELECT <select_list> FROM TableA A WHERE A.Key NOT IN (SELECT B.Key FROM TableB B)
( ( ( ( ( )
당신의 혼란에 대한 직접적인 답변으로,RIGHT JOIN
는 "다음 표현이 이 쿼리의 초점입니다"라고 말합니다.오른쪽 아래는 좀 이상한데, 난 네가 그걸 원할 이유가 없다고 생각해.쿼리와 2개의 중간 쿼리가 합니다.NULL
는 반대쪽 테이블의 모든 열에 있습니다.
올바른 조인의 경우 구문은 혼란스러울 수 있지만, 실제로는 그렇게 보입니다.「TableA RIGHT JOIN TableB」라고 하면, 「TableB」가 메인 테이블이며, 「TableA」는 일치하는 레코드가 있는 장소에 매달려 있을 뿐입니다.쿼리에서 테이블 B가 더 중요한 테이블임에도 불구하고 테이블 A가 먼저 나열되므로 뇌가 자동으로 테이블 A에 더 많은 우선순위를 할당할 수 있습니다.이런 이유 때문에, 거의 실제 코드에서 올바른 조인들 보다.
그래서 A와 B대신, 추적하기 쉽다 두가지 만들게 해 주죠.우리가 사람들의 정보, ShoeSize고 IQ가 두개의 테이블이 만한 사람.여러분은 몇몇 사람들이, 몇몇 사람들을 위해 IQ정보를 구하ShoeSize 정보 가지고 있다.그리고 Person다당신은 계속해서 할 수 있다. 둘 다 테이블에 ID.
Clockwise 위쪽의 오른쪽(심지어 tho 이 가장 격렬하고 고안된 복잡한 경우의로 시작한다)에서:.
- ;제가 모든 지능 지수 정보를 주오른쪽 JOIN IQ-> ShoeSize.우리가 가지고 있는 아이들은 어떤 ShoeSize 정보를 포함.
- 오른쪽 JOIN IQWHEREShowSize ShoeSize.PersonID)NULL ->. 나 어느 신발 사이즈 정보가 없어요 사람들만 전달하는 모든은 IQ가 정보 주세요.
- ShoeSize FULL OUTER JOIN IQWHEREShoeSize.PersonID)NULL 및 IQ입니다.PersonID)NULL ->, 나 IQ정보가 없어요 사람들만을 위한 더하는 shoe 크기 정보가 없어 못하는 이들에게 IQ정보가 신발 사이즈 info 주세요.
- Shoe Size FULL AUTER JOIN IQ -> 모든 것, 모든 신발 사이즈, 모든 IQ 데이터를 주세요.Shoes 사이즈와 IQ 기록이 동일한 인물일 경우아이디, 한 줄에 넣어주세요.
- 신발 사이즈는 왼쪽, IQ WHERE IQ.PersonID = NULL -> IQ 정보가 없는 사용자만 모든 신발 크기 정보 제공
- Shoe Size LEFT JOIN IQ -> 신발 사이즈 정보를 모두 알려주세요.그 사람들에 대한 IQ 정보가 있으면 포함시켜 주세요.
언급URL : https://stackoverflow.com/questions/13997365/sql-joins-as-venn-diagram
'itsource' 카테고리의 다른 글
어레이를 루프하여 아이템 삭제(루프 중단 없음) (0) | 2022.09.30 |
---|---|
여러 DB 결과를 사용하여 MySQL replace를 선택 항목으로 실행하여 교착 상태 발생 (0) | 2022.09.30 |
onChange of html 선택 시 매개 변수를 전달하는 방법 (0) | 2022.09.30 |
PHP의 count() 함수는 O(1)입니까, O(n)입니까? (0) | 2022.09.30 |
URL 문자열에서 파라미터를 가져오려면 어떻게 해야 하나요? (0) | 2022.09.30 |