관계형 데이터베이스, DDL, DML, TCL, WHERE 절, 함수, Group By, Having, Order By, Join에 대해 알아보자!
데이터베이스
: 데이터들을 저장하는 공간
용도와 목적에 맞는 데이터들끼리 모아서 저장
RDB(Relational Database)
: 관계형 데이터 모델에 기초를 둔 데이터베이스.
RDB에서 설계
는 모든 데이터를 2차원 테이블 형태
로 표현한 뒤, 각 테이블 간의 관계
를 정의하는 것으로 시작
RDBMS
: RDB 관리
, 감독
시스템
ex) Oracle, MS-SQL, MariaDB, MySQL, PostgreSQL
Entity->TABLE
RDB는 모든 데이터를 2차원의 테이블 형태
로 표현.
세로 열이 Column(속성)
, 가로 행이 Row(인스턴스)
테이블
은 RDB의 기본 단위이고, 일반적으로 DB는 여러 개의 테이블
로 구성.
테이블로 데이터를 저장하는 주된 목적은 데이터 활용
목적.
-> 테이블 형태로 조회하고 변경하고 삭제 가능
SQL
: 관계형 DB에서 데이터를 다루기 위해 사용
하는 언어
성능 차이
가 있으므로, SQL을 잘 작성
하고 튜닝
하는 것은 중요DDL(Data Definition Language)
: 데이터를 정의
하는 명령어
CREATE
, ALTER
, DROP
, RENAME
, TRUNCATE
한글
은 한 글자가 3byte
, 영어
는 1byte
char
: 고정 길이(나머지 칸은 공백)varchar
: 가변 길이유형 | 데이터 타입 |
---|---|
문자 | char |
varchar | |
clob | |
숫자 | number |
날짜 | date |
생성
명령어default
: 데이터 기본값create table 테이블명(
컬럼명 데이터 타입 [DEFAULT/NULL|NOT NULL]
...
);
--oracle
--테이블 복사
CREATE TABLE 테이블명 AS SELECT * FROM 복사할 테이블명;
--테이블 구조만 복사
CREATE TABLE 테이블명 AS SELECT * FROM 복사할 테이블명 where 1=2;
--데이터만 복사
INSERT INTO 복사할 테이블명 SELECT * FROM 복사할 테이블명;
--ms-sql
--테이블 복사
SELECT * INTO 테이블명 FROM 복사할 테이블명;
제약조건
완전히 복사X, NOT NULL
조건만 복사1.테이블 생성 시 규칙
테이블명
은 고유컬럼명
은 고유컬럼명
뒤에 데이터 유형
과 데이터 크기
명시()
안에 기술,
로 구분테이블명
과 컬럼명
은 숫자로 시작X
, 벤더별로 길이 한계 있음예약어 사용 불가
마지막
은 ;
로 끝남객체를 의미
할 수 있는 적절한 이름 사용단수형
A-Z, a-z, 0-9, _, $, #
문자만 허용2.테이블 생성 팁
테이블
은 각각의 정체성
을 나타내는 이름
컬럼명
정의 시, 다른 테이블과 통일성
이 있어야 한다. (데이터 표준화 관점
)3.제약 조건(CONSTRAINT)
: 데이터의 무결성
(데이터의 정확성
과 일관성
유지), 데이터에 결손
과 부정합이 없음
을 보증
PRIMARY KEY(기본키)
: 테이블에 저장된 각 행에 대한 고유성
보장.하나씩만 정의
, NULL 불가
, UNIQUE 인덱스 생성
, 테이블당 1개씩만 생성 가능하며 생성하지 않을 수도 있다.UNIQUE KEY(고유키)
: 각 행에 대한 고유성
보장.NULL 허용
NOT NULL
: NULL 값 허용X
CHECK
: 컬럼에 저장될 수 있는 값
의 범위 제한
FOREIGN KEY(외래키)
: 하나의 테이블이 다른 테이블
을 참조
시 FK 정의참조 무결성 옵션
Delete Action
( 부서 - 사원 )CASCADE
: Parent 삭제 시 Child 값 같이 삭제
SET NULL
: Parent 삭제 시 해당 Child 컬럼 NULL
처리SET DEFAULT
: Parent 삭제 시 해당 Child 컬럼 DEFAULT 값
변경RESTRICT
: Child 테이블에 해당 데이터가 PK로 존재하지 않는 경우
에만 Parent값 수정 및 삭제 가능
NO ACTION
: 참조 무결성 제약
이 걸려있는 경우 삭제 및 수정 불가
Insert Action
( 부서 - 사원 )Automatic
: Master 테이블에 PK가 없는 경우 Master PK 생성 후
Child 입력
Set Null
: Master 테이블에 PK X시 Child 외부키
를 Null
값으로 처리Set Default
: Master 테이블에 PK X시 Child 외부키
를 지정된 기본값
으로 입력Dependent
: Master 테이블에 PK가 존재할 때만
Child 입력 허용
No Action
: 참조 무결성 위반
하는 입력 액션을 취하지 않음
변경
컬럼 추가
,컬럼 변경
,컬럼 삭제
, 제약조건 추가
,제약 조건 삭제
1.ADD COLUMN
컬럼 추가
맨 끝
(별도 위치 지정 불가)alter table 테이블명 add 컬럼명 데이터 유형;
2.DROP COLUMN
컬럼 삭제
alter table 테이블명 drop column 컬럼명;
3.MODIFY COLUMN
컬럼 변경
데이터 유형, DEFAULT값, NOT NULL
제약 조건 변경 가능모든 데이터의 크기
가 줄이고자 하는 컬럼의 크기보다 작을 경우 가능데이터가 없는 경우
에만 데이터 유형 변경
가능DEFAULT 값 변경
시에는 변경 이후 저장되는 데이터에만 적용
NULL값이 저장되어있지 않은 컬럼
에만 NOT NULL
제약 조건 추가 가능--oracle
alter table 테이블명 modify (컬럼명1 데이터 유형 [DEFAULT 값] [NOT NULL], 컬럼명2 데이터 유형...);
--ms-sql
alter table 테이블명 alter column 컬럼명 데이터유형 [DEFAULT 값] [NOT NULL], ...;
NOT NULL
지정 X 시 이전 NOT NULL이 NULL 로 될 수 있음()
안함4.RENAME COLUMN
컬럼의 이름을 변경
alter table 테이블명 rename column 변경할 컬럼명 to 변경할 이름;
5.RENAME TABLE
테이블 이름 변경
alter table 테이블명 rename to 변경된 테이블명;
--ansi 표준
rename 테이블명 to 변경된 테이블명;
6.ADD CONSTRAINT
제약조건 추가
alter table 테이블명 add constraint 제약조건명 제약조건(컬럼명);
alter table teacher
add constraint teacher_fk foreign key(subject_id) references subject(subject_id);
1.DROP TABLE
테이블 삭제
CASCADE 옵션
명시하지 않으면 삭제 안됨
drop table 테이블명 [CASCADE CONSTRAINT]; --외래키 존재시
1.TRUNCATE TABLE
테이블에 저장
되어 있는 데이터 모두 제거
저장 공간
재사용 되도록 초기화
ROLLBACK 불가
truncate table 테이블명;
DML(Data Manipulation Language)
: DDL에서 정의한 대로 데이터 입력
, 입력한 데이터를 수정,삭제,조회
하는 명령어
dml
별도의 commit
필요dml
도 auto commit
비절차적 데이터 조작어
: 사용자가 무슨 데이터
를 원하는지만 명세호스트 프로그램
속에 삽입되어 사용되는 DML 명령어들을 데이터 부속어(Data Sub Language)
라고 한다INSERT
: 테이블에 데이터를 입력
하는 명령어
insert into 테이블명(컬럼명, 컬럼명...) values(값1, 값2...);
--전체 값
insert into 테이블명 values (전체 컬럼에 입력될 데이터 들);
컬럼 순서대로 빠짐없이 나열
되어야 하며,순서가 뒤바뀌어 데이터 유형 맞지 않거나
, 누락된 데이터가 있어 전체 컬럼 갯수와 맞지 않을 경우
데이터베이스는 에러
발생UPDATE
: 이미 저장된 데이터를 수정
시 사용하는 명령어
update 테이블명 set 컬럼명=새로운 값, 컬럼명=새로운 값2... where 조건;
DELETE
: 이미 저장된 데이터 삭제
시 사용
테이블 전체 삭제
시 truncate
사용이 시스템 부하 측면 유리
truncate
는 별도의 로그 쌓지 않아 rollback 불가
delete from 테이블명 where 조건;
SELECT
: 저장되어 있는 데이터를 조회
하고자 할 때 사용하는 명령어.
RETRIEVE
라고도 함SELECT [ALL/DISTINCT] 컬럼, 컬럼,...
FROM 테이블
WHERE 조건;
ALL
: Default 옵션. 중복된 데이터도 모두 출력Distinct
: 중복된 데이터 존재
시 1건
으로 처리*
: 전체 컬럼 조회
SELECT * FROM 테이블;
테이블의 컬럼 순서
테이블명이나 컬럼명에 별칭(Alias)
붙이기 가능
테이블 명 대신 무조건 Alias
사용해야함SELECT topic.name, topic.id
FROM topic
WHERE topic.id=1;
--Alias 사용
SELECT t.name, t.id
FROM topic t
WHERE t.id=1;
사칙연산
기능을 가진 연산자NUMBER
, DATE
데이터 타입과 함께 사용 가능연산자 | 의미 | 우선순위 |
---|---|---|
() | 괄호로 우선순위 조정 | 1 |
* | 곱하기 | 2 |
/ | 나누기 | 2 |
+ | 더하기 | 3 |
- | 빼기 | 3 |
SELECT a+b*a as mul,
(a+b)*a as mul2
FROM number;
=> 속성 이름이 mul
, mul2
로 나온다!
=> as
명령어를 통해 별칭 지정 (생략 가능
)
연결
시 사용||
으로 연결SELECT '재밌다'||' '||'SQLD'||'!' as fun
FROM DUAL;
-MERGE
: 테이블에 새로운 데이터 입력
하거나 이미 저장
되어있는 데이터에 대한 변경 작업
을 한 번에
할 수 있는 명령어
merge
into 변경할 테이블명
using 비교 테이블명
on 조건
when matched then
update
set 컬럼명=새로운 값
when not matched then
insert [(컬럼명, 컬럼명..)]
values 값1, 값2;
--ex
merge
into depart_bk db --db 테이블의 데이터 변경
using depart d --d 테이블을 이용
on (db.depart_id=d.depart_id) --동일한 값이 있는지가 조건
when matched then --동일한 값이 있으면, 그 값 변경
update
set db.depart_name=d.depart_name,
db.manger_id=d.manager_id,
db.location_id=d.location_id
when not matched then --동일한 값 없으면 데이터 생성
insert values (d.de part_id, d.depart_name, d.manager_id, d.location_id);
TCL(Transaction Control Language)
: 트랜잭션 제어
명령어
트랜잭션
: 쪼개질 수 없는 업무처리의 단위, 논리적인 업무 단위
false
시 DDL 종료 후 Auto Commit 안됨BEGIN TRANSACTION
...
COMMIT
BEGIN TRANSACTION
...
ROLLBACK
-BEGIN TRANSACTION(BEGIN TRAN)
으로 트랜잭션 시작, COMMIT TRANSACTION(COMMIT)
또는 ROLLBACK TRANSACTION(ROLLBACK)
으로 트랜잭션 종료
원자성(Atomicity)
: 트랜잭션이 묶인 일련의 동작들은 모두 성공
하거나 모두 실패
해야 함.All or Nothing
일관성(Consistency)
: 트랜잭션이 완료된 후
에도 데이터베이스가 가진 데이터에 일관성
이 있어야 함.고립성(Isolation)
: 하나의 트랜잭션은 고립되어 수행
되어야 함.지속성(Durablity)
: 트랜잭션이 성공적으로 수행
되었을 경우 트랜잭션이 변경한 데이터
가 영구적으로 저장
되어야 함. 모든 트랜잭션은 로그에 남겨진 뒤 commit
되어야 하고, 시스템 장애 발생 시 복구 가능해야 함.Dirty Read
: 다른
트랜잭션에 의해 수정
되었고 커밋되지 않은
데이터를 읽는 것Non-Repeatable Read
: 한 트랜잭션 내
에서 같은 쿼리
를 두 번 수행
했는데, 그 사이에 다른 트랜잭션
이 값
을 수정
또는 삭제
하는 바람에 두 쿼리 결과가 다르게
나타나는 현상Phantom Read
: 한 트랜잭션 내
에서 같은 쿼리
를 두 번
수행했는데, 첫번째 쿼리에서 없던 유령 레코드
가 두번째 쿼리에서 나타나는 현상
COMMIT
: DML
후 변경된
내용을 확정, 반영
하는 명령어
commit 실행 X
시, 메모리
까지만 반영되는데 메모리는 휘발성
이며 다른 사용자
는 변경된 값 조회 불가
update
한 뒤, 오랫동안
commit
또는 rollback
하지 않으면 lock
에 걸려 다른 사용자가 변경할 수 없는 상황 발생
ROLLBACK
: DML
후 변경된
내용을 취소
하는 명령어
rollback
시 변경 이전 값
으로 복구update
한 뒤, 오랫동안
commit
또는 rollback
하지 않으면 lock
에 걸려 다른 사용자가 변경할 수 없는 상황 발생
SAVEPOINT
: rollback 수행 시, 전체 작업을 되돌리지 않고
, 일부
만 되돌릴 수 있게 하는 기능을 가진 명령어.
--oracle
savepoint sv1;
...
rollback to sv1;
--mssql
save transaction sp1;
...
rollback transaction sp1;
where
: INSERT
를 제외한 DML
문을 수행할 때, 원하는 데이터만 골라
수행할 수 있도록 해주는 구문
SELECT
select * from study where col1=1;
select * from study where col1<>1;
UPDATE
update study set col1=4 where col1=3;
select * from study;
DELETE
delete from study where col1=4;
select * from study;
연산자 | 뜻 |
---|---|
= | 같음 |
< | 작음 |
<= | 작거나 같음 |
> | 큼 |
>= | 크거나 같음 |
문자형 컬럼
을 비교 조건으로 사용 시, 우측 상수값
을 반드시 인용부호''
로 감싸야 함select * from study where col2='wow';
연산자 | 뜻 |
---|---|
!= | 같지 않음 |
^= | 같지 않음 |
<> | 같지 않음 |
not 컬럼명 = | 같지 않음 |
not 컬럼명 > | 크지 않음 |
select * from study where not col1>2;
연산자 | 뜻 |
---|---|
BETWEEN A AND B | A와 B 사이(A, B 포함) |
LIKE '비교 문자열' | 비교 문자열을 포함 |
IN(LIST) | LIST 중 하나와 일치 |
IS NULL | NULL값 |
select * from study where col1 between 2 and 3;
select * from study where col2 like '%o%';
select * from study where col2 like 'w%w';
w
로 시작하고, w
로 끝나는 행
select * from study where col2 in ('wow', 'hi');
ex) col2
의 값 중 '%A', 'C%'
와 같이 %
를 포함한 문자열 중,
_
혹은 %
가 포함된 문자 검색 시 ESCAPE
지정하여 쿼리 작성
SELECT * FROM test
where col2 like '%#%%' ESCAPE '#';
연산자 | 뜻 |
---|---|
NOT BETWEEN A AND B | A와 B 사이가 아님(A,B 미포함) |
NOT IN(LIST) | LIST 중 일치하는 것이 하나도 없음 |
IS NOT NULL | NULL이 아님 |
select * from study where col1 not between 2 and 3;
--아래와 같음
select * from study where NOT (col1 between 2 and 3);
select * from study where NOT (col1>=2 and col1<=3);
select * from study where col1<2 or col1>3;
select * from study where col2 not in ('wow', 'hi');
--아래와 같음
select * from study where not(col2 in ('wow', 'hi'));
select * from study where not(col2='wow' or col2='hi');
select * from study where (col2!='wow' and col2!='hi');
select * from study where col2 is not null;
연산자 | 뜻 |
---|---|
AND | 모든 조건이 true |
OR | 하나 이상 조건이 true |
NOT | true면 false, false면 true |
처리 순서
: ()
->NOT
->SQL연산자, 비교연산자
->AND
->OR
select * from study where col1=1 and col2='wow';
사용자 정의 함수
내장 함수(Built-in)
: 단일행 함수, 다중행 함수(집계 함수, 그룹 함수, 윈도우 함수)입력 행 수
에 따라 단일행 함수
와 다중행 함수
로 구분단일행 함수
: SELECT, WHERE, ORDER BY, UPDATE의 SET
절에 사용 가능1:M
관계 테이블을 조인 시 M쪽에 출력된 행이 하나씩 단일행 함수의 입력값
으로 사용다중행 함수
도 단일행 함수와 동일하게 단일 값
만 반환DUAL 테이블
: 사용자 SYS가 소유하며 모든 사용자가 액세스 가능
'X'
라는 값이 들어 있는 행을 한 건 포함1.CHR(ASCII 코드)/CHAR(ASCII코드)
ASCII코드
입력 시, 매핑되는 문자
출력SELECT CHR(97) FROM DUAL;
2.LOWER(문자열)
문자열
을 소문자
로 변환SELECT LOWER('DANG') FROM DUAL;
3.UPPER(문자열)
문자열
을 대문자
로 변환SELECT UPPER('dangdangs') FROM DUAL;
4.LTRIM(문자열[,특정 문자])
문자열
의 왼쪽 공백
제거 (특정 문자x시)문자열
을 왼쪽
부터 한 글자씩 특정 문자
와 비교하여 특정 문자에 포함
되어 있으면 제거
, 포함되지 않으면 멈춤
(특정 문자o시)MS-SQL
은 공백 제거
만 가능SELECT LTRIM('Database','de') FROM DUAL;
SELECT LTRIM('Database','DE') FROM DUAL;
SELECT LTRIM(' Database') FROM DUAL;
5.RTRIM(문자열[,특정 문자])
문자열
의 오른쪽 공백
제거 (특정 문자X시)문자열
의 오른쪽
부터 한 글자
씩 특정 문자와 비교
하여 특정 문자에 포함
되어 있으면 제거
, 그렇지 않으면 멈춤
(특정 문자o시)MS-SQL
은 공백 제거
만 가능select rtrim('dangdang ') from dual;
select rtrim('oracle','le') from dual;
select rtrim('sllel','le') from dual;
6.TRIM([위치][특정 문자][FROM] 문자열)
문자열
의 왼쪽
과 오른쪽 공백
을 제거 (옵션X)문자열
을 위치[LEADING|TRAILING|BOTH]
로 지정된 곳부터 한 글자
씩 특정 문자
와 비교하여 같으면 제거
하고 그렇지 않으면 멈춤
(옵션o)특정 문자
는 한 글자
만 지정 가능(LTRIM, RTRIM과 다름)MS-SQL
은 공백 제거
만 가능select trim(' dang ') from dual;
select trim(leading 'g' from 'ggoo') from dual;
select trim(both 'g' from 'ggoog') from dual;
7.SUBSTR(문자열, 시작점 [,길이])/SUBSTRING(문자열)
문자열
을 원하는 부분만 잘라서
반환길이 명시 X
시 문자열
의 시작점
부터 끝
까지 반환시작
은 1
부터select substr('sleepygood',7,4) from dual;
select substr('sql',3,3) from dual;
8.LENGTH(문자열)/LEN(문자열)
문자열
의 길이
반환select length('dang') from dual;
9.REPLACE(문자열, 변경 전 문자열 [,변경 후 문자열])
문자열
에서 변경 전
문자열을 변경 후
문자열로 바꿔주는 함수변경 후
문자열 명시X시
문자열에서 변경 전 문자열을 제거
select replace('헷갈려요','헷갈려','좋아') from dual;
select replace('헷갈려요','헷갈려') from dual;
10.CONCAT(문자열1, 문자열2)
문자열1
과 문자열2
를 연결
해주는 함수11.LPAD(값, 총 문자 길이, 채움 문자)
지정한 길이
만큼 왼쪽부터 채움문자
로 채움1.ABS(수)
수
의 절댓값
반환select abs(-999) from dual;
2.SIGN(수)
수
의 부호
를 반환양수
는 1
음수
는 -1
0
은 0
select sign(0) from dual;
select sign(-300) from dual;
select sign(300) from dual;
3.ROUND(수 [,자릿수])
수
를 지정된 소수점 자릿수까지 반올림
하여 반환명시 X
시 기본값은 0
, 반올림된 정수
반환음수
지정 시, 지정된 정수부
를 반올림
하여 반환첫째자리가 0
첫째자리가 -1
select round(39.5) from dual;
select round(391.53,1) from dual;
지정한 자릿수가 1이기 때문에, 소숫점 첫째자리만 나온다.
지정한 자릿수에서 반올림해준다고 생각하자!!
select round(391.53,-2) from dual;
4.TRUNC(수 [,자릿수])
수
를 지정된 소수점 자릿수
까지 버림
하여 반환명시X시
기본값은 0
, 버림된 정수
반환음수
시 정수부에서 버림
하여 반환select trunc(391.53,-2) from dual;
5.CEIL(수)/CEILING(수)
소수점 이하
의 수를 올림
한 정수
반환select ceil(391.53) from dual;
select ceil(-391.53) from dual;
6.FLOOR(수)
소수점 이하
의 수를 버림
한 정수
반환select floor(391.53) from dual;
select floor(-391.53) from dual;
-391보다 -392가 더 작기 때문!!
7.MOD(수1, 수2)
수1
을 수2
로 나눈 나머지
를 반환수2
가 0
이면 수1
반환음수
이면, 나머지도 음수
select Mod(15,3) from dual;
select Mod(15,-4) from dual;
select Mod(-15,-4) from dual;
select Mod(-15,4) from dual;
1/24 : 1일을 24로 나눔
1/24/60 : 1시간으로 60으로 나눔(1분)
1/24/6 : 1시간을 6으로 나눔(10분)
--ex
select to_char(to_date('2015.01.10 10','YYYY.MM.DD HH24')
+ 1/24/(60/10), 'YYYY.MM.DD HH24:MI:SS') from dual;
1.SYSDATE/GETDATE()
현재
의 연, 월, 일, 시, 분, 초
를 반환해주는 함수nls_date_format
에 따라 sysdate
의 출력 양식
은 달라진다.select SYSDATE from dual;
2.EXTRACT(특정 단위 FROM 날짜데이터)/DATEPART(특정 단위, 날짜 데이터)
날짜 데이터
에서 특정 단위(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
)만을 출력해서 반환select extract(day FROM sysdate) from dual;
3.ADD_MONTHS(날짜 데이터, 특정 개월 수)/DATEADD(MONTH, 특정 개월 수, 날짜 데이터)
날짜 데이터
에서 특정 개월 수를 더한 날짜
를 반환해주는 함수이전 달
이나 다음 달
에 기준 날짜의 일자 존재X시 해당 월의 마지막 일자
반환select add_months(to_date('2023-05-31','YYYY-MM-DD'),-1) from dual;
select add_months(to_date('2023-05-5','YYYY-MM-DD'),2) from dual;
데이터베이스에서 데이터 유형에 대한 형변환
을 할 수 있는 경우는 두 가지
명시적
형변환 : 변환 함수
를 사용하여 데이터 유형 변환을 명시적으로 나타냄암시적
형변환 : 데이터베이스가 내부적
으로 알아서 데이터 유형을 변환SELECT * FROM WHERE BIRTHDAY=20000216;
)내부적
으로 BIRTHDAY
컬럼을 NUMBER
형으로 변환 => 암시적 형변환
=> 암시적 형변환이 가능하다고, 데이터 유형 고려 X하며 SQL 작성 시, 성능 저하
불러올 수 있으며, 에러 발생할 수 있기 때문에, 명시적 형변환
사용 추천
❕ MS-SQL
은 CONVERT
또는 CAST
함수 사용가능
1.TO_NUMBER(문자열)
문자열
을 숫자형
으로 변환해주는 함수select to_number('123444') from dual;
2.TO_CHAR(수 or 날짜 [,포맷])
수
나 날짜형의 데이터
를 포맷 형식
의 문자형
으로 변환해주는 함수select to_char(14123) from dual;
select to_char(sysdate,'YY-MM-DD') from dual;
select to_char(sysdate,'YYYYMMDD HH24MISS') from dual;
select to_char(sysdate,'YYYYMMDD HHMISS') from dual;
3.TO_DATE(문자열, 포맷)
포맷 형식
의 문자형
데이터를 날짜형
으로 변환해주는 함수
포맷 형식 | 뜻 |
---|---|
YYYY | 년 |
MM | 월 |
DD | 일 |
HH | 시(12) |
HH24 | 시(24) |
MI | 분 |
SS | 초 |
select to_date('20230216','YYYYMMDD') from dual;
1.NVL(인수1, 인수2)/ISNULL(인수1, 인수2)
인수1
값이 NULL
일 경우, 인수2
반환NULL
이 아닐 경우, 인수1
반환select col2, nvl(col1,-1) from study;
select col1, nvl(col2,'baaaaad') from study;
2.NVL2(인수1, 인수2, 인수3)
인수1
값이 NULL
일 경우, 인수3
반환NULL
이 아닐 경우, 인수2
반환select col2,nvl2(col2,'is not null', 'is null') from study;
3.NULLIF(인수1, 인수2)
인수1
과 인수2
가 같으면
NULL
같지 않으면
인수1
반환select nullif('issame','issame') from dual;
select nullif('is not same','issame') from dual;
4.COALESCE(인수1, 인수2, 인수3, ...)
NULL
이 아닌
최초
의 인수 반환select coalesce(null,null,'good','bad') from dual;
~이면 ~이고, ~이면 ~이다
DECODE
함수와 같은 기능ELSE
가 별도로 없으면 NULL
이 DEFAULT
SELECT
절의 Alias
쓰기 X-- Searched Case Expression
CASE WHEN 조건 열=조건값1 THEN 무엇1
WHEN 조건 열=조건값2 THEN 무엇2
[ELSE 무엇3]
END
-- Simple Case Expression
CASE 조건 열
WHEN 조건값1 THEN 무엇1
WHEN 조건값2 THEN 무엇2
[ELSE 무엇3]
END
DECODE(조건 열,조건값1,무엇1,조건값2,무엇2[,무엇3])
select col1,
case when col1=1 then 'first'
when col1=2 then 'second'
else 'third'
end as "read"
FROM study;
select col1,
case col1
when 1 then 'first'
when 2 then 'second'
else 'third'
end as read
FROM study;
select col1, decode(col1,1,'first',2,'second','third') as decode from study;
Group By
: 데이터
를 그룹
별로 묶을 수 있도록 해주는 것
By
뒤에는 그룹핑의 기준
이 되는 컬럼이 온다.하나 이상
이 온다.데이터를 그룹핑
하면, 그룹별로 집계 데이터
도출이 가능해진다.
함수 | 뜻 |
---|---|
COUNT(*) | 전체 ROW Count(null 포함) |
COUNT(컬럼) | 컬럼값 NULL인 행 제외 Count |
COUNT(DISTINCT 컬럼) | 컬럼값 NULL 아닌 행에서 중복 제거한 Count |
SUM(컬럼) | 컬럼값들 합계 (null 제외) |
AVG(컬럼) | 컬럼값들 평균 (null 제외) |
MIN(컬럼) | 컬럼값들 최솟값 (null 제외) |
MAX(컬럼) | 컬럼값들 최댓값 (null 제외) |
STDDEV(컬럼) | 컬럼값들의 표준 편차 |
VARIAN(컬럼) | 컬럼값들의 분산 |
HAVING
절 : GROUP BY
절 사용 시 WHERE
절처럼 사용하는 조건절
데이터
그룹핑 후, 특정 그룹
골라낼 때 사용 group by
이후 수행되기 때문에, 그룹핑 후 가능한 집계 함수
로 조건 부여 가능select
절에 명시되지 않은 집계 함수
로도 조건 부여 가능where
절을 사용해도 되는 조건은 성능을 위해 where절에서 필터링 선행group by
는 비교적 비용이 많이 들기 때문에 수행 전 데이터량 줄여야함sELECT
절에서 정의한 Alias
사용 불가 (having이 먼저 실행됨)테이블 전체
가 한개의 그룹
이 되는 경우 HAVING단독 사용 가능
select col1,sum(col3) as "group_sum",
count(col3) as "group_count"
from study
group by col1
having count(col1)>=2;
select ... 5
from ... 1
where ... 2
group by ... 3
having ... 4
order by ... 6
order by
절은 select문
에서 논리적으로 맨 마지막
에 수행
정렬
임의의 순서
대로 출력order by
뒤에는 정렬 기준 컬럼
하나 이상
가장 마지막 줄에 한번만
기술ASC(Ascending)
: 오름차순
DESC(Descending)
: 내림차순
ASC
가 기본값select col1, col2, col3
from study
order by col1;
select col1, col2, col3
from study
order by col1 desc, col2 asc;
NULL
의 정렬 위치가 다르다NULL
을 최댓값
으로 취급 (오름차순 시 마지막)NULL
을 최솟값
으로 취급 (오른차순 시 처음)order by
절에 NULLS FIRST, NULLS LAST
옵션 사용select
절 다음이므로, alias
사용 가능-- oracle
select col1, col2, col3
from study
order by col2 nulls first;
JOIN
: 각기 다른 테이블
을 한 번
에 보여줄 때 쓰는 쿼리
PK
, FK
연관성에 의해 JOIN 성립DBMS 옵티마이저
는 FROM
절에 나열된 테이블들을 2개
정도씩 묶어서 JOINNon EQUI JOIN
수행 가능하지만, 때로는 설계상의 이유로 수행 불가능EQUI JOIN
:=
조건으로 JOIN
하는 것
select s.col1 as s_col1, s.col3, t.col2 as name
from study s, test t
where s.col1=t.col1;
Non EQUI JOIN
: =
조건이 아닌 다른 조건(BETWEEN, >, >=, <, <=
) 으로 JOIN
select s.col1, t.col1 as tcol, t.col2
from study s, test t
where s.col1 between t.col3 and t.col4;
OUTER JOIN
: JOIN
조건에 만족하지 않는 행
도 출력되는 형태
ORACLE
의 경우 모든 행
이 출력되는 테이블의 반대편
에 (+)
기호 붙여 작성ex) LEFT OUTER JOIN
select s.col1, t.col1 from study s, test t
where s.col1=t.col1(+);