SQLite 결합 방식: 자연 좌측 외측, 내측, 테이블을 사용한 교차 결합
⚡ 스마트 요약
SQLite JOIN 절은 INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN 및 CROSS JOIN을 사용하여 두 개 이상의 테이블에서 행을 결합합니다. 이를 통해 공유 열을 기준으로 관련 레코드를 일치시키고 정규화된 데이터베이스에서 데이터를 읽을 수 있습니다.

SQLite 다양한 유형을 지원합니다. SQL INNER JOIN, LEFT OUTER JOIN, CROSS JOIN과 같은 조인입니다. 이 튜토리얼에서 볼 수 있듯이 각 JOIN 유형은 다양한 상황에 사용됩니다.
장점 소개 SQLite JOIN 절
여러 테이블이 있는 데이터베이스에서 작업할 때 이러한 여러 테이블에서 데이터를 가져와야 하는 경우가 많습니다.
JOIN 절을 사용하면 두 개 이상의 테이블이나 하위 쿼리를 조인하여 연결할 수 있습니다. 또한 테이블을 연결해야 하는 열과 조건을 정의할 수 있습니다.
모든 JOIN 절은 다음 구문을 가져야 합니다.
각 조인 절에는 다음이 포함됩니다.
- 왼쪽 테이블인 테이블 또는 하위 쿼리. 조인 절 앞의 테이블 또는 하위 쿼리(왼쪽)
- JOIN 연산자 - 조인 유형(INNER JOIN, LEFT OUTER JOIN 또는 CROSS JOIN)을 지정합니다.
- JOIN 제약 – 조인할 테이블이나 하위 쿼리를 지정한 후 조인 유형에 따라 해당 조건과 일치하는 행이 선택되는 조건인 조인 제약 조건을 지정해야 합니다.
다음 모든 사항에 대해서는 다음을 참고하세요. SQLite JOIN 테이블 예제에서는 sqlite3.exe를 실행하고 다음과 같이 샘플 데이터베이스에 대한 연결을 열어야 합니다.
단계 1) 이 단계에서는 내 컴퓨터를 열고 "C:\sqlite" 디렉터리로 이동한 다음 "sqlite3.exe"를 실행합니다.
단계 2) 다음 명령어를 사용하여 "TutorialsSampleDB.db" 데이터베이스를 엽니다.
이제 데이터베이스에서 모든 유형의 쿼리를 실행할 준비가 되었습니다.
SQLite 내부 결합
INNER JOIN은 조인 조건과 일치하는 행만 반환하고 조인 조건과 일치하지 않는 다른 모든 행을 제거합니다.
예시
다음 예시에서는 “Students” 테이블과 “Departments” 테이블을 DepartmentId를 기준으로 조인하여 각 학생의 학과명을 다음과 같이 가져옵니다.
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
코드 설명
INNER JOIN은 다음과 같이 작동합니다.
- Select 절에서는 참조된 두 테이블에서 선택하려는 열을 선택할 수 있습니다.
- INNER JOIN 절은 "From" 절로 참조되는 첫 번째 테이블 뒤에 작성됩니다.
- 그러면 조인 조건이 ON으로 지정됩니다.
- 참조된 테이블에 대해 별칭을 지정할 수 있습니다.
- INNER 단어는 선택사항이므로 JOIN만 작성하면 됩니다.
산출
INNER JOIN은 학생 테이블과 학과 테이블에서 "Students.DepartmentId = Departments.DepartmentId" 조건을 만족하는 레코드를 가져옵니다. 조건을 만족하지 않는 행은 무시되고 결과에 포함되지 않습니다.
바로 이러한 이유로 IT, 수학, 물리학과에 속한 10명의 학생 중 8명만 해당 쿼리에서 반환되었습니다. "Jena"와 "George" 학생은 부서 ID가 null이어서 부서 테이블의 departmentId 열과 일치하지 않기 때문에 포함되지 않았습니다. 자세한 내용은 다음과 같습니다.
SQLite 가입… 사용 중
INNER JOIN은 중복을 피하기 위해 “USING” 절을 사용하여 작성할 수 있으므로 “ON Students.DepartmentId = Departments.DepartmentId”라고 쓰는 대신 “USING(DepartmentID)”만 쓰면 됩니다.
조인 조건에서 비교할 컬럼이 동일한 이름일 때마다 “JOIN .. USING”을 사용할 수 있습니다. 이러한 경우 on 조건을 사용하여 이를 반복할 필요가 없으며 열 이름과 열 이름만 명시하면 됩니다. SQLite 그것을 감지할 것이다.
INNER JOIN과 JOIN .. USING의 차이점:
"JOIN … USING" 구문을 사용하면 조인 조건을 작성하는 대신, 두 테이블에서 공통으로 사용되는 조인 열만 작성합니다. 예를 들어, "table1 JOIN table2 ON table1.cola = table2.cola"와 같이 작성하는 대신 "table1 JOIN table2 USING(cola)"와 같이 작성합니다.
예시
다음 예시에서는 “Students” 테이블과 “Departments” 테이블을 DepartmentId를 기준으로 조인하여 각 학생의 학과명을 다음과 같이 가져옵니다.
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
설명
- 이전 예시와 달리, 우리는 “ON Students.DepartmentId = Departments.DepartmentId”라고 쓰지 않고 “USING(DepartmentId)”라고만 썼습니다.
- SQLite 조인 조건을 자동으로 추론하고 학생 및 학과 테이블의 DepartmentId를 비교합니다.
- 비교하는 두 열의 이름이 같을 때마다 이 구문을 사용할 수 있습니다.
산출
그러면 이전 예제와 정확히 동일한 결과가 제공됩니다.
SQLite 자연 조인
NATURAL JOIN은 JOIN…USING과 유사하지만 두 테이블에 존재하는 모든 열의 값이 같은지 자동으로 테스트한다는 차이점이 있습니다.
INNER JOIN과 NATURAL JOIN의 차이점은 다음과 같습니다.
- 내부 조인(INNER JOIN)에서는 두 테이블을 조인하는 데 사용할 조인 조건을 지정해야 합니다. 반면 자연 조인(Natural JOIN)에서는 조인 조건을 작성할 필요가 없습니다. 두 테이블의 이름만 입력하면 됩니다. 그러면 자연 조인은 모든 열의 값이 두 테이블 모두에 존재하는지 자동으로 확인합니다. 자연 조인은 조인 조건을 자동으로 추론합니다.
- NATURAL JOIN에서는 동일한 이름을 가진 두 테이블의 모든 열이 서로 일치됩니다. 예를 들어 두 개의 열 이름이 공통된 두 개의 테이블이 있는 경우(두 개의 열이 두 테이블에 동일한 이름으로 존재함) 자연 조인은 한 열의 값이 아닌 두 열의 값을 비교하여 두 테이블을 조인합니다. 열.
예시
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
설명
- (INNER JOIN에서처럼) 열 이름을 사용하여 조인 조건을 작성할 필요가 없습니다. (JOIN USING에서처럼) 열 이름을 한 번도 작성할 필요가 없습니다.
- 자연 조인은 두 테이블의 두 열을 모두 검색합니다. 두 테이블 Students 및 Departments 모두의 DepartmentId를 비교하는 조건이 구성되어야 함을 감지합니다.
산출
내추럴 조인은 이너 조인 및 조인 USING 예제와 동일한 결과를 제공합니다. 왜냐하면 예제에서는 세 가지 쿼리가 모두 동일하기 때문입니다. 하지만 경우에 따라 내추럴 조인과 이너 조인의 결과가 다를 수 있습니다. 예를 들어, 같은 이름을 가진 테이블이 여러 개 있는 경우 내추럴 조인은 모든 열을 서로 비교합니다. 그러나 이너 조인은 조인 조건에 포함된 열만 비교합니다.
SQLite 왼쪽 외부 조인
SQL 표준은 LEFT, RIGHT, FULL의 세 가지 유형의 외부 조인을 정의하지만, SQLite 자연스러운 LEFT OUTER JOIN만 지원합니다.
LEFT OUTER JOIN을 사용하면 왼쪽 테이블에서 선택한 열의 모든 값이 쿼리 결과에 포함됩니다. 따라서 값이 조인 조건과 일치하는지 여부와 관계없이 모든 값이 결과에 포함됩니다.
따라서 왼쪽 테이블에 'n'개의 행이 있으면 쿼리 결과에도 'n'개의 행이 포함됩니다. 하지만 오른쪽 테이블에서 가져오는 열의 값 중 조인 조건과 일치하지 않는 값이 있으면 해당 열에는 "null" 값이 포함됩니다.
따라서 왼쪽 조인의 행 수와 동일한 수의 행을 얻게 됩니다. 그러면 두 테이블(예: INNER JOIN 결과)에서 일치하는 행과 왼쪽 테이블에서 일치하지 않는 행을 얻을 수 있습니다.
예시
다음 예에서 우리는 두 테이블 "Students"와 "Departments"를 조인하기 위해 "LEFT JOIN"을 시도할 것입니다:
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
설명
- SQLite LEFT JOIN 구문은 INNER JOIN과 동일합니다. 두 테이블 사이에 LEFT JOIN을 작성한 다음 ON 절 뒤에 조인 조건이 옵니다.
- from 절 다음의 첫 번째 테이블은 왼쪽 테이블입니다. 반면 자연 LEFT JOIN 다음에 지정된 두 번째 테이블은 오른쪽 테이블입니다.
- OUTER 절은 선택 사항입니다. LEFT 자연 OUTER JOIN은 LEFT JOIN과 동일합니다.
산출
보시다시피 학생 테이블의 모든 행, 즉 총 10명의 학생이 포함되어 있습니다. 네 번째 학생인 제나와 마지막 학생인 조지의 departmentId가 학과 테이블에 존재하지 않더라도 이들도 포함됩니다.
이 경우, 부서 테이블에 해당 departmentId 값과 일치하는 departmentName이 없기 때문에 Jena와 George 모두의 departmentName 값은 "null"이 됩니다.
이제 벤 다이어그램을 이용하여 왼쪽 조인을 사용한 이전 쿼리를 더 자세히 설명해 보겠습니다.
LEFT JOIN은 학생 테이블에 있는 모든 학생 이름을 가져옵니다. 학생의 학과 ID가 departments 테이블에 존재하지 않는 경우에도 마찬가지입니다. 따라서 INNER JOIN처럼 일치하는 행만 가져오는 것이 아니라, 왼쪽 테이블(학생 테이블)에서 일치하지 않는 행까지 포함하여 전체 결과를 반환합니다.
일치하는 부서가 없는 학생 이름에는 일치하는 값이 없고 해당 값은 일치하지 않는 행의 값이기 때문에 부서 이름에 "null" 값이 있습니다.
SQLite 크로스 가입
CROSS JOIN은 첫 번째 테이블의 모든 값을 두 번째 테이블의 모든 값과 일치시켜 조인된 두 테이블의 선택된 열에 대한 데카르트 곱을 제공합니다.
따라서 첫 번째 테이블의 모든 값에 대해 두 번째 테이블에서 'n'개의 일치 항목을 얻습니다. 여기서 n은 두 번째 테이블 행의 수입니다.
INNER JOIN 및 LEFT OUTER JOIN과 달리 CROSS JOIN에서는 조인 조건을 지정할 필요가 없습니다. SQLite 크로스 조인에는 필요하지 않습니다.
The SQLite 첫 번째 표의 모든 값과 두 번째 표의 모든 값을 결합하여 논리적인 결과 집합을 얻게 됩니다.
예를 들어, 첫 번째 테이블에서 열(colA)을 선택하고 두 번째 테이블에서 열(colB)을 선택했다고 가정해 보겠습니다. colA에는 두 개의 값(1,2)이 있고 colB에도 두 개의 값(3,4)이 있습니다.
그러면 CROSS JOIN의 결과는 XNUMX개의 행이 됩니다.
- colA의 첫 번째 값인 1과 colB의 두 값(3,4)((1,3), (1,4))을 결합하여 두 행을 만듭니다.
- 마찬가지로 colA의 두 번째 값인 2와 colB의 두 값인 (3,4)인 (2,3), (2,4)를 결합하여 두 행을 만듭니다.
예시
다음 쿼리에서는 Students 테이블과 Departments 테이블 사이에 CROSS JOIN을 시도합니다.
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
설명
- . SQLite 여러 테이블에서 선택하려면 Students 테이블에서 "studentname" 열 두 개를 선택하고 Departments 테이블에서 "departmentName" 열 두 개를 선택했습니다.
- 크로스 조인의 경우, 조인 조건을 따로 지정하지 않고 두 테이블을 중간에 CROSS JOIN으로 결합했습니다.
산출
보시다시피 결과는 40개 행입니다. students 테이블의 10개 값이 departments 테이블의 4개 학과와 일치합니다. 다음과 같습니다.
- 학과 테이블의 XNUMX개 학과에 대한 XNUMX개 값이 첫 번째 학생 Michel과 일치합니다.
- 학과표에 있는 네 학과의 값이 두 번째 학생인 존과 일치했습니다.
- 학과표에 있는 네 학과의 네 가지 값이 세 번째 학생인 잭과 일치했습니다… 이런 식으로 계속됩니다.











