3.3.4.9 여러 테이블의 사용
pet
테이블은 애완 동물의 기록을 보유하고 있습니다. 수의사의 진찰이나 출산 등 애완 동물의 생애 이벤트 등 애완 동물에 관한 다른 정보를 기록하려면 별도의 테이블이 필요합니다. 이 테이블은 무엇을하면 좋을까요. 다음 정보를 포함해야합니다.
각 이벤트가 어떤 애완 동물 것인지를 나타 내기위한 애완 동물 이름.
이벤트가 언제 발생했는지를 나타내는 날짜입니다.
이벤트를 설명하는 필드.
이벤트를 분류 할 수있는 경우 이벤트 유형 필드.
이들을 고려하면 event
테이블의 CREATE TABLE
문은 다음과 같이됩니다.
mysql>CREATE TABLE event (name VARCHAR(20), date DATE,
->type VARCHAR(15), remark VARCHAR(255));
pet
테이블의 경우와 마찬가지로 초기 레코드를로드하는 가장 간단한 방법으로 다음의 정보를 기술 한 탭으로 구분 된 텍스트 파일을 만듭니다.
name | date | type | remark |
---|---|---|---|
Fluffy | 1995-05-15 | litter | 4 kittens 3 female 1 male |
Buffy | 1993-06-23 | litter | 5 puppies 2 female 3 male |
Buffy | 1994-06-19 | litter | 3 puppies 3 female |
Chirpy | 1999-03-21 | vet | needed beak straightened |
Slim | 1997-08-03 | vet | broken rib |
Bowser | 1991-10-12 | kennel | |
Fang | 1991-10-12 | kennel | |
Fang | 1998-08-28 | birthday | Gave him a new chew toy |
Claws | 1998-03-17 | birthday | Gave him a new flea collar |
Whistler | 1998-12-09 | birthday | First birthday |
다음과 같이 레코드를로드합니다.
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
pet
테이블에서 실행 한 쿼리에서 배운 것을 토대로하면, 원칙은 동일하기 때문에 event
테이블의 레코드도 얻을 수 있어야합니다. 그러나 event
테이블만으로는 질문에 회답 할 수없는 경우는 어떤 경우입니까?
각 애완 동물의 출산시 연령을 조사합니다. 전에 두 날짜에서 나이를 계산하는 방법을 배웠습니다. 애완 동물의 출산 일은 event
테이블에 있지만 그 날짜의 나이를 계산하려면 생년월일이 필요하고, 그것은 pet
테이블에 있습니다. 따라서이 쿼리에는 두 테이블이 필요합니다.
mysql>SELECT pet.name,
->(YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
->remark
->FROM pet INNER JOIN event
->ON pet.name = event.name
->WHERE event.type = 'litter';
+--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female | +--------+------+-----------------------------+
이 쿼리에 주목해야 할 점이 몇 가지 있습니다.
이 쿼리는 두 테이블에서 정보를 검색해야하기 때문에,
FROM
절에 두 테이블을 조인하고 있습니다.여러 테이블의 정보를 결합 (결합) 경우 하나의 테이블 레코드와 다른 테이블의 레코드가 어떻게 대응할지 여부를 지정해야합니다. 두 테이블에
name
컬럼이 있기 때문에 이것은 간단합니다. 이 쿼리는ON
절을 사용하여 두 테이블의 레코드를name
값에 따라 대응시키고 있습니다.이 쿼리는
INNER JOIN
을 사용하여 테이블을 조인하고 있습니다.INNER JOIN
은ON
절에 지정된 조건을 모두 테이블이 충족 경우에만 결과 테이블의 행이 허용됩니다. 이 예에서는pet
테이블의name
컬럼과event
테이블의name
컬럼이 일치 할 필요가 있다고ON
절에 지정되어 있습니다. 이름이 한 테이블에 있고 다른 하나는 없으면ON
절 조건이 충족되지 않기 때문에 해당 행은 결과에 표시되지 않습니다.name
컬럼은 두 테이블에 있기 때문에이 열을 참조 할 때 두 테이블의 것인지를 명확하게 표시해야합니다. 그러기 위해서는 열 이름 앞에 테이블 이름을 추가합니다.
두 개의 다른 테이블 않아도 병합을 수행 할 수 있습니다. 테이블의 레코드를 동일한 테이블의 다른 레코드와 비교하는 경우에 테이블을 그 자체에 결합하면 도움이 될 수 있습니다. 예를 들어, 번식 짝짓기 애완 동물을 선택하면 pet
테이블을 그 자체에 결합하여 동종의 암수 한쌍 후보를 생성 할 수 있습니다.
mysql>SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
->FROM pet AS p1 INNER JOIN pet AS p2
->ON p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
+--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+
이 쿼리는 테이블 이름의 별칭을 지정하여 컬럼을 참조하여 각 컬럼이 테이블의 두 인스턴스와 관련되는지를 반드시 명확하게하고 있습니다.