일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 정보처리기사
- Backjoon
- 백준
- axi
- C++
- linux
- 실기
- boj
- Vivado
- FPGA
- Bus
- baekjoon
- 코딩테스트
- UNIX
- hdl
- AMBA BUS
- verilog
- Xilinx
- amba
- Beakjoon
- vitis
- SQL
- java
- chip2chip
- 리눅스
- 정처기
- verilog HDL
- Zynq
- 자격증
- HDLBits
- Today
- Total
Hueestory
sqld 2과목 [1. SQL 기본] 본문
2-1. 관계형 데이터베이스 개요
데이터베이스 : 데이터의 집합, 꼭 형식을 갖추기 않아도 엑셀 파일을 모아 둔다면 그것 또한 데이터베이스(추상적)
DBMS : 데이터를 효과적으로 관리하기 위한 시스템 ex) ORACLE, MYSQL
SQL
- 관계형 데이터베이스에서 데이터의 조회 및 조작, DBMS 시스템 관리 기능을 명령하는 언어
- DDL, DML, DCL 등으로 구분하며 대/소문자 구분하지 않음
관계형 데이터베이스 구성 요소
- 계정 : 데이터의 접근 제한을 위한 여러 업무별/시스템별 계정이 존재
- 테이블 : DBMS의 DB 안에서 데이터가 저장되는 형식
- 스키마 : 테이블이 어떠한 구성으로 되어있는지, 어떠한 정보를 가지고 있는지에 대한 기본적인 구조를 정의
테이블
정의
- 데이터가 저장되는 단위
- 엑셀에서의 행(low)과 열(column). column은 속성이라고도 함
특징
- 하나의 테이블은 반드시 하나의 user 소유
- 1:1, 1:N, N:N의 관계가 가능
- 테이블명은 중복될 수 없지만, 소유자가 다른 경우 같은 이름으로 생성 가능
- 데이터는 행 단위로 입력/삭제되며 수정은 값의 단위로 가능
관계형 데이터베이스 특징
장점
- 데이터의 분류, 정렬, 탐색 속도가 빠름
- 신뢰성이 높고, 데이터의 무결성 보장
단점
- 기존의 작성된 스키마를 수정하기 어려움
- 데이터베이스의 부하를 분석하는 것이 어려움
데이터 무결성
- 데이터의 정확성과 일관성을 유지하고, 데이터에 결손과 부정합이 없음을 보증하는 것
- 데이터 무결성을 유지하는 것이 데이터베이스 관리시스템에 중요한 기능
데이터 무결성 종류
- 개체 무결성 : 기본키는 NULL 값이나 중복값을 가질 수 없음
- 참조 무결성 : 외래키 값은 NULL 이거나 참조 테이블의 기본키 값과 동일해야 함
- 도메인 무결성 : 주어진 속성 값이 정의된 도메인에 속한 값이어야 함
- NULL 무결성 : 특정 속성에 대해 NULL을 허용하지 않는 특징
- 고유 무결성 : 특정 속성에 대해, 값이 중복되지 않는 특징
- 키 무결성 : 하나의 관계에는 적어도 하나의 키가 존재해야 함
ERD(Entity Relationship Diagram)
- 테이블 간 서로의 상관 관계를 그림으로 표현한 것
- 현실 세계 데이터는 엔터티(Entity), 관계(Relationship), 속성(Attribute) 3가지의 구성으로 모두 표현 가능
2-2. SELECT 문
SQL 종류
- DDL : CREATE, ALTER, DROP, TRUNCATE / 데이터 정의, 구조 자체를 변경, ROLLBACK으로 취소 불가능
- DML : INSERT, DELETE, UPDATE, MERGE / 데이터 값 자체를 변경
- DCL : GRANT, REVOKE / 데이터를 권한으로 제어
- TCL : COMMIT, ROLLBACK / 트랜잭션 제어
- DQL : SELECT
/*SELECT 문 구조*/
SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회할 데이터 조건
GROUP BY 그룹핑컬럼명
HAVING 그룹핑 대상 필터링 조건
ORDER BY 정렬컬럼명;
- 위 6개 절로 구성
- GROUP BY와 HAVING은 순서가 바뀔 수 있지만, 각 절의 순서대로 작성해야 함
- FROM>WHERE>GROUP BY>HAVING>SELECT>ORDER BY 순서대로 실행
SELECT 절
- SELECT 문장을 사용하여 불러올 걸럼명, 연산 결과를 작성하는 절(CULUMN에 대한 선택)
- *를 사용하여 전체 컬럼명을 불러올 수 있음
- 표시할 대상 컬럼에 AS를 사용해 Alias(별칭) 지정 가능, AS 생략 가능
특징 및 주의사항
- SELECT 문보다 늦게 수행되는 ORDER BY 절에서만 컬럼 별칭 사용 가능
- 한글 사용 가능
- 이미 존재하는 예약어는 별칭으로 사용 불가, ex) agv, count, decode, SELECT, FROM 등
- 별칭에 공백, 특수문자를 표함하는 경우('_' 제외), 별칭 그대로 전달할 경우 쌍따옴표(" ") 사용
FROM 절
- 데이터를 불러올 테이블명 또는 뷰명 전달
- 테이블 여러 개 전달 가능(컴마로 구분) → 조인 조건 없이 테이블명만 나열 시 카타시안 곱 발생
- 테이블 별칭 선언 가능(ORACLE은 AS 사용 불가, SQL Server는 사용/생략 가능)
- ORACLE에서는 FROM 절 생략 불가(의미상 필요 없는 경우 DUAL 더미 테이블 선언)
- SQL Server에서는 FROM 절 필요 없을 경우 생략 가능
- 테이블 별칭을 선언하면 별칭만 사용해야 함
2-3 함수
- input value와 output value의 관계를 정의한 객체
- 데이터의 계산을 수행하거나 개별 데이터의 항목을 수정
- 표시할 날짜 및 숫자 형식을 지정
- 열 데이터의 유형을 변환
함수의 종류
입력값의 수
- 단일행 함수 : input과 output이 1:1
- 복수행 함수 : 여러 건의 데이터를 동시에 입력 받아서 하나의 요약값을 리턴, ex) sum, min, max
입/출력값의 타입
1. 문자형 함수
- 문자열 결합, 추출, 삭제 등을 수행
- 단일행 함수 형태
- output은 대부분 문자값(length, instr 제외)
종류
- LOWER : 소문자로
- UPPER : 대문자로
- SUBSTR(대상, m, n) : 문자열 m 위치에서 n개의 문자열 추출, n 생략 시 끝까지 추출, 음의 값이면 뒤에서부터
- INSTR(대상, 찾을문자열, m, n) : m위치에서 시작하여 n번째 발견된 문자열 위치를 반환, n 생략시 첫 발견 위치
- LTRIM, RTRIM(대상, 삭제문자열) : 좌/우측에서 시작하여 특정 문자열을 삭제, 대상이 아닌 문자열을 만나면 중단
- TRIM(대상) : 특정 문자열을 양쪽에서 삭제
- LPAD,RPAD(대상, n, 문자열) : 좌/우측에 문자열을 추가하여 총 n의 길이 리턴
- CONCAT(대상1, 대상2) : 문자열 결합
- LENGTH(대상) : 문자열 길이
- REPLACE(대상, 찾을문자열, 바꿀문자열) : 문자열 치환 및 삭제
- TRNSLATE(대상, 찾을문자열, 바꿀문자열) : 글자를 1:1로 치환
*SQL Server : SUBSTR → SUBSTRING, LENGTH → LEN, INSTR → CHARINDEX
2. 숫자형 함수
- 숫자를 입력하면 숫자 값을 반환
- 단일행 함수 형태의 숫자 함수
- ORACLE과 SQL Server 함수 거의 동일
종류
- ABS(숫자) : 절대값 반환(양수)
- ROUND(숫자, 자리수) : 소수점 특정 자리에서 반올림, 자리수 생략 시 첫째자리에서 반올림, 입력 시 n+1에서 반올림
- TRUNC(숫자, 자리수) : 소수점 특정 자리 아래 모두 버림
- SIGN(숫자) : 양수면 1, 음수면 -1, 0이면 0
- FLOOR(숫자) : 작거나 같은 최대 정수 리턴(내림)
- CEIL(숫자) : 크거나 같은 최소 정수 리턴(올림)
- MOD(숫자1, 숫자2) : 숫자1을 숫자2로 나누어 나머지 반환
- POWER(M, N) : m^n
- SQRT(숫자) : 루트값
3. 날짜형 함수
- 날짜 연산과 관련된 함수
- ORACLE과 SQL Server 함수 거의 다름
종류
- SYSDATE : 현재 날짜와 시간
- CURRENT_DATE : 현재 날짜
- CURRENT_TIMESTAMP : 현재 타임스탬프
- ADD_MONTHS(날짜, n) : 날짜에서 n개월 후
- MONTHS_BETWEEN(날짜1, 날짜2) : 날짜1과 날짜2의 개월 수
- LAST_DAY(날짜) : 주어진 월의 마지막 날짜
- NEXT_DAY(날짜, n) : 주어진 날짜 이후 지정된 요일의 첫 번째 날짜
- ROUND(날짜, 자리수) : 날짜 반올림
- TRUNC(날짜, 자리수) : 날짜 버림
*SQL Server : SYSDATE → GETDATE, ADD_MONTHS → DATEADD, MONTHS_BETWEEN → DATEDIFF
4. 변환 함수
- 값의 데이터 타입을 변환
- 문자를 숫자로, 숫자를 문자로, 날짜를 문자로 변경
종류
- TO_NUMBER(문자) : 숫자 타입으로 변경
- TO_CHAR(대상, 포맷) : 날짜/숫자의 포맷 변경, 리턴은 문자타입, 숫자의 경우 5자리로 리턴(앞 자리수 0)
- TO_DATE(문자, 포맷) : 주어진 문자를 포맷 형식에 맞게 읽어 날짜로 리턴
- FORMAT(날짜, 포맷) : 날짜의 포맷 변경
- CAST(대상 AS 데이터타입) : 대상을 주어진 데이터타입으로 변환
*SQL Server : TO_NUMBER, TO_DATE, TO_CHAR → CONVERT(포맷 전달 시), 단순 변환일 경우 주로 CAST 사용
5. 그룹 함수
- 다중행 함수
- 여러 값이 input값으로 들어가서 하나의 요약된 값으로 리턴
- GROUP BY와 함꼐 자주 사용됨
- ORACLE과 SQL Server 거의 동일
종류(모두 NULL을 제외하고 연산)
- COUNT(대상) : 행의 수, NULL만 있는 경우 0
- SUM(대상) : 총 합
- AVG(대상) : 평균
- MIN(대상) : 최솟값
- MAX(대상) : 최댓값
- VARIANCE(대상) : 분산
- STDDEV(대상) : 표준편차
6. 일반 함수
- 기타 함수(NULL 치환 함수 등)
종류
- DECODE(대상, 값1, 리턴1, ..., 그 외 리턴) : 대상이 값1이면 리턴1, ..., 그 외에는 그 외 리턴값 리턴, 생략시 NULL 리턴
- NVL(대상, 치환값) : 대상이 NULL이면 치환값으로 치환하여 리턴
- NVL2(대상, 치환값1, 치환값2) : 대상이 NULL이면 치환값2, NULL이 아니면 치환값1로 치환
- COALESCE(대상1, ..., 그 외 리턴) : 대상들 중 NULL이 아닌 값 출력(왼쪽부터), 모두 NULL이면 그 외 리턴값 리턴
- ISNULL(대상, 치환값) : 대상이 NULL이면 치환값이 리턴
- NULLIF(대상1, 대상2) : 두 값이 같으면 NULL, 다르면 대상1 리턴
- CASE문 : 조건별 치환 및 연산 수행
SELECT DEPTNO,
CASE DEPTNO WHEN 5 THEN 'A'
CASE DEPTNO WHEN 10 THEN 'B'
CASE DEPTNO WHEN 15 THEN 'C'
ELSE 'ERR'
END AS DNAME1
FROM EMP;
SELECT DEPTNO,
CASE WHEN DEPTNO = 5 THEN 'A'
CASE WHEN DEPTNO = 10 THEN 'B'
CASE WHEN DEPTNO = 15 THEN 'C'
ELSE 'ERR'
END AS DNAME1
FROM EMP;
둘 다 가능
2-4. WHERE 절
SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회할 데이터 조건;
- 테이블의 데이터 중 원하는 조건에 맞는 데이터만 조회하고 싶은 경우(행에 대한 선택)
- AND, OR 사용해 여러 조건 동시 전달 가능
- NULL 조회 시 IS NULL/IS NOT NULL 연산자 사용('=' 연산자로 조회 불가)
특징 및 주의사항
- 문자나 날짜 상수 표현 시 반드시 홑따옴표(' ') 사용
- ORACLE은 문자 상수의 경우 대소문자를 구분
- MSSQL은 기본적으로 문자상수의 대소문자를 구분하지 않음
종류
- = : 같은 조건
- !=, <> : 같지 않는 조건
- > : 큰 조건
- >= : 크거나 같은 조건
- < : 작은 조건
- <= : 작거나 같은 조건
- BETWEEN A AND B : A와 B 사이에 있는 범위 값을 모두 검색(A, B 포함, 문자나 날짜도 가능)
ex) WHERE SCORE >= 50 AND SCORE <= 80 → WHERE SCORE BETWEEN 50 AND 80
- IN(A, B, C) : A이거나 B이거나 C인 조건을 검색
- LIKE : 특정 패턴을 가지고 있는 조건, %와 _와 함께 사용, _는 한 자리를 의미
ex) ENAME LIKE 'S%' : 이름이 S로 시작
ENAME LIKE '%S%' : 이름이 S를 포함
ENAME LIKE '%S' : 이름이 S로 끝나는
ENAME LIKE '_S%' : 이름의 두 번째 글자가 S인
ENAME LIKE '__S__' : 이름의 가운데 글자가 S이며 길이가 5글자
- Is Null/ Is Not Null : NULL/NULL이 아닌 값을 검색
- A AND B : A 조건과 B 조건을 모두 만족하는 값 검색
- A OR B : A 조건이나 B 조건 중 한가지라도 만족하는 값을 검색
*IN : WHERE ENAME = 'A' OR ENAME = 'B' → WHERE ENAME IN ('A', 'B')
- NOT A : A가 아닌 모드 조건을 검색
2-5 1. GROUP BY 절
SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회할 데이터 조건
GROUP BY 그룹핑컬럼명
HAVING 그룹핑 대상 필터링 조건;
- 각 행을 특정 조건에 따라 그룹으로 분리하여 계산하도록 하는 구문식
- GROUP BY 절에 그룹을 지정할 컬럼을 전달(여러 개 가능)
- 그룹 연산에서 제외할 대상이 있다면 미리 WHERE 절에서 해당 행을 제외
- 그룹에 대한 조건은 WHERE 절에서 사용할 수 없음(SUM, COUNT, MIN 등)
- GROUP BY 절을 사용하면 데이터가 요약되므로 요약되기 전 데이터와 함께 출력할 수 없음
2-5 2. HAVING 절
- 그룹 함수 결과를 조건으로 사용할 때 사용하는 절
- WHERE 절을 사용하여 그룹을 제한할 수 없으므로 HAVING 절에 전달
- HAVING 절이 GROUP BY 절 앞에 올 수는 있지만 뒤에 쓰는 것을 권장
- 내부적 연산 순서가 SELECT 절보다 먼저이므로 SELECT 절에서 선언된 Alias 사용 불가
2-6. ORDER BY 절
SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회할 데이터 조건
GROUP BY 그룹핑컬럼명
HAVING 그룹핑 대상 필터링 조건
ORDER BY 정렬컬럼명 [ASC|DESC];
- 출력하는 행의 순서를 사용자가 변경하고자 할 때 사용
- ASC, DESC(생략 시 ASC)
- 유일하게 SELECT 절에 정의한 컬럼 별칭 사용 가능
- SELECT 절에 선언된 순서대로의 숫자 전달 가능
- 숫자 1, 2, 3 등을 사용한 경우 SELECT의 컬럼 순서를 의미
정렬 순서(ASC)
- 한글 : 가, 나, 다, ...
- 영어 : A, B, C,...
- 숫자 : 1, 2, 3,...
- 날짜 : 과거 날짜부터 시작해서 최근 날짜로 정렬
NULL의 정렬
- NULL을 포함한 값의 정렬 시 ORACLE은 기본적으로 NULL을 마지막, SQL Server는 처음에 배치
- ORACLE은 ORDER BY 절에 NULLS LASS|NULLS FIRST를 명시하여 NULL 정렬 순서 변경 가능
2-7. JOIN
- 여러 테이블의 데이터를 사용하여 동시 출력하거나 참조 할 경우 사용
- FROM 절에 조인할 테이블 나열
- ORACLE 표준은 테이블 나열 순서 상관 없지만 ANSI 표준은 OUTER JOIN 시 순서 중요
- WHERE 절에서 조인 조건을 작성(ORACLE 표준)
- 동일한 열 이름이 여러 테이블에 존재할 경우 열 이름 앞에 테이블 이름이나 테이블 Alias 붙임
- N개의 테이블을 조인하려면 최소 N-1개의 조인 조건이 필요
- ORACLE 표준과 ANSI 표준이 서로 다름
조인 종류
- 조건의 형태에 따라
- EQUI JOIN(등가) : JOIN 조건이 동등 조건인 경우
- NON-EQUI JOIN : JOIN 조건이 동등 조건이 아닌 경우
조건 결과에 따라
- INNER JOIN : JOIN 조건에 성립하는 데이터만 출력하는 경우
- OUTER JOIN : JOIN 조건이 성립하지 않는 데이터도 출력하는 경우(LEFT/RIGHT/FULL OUTER JOIN)
- NATURAL JOIN : 조인 조건 생략 시 두 테이블에 같은 이름으로 자연 연결되는 조인
- CROSS JOIN : 조인 조건 생략 시 두 테이블의 발생 가능한 모든 행을 출력하는 조인
- SELF JOIN : 하나의 테이블을 두 번 이상 참조하여 연결하는 조인
1. EQUI JOIN
SELECT * | 테이블명1.컬럼명, 테이블명2.컬럼명
FROM 테이블명1, 테이블명2
WHERE 테이블명1.컬럼명 = 테이블명2.컬럼명;
- 조인 조이 '=' 비교를 통해 같은 값을 가지는 행을 연결하여 결과를 얻는 조인 방법(NULL은 제외)
- SQL 명령문에서 가장 많이 사용하는 조인 방법
- FROM 절에 조인하고자 하는 테이블을 모두 명시
- FROM 절에 명시하는 테이블은 테이블 별칭(Alias) 사용 가능
2. NON-EQUI JOIN
SELECT * | 테이블명1.컬럼명, 테이블명2.컬럼명
FROM 테이블명1, 테이블명2
WHERE 테이블명1.컬럼명 비교조건 테이블명2.컬럼명;
- 테이블을 연결짓는 조인 컬럼에 대한 비교조건이 '<', BETWEEN A AND B 와 같이 '=' 조건이 아닌 연산자를 사용
세 테이블 이상의 JOIN
- 관계를 잘 파악하여 모든 테이블이 연결되도록 조인 조건 명시
- N개의 테이블의 경우 최소 N-1개의 조인 조건 필요
3. SELF JOIN
- 한 테이블 내 각 행끼리 관계를 갖는 경우
- 한 테이블을 참조할 때마다 명시해야 함
- 테이블명이 중복되므로 반드시 테이블 별칭 사용
2-8 표준 JOIN
표준 JOIN
- ANSI 표준으로 작성되는 INNER JOIN, CROSS JOIN, NATURAL JOIN, OUTER JOIN
1. INNER JOIN
- 내부 조인이라고 하며 조인 조건이 일치하는 행만 추출
- ANSI 표준의 경우 FROM 절에 INNER JOIN 혹은 줄여서 JOIN을 명시
- ANSI 표준의 경우 USING 이나 ON 조건절을 필수적으로 사용
ON 절
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.조인컬럼 = 테이블2.조인컬럼;
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 JOIN 테이블2
ON 테이블1.조인컬럼 = 테이블2.조인컬럼;
둘 다 가능
- 조인할 양 컬럼의 컬럼명이 서로 다르더라도 사용 가능
- ON 조건의 괄호는 생략 가능
- 컬럼명이 같을 경우 테이블 이름이나 별칭을 사용하여 명확하게 지정(테이블 출처)
- ON 조건절에서 조인조건 명시, WHERE 절에서는 일반조건 명시
USING 절
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 INNER JOIN 테이블2
USING (동일컬럼명);
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 JOIN 테이블2
USING (동일컬럼명);
둘 다 가능
- 조인할 컬럼명이 같을 경우 사용
- Alias나 테이블 이름 같은 접두사 붙이기 불가
- 괄호 필수
2. NATURAL JOIN
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 NATURAL JOIN 테이블2;
- 두 테이블 간의 동일한 이름을 가지는 모든 컬럼들에 대해 EQUI JOIN을 수행(NULL 불가)
- USING, ON, WHERE 절에서 조건 정의 불가
- JOIN에 사용된 컬럼들은 데이터 유형이 동일해야 하며 접두사 사용 불가
3. CROSS JOIN
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1 CROSS JOIN 테이블2;
- 테이블 간 JOIN 조건이 없는 경우 생성 가능한 모든 데이터들의 조합(카타시안 곱, NULL 포함)
- 양쪽 테이블 행의 수 끼리 곱한 수 만큼 데이터 조합 발생(m*n)
4. OUTER JOIN
- INNER JOIN과 대비되는 조인 방식
- JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용
- 두 테이블 중 한쪽에 NULL을 가지면 EQUI JOIN이 작동하지 않음 → 이를 출력 시 OUTER JOIN 사용
- 테이블 기준 방향에 따라 LEFT, RIGTH, FULL로 구분
- OUTER 생략 가능, ex) LEFT OUTER JOIN → LEFT JOIN
종류
LEFT OUTER JOIN
/* ORACLE 표준 */
SELECT *
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO = P.PROFNO(+)
AND S GRADE IN (1, 4);
/* ANSI 표준 */
SELECT S.STUDNO, S.NAME AS 학생명, S.GRADDE, S.PROFNO,
P.PROFNO, P.NAME AS 교수명
FROM STUDENT S LEFT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO
WHERE S.GRADE IN (1, 4);
- FROM 절에 나열된 왼쪽 테이블에 해당하는 데이터를 읽은 후, 우측 테이블에서 JOIN 대상을 읽어옴
- 즉, 왼쪽 테이블이 기준이 되어 오른쪽 테이블 데이터를 채우는 방식
- 우측 값에서 같은 값이 없는 경우 NULL 값으로 출력
RIGHT OUTER JOIN
- LEFT OUTER JOIN의 반대
- 즉, 오른쪽 테이블이 기준이 되어 오른쪽 테이블 데이터를 채우는 방식
- FROM 절에 테이블 순서를 변경하면 LEFT OUTER JOIN으로 수행 가능
FULL OUTER JOIN
/* ANSI 표준 */
SELECT S.STUDNO, S.NAME AS 학생명, S.GRADDE, S.PROFNO,
P.PROFNO, P.NAME AS 교수명
FROM STUDENT S FULL OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
/* ORACLE 표준, LEFT OUTER JOIN UNION(+) RIGHT OUTER JOIN */
SELECT S.STUDNO, S.NAME AS 학생명, S.GRADDE, S.PROFNO,
P.PROFNO, P.NAME AS 교수명
FROM STUDENT S PROFESSOR P
WHERE S.PROFNO = P.PROFNO(+)
UNION
SELECT S.STUDNO, S.NAME AS 학생명, S.GRADDE, S.PROFNO,
P.PROFNO, P.NAME AS 교수명
FROM STUDENT S PROFESSOR P
WHERE S.PROFNO(+) = P.PROFNO;
- 두 테이블 전체 기준으로 결과를 생성하여 중복 데이터는 삭제 후 리턴
- ORACLE 표준에는 없음, LEFT의 결과와 RIGHT의 결과의 UNION 연산 리턴과 동일