CREATE: 데이터베이스 개체(테이블, 뷰, 인덱스 등)를 생성합니다.
ALTER: 이미 존재하는 데이터베이스 개체의 구조를 변경합니다.
DROP: 데이터베이스 개체를 삭제합니다.
TRUNCATE: 테이블 내의 모든 데이터를 삭제합니다.
RENAME: 데이터베이스 객체의 이름을 변경합니다.
COMMENT:데이터베이스 객체에 대한 주석을 추가합니다.
DDL(Data Definition Language) 데이터베이스 정의
SQL Server에서는 DDL명령 후 rollback시 되돌아가지만
Oracle에서는 DDL명령어 모두 트랜잭션 종료라는 기능이 있어서 rollback해도 이미 DB 반영됨
테이블 생성 주의사항
테이블명은 객체를 의미할 수 있는 적절한 이름으로 단수형을 권고하며 대소문자를 구분하지 않으며 기본적으로 대문자로 만들어진다. 테이블명은 다른테이블명과 중복이면 안된다. 하나의 테이블 내에서 칼럼명이 중복이면 안된다. 문자 데이터 타입에는 반드시 최대 길이를 표시해야 한다. 칼럼에 대한 제약조건이 있으면 CONSTRAINT를 이용하여 추가할 수 있다.
제약조건의 종류
데이터 입력
데이터 수정
데이터 삭제
데이터 조회
전체조회 : SELECT * FROM 테이블명;
열 별칭 : SELECT FirstName AS First, LastName AS Last FROM 테이블명;
중복된 값 제외 : SELECT DISTINCT 기준칼럼명 FROM 테이블명;
TRUNCATE & DROP & DELECT 차이점
TRUNCATE 테이블은 그대로 있으나 안의 데이터와 인덱스 삭제되어 용량이 줄어듬
DROP 테이블 삭제
DELECT 데이터만 삭제하기에 인덱스는 남아있으며 로그가 남아서 되돌릴 수 있음
Delete Action 명령어
Cascade : 부모테이블 삭제 시 자식테이블도 같이 삭제됩니다.
Set Null : 부모테이블 삭제 시 자식테이블의 해당 필드를 Null값 처리
Set Default : 부모테이블 삭제 시 자식테이블 해당 필드 값을 기본값으로 처리
Restrict : 자식테이블에 PK값이 없는 경우만 부모테이블 삭제 허용
No Action : 참조무결성을 위반하는 삭제/수정 액션을 취하지 않음
Insert Action 명령어
Automatic : 부모테이블에 PK가 없는 경우 부모테이블 PK를 생성 후 자식테이블 입력
Set Null/Set Default : Delete 명령어와 비슷합니다. 단, 부모테이블에 PK가 없는 경우를 전제조건으로 합니다.
Dependent : 부모테이블에 PK가 존재할 때만 자식테이블 입력 허용
No Action : 참조무결성을 위반하는 입력 액션을 취하지 않음
트랜잭션 특성
고립성(격리성)이 낮을 때 발생하는 문제
1) Dirty Read : 다른 트랜잭션에 의해 수정되었음에도 불구하고 커밋되지 않은 데이터를 읽는 것
2) Non-Repeatable Read : 한 트랜잭션 내에서 같은 쿼리를 두번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상
3) Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두번 수행했는데 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상.
GRANT : 권한부여
REVOKE : 권한삭제
연산우선순위
1. 괄호 ()
2. NOT연산자
3. 비교연산자, SQL연산자
4. AND
5. OR
NULL함수
다음 중 SELECT COL1 + COL3 FROM TAB_A;의 결과로 가장 적절한 것은? 50, null, null
col 1 | col 2 | col 3 |
---|---|---|
30 | NULL | 20 |
NULL | 10 | 40 |
50 | NULL | NULL |
행끼리의 연산은 SUM(COL1+COL2+...) 이런 식이고 행에 NULL이 포함되어있다면 연산결과는 항상 NULL값이 나옵니다. 근데 열의 연산은 다릅니다. SUM(COL1) 이런식으로 나오면 열끼리의 연산인데, 열 연산은 NULL이 보이면 그냥 무시하고 NULL이 아닌 데이터끼리만 연산을 수행합니다!
Oracle에서는 공백이 NULL과 같고, SQL Server에서는 공백은 그냥 하나의 데이터와 같습니다.
SELECT 문장 실행 순서
1. FROM 테이블명
2. WHERE 조건식 (대상이 아닌 데이터 제거)
3. GROUP BY (행들을 소그룹화)
4. HAVING (그룹핑된 값의 조건에 맞는 것만 출력)
5. SELECT (별명지정)
6. ORDER BY (정렬)
SQL Server의 TOP WITH TIES
SELECT TOP(2) WITH TIES ENAME, SAL
FROM EMP
ORDER BY SAL DESC
급여가 높은 2명을 내림차순으로 출력하는데 같은 ,
급여를 받는 사원은 같이 출력한다.
오라클의 Rownum
-- 급여가 높은 상위 5명을 선택
SELECT *
FROM (
SELECT *
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 5;
-- 급여순으로 6~10위를 선택
SELECT *
FROM (
SELECT *
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM BETWEEN 6 AND 10;
두 개 이상의 테이블들을 연결하여 데이터를 출력하는 것으로
일반적으로 PK나 FK 값의 연관성에 의해 성립되지만
어떤 경우에는 PK, FK 관계가 없어도 논리적인 값들의 연관으로 JOIN이 가능하다.
EQUI JOIN
방법1) WHERE 절에 JOIN 조건을 넣는다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ... FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명1 = 테이블2.칼럼명2;
방법 2) ON 절에 JOIN 조건을 넣는다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명, ... FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.칼럼명1 = 테이블2.칼럼명2;
INNER JOIN
FROM 절의 USING 조건절
ON 조건절
-SELECT E.EMPNO, D.DNAME FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);
-ON 조건절과 WHERE 검색 조건은 충돌 없이 사용할 수 있다.
NATURAL JOIN
CROSS JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN