Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바의 정석 기초편 ch7
- 타임리프 - 기본기능
- 스프링 db2 - 데이터 접근 기술
- 스프링 mvc1 - 스프링 mvc
- 자바의 정석 기초편 ch1
- 자바의 정석 기초편 ch14
- 게시글 목록 api
- 자바의 정석 기초편 ch5
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch4
- jpa 활용2 - api 개발 고급
- 자바의 정석 기초편 ch11
- 스프링 mvc1 - 서블릿
- 스프링 mvc2 - 타임리프
- 자바의 정석 기초편 ch2
- 2024 정보처리기사 시나공 필기
- 자바의 정석 기초편 ch9
- 자바의 정석 기초편 ch13
- 스프링 db1 - 스프링과 문제 해결
- 자바의 정석 기초편 ch8
- 자바의 정석 기초편 ch3
- 스프링 mvc2 - 검증
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch6
- 스프링 입문(무료)
- 스프링 고급 - 스프링 aop
- 자바의 정석 기초편 ch12
- 스프링 mvc2 - 로그인 처리
- @Aspect
- 2024 정보처리기사 수제비 실기
Archives
- Today
- Total
나구리의 개발공부기록
3장 - SQL응용 | 섹션22. DML, 섹션23. DML - SELECT(1) -, 섹션24. DML - SELECT(2) -, 섹션25. DML - JOIN 본문
2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/필기 3강 - 데이터베이스 구축
3장 - SQL응용 | 섹션22. DML, 섹션23. DML - SELECT(1) -, 섹션24. DML - SELECT(2) -, 섹션25. DML - JOIN
소소한나구리 2024. 5. 6. 20:432024년도 시나공 필기 책 내용 정리
섹션22. DML
1. DML(Data Manipulation Language, 데이터 조작어)의 개요
- 데이터베이스 사용자가 응용 프로그램이나 질의어를 통해 저장된 데이터를 실질적으로 관리하는데 사용되는 언어
- 데이터베이스 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공함
- DML의 유형
명령문 | 기능 |
SELECT | 테이블에서 튜플을 검색 |
INSERT | 테이블에 새로운 튜플을 삽입 |
DELETE | 테이블에서 튜플을 삭제 |
UPDATE | 테이블에서 튜플의 내용을 갱신 |
2. 삽입문(INSERT INTO ~)
- 기본 테이블에 새로운 튜플을 삽입할 때 사용됨
INSERT INTO 테이블명 ([속성명1, 속성명2, ...])
VALUES (데이터1, 데이터2, ...);
- 대응하는 속성과 데이터는 개수와 데이터 유형이 일치해야 함
- 기본 테이블의 모든 속성을 사용할 때는 속성명을 생략할 수 있음
- SELECT문을 사용하여 다른 테이블의 검색 결과를 삽입할 수 있음
-- <사원>테이블에 [이름 - 홍승현, 부서 - 인터넷]을 삽입
INSERT INTO 사원(이름, 부서) VALUSE ('홍승현', '인터넷');
# <사원> 테이블에 [장보고, 기획, 05/03/73, 홍제동, 90)을 삽입
INSERT INTO 사원 VALUSE('장보고', '기획', #05/03/73#, '홍제동', 90);
-- 날짜 데이터는 숫자로 취급되지만 '' 또는 ##으로 묶어줌
# <사원> 테이블에 있는 편집부의 모든 튜플을 편집부원(이름, 생일, 주소, 기본급)테이블에 삽입
INSERT INTO 편집부원(이름, 생일, 주소, 기본급)
SELECT 이름, 생일, 주소, 기본급
FROM 사원
WHERE 부서 = '편집';
3. 삭제문(DELETE FROM ~)
- 기본 테이블에 있는 튜플들 중에서 특정 튜플을 삭제할 때 사용
DELETE FROM 테이블명 [WHERE 조건];
- 모든 레코드를 삭제할 때는 WHERE 절을 생략함
- 모든 레코드를 삭제하더라도 테이블 구조는 남아 있기 때문에 디스크에서 테이블을 완전히 제거하는 DROP과는 다름
# <사원> 테이블에서 임꺽정에 대한 튜플을 삭제
DELETE FROM 사원 WHERE 이름 = '임꺽정';
# <사원> 테이블에서 인터넷 부서에 대한 모든 튜플을 삭제
DELETE FROM 사원 WHERE 부서 = '인터넷';
# <사원> 테이블의 모든 레코드를 삭제
DELETE FROM 사원;
4. 갱신문 (UPDATE ~ SET ~)
- 기본 테이블에 있는 튜플들 중에서 특정 튜플의 내용을 변경할 때 사용
UPDATE 테이블명
SET 속성명 = 데이터[, 속성명 = 데이터, ...]
[WHERE 조건];
-- <사원> 테이블에서 홍길동의 주소를 수색동으로 수정
UPDATE 사원 SET 주소 = '수색동'
WHERE 이름 = '홍길동';
# <사원> 테이블에서 황진이의 부서를 기획부로 변경하고 기본급을 5만원 인상
UPDATE 사원 SET 부서 = '기획부', 기본급 = 기본급 + 5
WHERE 이름 = '황진이'
데이터 조작문의 네 가지 유형 정리
SELECT(검색) : SELECT ~ FROM ~ WHERE ~
INSERT(삽입) : INSERT INTO ~ VALUES ~
DELETE(삭제) : DELETE FROM ~ WHERE ~
UPDATE(변경) : UPDATE ~ SET ~ WHERE ~
섹션23. DML - SELECT(1) -
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는 오름차순 DESD는 내림차순, 생략 시 오름차순으로 지정
조건 연산자
- 비교 연산자
연산자 | = | <> | > | < | >= | <= |
의미 | 같다 | 같지 않다 | 크다 | 작다 | 크거나 같다 | 작거나 같다 |
- 논리 연산자 : NOT, AND, OR
- LIKE 연산자 : 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 튜플을 검색하기 위해 사용됨
대표 문자 | % | _ | # |
의미 | 모든 문자를 대표함 | 문자 하나를 대표함 | 숫자 하나를 대표함 |
연산자의 우선순위
종류 | 연산자 | 우선순위 |
산술 연산자 | X, /, +, - | 왼쪽에서 오른쪽으로 갈수록 낮아짐 |
관계 연산자 | =, < >, >, >=, <, <= | 모두 같음 |
논리 연산자 | NOT, AND, OR | 왼쪽에서 오른쪽으로 갈수록 낮아짐 |
2. 기본 검색
- SELECT절에 원하는 속성을 지정하여 검색
# <사원> 테이블의 모든 튜플을 검색
SELECT * FROM 사원;
기타 방법
SELECT 사원.* FROM 사원;
SELECT 이름, 부서, 생일, 주소, 기본급 FROM 사원; # 테이블의 모든 컬럼을 대상으로 지정
SELECT 사원.이름 ... 사원.기본급 FROM 사원; #테이블명을 포함하여 모든 컬럼을 대상으로 지정
-- <사원>테이블에서 주소만 검색하고 같은 주소는 한번만 출력
SELECT DISTINCT 주소 FROM 사원;
# <사원>테이블에서 기본급에 특별수당 '10을 더한 월급을 XX부서의 XXX의 월급 XXX' 형태로 출력
SELECT 부서 + '부서의' AS 부서2, 이름 + '의 월급' AS 이름2, 기본급+10 AS 기본급2, FROM 사원;
3. 조건 지정 검색
- WHERE 절에 AND, OR, LIKE, BETWEEN 등의 기능을 사용하여 조건을 지정하고 조건에 만족하는 튜플만 검색
# <사원> 테이블에서 기획부의 모든 튜플을 검색
SELECT * FROM 사원 WHERE 부서 = '기획';
-- <사원> 테이블에서 기획부서에 근무하면서 대흥동에 사는 사람의 튜플을 검색
SELECT * FROM 사원 WHERE 부서 = '기획' AND 주소 = '대흥동';
# <사원> 테이블에서 부서가 기획이거나 인터넷인 튜플을 검색
SELECT * FROM 사원 WHERE 부서 = '기획' OR 부서 = '인터넷';
SELECT * FROM 사원 WHERE 부서 IN('기획','인터넷');
-- <사원> 테이블에서 성이 김인 사람의 튜플을 검색
SELECT * FROM 사원 WHERE 이름 LIKE '김%';
# <사원> 테이블에서 생일이 01/01/69에서 12/31/73 사이인 튜플을 검색
SELECT * FROM 사원 WHERE 생일 BETWEEN #01/01/69# AND #12/31/73#;
-- <사원> 테이블에서 주소가 NULL인 튜플을 검색
SELECT * FROM 사원 WHERE 주소 IS NULL;
# NULL이 아닌 값을 검색할 경우
SELECT * FROM 사원 WHERE 주소 IS NOT NULL;
4. 정렬 검색
- ORDER BY 절에 특정 속성을 지정하여 지정된 속성으로 자료를 정렬하여 검색
# <사원>테이블에서 주소를 기준으로 내림차순 정렬시켜 상위 2개 튜플만 검색
SELECT TOP 2 * FROM 사원 ORDER BY 주소 DESC;
# <사원>테이블에서 부서를 기준으로 오름차순 정렬하고 같은 부서에 대해서는 이름을 기준으로 내림차순 정렬시켜서 검색
SELECT * FROM 사원 ORDER BY 부서 ASC, 이름 DESC;
5. 하위 질의
- 조건절에 주어진 질의를 먼저 수행하여 그 검색결과를 조건절의 피연산자로 사용
# 취미가 나이트댄스인 사원의 이름과 주소를 검색
-- 조건절의 ()안의 쿼리문을 연산하고 연산결과를 조건절의 피연산자로 대입
SELECT 이름, 주소 FROM 사원 WHERE 이름 =(SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스');
# 취미활동을 하지 않는 사원들을 검색
-- NOT IN()은 포함되지 않는 데이터를 의미
SELECT * FROM 사원 WHERE 이름 NOT IN(SELECT 이름 FROM 여가활동);
# 취미활동을 하는 사원들의 부서를 검색
-- EXISTS()는 하위 질의로 검색된 결과가 존재하는지 확인할 때 사용
-- 1. ()의 연산결과는 여가활동과 사원에 공통으로 있는 이름을 여가활동 테이블에서 검색하여 이름을 반환
-- 2. ()의 연산결과가 사원 테이블에 있는지 확인하여 해당 값의 부서를 출력
SELECT 부서 FROM 사원
WHERE EXISTS (SELECT 이름 FROM 여가활동 WHERE 여가활동.이름 = 사원.이름);
6. 복수 테이블 검색
- 여러 테이블을 대상으로 검색을 수행
# 경력이 10년 이상인 사원의 이름, 부서, 취미, 경력을 검색
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력
FROM 사원, 여가활동
WHERE 여가활동.경력 >= 10 AND 여가활동.이름 = 사원.이름;
섹션24. DML - SELECT(2) -
1. 일반 형식
SELECT [PREDICATE][테이블명.]속성명[AS별칭][,테이블명.]속성명,...]
[, 그룹함수(속성명)[AS별칭]]
[, WINDOW함수 OVER (PARTITION BY 속성명1, 속성명2...
ORDER BY 속성명3, 속성명4, ...)[AS별칭]]
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와 함께 사용되며 그룹에 대한 조건을 지정
그룹함수: GROUP BY 절에 지정된 그룹별로 속성의 값을 집계할 때 사용됨
- COUNT(속성명) : 그룹별 튜플 수를 구하는 함수
- SUM(속성명) : 그룹별 합계를 구하는 함수
- AVG(속성명) : 그룹별 평균을 구하는 함수
- MAX(속성명) : 그룹별 최대값을 구하는 함수
- MIN(속성명) : 그룹별 최소값을 구하는 함수
- STDDEV(속성명) : 그룹별 표준편차를 구하는 함수
- VARIANCE(속성명) : 그룹별 분산을 구하는 함수
- ROLLUP(속성명,속성명,...)
- 인수로 주어진 속성을 대상으로 그룹별 소계를 구하는 함수
- 속성의 개수가 n개이면 n+1 레벨까지 하위 레벨에서 상위 레벨 순으로 데이터가 집계됨
- CUBE(속성명, 속성명,...)
- ROLLUP과 유사한 형태이나 CUBE는 인수로 주어진 속성을 대상으로 모든 조합의 그룹별 소계를 구함
- 속서의 개수가 n개이면, 2ⁿ 레벨까지 상위 레벨에서 하위 레벨 순으로 데이터가 집계됨
WINDOW함수 : GROUP BY절을 이용하지 않고 함수의 인수로 지정한 속성을 범위로 하여 속성의 값을 집계함, 함수의 인수로 지정한 속성이 대상 레코드의 범위가 되는데 이를 윈도우(WINDOW)라고 함
- ROW_NUMBER(): 윈도우별로 각 레코드에 대한 일련 번호를 반환
- RANK(): 윈도우별로 순위를 반환하며 공동 순위를 반영함
- DENSE_RANK(): 윈도우별로 순위를 반환하며 공동순위를 무시하고 순위를 부여
2. WINDOW 함수 이용 검색
- GROUP BY절을 이용하지 않고 함수의 인수로 지정한 속성을 범위로 하여 속성의 값을 집계
# <상여금> 테이블에서 상여내역별로 상여금에 대한 일련 번호를 출력(단, 순서는 내림차순이며 속성명은 NO로 지정)
SELECT 상여내역, 상여금,
ROW_NUMBER() OVER(PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS NO
FROM 상여금;
/* <상여금> 테이블에서 상여내역별로 상여금에 대한 순위를 출력
(단, 순서는 내림차순 속성명은 상여금순위, RANK()함수 사용) */
SELECT 상여내역, 상여금,
RANK() OVER(PARTITION 상여내역 ORDER BY 상여금 DESC) AS 상여금순위
FROM 상여금;
3. 그룹 지정 검색
- GROUP BY 절에 지정한 속성을 기준으로 자료를 그룹화하여 검색
# <상여금> 테이블에서 부서별 상여금의 평균을 출력
SELECT 부서, AVG(상여금) AS 평균
FROM 상여금
GROUP BY 부서;
# <상여금> 테이블에서 부서별 튜플수를 검색
SELECT 부서, COUNT(*) AS 사원수
FROM 상여금
GROUP BY 부서;
# <상여금> 테이블에서 상여금이 100이상인 사원이 2명 이상인 부서의 튜플수를 출력
-- WHERE 상여금 >= 100: 상여금이 100 이상인 값을 검색
-- GROUP BY 부서: 상여금이 100 이상인 값에 대해서만 부서별로 그룹을 지정
-- HAVING COUNT(*) >= 2: 부서의 인원(WHERE절의 조건에 부합하는 GROUP BY의 부서)의 인원이 2 이상인 값 지정
SELECT 부서, COUNT(*) AS 사원수
FROM 상여금 WHERE 상여금 >= 100
GROUP BY 부서 HAVING COUNT(*) >= 2;
/* <상여금> 테이블의 부서, 상여내역 그리고 상여금에 대해 부서별 상여내역별 소계와 전체 합계를 검색,
(단, 속성명은 상여금합계로 하고 ROLLUP 함수를 사용) */
-- ROLLUP에 적용되는 속성이 2개이므로 집계되는 레벨수는 2+1 = 3레벨이며 가장 하위레벨인 3레벨부터 표시됨
-- 부서와 상여내역별 상여급의 합계, 소계가 각각 표시되고 전체합계인 1레벨이 제일 마지막에 표시
SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계
FROM 테이블
GROUP BY ROLLUP(부서, 상여내역);
/* <상여금> 테이블의 부서, 상여내역, 그리고 상여금에 대해 부서별 상여내역별 소계와 전체 합계를 검색
(단, 속성명은 상여금합계로 하고 CUBE 함수를 사용) */
-- CUBE에 적용되는 속성이 2개이므로 집계되는 레벨수는 2² = 4레벨이며 가장 상위레벨부터 표시됨
-- 1레벨인 전체합계까 먼저 표시되고 2레벨인 상여내역별 상여금의 합계가 표시됨,
-- 그 다음에 부서별 소계화 부서별 상여내역별 합계가 각각 표시됨
SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계
FROM 테이블
GROUP BY CUBE(부서, 상여내역);
4. 집합 연산자를 이용한 통합 질의
- 집합 연산자를 사용하여 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문의 조회 결과 중 공통된 행만 출력 | 교집합 |
EXCEPT | 첫 번째 SELECT문의 조회 결과에서 두 번째 SELECT문의 조회 결과를 제외한 행을 출력 | 차집합 |
# <사원> 테이블과 <직원> 테이블을 통합하는 질의문을 작성(단, 중복은 1번반 출력)
SELECT * FROM 사원
UNION
SELECT * FROM 직원;
# <사원> 테이블과 <직원> 테이블에 공통으로 존재하는 레코드만 통합하는 질의문 작성
SELECT * FROM 사원
INTERSECT
SELECT * FROM 직원;
섹션25. DML - JOIN
1. JOIN의 개요
- 2개의 테이블에 대해 연관된 튜플들을 결합하여 하나의 새로운 릴레이션을 반환
- INNER JOIN과 OUTER JOIN으로 구분됨
- 일반적으로 FROM절에 기술하지만 릴레이션 사용되는 어느 곳에서나 사용할 수 있음
2. INNER JOIN
- 일반적으로 EQUI JOIN과 NON-EQUI JOIN으로 구분됨
- 조건이 없는 INNER JOIN을 수행하면 CROSS JOIN(교차 조인 - 조인하는 두 테이블에 있는 튜플들의 순서쌍을 결과로 반환)과 동일한 결과를 얻을 수 있음
- EQUI JOIN
- JOIN대상 테이블에서 공통 속성을 기준으로 '='(equal) 비교에의해 같은 값을 가지는 행을 연결하여 결과를 생성하는 JOIN 방법
- JOIN 조건이 '='일 때 동일한 속성이 두 번 나타나게 되는데, 이중 중복된 속성을 제거하여 같은 속성을 한 번만 표기하는 방법을 NATURAL 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(속성명);
# <학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN 하여 학번, 이름, 학과코드, 학과명을 출력하는 SQL작성
SELECT 학번, 이름, 학생.학과코드, 학과명
/* 두 테이블을 조인하여 사용할 때 한 테이블에만 있는 속성은 테이블명을 생략할 수 있지만
두 테이블에 모두 속해있는 속성은 반드시 테이블명과 함께 속성을 표시해야함 */
FROM 학생, 학과
WHERE 학생.학과코드 = 학과.학과코드;
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생 NATURAL JOIN 학과
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생 JOIN 학과 USING(학과코드);
- NON-EQUI JOIN
- JOIN조건에 '=' 조건이 아닌 나머지 비교 연산자 (>, <, <>, >=, <=)를 사용하는 JOIN방법
- 표기 형식
SELECT [테이블명1.]속성명, [테이블명2.]속성명,...
FROM 테이블명1, 테이블명2
WHERE (NON-EQUI JOIN 조건);
# <학생> 테이블과 <성적등급> 테이블을 JOIN하여 각 학생의 학번, 이름, 성적, 등급을 출력하는 SQL문 작성
SELECT 학번, 이름, 성적, 등급
FROM 학생, 성적등급
WHERE 학생.성적 BETWEEN 성적등급.최저 AND 성적등급.최고;
3. OUTER JOIN
- 릴레이션에서 JOIN조건에 만족하지 않는 튜플들도 결과로 출력하기 위한 JOIN방법으로 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있음
- LEFT OUTER JOIN : INNER JOIN의 결과를 구한 후, 우측 항 릴레이션의 어떤 튜플과도 맞지 않은 좌측 항의 릴레이션에 있는 튜플들에 NULL값을 붙여서 INNER JOIN의 결과에 추가
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의 결과에 추가
SELECT [테이블명1.]속성명, [테이블명2.]속성명,...
FROM 테이블명1 RIGHT OUTER JOIN 테이블명2
ON 테이블명1.속성명 = 테이블명2.속성명;
SELECT [테이블명1.]속성명, [테이블명2.]속성명,...
FROM 테이블명1, 테이블명2
WHERE 테이블명1.속성명(+) = 테이블명2.속성명;
- INNER JOIN은 두 릴레이션에 관련이 있는 튜플만 표시
- LEFT OUTER JOIN은 좌측 릴레이션이 기준이 되어 좌측 릴레이션에 있는 튜플은 모두 표시하고 우측 릴레이션에서는 관련이 있는 튜플만 표시
- RIGHT OUTER JOIN은 LEFT OUTER JOIN의 반대로 우측 릴레이션이 기준이 됨
- 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.속성명;
/* <학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을
출력하는 SQL문을 작성, 이때 학과코드가 입력되지 않은 학생도 출력 */
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생 LEFT OUTER JOIN 학과 ON 학생.학과코드 = 학과.학과코드;
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생, 학과 WHERE 학생.학과코드 = 학과.학과코드(+);
# JOIN구문을 기준으로 테이블의 위치를 교환하여 RIGHT JOIN을 해도 결과가 같음
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생 RIGHT OUTER JOIN 학과 ON 학과.학과코드 = 학생.학과코드; # 테이블위치를 교환
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생, 학과 WHERE 학과.학과코드(+) = 학생.학과코드; # 테이블 위치를 교환
/* <학생> 테이블과 <학과> 테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름 학과코드, 학과명을
출력하는 SQL문을 작성, 이때 학과코드가 입력되지 않은 학생이나 학생이 없는 학과코드도 모두 출력 */
SELECT 학번, 이름, 학생.학과코드, 학과명
FROM 학생 FULL OUTER JOIN 학과 ON 학생.학과코드 = 학과.학과코드;
4. SELF JOIN
- 같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN을 하는 JOIN
SELECT [별칭1.]속성명, [별칭2.]속성명, ...
FROM 테이블명1 [AS]별칭1 JOIN 테이블명1 [AS] 별칭2
ON 별칭1.속성명 = 별칭2.속성명;
SELECT [별칭1.]속성명, [별칭2.]속성명, ...
FROM 테이블명1 [AS]별칭1, 테이블명1 [AS] 별칭2
WHERE 별칭1.속성명 = 별칭2.속성명;
# <학생> 테이블을 SELF JOIN하여 선배가 있는 학생과 선배의 이름을 표시하는 SQL문 작성
SELECT A.학번, A.이름, B.이름 AS 선배
FROM 학생 A JOIN 학생 B
ON A.선배 = B.학번;
SELECT A.학번, A.이름, B.이름 AS 선배
FROM 학생 A, 학생 B
WHERE A.선배 = B.학번;
'2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비) > 필기 3강 - 데이터베이스 구축' 카테고리의 다른 글
4장 - SQL활용 | 섹션26. 프로시저(Procedure), 섹션27. 트리거(Trigger), 섹션28. 사용자 정의 함수, 섹션29. DBMS 접속 기술 (0) | 2024.05.07 |
---|---|
3장 - SQL응용 핵심 요약 (0) | 2024.05.06 |
3장 - SQL응용 | 섹션19. SQL의 개념, 섹션20. DDL, 섹션21. DCL (0) | 2024.05.06 |
2장 - 물리 데이터베이스 설계 핵심 요약 (0) | 2024.05.05 |
2장 - 물리 데이터베이스 설계 | 섹션15. 데이터베이스 보안(암호화), 섹션16. 데이터베이스 보안(접근통제), 섹션17. 데이터베이스 백업, 섹션18. 스토리지 (0) | 2024.05.05 |