SQLite 조인: 자연 왼쪽 외부, 내부, 테이블과 교차 예

SQLite는 다양한 유형을 지원합니다. SQL INNER JOIN, LEFT OUTER JOIN, CROSS JOIN과 같은 조인입니다. 이 튜토리얼에서 볼 수 있듯이 각 JOIN 유형은 다양한 상황에 사용됩니다.

SQLite JOIN 절 소개

여러 테이블이 있는 데이터베이스에서 작업할 때 이러한 여러 테이블에서 데이터를 가져와야 하는 경우가 많습니다.

JOIN 절을 사용하면 두 개 이상의 테이블이나 하위 쿼리를 조인하여 연결할 수 있습니다. 또한 테이블을 연결해야 하는 열과 조건을 정의할 수 있습니다.

모든 JOIN 절에는 다음이 있어야 합니다.wing 통사론:

SQLite JOIN 절 구문
SQLite JOIN 절 구문

각 조인 절에는 다음이 포함됩니다.

  • 왼쪽 테이블인 테이블 또는 하위 쿼리. 조인 절 앞의 테이블 또는 하위 쿼리(왼쪽)
  • JOIN 연산자 – 조인 유형(INNER JOIN, LEFT OUTER JOIN 또는 CROSS JOIN)을 지정합니다.
  • JOIN 제약 – 조인할 테이블이나 하위 쿼리를 지정한 후 조인 유형에 따라 해당 조건과 일치하는 행이 선택되는 조건인 조인 제약 조건을 지정해야 합니다.

참고하세요, 모든 추종자들에 대해wing SQLite JOIN 테이블 예제에서는 sqlite3.exe를 실행하고 flo로 샘플 데이터베이스에 대한 연결을 열어야 합니다.wing:

단계 1) 이 단계에서,

  1. 내 컴퓨터를 열고 다음 항목으로 이동합니다.wing 디렉토리 “C:\sqlite"및
  2. 그런 다음 “sqlite3.exe":

SQLite JOIN 절

단계 2) 데이터베이스 열기 “튜토리얼SampleDB.db" 다음과 같이wing 명령:

SQLite JOIN 절

이제 데이터베이스에서 모든 유형의 쿼리를 실행할 준비가 되었습니다.

SQLite 내부 조인

INNER JOIN은 조인 조건과 일치하는 행만 반환하고 조인 조건과 일치하지 않는 다른 모든 행을 제거합니다.

SQLite 내부 조인
SQLite 내부 조인

팔로우에서wing 예를 들어, 두 테이블을 조인하겠습니다.학생들"및"부서”를 DepartmentId와 함께 사용하여 다음과 같이 각 학생의 학과 이름을 가져옵니다.

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

코드 설명

INNER JOIN은 다음과 같이 작동합니다.wing:

  • Select 절에서는 참조된 두 테이블에서 선택하려는 열을 선택할 수 있습니다.
  • INNER JOIN 절은 "From" 절로 참조되는 첫 번째 테이블 뒤에 작성됩니다.
  • 그러면 조인 조건이 ON으로 지정됩니다.
  • 참조된 테이블에 대해 별칭을 지정할 수 있습니다.
  • INNER 단어는 선택사항이므로 JOIN만 작성하면 됩니다.

산출

SQLite INNER JOIN 예

  • INNER JOIN은 "라는 조건과 일치하는 학생과 학과 테이블 모두에서 레코드를 생성합니다.Students.DepartmentId = 부서.DepartmentId “. 일치하지 않는 행은 무시되며 결과에 포함되지 않습니다.
  • 그렇기 때문에 IT, 수학, 물리학과에 대한 이 쿼리에서 학생 8명 중 10명만 반환되었습니다. 반면에 학생 "Jena"와 "George"는 포함되지 않았습니다. 왜냐하면 이 학생의 부서 ID가 null이고 부서 테이블의 DepartmentId 열과 일치하지 않기 때문입니다. 다음과 같이wing:

    SQLite INNER JOIN 예

SQLite JOIN… 사용 중

INNER JOIN은 중복을 피하기 위해 “USING” 절을 사용하여 작성할 수 있으므로 “ON Students.DepartmentId = Departments.DepartmentId”라고 쓰는 대신 “USING(DepartmentID)”만 쓰면 됩니다.

조인 조건에서 비교할 컬럼이 동일한 이름일 때마다 “JOIN .. USING”을 사용할 수 있습니다. 이러한 경우 on 조건을 사용하여 이를 반복할 필요가 없으며 열 이름만 명시하면 SQLite가 이를 감지합니다.

INNER JOIN과 JOIN의 차이점 .. 사용:

“JOIN … USING”을 사용하면 조인 조건을 작성하지 않고 table1 “INNER JOIN table2 ON table1.cola = table2.cola”를 작성하는 대신 조인된 두 테이블 사이에 공통된 조인 열만 작성합니다. "table1 JOIN table2 USING(cola)"과 같습니다.

팔로우에서wing 예를 들어, 두 테이블을 조인하겠습니다.학생들"및"부서”를 DepartmentId와 함께 사용하여 다음과 같이 각 학생의 학과 이름을 가져옵니다.

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments USING(DepartmentId);

설명

  • 이전 예와 달리 “ON Students.DepartmentId = Departments.DepartmentId“. 우리는 방금 “USING(부서 ID)".
  • SQLite는 조인 조건을 자동으로 추론하고 구성합니다.ares 두 테이블(학생 및 부서)의 DepartmentId입니다.
  • 비교하는 두 열의 이름이 같을 때마다 이 구문을 사용할 수 있습니다.

산출

  • 그러면 이전 예제와 정확히 동일한 결과가 제공됩니다.

SQLite JOIN 예

SQLite 자연 조인

NATURAL JOIN은 JOIN…USING과 유사하지만 두 테이블에 존재하는 모든 열의 값이 같은지 자동으로 테스트한다는 차이점이 있습니다.

INNER JOIN과 NATURAL JOIN의 차이점은 다음과 같습니다.

  • INNER JOIN에서는 내부 조인이 두 테이블을 조인하는 데 사용하는 조인 조건을 지정해야 합니다. 반면 자연 조인에서는 조인 조건을 작성하지 않습니다. 아무 조건 없이 두 테이블의 이름만 적으면 됩니다. 그런 다음 자연 조인은 두 테이블에 존재하는 모든 열의 값이 같은지 자동으로 테스트합니다. 자연 조인은 조인 조건을 자동으로 추론합니다.
  • NATURAL JOIN에서는 동일한 이름을 가진 두 테이블의 모든 열이 서로 일치됩니다. 예를 들어 두 개의 열 이름이 공통된 두 개의 테이블이 있는 경우(두 개의 열이 두 테이블에 동일한 이름으로 존재함) 자연 조인은 한 열의 값이 아닌 두 열의 값을 비교하여 두 테이블을 조인합니다. 열.

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
Natural JOIN Departments;

설명

  • INNER JOIN에서 했던 것처럼 열 이름으로 조인 조건을 작성할 필요가 없습니다. JOIN USING에서 했던 것처럼 열 이름을 한 번도 쓸 필요가 없었습니다.
  • 자연 조인은 두 테이블의 두 열을 모두 검색합니다. 두 테이블 Students 및 Departments 모두의 DepartmentId를 비교하는 조건이 구성되어야 함을 감지합니다.

산출

SQLite NATURAL JOIN 예

  • Natural JOIN은 INNER JOIN 및 JOIN USING 예제에서 얻은 출력과 정확히 동일한 출력을 제공합니다. 이 예에서는 세 가지 쿼리가 모두 동일하기 때문입니다. 그러나 어떤 경우에는 출력이 내부 조인과 자연 조인의 경우와 다릅니다. 예를 들어, 동일한 이름을 가진 테이블이 더 있는 경우 자연 조인은 모든 열을 서로 일치시킵니다. 그러나 내부 조인은 조인 조건의 열과만 일치합니다(자세한 내용은tails 다음 섹션에서; 내부 조인과 자연 조인의 차이점)

SQLite 왼쪽 외부 조인

SQL 표준은 LEFT, RIGHT 및 FULL의 세 가지 유형의 OUTER JOIN을 정의하지만 SQLite는 자연적인 LEFT OUTER JOIN만 지원합니다.

LEFT OUTER JOIN에서는 왼쪽 테이블에서 선택한 컬럼의 모든 값이 결과에 포함됩니다. 질문이므로 값이 조인 조건과 일치하는지 여부에 관계없이 결과에 포함됩니다.

따라서 왼쪽 테이블에 'n'개의 행이 있는 경우 쿼리 결과에는 'n'개의 행이 있습니다. 그러나 오른쪽 테이블에서 나오는 열 값의 경우 조인 조건과 일치하지 않는 값이 있으면 "null" 값이 포함됩니다.

따라서 왼쪽 조인의 행 수와 동일한 수의 행을 얻게 됩니다. 그러면 두 테이블(예: INNER JOIN 결과)에서 일치하는 행과 왼쪽 테이블에서 일치하지 않는 행을 얻을 수 있습니다.

팔로우에서wing 예를 들어, “LEFT JOIN”을 사용하여 “Students”와 “Departments”라는 두 테이블을 조인해 보겠습니다.

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과 동일합니다.

산출

SQLite LEFT OUTER JOIN 예

  • 보시다시피 학생 테이블의 모든 행이 포함되어 총 10명의 학생이 포함됩니다. 네 번째와 마지막 학생인 Jena와 George의 학과 ID가 Departments 테이블에 존재하지 않는 경우에도 포함됩니다.
  • 그리고 이러한 경우 부서 테이블에 DepartmentId 값과 일치하는 DepartmentName이 없기 때문에 Jena와 George 모두의 DepartmentName 값은 "null"이 됩니다.

Van 다이어그램을 사용하여 왼쪽 조인을 사용하는 이전 쿼리에 대해 더 자세히 설명하겠습니다.

SQLite 왼쪽 외부 조인

SQLite 왼쪽 외부 조인

LEFT JOIN은 학생이 부서 테이블에 존재하지 않는 부서 ID를 가지고 있는 경우에도 학생 테이블의 모든 학생 이름을 제공합니다. 따라서 쿼리는 INNER JOIN으로 일치하는 행만 제공하는 것이 아니라 학생 테이블인 왼쪽 테이블에서 일치하지 않는 행이 있는 추가 부분을 제공합니다.

일치하는 부서가 없는 학생 이름에는 일치하는 값이 없고 해당 값은 일치하지 않는 행의 값이기 때문에 부서 이름에 "null" 값이 있습니다.

SQLite 크로스 조인

CROSS JOIN은 첫 번째 테이블의 모든 값을 두 번째 테이블의 모든 값과 일치시켜 조인된 두 테이블의 선택된 열에 대한 데카르트 곱을 제공합니다.

따라서 첫 번째 테이블의 모든 값에 대해 두 번째 테이블에서 'n'개의 일치 항목을 얻습니다. 여기서 n은 두 번째 테이블 행의 수입니다.

INNER JOIN 및 LEFT OUTER JOIN과 달리 CROSS JOIN을 사용하면 SQLite가 CROSS JOIN에 조인 조건을 필요로 하지 않기 때문에 조인 조건을 지정할 필요가 없습니다.

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)를 결합하여 두 개의 행을 만듭니다.

팔로우에서wing 쿼리를 통해 Students 테이블과 Departments 테이블 사이에 CROSS JOIN을 시도하겠습니다.

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
CROSS JOIN Departments;

설명

  • 여러 테이블에서 SQLite를 선택하는 경우, Students 테이블에서 "studentname"이라는 두 개의 열을 선택하고, Departments 테이블에서 "departmentName"이라는 두 개의 열을 선택했습니다.
  • Cross Join의 경우 조인 조건을 지정하지 않고 두 테이블 사이에 CROSS JOIN을 결합한 것뿐입니다.

산출

SQLite CROSS JOIN 예

보시다시피 결과는 40개 행입니다. 학생 테이블의 10개 값이 학과 테이블의 4개 학과와 일치합니다. 다음과 같이wing:

  • 학과 테이블의 XNUMX개 학과에 대한 XNUMX개 값이 첫 번째 학생 Michel과 일치합니다.
  • 두 번째 학생 John과 일치하는 부서 테이블의 XNUMX개 부서에 대한 XNUMX개 값입니다.
  • 학과 테이블의 XNUMX개 학과에 대한 XNUMX개의 값이 세 번째 학생 Jack과 일치합니다…

요약

SQLite JOIN 쿼리를 사용하면 하나 이상의 테이블 또는 하위 쿼리를 함께 연결하여 두 테이블 또는 하위 쿼리 모두에서 열을 선택할 수 있습니다.