종속 테이블
이제 쿼리를 조금 복잡하게 만들어 보겠습니다. 직원의 작업이 포함된 새 작업 테이블을 데이터베이스에 추가해 보겠습니다. 어떤 항목이 포함되어 있는지 살펴보겠습니다.
SELECT * FROM task
그러한 요청의 결과:
ID | employee_id | 이름 | 마감 시간 |
---|---|---|---|
1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 |
2 | 2 | 백엔드의 버그 수정 | 2022-06-15 |
삼 | 5 | 커피를 사다 | 2022-07-01 |
4 | 5 | 커피를 사다 | 2022-08-01 |
5 | 5 | 커피를 살 것이다 | 2022-09-01 |
6 | (없는) | 사무실을 청소하다 | (없는) |
7 | 4 | 즐거운 삶 | (없는) |
8 | 6 | 즐거운 삶 | (없는) |
이 테이블에는 4개의 열만 있습니다.
- id — 고유한 작업 번호(및 테이블의 행)
- employee_id — 작업이 할당된 직원 테이블의 직원 ID입니다.
- 이름 — 작업의 이름과 설명
- 기한 - 작업을 완료해야 하는 시간입니다.
몇 가지 뉘앙스에 주의하십시오. 태스크 N6에는 employee_id가 없고 클리너도 없습니다. 작업은 있지만 수행자는 없습니다. 일어난다.
또한 작업 6-9에는 기한이 정해져 있지 않습니다. 이는 작업을 정기적으로 지속적으로 수행해야 할 때 발생합니다. 예를 들어, 사무실은 매일 청소해야 하지만, 당신도 매일 삶을 즐겨야 합니다 :)
한 테이블이 다른 테이블의 ID를 사용하는 경우 이러한 테이블을 종속 이라고 합니다 .
여러 테이블에 대한 쿼리
여기서 우리는 작업 테이블에서 "Enjoying life"라는 두 가지 작업이 있음을 볼 수 있습니다. 이 운 좋은 사람들이 누구인지 어떻게 알 수 있습니까?
이를 위해 SQL에서 한 번에 두 개의 테이블에서 쿼리를 실행할 수 있습니다. 일반적으로 SQL에서는 여러 테이블을 동시에 쿼리할 수 있습니다. 이러한 요청의 일반적인 형식은 다음과 같습니다.
SELECT columns
FROM Table 1, table 2, tableN
중요한! 동시에 여러 테이블에 쿼리를 작성하면 결과적으로 테이블 행의 데카르트 제품을 얻게 됩니다. 첫 번째 테이블의 각 행은 두 번째 테이블의 각 행에 접착되는 식입니다.
즉, 첫 번째 테이블에 5개의 행이 있고 두 번째 테이블에 10개의 행이 있으면 총 50개의 행이 있습니다. Java에서 이 쿼리는 다음과 같습니다.
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
한 번에 두 개의 테이블에 쿼리를 작성하고 어떤 일이 발생하는지 살펴보겠습니다.
SELECT * FROM employee, task
그리고 이 쿼리의 결과는 다음과 같습니다.
ID | 이름 | 직업 | 샐러리 | 나이 | ID | 직원 | _ID | 이름 | 마감 시간 |
---|---|---|---|---|---|---|---|---|---|
1 | 이바노프 이반 | 프로그램 제작자 | 100000 | 25 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 | |
2 | 페트로프 페트르 | 프로그램 제작자 | 80000 | 23 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 | |
삼 | 이바노프 세르게이 | 시험 장치 | 40000 | 서른 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 | |
4 | 라비노비치 모이샤 | 감독 | 200000 | 35 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 | |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 | |
6 | 바스카 | 고양이 | 1000 | 삼 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 | |
1 | 이바노프 이반 | 프로그램 제작자 | 100000 | 25 | 2 | 2 | 백엔드의 버그 수정 | 2022-06-15 | |
2 | 페트로프 페트르 | 프로그램 제작자 | 80000 | 23 | 2 | 2 | 백엔드의 버그 수정 | 2022-06-15 | |
삼 | 이바노프 세르게이 | 시험 장치 | 40000 | 서른 | 2 | 2 | 백엔드의 버그 수정 | 2022-06-15 | |
4 | 라비노비치 모이샤 | 감독 | 200000 | 35 | 2 | 2 | 백엔드의 버그 수정 | 2022-06-15 | |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 2 | 2 | 백엔드의 버그 수정 | 2022-06-15 |
총 48개의 결과 라인이 있지만 여기서는 11개만 제공했습니다. 그렇지 않으면 공간이 충분하지 않습니다.
다음 세 가지에 주의하십시오.
- 이름이 같은 열: id . 이것은 직원 테이블 의 ID 와 작업 테이블 의 ID 입니다 .
- 각 테이블의 행이 반복됩니다. 왼쪽 열에서 ID 6 다음에 다시 ID = 1이 옵니다.
- 예를 들어 직원 테이블의 id가 6이고 동일한 행의 employee_id가 1인 의미 없는 행이 있습니다.
의미 없는 줄 제거
결과 테이블에 행이 너무 많습니다 . 이는 employee 및 task 두 테이블의 모든 행에 대한 데카르트 곱입니다 .
논리적으로 Employee_id 행이 3이면 id가 3인 직원 테이블의 행에만 달라붙어야 합니다. WHERE를 사용하여 이 오해를 수정해 보겠습니다.
다음과 같은 쿼리를 작성해 봅시다.
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
그리고 이 쿼리의 결과는 다음과 같습니다.
ID | 이름 | 직업 | 샐러리 | 나이 | ID | employee_id | 이름 | 마감 시간 |
---|---|---|---|---|---|---|---|---|
1 | 이바노프 이반 | 프로그램 제작자 | 100000 | 25 | 1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 |
2 | 페트로프 페트르 | 프로그램 제작자 | 80000 | 23 | 2 | 2 | 백엔드의 버그 수정 | 2022-06-15 |
4 | 라비노비치 모이샤 | 감독 | 200000 | 35 | 7 | 4 | 즐거운 삶 | (없는) |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 삼 | 5 | 커피를 사다 | 2022-07-01 |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 4 | 5 | 커피를 사다 | 2022-08-01 |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 5 | 5 | 커피를 살 것이다 | 2022-09-01 |
6 | 바스카 | 고양이 | 1000 | 삼 | 8 | 6 | 즐거운 삶 | (없는) |
좋은 소식은 의미 없는 줄이 사라졌다는 것입니다. 첫 번째 열의 id는 항상 employee_id와 같습니다.
나쁜 소식은 사무실 청소와 같이 누구에게도 할당되지 않은 작업이 사라졌다는 것입니다. 그들의 employee_id는 NULL이므로 WHERE가 완료된 후 폐기되었습니다.