JOIN OUTER 복습
INNER JOIN과 LEFT OUTER JOIN 결과 차이를 비교한다.
INNER JOIN과 LEFT OUTER JOIN 결과 차이를 비교한다.. 이 묶음은 제약조건으로 데이터 무결성을 지키고, VIEW로 복잡한 조회를 재사용하는 방법을 다룬다.
외래키와 CASCADE는 데이터 관계를 직접 바꾸므로 실행 전후의 행 수와 참조 상태를 반드시 비교해야 한다. VIEW는 실제 데이터를 복사하지 않고 SELECT 문을 저장해 두는 성격에 가깝다.
| 항목 | 설명 | 확인 방법 |
|---|---|---|
| CREATE VIEW | SELECT 문을 뷰 이름으로 저장한다 | SHOW FULL TABLES로 확인 |
| 단순 뷰 | 한 테이블에서 필요한 컬럼만 보여준다 | SELECT * FROM v_usertbl |
| 조인 뷰 | 여러 테이블 조인을 재사용한다 | WHERE 조건을 붙여 조회 |
| 별칭 | 출력 컬럼명을 보기 좋게 바꾼다 | AS 'USER ID' |
| 백틱 | 공백이 있는 별칭을 조회할 때 사용한다 | SELECT `USER ID` |
| 옵션 | 동작 | 주의 |
|---|---|---|
| FOREIGN KEY | 부모 테이블에 있는 값만 허용 | 부모 없는 자식 데이터 입력 실패 |
| ON UPDATE CASCADE | 부모 키 변경을 자식에게 전파 | 키 변경 영향 범위 확인 |
| ON DELETE CASCADE | 부모 삭제 시 자식도 삭제 | 실수 삭제 위험 |
| foreign_key_checks=0 | 검사를 임시 비활성화 | 재활성화 후 데이터 정합성 직접 확인 |
| DROP FOREIGN KEY | 기존 외래키 제거 | 제약조건 이름 필요 |
INNER JOIN은 회원과 구매가 모두 존재하는 행만 보여준다. LEFT OUTER JOIN은 구매 테이블을 기준으로 두면 회원 정보가 없어도 구매 행을 남길 수 있어, 참조 누락 데이터를 찾을 때 유용하다.
CASCADE나 foreign_key_checks를 다룬 뒤에는 반드시 조인 결과와 행 수를 확인한다. VIEW를 만든 뒤에는 원본 SELECT와 뷰 조회 결과가 같은 의미인지 비교한다.
| 실수 | 증상 | 해결 |
|---|---|---|
| 별칭에 공백을 넣고 일반 컬럼처럼 조회 | Unknown column 오류 | 백틱으로 감싼다 |
| foreign_key_checks를 다시 켜지 않음 | 이후 입력 검사가 느슨해짐 | 작업 직후 1로 복구 |
| CASCADE 삭제 영향 미확인 | 자식 데이터가 같이 삭제됨 | 삭제 전 SELECT로 대상 확인 |
| CHECK 추가 전 데이터 미정리 | ALTER TABLE 실패 | UPDATE로 위반 데이터 수정 |
| VIEW를 실제 테이블로 착각 | 저장 공간과 수정 가능성 오해 | SELECT 저장 객체로 이해 |
| 작업 전 | 작업 후 | 확인 포인트 |
|---|---|---|
| 복잡한 SELECT 반복 | VIEW로 재사용 | 원본 SELECT와 뷰 결과 비교 |
| 부모 키 변경 시 자식 불일치 | ON UPDATE CASCADE로 동기화 | buytbl.userID 변경 여부 |
| 부모 삭제 시 자식 잔존 | ON DELETE CASCADE로 함께 삭제 | 삭제 범위 사전 확인 |
| 범위 밖 birthYear 존재 | CHECK 추가 후 차단 | 위반 데이터 정리 여부 |
| FK 때문에 대량 입력 실패 | checks 비활성화 후 입력 | 복구와 정합성 점검 |
CASCADE는 편리하지만 영향 범위가 크다. 특히 ON DELETE CASCADE는 부모 행 삭제가 곧 자식 행 삭제로 이어지므로 운영 데이터에서는 삭제 전 백업과 대상 확인이 필요하다.
VIEW는 보고서성 조회나 반복되는 조인에 적합하다. 다만 별칭에 공백을 넣으면 조회할 때 백틱이 필요하므로, 실무에서는 가능하면 공백 없는 컬럼 별칭을 쓰는 편이 관리하기 쉽다.
| 체크 | 통과 기준 |
|---|---|
| VIEW 생성 | SELECT * FROM 뷰이름이 정상 동작한다. |
| 별칭 조회 | 공백 별칭은 백틱으로 조회한다. |
| FK 상태 | SHOW CREATE TABLE에서 제약조건을 확인한다. |
| CASCADE 결과 | 부모 변경 후 자식 테이블 값을 비교한다. |
| 검사 복구 | foreign_key_checks를 1로 되돌린다. |
| 상황 | 기억할 문법 | 핵심 |
|---|---|---|
| 조회 재사용 | CREATE VIEW ... AS SELECT | 복잡한 SELECT를 이름으로 저장 |
| 공백 별칭 조회 | `USER ID` | 작은따옴표가 아니라 백틱 |
| 부모 키 변경 전파 | ON UPDATE CASCADE | 자식 FK 값도 변경 |
| 부모 삭제 전파 | ON DELETE CASCADE | 자식 행도 삭제 |
| FK 검사 임시 해제 | SET foreign_key_checks = 0 | 작업 후 1로 복구 |
| 범위 제한 | CHECK (...) | 위반 데이터 정리 후 추가 |
| 확인 결과 | 정상 해석 | 다음 조치 |
|---|---|---|
| INNER JOIN 행 수가 buytbl보다 적다 | 회원 없는 구매가 있을 수 있다 | LEFT JOIN으로 누락 행 확인 |
| VIEW 조회가 원본 SELECT와 같다 | 뷰 정의가 의도대로 저장됐다 | WHERE 조건을 붙여 재사용 |
| 백틱 없이 별칭 조회 실패 | 공백 별칭 사용 때문이다 | 백틱으로 감싸거나 별칭을 단순화 |
| UPDATE 후 buytbl도 바뀐다 | ON UPDATE CASCADE 동작 | 전파 범위가 맞는지 확인 |
| DELETE 후 buytbl 행이 줄었다 | ON DELETE CASCADE 동작 | 삭제 전 백업 필요성 기록 |
| 상황 | 복구 방향 | 확인 명령 |
|---|---|---|
| foreign_key_checks를 꺼 둠 | SET foreign_key_checks = 1 | SELECT @@foreign_key_checks |
| 잘못 만든 뷰 | DROP VIEW 후 다시 CREATE VIEW | SHOW FULL TABLES |
| 잘못 건 CASCADE | DROP FOREIGN KEY 후 재추가 | SHOW CREATE TABLE buytbl |
| CHECK 추가 실패 | 위반 데이터 UPDATE 후 재시도 | WHERE 조건으로 위반 값 검색 |
| 조인 결과 누락 | OUTER JOIN으로 원인 행 찾기 | U.userID IS NULL 조건 |
이 주제는 SQL 실행 성공보다 변경 후 데이터 관계가 의도대로 유지되는지가 더 중요하다. VIEW, FK, CASCADE, CHECK는 모두 결과를 검산해야 완성이다.
핵심 요약
Tags
'php' 카테고리의 다른 글
| MySQL CREATE OR REPLACE VIEW — 뷰 수정·조회·DML 완전 정리 (0) | 2026.07.01 |
|---|---|
| MySQL INSERT · UPDATE — 데이터 추가·수정 완전 정리 (0) | 2026.07.01 |
| MySQL SQLDB 풀세트 — DB생성·테이블·데이터 한꺼번에 완전 정리 (0) | 2026.07.01 |
| MySQL FK CASCADE 실습 — UPDATE·DELETE·DROP COLUMN 완전 정리 (0) | 2026.07.01 |
| MySQL ALTER — CHECK 제약 추가 · UPDATE 완전 정리 (0) | 2026.07.01 |
왕진 블로그

댓글