DB : 특정 기업이나 조직 또는 개인이 필요에 의해 데이터를 일정한 형태로 저장해 놓은 것을 의미한다.
DBMS : 효율적인 데이터 관리 뿐만 아니라 예기치 못한 사건으로 인한 데이터의 손상을 피하고, 필요시 필요한 데이터를 복구하기 위한 강력한 기능의 SW
DB 발전
1960 : 플로우차트 중심의 개발, 파일구조 사용
1970 : DB 관리기법이 처음 태동, 계층-망형 DB등장
1980 : 관계형 DB 상용화, Oracle, Sybase 등장
1990 : 객체 관계형 DB로 발전
SQL : 관계형 DB에서 데이터 정의, 조작, 제어를 위해 사용하는 언어
SQL 문장들의 종류
DML : SELECT, INSERT, UPDATE, DELETE 등 데이터 조작어
DDL : CREATE, ALTER, DROP, RENAME 등 데이터 정의어
DCL : GRANT, REVOKE 등 데이터 제어어
TCL : COMMIT, ROLLBACK 등 트랜잭션 제어어
테이블 : 데이터를 저장하는 객체, 로우(가로, 행)와 칼럼(세로, 열)으로 구성
정규화 : 데이터의 정합성 확보와 데이터 입력/수정/삭제시 발생할 수 있는 [이상현상]을 방지하기 위함
기본키 : 테이블에 존재하는 각 행을 한 가지 의미로 특정할 수 있는 한 개 이상의 칼럼
외부키 : 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 칼럼
--------------------------------------------
데이터 유형
CHAR(s) : 고정 길이 문자열 정보
‘AA’ = ‘AA ’
VARCHAR(s) : 가변 길이 문자열 정보
‘AA’ != ‘AA ’
NUMERIC : 정수, 실수 등 숫자 정보
DATE : 날짜와 시각 정보
CREATE TABLE 테이블이름 (
);
테이블 명은 다른 테이블의 이름과 중복되면 안 된다.
테이블 내의 칼럼명은 중복될 수 없다.
각 칼럼들은 , 로 구분되고 ; 로 끝난다.
칼럼 뒤에 데이터 유형은 꼭 지정되어야 한다.
테이블명과 칼럼명은 반드시 문자로 시작해야한다.
A-Z,a-z,0-9,_,$,#만 사용 가능
DATETIME 데이터 유형에는 별도로 크기를 지정x
제약조건
1. PRIMARY KEY(기본키) : 기본키 정의
2. UNIQUE KEY(고유키) : 고유키 정의
3. NOT NULL : NULL 값 입력금지
4. CHECK : 입력 값 범위 제한
5. FOREIGN KEY(외래키) : 외래키 정의
DESC(RIBE) 테이블명; -> 테이블 구조 확인(Oracle)
exec sp_help ‘db0.테이블명’ -> (SQL Server)
go
테이블 구조 변경(칼럼 추가, 삭제 등) DDL
ALTER TABLE 테이블명
ADD 칼럼명 데이터 유형;
DROP COLUMN 칼럼명;
MODIFY (칼럼명 데이터유형 DEFAULT식 NOT NULL); -> 칼럼 데이터 유형, 조건 등 변경 Oracle
ALTER (칼럼명 데이터유형 DEFAULT식 NOT NULL); -> SQL Server
RENAME COLUMN 변경전칼럼명 TO 뉴칼럼명; Ora
sp_rename 변경전칼럼명, 뉴칼럼명, ‘COLUMN’; SQ
DROP CONSTRAINT 조건명; 제약조건 삭제
ADD CONSTRAINT 조건명 조건 (칼럼명); 조건 추가
RENAME 변경전테이블명 TO 변경후테이블명; Ora
sp_rename ‘db0.TEAM’,‘TEAM_BACKUP’; SQL
DROP TABLE 테이블명 [CASCADE CONSTRAINT]
CASCADE CONSTRAINT : 참조되는 제약조건 삭제
TRUNCATE TABLE 테이블명: 행 제거, 저장공간 재사용
--------------------------------------------
DML
DDL 명령어의 경우 실행시 AUTO COMMIT 하지만 DML의 경우 COMMIT을 입력해야 한다.
SQL Server의 경우 DML도 AUTO COMMIT
INSERT INTO PLAYER (PLAYER) VALUES (‘PJS’);
UPDATE PLAYER SET BACK_NO = 60;
DELETE FROM PLAYER;
SELECT PLAYER_ID FROM PLAYER;
SELECT DISTINCT POSITION 시 구분값만 출력 ex)GK, FW, DF, MF
SELECT PLAYER AS “선수명” FROM PLAYER;
와일드카드
* : 모든
% : 모든
- : 한 글자
합성 연산자
문자와 문자 연결 : ||(Oracle), +(SQL Server)
SELECT PLAYER_NAME + ‘선수’ “정보”
--------------------------------------------
TCL
트랜잭션 : 밀접히 관련되어 분리될 수 없는 1개 이상의 DB 조작
COMMIT : 올바르게 반영된 데이터를 DB에 반영
ROLLBACK : 트랜잭션 시작 이전의 상태로 되돌림
SAVEPOINT : 저장 지점
트랜잭션의 특성
1. 원자성 : 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않아야 함
2. 일관성 : 트랜잭션 실행 전 DB 내용이 잘못 되지 않으면 실행 후도 잘못 되지 않아야 함
3. 고립성 : 트랜잭션 실행 도중 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.
4. 지속성 : 트랜잭션이 성공적으로 수행되면 DB의 내용은 영구적으로 저장된다.
SAVEPOINT SVPT1; (Oracle)
ROLLBACK TO SVPT1; (Oracle)
SAVE TRAN SVPT1; (SQL Server)
ROLLBACK TRAN SVPT1; (SQL Server)
COMMIT;
--------------------------------------------
연산자의 종류
BETWEEN a AND b : a와 b 값 사이에 있으면 됨
IN (list) : 리스트에 있는 값중 어느 하나라도 일치
LIKE ‘비교문자열’ : 비교문자열과 형태가 일치
IS NULL : NULL 값인 경우
NOT IN (list) : list의 값과 일치하지 않는다
IS NOT NULL : NULL 값을 갖지 않는다.
연산자 우선순위 : ()->NOT->비교연산자->AND->OR
SELECT PLAYER_NAME 선수명
FROM PLAYER
WHERE TEAM_ID = ‘K2’; -> 팀ID가 K2인 사람
WHERE TEAM_ID IN (‘K2’,‘K7’); -> K2,K7인 사람
WHERE HEIGHT BETWEEN 170 AND 180;
-> 키가 170 ~ 180인 사람
WHERE POSITION IS NULL; -> 포지션 없는 사람
NULL 값과의 수치연산은 NULL 값을 리턴한다.
NULL 값과의 비교연산은 거짓(FALSE)를 리턴한다.
ROWNUM : 원하는 만큼의 행을 가져올 때 사용(Or)
TOP : (SQL Server)
WHERE ROWNUM =1;
SELECT TOP(1) PLAYER_NAME FROM PLAYER;
--------------------------------------------
문자형 함수
LOWER : 문자열을 소문자로
UPPER : 문자열을 대문자로
ASCII : 문자의 ASCII 값 반환
CHR/CHAR : ASCII 값에 해당하는 문자 반환
CONCAT : 문자열1, 2를 연결
SUBSTR/SUBSTRING : 문자열 중 m 위치에서 n개의 문자 반환
LENGTH/LEN : 문자열 길이를 숫자 값으로 반환
CONCAT(‘RDBMS’,‘ SQL’) -> ‘RDBMS SQL’
SUBSTR(‘SQL Expert’,5,3) -> ‘Exp’
LTRIM(‘xxxYYZZxYZ’,‘x’) -> ‘YYZZxYZ’
RTRIM(‘XXYYzzXYzz’,‘z’) -> ‘XXYYzzXY’
TRIM(‘x’ FROM ‘xxYYZZxYZxx’) -> ‘YYZZxYZ’
숫자형 함수
SIGN(n) : 숫자가 양수면1 음수면-1 0이면 0 반환
MOD : 숫자1을 숫자2로 나누어 나머지 반환
CEIL/CEILING(n) : 크거나 같은 최소 정수 반환
FLOOR(n) : 작거나 같은 최대 정수 리턴
ROUND(38.5235,3) -> 38.524
ROUND(38.5235,1) -> 38.5
ROUND(38.5235) -> 39
TRUNC(38.5235,3) -> 38.523
TRUNC(38.5235,1) -> 38.5
TRUNC(38.5235) -> 38
날짜형 함수
SYSDATE/GETDATE() 현재날짜와 시각 출력
EXTRACT/DATEPART 날짜에서 데이터 출력
TO_NUMBER(TO_CHAR(d,‘YYYY’))/YEAR(d)
SELECT ENAME,
CASE WHEN SAL >=3000 THEN ‘HIGH’
WHEN SAL >=1000 THEN ‘MID’
ELSE ‘LOW’
END AS SALARY_GRADE
FROM EMP;
NULL 관련 함수
NVL(식1,식2)/ISNULL(식1,식2) : 식1의 값이 NULL 이면 식2 출력
NULLIF(식1,식2) : 식1이 식2와 같으면 NULL을 아니면 식1을 출력
COALESCE(식1,식2) : 임의의 개수표현식에서 NULL이 아닌 최초의 표현식, 모두 NULL이면 NULL 반환
ex)COALESCE(NULL,NULL,‘abc’) -> ‘abc’
-------------------------------------------
집계 함수
1. 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다.
2. GROUP BY 절은 행들을 소그룹화 한다.
3. SELECT, HAVING, ORDER BY 절에 사용 가능
-ALL : Default 옵션
-DISTINCT : 같은 값을 하나의 데이터로 간주 옵션
COUNT(*) : NULL 포함 행의 수
COUNT(표현식) : NULL 제외 행의 수
SUM, AVG : NULL 제외 합계, 평균 연산
STDDEV : 표준 편차
VARIAN : 분산
MAX, MIN : 최대값, 최소값
GROUP BY, HAVING 절의 특징
1. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
2. 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
3. GROUP BY 절에서는 ALIAS 사용 불가
4. 집계 함수는 WHERE 절에 올 수 없다.
5. HAVING 절에는 집계함수를 이용하여 조건 표시o
6. HAVING 절은 일반적으로 GROUP BY 뒤에 위치
SEARCHED_CASE_EXPRESSION
CASE WHEN LOC = ‘a’ THEN ‘b’
SIMPLE_CASE_EXPRESSION
CASE LOC WHEN ‘a’ THEN ‘b’
이 2문장은 같은 의미이다.
--------------------------------------------
ORDER BY 특징
1. SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정한 칼럼을 기준으로 정렬하여 출력하는데 사용한다.
2. ORDER BY 절에 칼럼명 대신 ALIAS 명이나 칼럼 순서를 나타내는 정수도 사용 가능하다.
3. DEFAULT 값으로 오름차순(ASC)이 적용되며 DESC 옵션을 통해 내림차순으로 정렬이 가능하다.
4. SQL 문장의 제일 마지막에 위치한다.
5. SELECT 절에서 정의하지 않은 칼럼 사용 가능
Oracle에서는 NULL을 가장 큰 값으로 취급하며 SQL Server에서는 NULL을 가장 작은 값으로 취급한다.
SELECT 문장 실행 순서
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
SELECT TOP(2) WITH TIES ENAME, SAL
FROM EMP
ORDER BY SAL DESC;
위는 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원은 같이 출력한다(WITH TIES)
--------------------------------------------
JOIN : 두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것
일반적으로 행들은 PK나 FK 값의 연관에 의해 JOIN이 성립된다. 어떤 경우에는 PK, FK 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립가능하다.
5가지 테이블을 JOIN 하기 위해서는 최소 4번의 JOIN 과정이 필요하다. (N-1)
EQUI JOIN : 2 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용, 대부분 PK, FK의 관계를 기반으로 한다.
SELECT PLAYER.PLAYER_NAME
FROM PLAYER
위 SQL처럼 컬럼명 앞에 테이블 명을 기술해줘야 함
NON EQUI JOIN : 2개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용
‘=’ 연산자가 아닌 BETWEEN, >, <= 등 연산자 사용
SELECT E.ENAME, E.JOB, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HSAL;
위는 E의 SAL의 값을 S의 LOSAL과 HSAL 범위에서 찾는 것이다.
============================================
집합 연산자 : 두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 때 사용
SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환할 때 사용 가능
일반 집합 연산자
1. UNION : 합집합(중복 행은 1개로 처리)
2. UNION ALL : 합집합(중복 행도 표시)
3. INTERSECT : 교집합(INTERSECTION)
4. EXCEPT,MINUS : 차집합(DIFFERENCE)
5. CROSS JOIN : 곱집합(PRODUCT)
순수 관계 연산자 : 관계형 DB를 새롭게 구현
1. SELECT -> WHERE
2. PROJECT -> SELECT
3. NATRUAL JOIN -> 다양한 JOIN
4. DIVIDE -> 사용x
{a,x}{a,y}{a,z} divdie {x,z} = {a}
FROM 절 JOIN 형태
1. INNER JOIN
2. NATURAL JOIN
3. USING 조건절
4. ON 조건절
5. CROSS JOIN
6. OUTER JOIN
INNER JOIN : JOIN 조건에서 동일한 값이 있는 행만 반환, USING이나 ON 절을 필수적으로 사용
NATURAL JOIN : 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN 수행, NATURAL JOIN이 명시되면 추가로 USING, ON, WHERE 절에서 JOIN 조건을 정의할 수 없다, SQL Sever는 지원x
USING 조건절
같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다, JOIN 칼럼에 대해서 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없다, SQL Server 지원x
ON 조건절
ON 조건절과 WHERE 조건절을 분리하여 이해가 쉬우며, 칼럼명이 다르더라도 JOIN 조건을 사용할 수 있는 장점이 있다, ALIAS나 테이블명 반드시 사용
CROSS JOIN
양쪽 집합의 M*N건의 데이터 조합이 발생한다.
OUTER JOIN
JOIN 조건에서 동일한 값이 없는 행도 반환 가능하다, USING이나 ON 조건절 반드시 사용해야 함
LEFT OUTER JOIN
조인 수행시 먼저 표기된 좌측 테이블에 해당하는 데이터를 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어 온다. 우측 값에서 같은 값이 없는 경우 NULL 값으로 채운다.
RIGHT OUTER JOIN
LEFT OUTER JOIN의 반대
FULL OUTER JOIN
조인 수행시 좌측, 우측 테이블의 모든 데이터를 읽어 JOIN하여 결과를 생성한다. 중복 데이터는 삭제한다.
'database' 카테고리의 다른 글
SQL 옵티마이저 (0) | 2020.09.24 |
---|---|
SQL 활용 (0) | 2020.09.24 |
데이터 모델과 성능 (0) | 2020.09.24 |
데이터 모델링의 이해 (0) | 2020.09.24 |