슬라이드 1

Download Report

Transcript 슬라이드 1

ORACLE SQL BASIC
목차
1. 테이블
테이블 구성.
기본키, 외래키
데이터타입
2. SQL
DML, DDL, DCL
기본 SQL 문장
3. 함수
문자, 숫자, 날짜형함수, NULL함수, 변환함수
4. 조인
JOIN 이란.
ANSI 조인
5. 그룹쿼리
GROUP BY
HAVING절
6. 서브쿼리
WHERE 절
FROM 절
7. 계층형 쿼리
테이블

테이블 : database의 가장 기본이 되는 데이터의 집합체
로우(행,ROW,가로축)와 컬럼(열,COLUMN,세로축)으로 구성되어 있는 2차원적인 평면 구조

테이블 생성 구성 요소
- TABLEName
: 많은 테이블을 구분하기 위해서 지정
- Column Name
: 한 테이블 안에 구체적으로 존재하게 될 데이터를 구분 짓는 이름
- Type(데이터 타입) : 데이터가 존재하기 위해서는 문자인지, 숫자인지 또는 날짜인지 구분
- Size(데이터 크기) : 데이터 타입이 결정되면 타입의 크기를 정의
문자와 숫자인 경우에만 크기 지정
- Null : 데이터가 없는 상태, Not Null은 Null을 허용 안하겠다는 의미이고 항상 데이터를 입력

기본적인 테이블 생성 패턴
사원번
호
사원명
직급
부서번
호
나이
컬럼1데이터타입(size) not null,
1
김형섭
사원
10
30
컬럼2데이터타입(size)
2
윤여준
사원
20
26
CREATE TABLE 테이블명
( 컬럼1
컬럼2
);
EMPLOYEES
기본키, 외래키

Primary key (기본키) : 테이블의 데이터들을 유일하게 식별하기 위한 무결성 제약조건 (UNIQUE+NOT NULL)

Foreign key (외래키) : 다른 테이블의 Primary key를 참조하는 칼럼으로 지정한 제약조건

Foreign key 제약조건은 두 테이블 간의 관계를 선언함으로써 데이터 무결성을 보장해주는 역할

외래키 테이블이 참조하는 기준 테이블의 컬럼은 반드시 primary key 제약조건 설정

기준 테이블: departments
CREATE TABLE departments
(department_id
CONSTRAINT

number(20) not null,
pk명 PRIMARY KEY (department_id(컬럼명));
외래 키 테이블 : employees
CREATE TABLE employees
(employee_id
number(20) not null,
employee_name
varchar2(10) not null,
department_id
number(20) not null
CONSTRANIT
fk명 FOREIGN KEY (department_id(컬럼명))
REFERENCES departments(department_id(참조컬럼명));
참조무결성
DEP
부서번호
부서명
부서위치
지역코드
10
시스템기술지원
팀
3층
1
20
DB기술지원팀
3층
1
30
영업사업부
3층
2
40
경영지원본부
3층
2
Foreign
Key
Primary
Key
NULL
• 데이터 타입  데이터가 존재할 때 어떤 형태로 존재하는지 결정하는 테이블 구성요소
데이터 유형 (문
자형 )
설명
CHAR
고정길이의 문자 데이터를 2000 BYTE 까지 저장
VARCHAR2
가변길이의 문자 데이터를 4000 BYTE 까지 저장
NCHAR
고정길이의 유니코드 문자형 데이터를 2000 BYTE까지 저장
NVARCHAR2
가변길이의 유니코드 문자형 데이터를 4000 BYTE 까지 저장
CLOB
Character Large Object 타입으로 데이터베이스 단일 바이트 문자 셋으로 저장되며 크기
가 큰 문자열이나 문서의 저장이 가능 4G까지 저장
BLOB
Binary Large Object 타입으로 바이너리 형태로 저장 되며 사진,비디오, 오디오 데이터 저
장 시 사용 4G까지 저장
NCLOB
National Character Set Large Object 타입 CLOB와 같으나 National Character set 으로
저장
데이터 유형(숫자형) 설명
길이
NUMBER
[(prec | prec, scale)]
최대값은 21byte
가변 숫자 타입으로, prec로 설정한 값(1~38)은 전체 자릿수이며, scale로 설
정값(-84~127)은 소수점 이하 자릿수를 의미한다.
데이터 유형(날짜형) 설명
길이
DATE
7byte, 표현형태NLS_DATE_FORMAT
파라미터에 명시된 값 따른다.
(예, DD-MON-RR, 01-JAN-99)
고정길이의 날짜와 시간 데이터로서 BC 4712년 1월1
일부터 9999년 12월 31일까지 표현할 수 있다.
SQL
1. SQL( Structured Query Language)

데이터에 ACCESS 하기 위해 데이터베이스와 통신하는 언어

데이터베이스에서 데이터를 조회, 입력, 수정, 삭제, 저장하는데 사용되는 질의 언어

어느 일정한 틀이나 패턴이 있는 구조화된(structured) 언어

패턴에 맞게 조건들을 선언한다는 의미에서 선언적(declarative) 언어
2. SQL 역할 (DML, DDL, DCL)

DML(Data Manipulation Language)
- 데이터의 추출, 저장, 삭제 등 데이터를 조작하는 역할
- SELECT, INSERT, UPDATE, DELETE
- 데이터 조회 : SELECT
Select 컬럼1, 컬럼2 ..
From 테이블1,테이블2..
Where 조건들;
SELECT last_name, first_name
From employees
Where hire_date >= ‘2008-07-14’;
- 데이터 저장 : INSERT(신규 데이터 입력)
Insert into 테이블명1 [컬럼1, 컬럼2…]
values (값1, 값2…);
* 입력 시 테이블의 컬럼 타입과 입력시킬 데이터 값의 타입이 일치

데이터 저장 : UPDATE(기존 데이터 수정)
Update 테이블명
set 변경컬럼1 = 변경하고자 하는 값,
변경컬럼2 = 변경하고자 하는 값
Where 조건절;

데이터 삭제 : DELETE
Delete [from] 테이블
Where 조건;

COMMIT : 데이터 변경작업(INSERT, UPDATE, DELETE)을 한뒤 COMMIT을 실행하면 변경된
데이터들이 데이터 파일에 반영

ROLLBACK : COMMIT과 반대의 개념으로 변경된 데이터들을 변경 전 상태로 되돌리는 역할
단, COMMIT 후에는 ROLLBACK이 되지 않음

DDL (Data Definition Language)
- 데이터가 저장되는 테이블이나 각종 객체들을 생성하는 역할
객체 생성 : CREATE
Create table UNION (
Employee_id
NUMBER(10) NOT NULL,
Name
VARCHAR2(10) NOT NULL,
Email
VARCHAR2(20) NOT NULL,
Phone_number
VARCHAR2(20),
Hire_date
DATE NOT NULL);
객체 삭제 : DROP
Drop table 테이블명
Drop index 인덱스명
객체 변경 : ALTER
컬럼 추가, 컬럼명 변경, 컬럼 default 값 변경

데이터 삭제 : TRUNCATE
Truncate table 테이블명

TRUNCATE 과 DELETE, DROP 의 차이점

TRUNCATE  데이터를 삭제했을 경우 ROLLBACK을 사용하여 데이터를 복구할 수 없음
TRUNCATE가 실행되면서 자동 COMMIT, 테이블에 있는 인덱스나 트리거에
영향을 주지 않고 데이터만 삭제, 테이블의 구조 보존

DROP
 데이터를 삭제함은 물론 테이블 구조까지 소멸

DELETE
 테이블의 데이터를 삭제(rollback 가능(undo를 남김) )
.

DCL (Data Control Language)
- 데이터베이스에 있는 데이터의 접근을 제어하는 언어
권한 허용 : GRANT
권한 제거 : REVOKE
SQL 문장의 구성요소들

예약어 : SELECT, FROM ,WHERE 등 오라클 DBMS에서 특정 용도로 사용되는 단어들

연산자 : 데이터 항목들을 조작해서 결과를 산출해내는 역할을 수행하는 것 (+,-,*,/,>,<,>=,<=등)

의사컬럼 : 테이블에 있는 일반적인 컬럼처럼 행동하기는 하지만 실제로 테이블에 저장되어 있지
않은 컬럼
ROWNUM – 각각의 로우들에 대한 순서값을 가리키는 의사컬럼
(employees 테이블에서 10건의 정보만 조회하고 싶을때)
SELECT employee_id, last_name, rownum
FROM employees
WHERE ROWNUM <= 10
ROWID – 테이블에 저장된 각 로우들의 주소값을 가진 의사컬럼
<ROWNUM이나 ROWID와 같은 의사컬럼들은 SELECT나 WHERE 절에서는 사용가능
하지만 INSERT, UPDATE 문장에서 값으로는 사용될 수 없습니다.>

함수 : 특정 연산을 수행하고 그 결과를 돌려주는 기능을 하는 객체
기본 SELECT 문
SELECT [distinct] { * , column alias }
from 테이블 명
Where [컬럼명1] [연산자] [값1]
[and | or]
[컬럼명2] [연산자] [값2]
…
SELECT : 조회해라
distinct : 중복되는 컬럼 값 중 하나씩만 추출해라.
[
] : 생략 가능하다는 의미.
{
} : * (모든 컬럼) , COLUMN 중 하나를 보여줘라.
Alias : 선택한 * 나 column 에 별칭을 줄 수 있다.
FROM : 데이터가 저장된 테이블로부터 가져와라.
테이블명 : 내가 원하는 데이터가 있는 테이블의 이름.
Where : 테이블에 있는 데이터들을 걸러내는 필터역할 (조회되는 행을 제한)
Distinct

중복되는 컬럼 값 중에서 하나씩만 추출
SELECT [distinct] { * , column alias }
from 테이블 명
Order by
SELECT [distinct] { * , column alias }
from 테이블 명
order by [컬럼명1], [컬럼명2] [asc/desc]
Alias
SELECT employee_id
사원번호,
first_name
as 이름,
salary
“월급”,
from employees;
Where절

WHERE 컬럼 = 값, 내용
- 컬럼의 실 데이터와 조건에 주는 값이나 내용이 연산자(=,>,<,>=,<=)와 일치하는 것만 조회
SELECT employee_id 사원번호, first_name ||’ ‘|| last_name 이름
From employees
Where [컬럼명1] [연산자] [값1] SELECT *
FROM employees
[and | or]
WHERE employee_id = 101
[컬럼명2] [연산자] [값2]
and
salary < 10000;

조건절을 구성하는 데이터 조건 범위 항목들
- 연산자, AND, OR, 범위조건, IN, EXIST, NOT, NULL
연산자
종류
연산자
예
문자 연산자
||
Select * from employees
Where first_name || last_name = ‘스티븐킹’;
수식 연산자
+, -, *, /
Select * from employees
Where salary * 12 = 4500;
비교 연산자
>, <, =, >=, <=
Select * from employees
Where salary >=3000;

우선순위
( ), *, /, +, - 순으로 우선순위가 결정

곱하기, 나누기는 더하기, 빼기 보다 우선순위가 빠름

괄호를 사용하면 우선순위가 임의로 바뀜

같은 우선 순위일 경우 좌측에서 우측 순으로 빠름
AND와 OR
종류
AND
예
Select * from employees where department_id = 30 and salary < 10000;
두 개의 조건 모두를 만족해야 참인 경우
OR
Select * from employees where department_id = 30 or department_id = 60;
두 개의 조건 중 하나만 만족해도 참인 경우
범위 조건
종류
예
between A and B
Select * from employees where employee_id between 110 and 120;
(=Select * from employees
where employee_id >= 110 and employee_id <= 120;)
범위를 가진 조건 값을 검색해야 하는 경우
LIKE
Select * from employees where full_name
like ‘나%’ ;
조건 값을 명확히 알지 못했을 경우
ex) select * from dict where table_name like '%DIC%';
(or
‘%근영’ )
IN

한 컬럼에 여러 개의 데이터를 동시에 비교해야 할 경우

IN을 사용하지 않으면 OR을 사용

반드시 괄호와 함께 쓰이며, 괄호 안에는 비교할 값의 리스트나 서브쿼리가 올 수 있음

IN을 사용하려는 컬럼만 SELECT문에서 사용
Select * from employees
Where department_id = 30 or department_id = 60 or deparment_id = 90;
Select * from employees
Where department_id in ( 30, 60, 90 );
여러 개의 조건 값을 동시에 비교, 하나만 만족해도 값을 가져온다.
Select * from employees
Where department_id IN
( select department_id
from departments
where department_id
IN (30, 60, 90));
EXIST

IN 과 비슷한 용도로 사용되지만, SELECT절에 컬럼 내용은 아무 의미없고 조인내용이 중요

EXIST는 특정 컬럼값이 존재하는지 여부 체크

괄호 안에는 오직 서브쿼리만 올 수 있음

서브쿼리의 WHERE절에서 비교할 기준테이블의 컬럼과 조인을 맺어야 하며, 서브쿼리의 결과로
반환되는 로우가 1개라도 있을 경우 EXIST 조건을 만족
Select emp.employee_id, emp.salary, emp.department_id
From employees emp
Where EXISTS
( select 1
from departments dep
where emp.department_id = dep.department_id
and dep.department_id IN (30 ,60, 90));
NULL, NOT
종류
예
NULL
NULL 과 관련된 조건에서는 항상 IS [ NOT ] NULL 구문을 사용한다.
• where location is null
NOT
해당 조건 앞에 붙어서 조건 값 결과가 TRUE 면 FALSE를 , FALSE면 TRUE 를
반환, NOT은 보통 IN, EXIST, IS NULL 등의 조건들과 같이 사용
•
•
•
•
•
where
where
where
where
where
not employee_id between 110 and 120
department_id not in (30, 60, 90)
not exist ( 서브쿼리)
phone_number not like ‘515%’
state_province is not null
SQL 함수

함수 : 조회/수정/삭제/입력시 자주 사용되고 데이터 값을 다양하게 변환하는데 사용
단일행 함수
복수행(그룹)함수
행별로 하나의 결과값을 반환하는 함수
(SELECT절, WHERE절, ORDER BY절에 주로 쓰임)
여러 행 또는 테이블 전체에 대해 함수가
적용되어 하나의 결과값을 반환하는 함수
문자 함수
COUNT
숫자 함수
SUM
날짜 함수
MIN / MAX
변환 함수
AVG
단일행 함수
구분
함수
내용
문자
함수
CONCAT
첫 번째 문자와 두 번째 문자를 연결, 문자열 연결 연산자
INITCAP
첫 문자를 대문자로 나머지는 소문자로
LOWER, UPPER
모든 문자를 소문자로, 모든 문자를 대문자로
LPAD(char1,n,char2)
RPAD(char1,n,char2)
n자리만큼의 공간에서 Char1에 해당하는 문자열을 제외한 왼쪽공간을 char2로 대체
LTRIM(char)
RTRIM(char)
Char의 맨 왼쪽부분에 있는 space(공백) 이나 지정한 문자를 제거
Char의 맨 오른쪽부분에 있는 space(공백) 이나 지정한 문자를 제거
SUBSTR(char,n,m)
특정 문자 또는 문자열의 일부분을 선택 char의 n번째 자리부터 m번째에 해
당하는 문자열 돌려줌
SUBSTRB(char,n,m)
Byte단위로 char의 n번째 자리부터 m번째에 해당하는 문자열을 돌려줌
REPLACE
특정 문자열을 다른 특정 문자열로 변환
TRANSLATE
문자열에 있는 특정 문자 전체를 다른 문자로 변환
ASCII
특정문자의 ASCLL 코드값을 반환
INSTR
대상 문자열에서 특정 문자열을 찾아 그 시작위치를 반환
LENGTH(char)
문자의 실제 길이를 반환
LENGTHB(char)
문자의 BYTE 수를 반환 (영문 1byte, 한글 2byte)
n자리만큼의 공간에서 Char1에 해당하는 문자열을 제외한 오른쪽공간을 char2로 대체
구분
함수
내용
숫자
함수
ROUND(n,m)
반올림을 구하는 함수 (n은 계산할 숫자값, m값은 정수)
TRUNC(n,m)
지정한 소수점 자리수 밑으로 절삭
MOD(n/m)
n을 m 으로 나눈 나머지 값을 구함
23에서 5를 나누면 정수값은 4이고 나머지는 3  Mod의 결과값은 3
SIGN
양수인지 음수인지의 여부 반환, 양수면 1, 음수면 -1, 0이면 0반환
CEIL(n)
소수점 이후의 값이 존재하면 무조건 올림 하는 함수 n은 숫자값
POWER(n2,n1)
n2의 n1제곱값 구함
구분
함수
내용
날짜 함
수
SYSDATE
현재 시스템 날짜를 보여주는 함수
ADD_MONTH(date,n)
특정 날짜 형식에 개월수를 더하는 함수
LAST_DAY(date)
Date 일자의 해당 월의 마지막 일자를 반환하는 함수
MONTH_BETWEEN(date1,date2)
날짜와 날짜 사이의 월수를 계산하는 함수
NEXT_DAY
해당날짜의 다음 지정한 날짜로 변환할 때
구분
함수
내용
변환 함
수
TO_CHAR(char,fmt)
문자(nchar,nvarchar2,clob,nclob등), 날짜(date,timestamp,timestamp with
time zone등), 숫자(number)형식의 데이터 타입을 VARCHAR2 타입으로
변환하여 반환하는 함수
TO_NUMBER(char)
파라미터로 들어온 char, varchar2, nchar, nvarchar2, binary_float,
binary_double 타입의 데이터를 NUMBER타입으로 변환하여 반환하는 함
수
TO_DATE(char, fmt)
파라미터로 들어오는 char, varchar2, nchar, nvarchar2타입의 데이터를
DATE타입으로 변환하여 반환하는 함수
구분
함수
내용
Null
관련 함수
NVL(column명,대신할 data)
해당 컬럼이 null일 경우에 대신할 문자나 숫자 등을 대신 사용
아닌 경우에 원래 데이터 사용
기타함수
DECODE(a,b,c,d)
DECODE(a,b,c,d,e,f)
a 가 b면 c고, 아니면 d
a가 b면 c고, d면e고, 아니면 f
그룹 함수(집계함수)

여러 행 또는 테이블 전체에 대해 함수가 적용되어 하나의 결과값을 반환하는 함수
구분
함수
내용
집계
(그룹)
함수
COUNT(*)
Count(column)
테이블에 있는 전체 데이터(로우)가 몇 건이 존재하는지 반환
Select count(*) from employees;
Select count(*) from dba_data_files;
SUM(column)
Column에 해당하는 모든 행의 테이블의 합계를 반환
Select sum(salary) from employees;
Select sum(bytes) from dba_data_files;
MAX(column)
MIN (column)
조회 범위 내 해당 컬럼 들 중 최대값, 조회 범위 내 해당 컬럼 들 중
최소값
Select MAX(salary), MIN(salary) from employees;
AVG(column)
Column에 해당하는 모든 행의 평균값을 구해 반환
Select AVG(salary) from employees;
조인

각각의 테이블들을 연관 지어서 원하는 데이터만을 가져올 수 있게 하는 것이 JOIN

두 개 이상의 테이블을 사용할 경우 반드시 해주어야 하는 것이 JOIN


조인은 두 개 이상의 테이블을 FROM절에서 선언한 후에 WHERE 절에서 각 테이블의 연관되는
컬럼들끼리 EQUAL(=)로써 정의합니다.
OUTER JOIN  기본적인 JOIN은 양쪽테이블의 컬럼 내용이 같을 경우에 만족하는데 기준이 되
는 테이블을 중심으로 관계된 컬럼의 데이터가 없더라도 조회 (데이터 없는 쪽에(+))
Select
employees.first_name, employees.last_name,employees.email,
departments.department_name
From employees, departments
Where employees.department_id = departments.department_id
Select
emp.first_name, emp.last_name, emp.email,
dep.department_id, dep.department_name
From employees emp, department dep, jobs job, location loc
Where emp.department_id = dep.department_id
AND emp.job_id
= job.job_id
AND dep.location_id
= loc.location_id
AND loc.state_province = ‘캘리포니아’;
1.
locations 테이블에서 state_porvince 값이 캘리포니아 로우를 찾는다.
2.
찾은 location_id 값과 같은 값을 가진 데이터를 departments 테이블에서 찾아 조인을 한다.
3.
2의 결과와 employees 테이블을 비교하여 (department_id 값이 같은 것) 조인한다.
4.
3의 결과와 jobs 테이블을 비교하여 조인하여 최종 쿼리결과를 얻는다.
조인 종류
기존 조인
ANSI 조인 (국제적 표준)
내부조인
(inner join)
From employees emp,
Department dep
Where emp.department_id
= dep.department_id
From employees emp INNER JOIN departments dep
ON emp.department_id = dep.department_id
혹은
From employees emp INNER JOIN department dep
USING (department_id)
외부조인
(outer join)
From employees emp,
job_history j
where emp.employee_id =
j.employee_id(+)
From employees emp LEFT[RIGHT] OUTER JOIN
job_history j ON emp.employee_id = j.employee_id
혹은
From employees emp
LEFT[RIGHT] OUTER JOIN job_history j USING
(employee_id)
카타시안 프
로덕트
(cross join)
조인조건을 명시하지 않고
From절에 조인대상테이블만
나열 두 테이블의 모든 조합
결과 산출
From employees emp
CROSS JOIN
Departments dep ON emp.department_id =
dep.department_id
Full Outer 조
인
없음
From employees emp FULL OUTER JOIN departments
dep ON emp.employee_id = dep.manager_id
두 테이블 중 데
이터가 없는 테
이블 쪽에 (+)
Ansi는
데이터가 있는
테이블 편을
명시
left, right outer
join한 후 unione
한 효과
그룹함수(group by)

데이터를 그룹으로 묶어 합계, 평균, 최대값,
최소값 등의 집계성 데이터를 나타내는 기능
select department_id, count(*)
from employees
group by department_id;

부서명을 함께 조회
select a.department_id, b.department_name, count(*)
from employees a, departments b
where a.department_id=b.department_id
group by a.department_id, b.department_name
order by a.department_id;
Group by 절
1.
select department_id, sum(salary), count(salary), avg(salary)
from employees
group by department_id;
- select 절에서 컬럼 사용시 group by에 선언된 컬럼 외에는 모두 group 함수를 사용
2.
select department_id, job_id, sum(salary), avg(salary)
from employees
group by department_id;
- group by문은 group by 절에 선언되지 않은 컬럼을 사용했을 때 에러를 발생 (group by 절에 job_id 추가)
3. select job_id, to_char(sum(salary), ‘999,999’) total,
to_char(avg(salary), ‘999,999’) avg
from employees
where department_id = 80
group by job_id
order by job_id;
-employees 테이블에서 department_id가 80인 부서를 job_id별로 그룹화하여 부서별로 급여합계와 평균을
조회
그룹함수(having 절)

Having 절은 group by 절의 조건절

그룹함수를 where 절에 사용한 SQL 문장
select department_id, count(*)
from employees
where department_id is not null
and count(*) <= 5
group by department_id
order by department_id;
Error : 그룹함수는 허가되지 않습니다.
- 그룹함수는 where 절에 올 수 없음, 구하고자 하는 쿼리와 같이 조건에 그룹함수의 결과가 필요한
경우 HAVING 절에 명시
- SELECT문은 WHERE절을 통해 조회내용의 범위(조건)를 결정하고,
GROUP BY절은 HAVING절을 통해 조회내용의 범위(조건)를 제한
그룹함수(group by, having)
Select department_id, count(*) from employees
Where department_id IS NOT NULL
GROUP BY department_id
HAVING count(*) <= 5
ORDER BY department_id;
SQL 문장의 실행순서를 보면 WHERE 조건이 먼저 처리되고 이 조건으로 걸러진 데이터들을 대상으로
grouping이 수행되고 그 이후에 HAVING 조건을 처리하기 때문에 대부분의 일반조건은 WHERE 절에
명시하는 것이 성능적인 측면에서 바람직하다.
(NULL을 제외한 department_id 컬럼을 그룹화하여 5보다 작거나 같은 값을 count(*) 하여 오름차순으
로 정렬하여 보여주세요.)
서브쿼리
하나의 SQL 문장 내부에 존재하는 또 다른 SELECT 문장
서브쿼리는 왜 사용하나?
전체 사원들 중 평균 급여보다 낮은 급여를 받는 사원들의 명단을 추출해야 한다면 어떻게 작성 할
것인가?
먼저, 평균월급이 얼마인지 구한 뒤에 이 값보다 월급이 작은 사원들의 명단을 추출하면 된다.
SQL> select ROUND(AVG(salary)) from employees;
ROUND(AVG(SALARY))
------------------------6462
여기서 나온 결과값으로,
SQL> SELECT employee_id, first_name, last_name from employees
Where salary < 6462;
Where 절에 평균값을 넣으면 해결되지만 where절에서는 집계함수를 사용할 수 없다.
두 문장을 합치기 위해서 평균값을 구하는 select 문을 where 절에 넣는 서브쿼리
SQL> select employee_id, first_name, last_name from employees
Where salary < ( select ROUND(AVG(salary)) from employees);
인라인뷰(from절의 서브쿼리)

FROM 절에 테이블 대신 select문을 사용하는 것, select 문을 일종의 테이블처럼 인식하는 것

평균 급여보다 높고 최대 급여보다 낮은 월급을 받는 사원 리스트를 조회하는 쿼리

평균 및 최대 급여액을 구하는 서브쿼리를 인라인뷰로 만든 쿼리
SELECT a.employee_id, a.first_name || ‘ ‘ || a.last_name names, a.salary,
ROUND(b.avgs), b.maxs
FROM employees a,
( SELECT AVG(salary) avgs,
MAX(salary) maxs
FROM employees ) b
WHERE a.salary BETWEEN b.avgs AND b.maxs
ORDER BY a.salary DESC;
SELECT *
FROM (
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC )
WHERE ROWNUM < 11 ;
계층형 쿼리
SELECT LPAD( ‘ ‘, 2*(LEVEL-1)) || item_name item_names
FROM BOM
① START WITH parent_id IS NULL
② CONNECT BY PRIOR item_id = parent_id;
1. Start with 조건1 : 루트노드를 식별한다. 조건 1을 만족하는 모든 row들은 루트노드가 된다.
2. Connect by 조건2 : 부모와 자식노드들 간의 관계를 명시하는 부분 조건 2에는 반드시 prior 연산
자를 포함시켜야 한다.
3. Prior : connect by 절에서 해당 컬럼의 부모 로우를 식별하는데 사용
parent_id 에도 item_id 가 존재하기에 prior를 item_id 앞에 위치한다.
Select b.job_title “직위”,
LPAD( ‘ ‘, 4*(LEVEL -1) || a.first_name || ‘ ‘ || a.last_name “성명”,
c.department_name “부서”,
d.city || ‘, ‘ || d.state_province “부서위치”
From employees a,
jobs b,
departments c,
locations d
Where a.job_id = b.job_id
and a.department_id = c.department_id
and c.location_id = d.location_id
Start with a.manager_id IS NULL
Connect by a.manager_id = prior a.employee_id;

오라클이 계층형 쿼리를 처리하는 순서
1.
조인이 사용되었다면 가장 먼저 조인을 처리
2.
Connect by 조건 처리
3.
나머지 조건 (where절에서 조인 이외의 조건) 처리
감사합니다