데이터베이스 구축 3장 SQL 응용
Updated:
SQL의 개념
SQL(Structured Query Language)의 개요
IBM 연구소에서 개발한 SEQUEL에서 유래하여 국제 표준 데이터베이스 언어이며, 많은 회사에서 관계형 데이터베이스(RDB)를 지원하는 언어로 채택하고 있다. 관계대수와 관계해석을 기초로 한 혼합 데이터 언어이다. 질의어지만 질의 기능만 있는 것이 아니라 데이터 구조 정의, 데이터 조작, 데이터 제어 기능을 모두 갖추고 있다.
SQL은 기능에 따라 DDL(데이터 정의어), DML(데이터 조작어), DCL(데이터 제어어)로 나눈다.
DDL(Data Define Language, 데이터 정의어)
DDL은 SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의하거나 변경 또는 삭제할 때 사용하는 언어이다. 논리적 데이터 구조와 물리적 데이터 구조의 사상을 정의하고 데이터베이스 관리자나 데이터베이스 설계자가 사용한다. DDL(데이터 정의어)의 유형은 다음과 같다.
- CREATE: SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의한다.
- ALTER: TABLE에 대한 정의를 변경하는 데 사용한다.
- DROP: SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 삭제한다.
DML(Data Manipulation Language, 데이터 조작어)
DML은 데이터베이스 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터를 실질적으로 처리하는 데 사용되는 언어이다. 데이터베이스 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공한다. DML(데이터 조작어)의 유형은 다음과 같다.
- SELECT: 테이블에서 조건에 맞는 튜플을 검색한다.
- INSERT: 테이블에 새로운 튜플을 삽입한다.
- DELETE: 테이블에서 조건에 맞는 튜플을 삭제한다.
- UPDATE: 테이블에서 조건에 맞는 튜플의 내용을 변경한다.
DCL(Data Control Language, 데이터 제어어)
DCL은 데어터의 보안, 무결성, 회복, 병행 수행 제어 등을 정의하는 데 사용되는 언어이다. 데이터베이스 관리자가 데이터 관리를 목적으로 사용한다. DCL(데이터 제어어)의 종류는 다음과 같다.
- COMMIT: 명령에 의해 수행된 결과를 실제 물리적 디스크로 저장하고, 데이터베이스 조작 작업이 정상적으로 완료되었음을 관리자에게 일러준다.
- ROLLBACK: 데이터베이스 조작 작업이 비정상적으로 종료되었을 때 원래의 상태로 복구한다.
- GRANT: 데이터베이스 사용자에게 사용 권한을 부여한다.
- REVOKE: 데이터베이스 사용자의 사용 권한을 취소한다.
DDL
DDL(Data Define Language, 데이터 정의어)의 개요
DDL(데이터 정의어)는 DB 구조, 데이터 형식, 접근 방식 등 DB를 구축하거나 수정할 목적으로 사용하는 언어이다. DDL은 번역한 결과가 데이터 사전(Data Dictionary)이라는 특별한 파일에 여러 개의 테이블로서 저장된다. DDL에는 CREATE SCHEMA, CREATE DOMAIN, CREATE TABLE, CREATE VIEW, CREATE INDEX, ALTER TABLE, DROP 등이 있다.
CREATE SCHEMA
CREATE SCHEMA는 스키마를 정의하는 명령문이다. 스키마의 식별을 위해 스키마 이름과 소유권자나 허가권자를 정의한다.
- 표기형식
CREATE SCHEMA 스카마명 AUTHORIZATION 사용자_id;
CREATE DOMAIN
CREATE DOMAIN은 도메인을 정의하는 명령문이다. 임의의 속성에서 취할 수 있는 값의 범위가 SQL에서 지원하는 전체 데이터 타입의 값이 아니고 일부분일 때, 사용자는 그 값의 범위를 도메인으로 정의할 수 있다. 정의된 도메인명은 일반적인 데이터 타입처럼 사용한다.
- 표기형식
CREATE DOMAIN 도메인명 [AS] 데이터_타입 [DEFAULT 기본값] [CONSTRAINT 제약조건명 CHECK (범위값)];
- 데이터 타입: SQL에서 지원하는 데이터 타입
- 기본값: 데이터를 입력하지 않았을 때 자동으로 입력되는 값
CREATE TABLE
CREATE TABLE은 테이블을 정의하는 명령문이다.
- 표기형식
CREATE TABLE 테이블명 (속성명 데이터_타입 [DEFAULT 기본값] [NOT NULL], ... [, PRIMARY KEY(기본키_속성명, ...)] [, UNIQUE(대체키_속성명, ...)] [, FOREIGN KEY(외래키_속성명, ...)] [REFERENCES 참조테이블(기본키_속성명, ...)] [ON DELETE 옵션] [ON UPDATE 옵션] [, CONSTRAINT 제약조건명] [CHECK (조건식)]);
- 기본 테이블에 포함될 모든 속성에 대하여 속성명과 그 속성의 데이터 타입, 기본 값, NOT NULL 여부를 지정한다.
- PRIMARY KEY: 기본키로 사용할 속성 또는 속성의 집합을 지정한다.
- UNIQUE: 대체키로 사용할 속성 또는 속성의 집합을 지정하는 것으로 UNIQUE로 지정한 속성은 중복된 값을 가질 수 없다.
- FOREIGN KEY ~ REFERENCES ~
- 참조할 다른 테이블과 그 테이블을 참조할 때 사용할 외래키 속성을 지정한다.
- 외래키가 지정되면 참조 무결성의 CASCADE 법칙이 적용된다.
- ON DELETE 옵션: 참조 테이블의 튜플이 삭제되었을 때 기본 테이블에 취해야 할 사항을 지정한다.
NO ACTION 참조 테이블에 변화가 있어도 기본 테이블에는 아무런 조취를 취하지 않는다. CASCADE 참조 테이블의 튜플이 삭제되면 기본 테이블의 관련 튜플도 모두 삭제되고, 속성이 변경되면 관련 튜플의 속성 값도 모두 변경된다. SET NULL 참조 테이블에 변화가 있으면 기본 테이블의 관련 튜플의 속성 값을 NULL로 변경한다. SET DEFAULT 참조 테이블에 변화가 있으면 기본 테이블의 관련 튜플의 속성 값을 NULL로 변경한다. - ON UPDATE 옵션: 참조 테이블의 참조 속성 값이 변경되었을 때 기본 테이블에 취해야 할 사항을 지정한다. 옵션에는 NO ACTION, CASCADE, SET NULL, SET DEFAULT가 있다.
- CONSTRAINT: 제약 조건의 이름을 지정한다. 이름을 지정할 필요가 없으면 CHECK절만 사용하여 속성 값에 대한 제약 조건을 명시한다.
- CHECK: 속성 값에 대한 제약 조건을 정의한다.
CREATE VIEW
CREATE VIEW는 뷰(VIEW)를 정의하는 명령문이다.
- 표기형식
CREATE VIEW 뷰명[(속성명[, 속성명, ...])] AS SELECT문;
- SELECT문을 서브 쿼리로 사용하여 SELECT문의 결과로서 뷰를 생성한다.
- 서브 쿼리인 SELECT문에는 UNION이나 ORDER BY절을 사용할 수 없다.
- 속성명을 기술하지 않으면 SELECT문의 속성명이 자동으로 사용된다.
CREATE INDEX
CREATE INDEX는 인덱스를 정의하는 명령문이다.
- 표기형식
CREATE [UNIQUE] INDEX 인덱스명 ON 테이블명(속성면[ASC|DESC] [, 속성명[ASC|DESC]]) [CLUSTER];
- UNIQUE
- 사용된 경우: 중복 값이 없는 속성으로 인덱스를 생성한다.
- 생략된 경우: 중복 값을 허용하는 속성으로 인덱스를 생성한다.
- 정렬 여부 지정
- ASC: 오름차순 정렬
- DESC: 내림차순 정렬
- 생략된 경우: 오름차순으로 정렬됨
- CLUSTER: 사용하면 인덱스가 클러스터드 인덱스로 설정됨
- UNIQUE
ALTER TABLE
ALTER TABLE은 테이블에 대한 정의를 변경하는 명령문이다.
- 표기형식
ALTER TABLE 테이블명 ADD 속성명 데이터_타입 [DEFAULT'기본값']; ALTER TABLE 테이블명 ALTER 속성명 [SET DEFAULT '기본값']; ALTER TABLE 테이블명 DROP COLUMN 속성명 [CASCADE];
- ADD: 새로운 속성(열)을 추가할 때 사용한다.
- ALTER: 특정 속성의 Default 값을 변경할 때 사용한다.
- DROP COLUMN: 특정 속성을 삭제할 때 사용한다.
DROP
DROP은 스키마, 도메인, 기본 테이블, 뷰 테이블, 인덱스, 제약 조건 등을 제거하는 명령문이다.
- 표기형식
DROP SCHEMA 스키마명 [CASCADE|RESTRICT]; DROP DOMAIN 도메인명 [CASCADE|RESTRICT]; DROP TABLE 테이블명 [CASCADE|RESTRICT]; DROP VIEW 뷰명 [CASCADE|RESTRICT]; DROP INDEX 인덱스명 [CASCADE|RESTRICT]; DROP CONSTRAINT 제약조건명;
- CASCADE: 제거할 요소를 참조하는 다른 모든 개체를 함께 제거한다. 즉 주 테이블의 데이터 제거 시 각 외래키와 관계를 맺고 있는 모든 데이터를 제거하는 참조 무결성 제약 조건을 설정하기 위해 사용된다.
- RESTRICT: 다른 개체가 제거할 요소를 참조중일 때는 제거를 취소한다.
DCL
DCL(Data Control Language, 데이터 제어어)의 개요
DCL(데이터 제어어)는 데이터의 보안, 무결성, 회복, 병행 제어 등을 정의하는 데 사용하는 언어이다. DCL은 데이터베이스 관리자(DBA)가 데이터 관리를 목적으로 사용한다. DCL에는 GRANT, REVOKE, COMMIT, ROLLBACK, SAVEPOINT 등이 있다.
GRANT/REVOKE
데이터베이스 관리자가 데이터베이스 사용자에게 권한을 부여하거나 취소하기 위한 명령어이다.
- GRANT: 권한 부여를 위한 명령어
- REVOKE: 권한 취소를 위한 명령어
- 사용자등급 지정 및 해제
GRANT 사용자등급 TO 사용자_ID_리스트 [IDENTIFIED BY 암호]; REVOKE 사용자등급 FROM 사용자_ID_리스트;
- 사용자등급
- DBA: 데이터베이스 관리자
- RESOURCE: 데이버베이스 및 테이블 생성 가능자
- CONNECT: 단순 사용자
- 사용자등급
- 테이블 및 속성에 대한 권한 부여 및 취소
GRANT 권한_리스트 ON 개체 TO 사용자 [WITH GRANT OPTION]; REVOKE [GRANT OPTION FOR] 권한_리스트 ON 개체 FROM 사용자 [CASCADE];
- 권한 종류: ALL, SELECT, INSERT, DELETE, UPDATE, ALTER 등
- WITH GRANT OPTION: 부여받은 권한을 다른 사용자에게 다시 부여할 수 있는 권한을 부여함
- GRANT OPTION FOR: 다른 사용자에게 권한을 부여할 수 있는 권한을 취소함
- CASCADE: 권한 취소 시 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연쇄적으로 취소함
COMMIT
트랜잭션이 성공적으로 끝나면 데이터베이스가 새로운 일관성(Consistency) 상태를 가지기 위해 변경된 모든 내용을 데이터베이스에 반영해야 하는데, 이때 사용하는 명령이 COMMIT이다. COMMIT 명령을 실행하지 않아도 DML문이 성공적으로 완료되면 자동으로 COMMIT되고, DML이 실패하면 자동으로 ROLLBACK이 되도록 Auto Commit 기능을 설정할 수 있다.
ROLLBACK
ROLLBACK은 아직 COMMIT되지 않은 변경된 모든 내용들을 취소하고 데이터베이스를 이전 상태로 되돌리는 명령이다. 트랜잭션 전체가 성공적으로 끝나지 못하면 일부 변경된 내용만 데이터베이스에 반영되는 비일관성(Inconsistency)인 상태를 가질 수 있기 때문에 일부분만 완료된 트랜잭션은 롤백(Rollback)되어야 한다.
SAVEPOINT
SAVEPOINT는 트랜잭션 내에 ROLLBACK 할 위치인 저장점을 지정하는 명령어이다. 저장점을 지정할 때는 이름을 부여하며, ROLLBACK 시 지정된 저장점까지의 트랜잭션 처리 내용이 취소된다.
DML
DML(Data Manipulation Language, 데이터 조작어)의 개요
DML(데이터 조작어)은 데이터베이스 사용자가 응용 프로그램이나 질의어를 통해 저장된 데이터를 실질적으로 관리하는데 사용되는 언어이다. DML은 데이터베이스 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공한다. DML의 유형은 다음과 같다.
- SELCT: 테이블에서 튜플을 검색한다.
- INSERT: 테이블에서 새로운 튜플을 삽입한다.
- DELETE: 테이블에서 튜플을 삭제한다.
- UPDATE: 테이블에서 튜플의 내용을 갱신한다.
삽입문(INSERT INTO ~)
삽입문은 기본 테이블에 새로운 튜플을 삽입할 때 사용한다.
- 일반 형식
INSERT INTO 테이블명([속성명1, 속성명2, ...]) VALUE (데이터1, 데이터2, ...);
- 대응하는 속성과 데이터는 개수와 데이터 유형이 일치해야 한다.
- 기본 테이블의 모든 속성을 사용할 때는 속성명을 생략할 수 있다.
- SELECT문을 사용하여 다른 테이블의 검색 결과를 삽입할 수 있다.
삭제문(DELETE FROM ~)
삭제문은 기본 테이블에 있는 튜플들 중에서 특정 튜플(행)을 삭제할 때 사용한다.
- 일반형식
DELETE FROM 테이블명 [WHERE 조건];
- 모든 레코드를 삭제할 때는 WHERE절을 생략한다.
- 모든 레코드를 삭제하더라고 테이블 구조는 남아 있기 때문에 디스크에서 테이블을 완전히 제거하는 DROP과는 다르다.
갱신문(UPDATE ~ SET ~)
갱신문은 기본 테이블에 있는 튜플들 중에서 특정 튜플의 내용을 변경할 때 사용한다.
- 일반형식
UPDATE 테이블명 SET 속성명 = 데이터[, 속성명 = 데이터, ...] [WHERE 조건];
DML - SELECT - 1
일반 형식
SELECT [PREDICATE] [테이블명.]속성명 [AS 별칭] [, [테이블명.]속성명, ...]
[, 그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, ...
ORDER BY 속성명3, 속성명4, ...)]
FROM 테이블명[, 테이블명, ...]
[WHERE 조건]
[GROUP BY 속성명, 속성명, ...]
[HAVING 조건]
[ORDER BY 속성명 [ASC|DESC]];
- SELECT 절
- PREDICATE: 불러올 튜플 수를 제한할 명령어를 기술한다.
- ALL: 모든 튜플을 검색할 때 지정하는 것으로, 주로 생략한다.
- DISTINCT: 중복된 튜플이 있으면 그 중 첫 번째 한 개만 검색한다.
- DISTINCTROW: 중복된 튜플을 제거하고 한 개만 검색하지만 선택된 속성의 값이 아닌, 튜플 전체를 대상으로 한다.
- 속성명: 검색하여 불러올 속성(열) 또는 속성을 이용한 수식을 지정한다.
- 기본 테이블을 구성하는 모든 속성을 지정할 때는 ‘*‘를 기술한다.
- 두 개 이상의 테이블을 대상으로 검색할 때는 ‘테이블명.속성명’으로 표현한다.
- AS: 속성 및 연산의 이름을 다른 제목으로 표시하기 위해 사용된다.
- PREDICATE: 불러올 튜플 수를 제한할 명령어를 기술한다.
- FROM절: 질의에 의해 검색될 데이터들을 포함하는 테이블명을 기술한다.
- WHERE절: 검색할 조건을 기술한다.
- ORDER BY절: 특정 속성을 기준으로 정렬하여 검색할 때 사용한다.
- 속성명: 정렬의 기준이 되는 속성먕을 기술한다.
- [ASC|DESC]: 정렬 방식으로서 ‘ASC’는 오름차순, ‘DESC’는 내림차순이다. 생략하면 오름차순으로 지정된다.
기본 검색
SELECT 절에서 원하는 속성을 지정하여 검색한다.
조건 지정 검색
WHERE 절에 조건을 지정하여 조건에 만족하는 튜플만 검색한다.
정렬 검색
ORDER BY 절에 특정 속성을 지정하여 지정된 속성으로 자료를 정렬하여 검색한다.
하위 질의
하위 질의는 조건절에 주어진 질의를 먼저 수행하여 그 검색 결과를 조건질의 피연산자로 사용한다.
복수 테이블 검색
여러 테이블을 대상으로 검색을 수행한다.
DML - SELECT - 2
SELECT [PREDICATE] [테이블명.]속성명 [AS 별칭] [, [테이블명.]속성명, ...]
[, 그룹함수(속성명) [AS 별칭]]
[, Window함수 OVER (PARTITION BY 속성명1, 속성명2, ...
ORDER BY 속성명3, 속성명4, ...)]
FROM 테이블명[, 테이블명, ...]
[WHERE 조건]
[GROUP BY 속성명, 속성명, ...]
[HAVING 조건]
[ORDER BY 속성명 [ASC|DESC]];
- 그룹함수: GROUP BY절에 지정된 그룹별로 속성의 값을 집계할 함수를 기술한다.
- WINDOW 함수: GROUP BY절을 이용하지 않고 속성의 값을 집계할 함수를 기술한다.
- PARTITION BY: WINDOW 함수가 적용될 범위로 사용할 속성을 지정한다.
- ORDER BY: PARTITION 안에서 정렬 기준으로 사용할 속성을 지정한다.
- GROUP BY절: 특정 속성을 기준으로 그룹화하여 검색할 때 사용한다. 일반적으로 GROUP BY절은 그룹 함수와 함께 사용된다.
- HAVING절: GROUP BY와 함께 사용되며, 그룹에 대한 조건을 지정한다.
집합 연산자를 이용한 통합 질의
집합 연산자를 사용하여 2개 이상의 테이블의 데이터를 하나로 통합한다.
SELECT 속성명1, 속성명2, ...
FROM 테이블명
UNION | UNION ALL | INTERSECT | EXCEPT
SELECT 속성명1, 속성명2, ...
FROM 테이블명
[ORDER BY 속성명 [ASC|DESC]];
- 두 개의 SELECT문에 기술한 속성들은 개수와 데이터 유형이 서로 동일해야 한다.
- 집합 연산자의 종류(통합 질의의 종류)
- UNION(합집합)
- 두 SELECT문의 조회 결과를 통합하여 모두 출력한다.
- 중복된 행은 한 번만 출력한다
- UNION ALL(합집합)
- 두 SELECT문의 조회 결과를 통합하여 모두 출력한다.
- 중복된 행도 그대로 출력한다.
- INTERSECT(교집합)
- 두 SELECT문의 조회 결과 중 공통된 행만 출력한다.
- EXECEPT(차집합)
- 첫 번쨰 SELECT문의 조회 결과에서 두 번째 SELECT문의 조회 결과를 제외한 행을 출력한다.
- UNION(합집합)
DML - JOIN
JOIN의 개요
JOIN은 2개의 테이블에 대해 연관된 튜플들을 결합하여, 하나의 새로운 릴레이션을 반환한다. JOIN은 크게 INTER JOIN과 OUTER JOIN으로 구분된다. JOIN은 일반적으로 FROM절에 기술하지만, 릴레이션이 사용되는 어느 곳에서나 사용할 수 있다.
INNER JOIN
INNER JOIN은 일반적으로 EQUI JOIN과 NON-EQUI JOIN으로 구분된다. 조건이 없는 INNER JOIN을 수행하면 CROSS JOIN과 동일한 결과를 얻을 수 있다.
- EQUI JOIN
- EQUI JOIN은 JOIN 대상 테이블에서 공통 속성을 기준으로 ‘=’비교에 의해 같은 값을 가지는 행을 연결하여 결과를 생성하는 JOIN방법이다.
- EQUI JOIN에서 JOIN 조건이 ‘=’일 때 동일한 속성이 두 번 나타나게 되는데, 이 중 중복된 속성을 제거하여 같은 속성을 한 번만 표기하는 방법을 BATURAL JOIN이라고 한다
- EQUI JOIN에서 연결 고리가 되는 공통 속성을 JOIN 속성이라고 한다.
- WHERE절을 이용한 EQUI JOIN의 표기형식
SELECT [테이블명1.]속성명, [테이블명2.]속성명 FROM 테이블명1, 테이블명2, ... WHERE 테이블명1.속성명 = 테이블명2.속성명;
- NATURAL JOIN절을 이용한 EQUI JOIN의 표기 형식
SELECT [테이블명1.]속성명, [테이블명2.]속성명 FROM 테이블명1 NATURAL JOIN 테이블명2;
- JOIN ~ USING절을 이용한 EQUI JOIN의 표기 형식
SELECT [테이블명1.]속성명, [테이블명2.]속성명 FROM 테이블명1 JOIN 테이블명2 USING(속성명);
- NON-EQUI JOIN
- NON-EQUI JOIN은 JOIN 조건에 ‘=’ 조건이 아닌 나머지 비교 연산자, 즉 >, <, <>, >=, <= 연산자를 사용하는 JOIN 방법이다.
SELECT [테이블명1.]속성명, [테이블명2].속성명, ... FROM 테이블명1, 테이블명2, ... WHERE (NON-EQUI JOIN 조건);
- NON-EQUI JOIN은 JOIN 조건에 ‘=’ 조건이 아닌 나머지 비교 연산자, 즉 >, <, <>, >=, <= 연산자를 사용하는 JOIN 방법이다.
OUTER JOIN
OUTER JOIN은 릴레이션에서 JOIN 조건에 만족하지 않는 튜플도 결과로 출력하기 위한 JOIN 방법으로, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.
- LEFT OUTER JOIN
- INNER JOIN의 결과를 구한 후, 우측 항 릴레이션의 어떤 튜플과도 맞지 않는 좌측 항의 릴레이션에 있는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다. ```sql SELECT [테이블명1.]속성명, [테이블명2.]속성명, … FROM 테이블명1 LEFT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, … FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명(+); ```
- RIGHT OUTER JOIN
- INNER JOIN의 결과를 구한 후, 좌측 항 릴레이션의 어떤 튜플과도 맞지 않는 우측 항의 릴레이션에 있는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다. ```sql SELECT [테이블명1.]속성명, [테이블명2.]속성명, … FROM 테이블명1 RIGHT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명, … FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명(+) = 테이블명2.속성명; ```
- FULL OUTER JOIN
- LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합쳐 놓은 것이다.
- INNER JOIN의 결과를 구한 후, 좌측 항의 릴레이션에 대해 우측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다. 그리고 유사하게 우측 항의 릴레이션에 대해 좌측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.
SELECT [테이블명1.]속성명, [테이블명2.]속성명, ... FROM 테이블명1 FULL OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명;
SELF JOIN
SELF JOIN은 같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN을 하는 JOIN방법이다.
SELECT [별칭1.]속성명, [별칭1.]속성명, ...
FROM 테이블명1 [AS] 별칭1 JOIN 테이블명1 [AS] 별칭2
ON 별칭1.속성명 = 별칭2.속성명;
SELECT [별칭1.]속성명, [별칭1.]속성명, ...
FROM 테이블명1 [AS] 별칭1, 테이블명1 [AS] 별칭2
WHERE 별칭1.속성명 = 별칭2.속성명;
댓글남기기