[SQL] ORDER BY 정렬

1. ORDER BY 정렬

1
2
3
4
5
6
SELECT 칼럼명 [ALIAS명]
FROM 테이블명
[WHERE 조건식]
[GROUP BY 칼럼또는 표현식]
[HAVING 그룹조건식]
[ORDER BY 칼럼이나 표현식 [ASC 또는 DESC];

2.SELECT 문장실행 순서

5)SELECT
1)FROM
2)WHERE
3)GROUP BY
4)HAVING
6)ORDER BY

1
2
3
4
5
6
7
8
SELECT DNAME, LOC, DEPTNO
FROM DEPT
ORDER BY 1,2,3 DESC;

SELECT JOB FROM EMP
GROUP BY JOB
HAVING COUNT(*)>0
ORDER BY MAX(EMPNO), MAX(MGR), SUM(SAL), COUNT(DEPTNO), MAX(HIREDATE);

3. TOP N 쿼리

ROWNUM

1
2
3
4
5
6
7
8
9
10
--ORDER BY가 제일 늦게 실행되기 때문에 원하는 값이 안 나옴
SELECT ENAME, SAL FROM EMP
WHERE ROWNUM <4
ORDER BY SAL;

--2중쿼리 이용
SELECT ENAME, SAL
FROM (SELECT ENAME, SAL FROM EMP
ORDER BY SAL DESC)
WHERE ROWNUM<4;

[SQL] GROUP BY, HAVING절

1. 집계함수(AGGREGATE FUNCTION)

  • 여러 행들의 그룹이 모여 그룹당 하나의 결과를 리턴하는 함수
  • GROUP BY 절은 행들을 소그룹화 함
  • SELECT절, HAVING절, ORDER BY 절에 사용할 수 있음.

집계함수명([DISTINCT] 칼럼이나 표현식)

COUNT(*)

  • NULL값을 포함한 행의 수 출력

    COUNT(표현식)

  • 표현식의 값이 NULL값을 제외한 행의 수 출력

    SUM([DISTINCT] 표현식)

  • NULL값을 제외한 합계출력

    AVG([DISTINCT] 표현식)

  • NULL값을 제외한 평균출력

    MAX([DISTINCT] 표현식)

  • 표현식의 최대값 출력

    MIN([DISTINCT] 표현식)

  • 표현식의 최소값 출력

    STDDEV([D] 표현식)

  • 표현식의 표준편차 출력

    VARIAN([D] 표현식)

  • 표현식의 분산 출력

2. GROUP BY절

  • SQL문에서 FROM과 WHERE절 뒤에 위치, 데이터를 그룹으로 분류하여 소그룹에대한 항목별 통계정보를 얻을때 사용
1
2
3
4
5
SELECT [DISTINCT] 칼럼명 [ALIAS명]
FROM 테이블명
[WHERE 조건식]
[GROUP BY 칼럼이나 표현식]
[HAVING 그룹조건식];

GROUP BY, HAVING절의 특성

  • 그룹바이로 소그룹의 기준을 정한후, SELECT 절에 집계함수를 사용
  • 집계함수의 통계정보는 NULL값을 제외하고 수행함
  • WHERE절에는 집계함수 올 수 없음
  • HAVING절은 그룹바이절의 기준 항목이나 소그룹의 집계함수를 이용한 저건을 표시
  • 그룹바이절에 의해 소그룹별로 만들어진 집계데이터 중, HAVING 절에 제한 조건을 두어 만족하는 내용만 출력
  • HAVING절은 일반적으로 GROUP BY절 뒤에 위치
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER;
-->>ERROR : 단일 그룹의 집계함수가 아니다라고 나옴


SELECT POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY POSITION 포지션;
-->>ERROR SQL명령어가 올바르게 종료되지 않음-->그룹바이에 별명ALIAS쓸 수 없음

--포지션별 최대키, 최소키, 평균키 출력
SELECT POSITION 포지션, MAX(HEIGHT), MIN(HEIGHT), AVG(HEIGHT)
FROM PLAYER
GROUP BY PISITION;

3.HAVING 절

  • GROUP BY후에 조건을 달고 싶을때 WHERE 대신 씀
  • WHERE절은 GROUP BY절 전에 오기때문에 소그룹으로 묶인후의 조건을 걸 수없음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키
FROM PLAYER
WHERE AVG(HIGHT) >=180
GROUP BY POSITION
--3행오류 : 집계함수가 허가되지 않음. 그룹바이로 소그룹화 되기전에 집계함수를 사용했기때문.

SELECT POSITION, ROUND(AVG(HEIGHT),2)
FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGNT)>=180;

--이렇게써야함
--예제)
--최대 키가 190CM이상인 선수를 가지고 포지션별 평균 키를 출력
SELECT POSICITON AVG(HEIGHT)
FROM PLAYER
GROUP BY POSITION
HAVING MAX(HEIGHT) >=190;

4. CASE 표현을 활용한 월별 데이터 집계

  • 모델링의 제 1정규화로 반독되는 칼럼의 경우, 구분칼럼을 두고 여러개의 레코드로 만들어진 집합을 정해진 칼럼 수만큼 확장해서 집계 보고서를 만드는 유용한 기법

예제)
부서별 월별 입사자의 평균 급여를 조회, 입사후 1년마다 급여 인상이나 보너스 지급과 같은 일정이 정기적으로 잡히면 업무적으로 중요한 정보가 됨

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
--STEPT1
--개별입사정보에서 월별데이터 추출
SELECT ENAME, DEPOTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL
FROM EMP;

--STEPT2 월별데이터 구분
SELECT ENAME, DEPTNO,
CASE MONTH WHEN 1 THEN SAL END M01, CASE MONTH WHEN 2 THEN SAL END M02,
CASE MONTH WHEN 3 THEN SAL END M03, CASE MONTH WHEN 4 THEN SAL END M04,
CASE MONTH WHEN 5 THEN SAL END M05, CASE MONTH WHEN 6 THEN SAL END M06,
CASE MONTH WHEN 7 THEN SAL END M07, CASE MONTH WHEN 8 THEN SAL END M08,
CASE MONTH WHEN 9 THEN SAL END M09, CASE MONTH WHEN 10 THEN SAL END M10,
CASE MONTH WHEN 11 THEN SAL END M11, CASE MONTH WHEN 12 THEN SAL END M12
FROM (SELECT ENAME, DEPTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL
FROM EMP);

--STEPT3 2의구분을 부서별로 그룹화
SELECT DEPTNO,
AVG(CASE MONTH WHEN 1 THEN SAL END) M01, AVG(CASE MONTH WHEN 2 THEN SAL END) M02,
AVG(CASE MONTH WHEN 3 THEN SAL END) M03, AVG(CASE MONTH WHEN 4 THEN SAL END) M04,
AVG(CASE MONTH WHEN 5 THEN SAL END) M05, AVG(CASE MONTH WHEN 6 THEN SAL END) M06,
AVG(CASE MONTH WHEN 7 THEN SAL END) M07, AVG(CASE MONTH WHEN 8 THEN SAL END) M08,
AVG(CASE MONTH WHEN 9 THEN SAL END) M09, AVG(CASE MONTH WHEN 10 THEN SAL END) M10,
AVG(CASE MONTH WHEN 11 THEN SAL END) M11, AVG(CASE MONTH WHEN 12 THEN SAL END) M12
FROM (SELECT ENAME, DEPTNO, EXTRACT(MONTH FROM HIREDATE) MONTH, SAL
FROM EMP)
GROUP BY DEPTNO;

5.집계함수와 NULL처리

  • 빈칸을 NULL이 아니라 0으로 처리하기 위해 NVL()을 사용하는 경우가 있는데, 오히려 불필요할 수 있음
  • 행 함수는 건수가 NULL인 행을 빼고 계산함. SUM, AVG,..등 굳이 0을넣어 불필요하게 더 계산할 필요가 없음
  • ELSE 절 생략하면 DEFAULT 값이 NULL임
  • 출력시 NULL이 아닌 0을 표현하고싶으면 NVL(SUM(SAL),0)이렇게 하면됨

[SQL] 함수

1. 문자열 함수

LOWER(문자열)

  • 문자열 소문자로 변경

    UPPER(문자열)

  • 문자열 대문자로 변경

    ASCII(문자)

  • 문자, 숫자를 ASCII로 변경

    CONCAT(문자열1, 문자열2)

  • 문자열1과 문자열 2 합침(||와 같은 기능)

    SUBSTR(문자열, M [,N])

  • 문자열 중에 M부터 N개의 문자 리턴(N이 없으면 M부터 끝까지 리턴)

    LENGTH(문자열)

  • 문자열 개수 리턴

    LTRIM(문자열 [,지정문자])

  • 문자열의 첫 문자부터 지정문자를 제거함(지정문자 생략시 “”공백 제거)

    RTRIM(문자열 [,지정문자])

  • 문자열 제일 마지막부터 지정문자를 제거함(지정문자 생략시 “”공백제거)

    TRIM(지정문자 FROM 문자열)

  • 문자열의 양끝의 지정문자 제거

2. 숫자형 함수

ABS(숫자)

  • 숫자의 절대값 리턴

    SING(숫자)

  • 숫자의 양수, 음수, 0을 구분(결과값 -1 OR 0 OR 1)

    MOD(숫자1, 숫자2)

  • 숫자1/숫자2의 나머지 리턴

    CEIL(숫자)

  • 숫자보다 크거나 같은 최소 정수리턴

    FLOOR(숫자)

  • 숫자봗 작거나 같은 최대정수리턴

    ROUND(숫자 [,M])

  • 숫자를 M+1자리에서 반올림해서 리턴(M의 DEFAULT는 0)

    TRUNC(숫자[,M])

  • 숫자를 M+1자리에서 버림해서 리턴(M의 DEFAULT는0)

    EXP(),POWER(),SQRT(),LOG()

  • 지수, 거듭제곱, 제곱근, 로그값 리턴

3. 날짜형 함수

SYSDATE

  • 현재 날짜, 시각 출력

    EXTRACT(‘YEAR’ FROM d)

  • d 날짜에서 ‘YEAR’(년) 추출(YEAR에 MONTY, DAY 입력가능)

    TO_NUMBER(TO_CHAR(D,’YYYY’))

  • 날짜데이터에서 년도 출력

    TO_NUMBER(TO_CHAR(D,’MM’))

  • 날짜데이터에서 월도 출력

    TO_NUMBER(TO_CHAR(D,’DD’))

  • 날짜데이터에서 일 출력

4. 변환형 함수

TO_NUMBER(문자열)

  • 문자열을 숫자로 변환

    TO_CHAR(숫자|날짜 [,FOMAT])

  • 숫자나 날짜를 주어진 포맷형태로 문자열 타입으로 변환

    TO_DATE(문자열[,FOMAT])

  • 문자열을 주어진 포맷 형태로 날짜타입으로 변환

5.CASE표현

함수의 성질을 가지고 있어 중첨해서 사용할 수 있음

1
2
3
4
CASE
SIMPLE_CASE_EXPRESSION 조건
ESLE 표현절
END
  • 예제)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    --예제1
    SELECT ENAME,
    CASE WHEN SAL>2000
    THEN SAL
    ELSE 2000
    END REVISED_SALARY
    FROM EMP;

    --예제2)
    SELECT LOC,
    CASE LOC
    WHEN 'NEW YORK' THEN 'EAST'
    WHEN 'CHICAGO' THEN 'CENTER'
    ELSE 'ETC'
    END AS AREA
    FROM DEPT;

6.NULL관련함수

연산

NULL+숫자=NULL;(사칙연산 모두 포함)
NULL+문자열=NULL;

NVL(표현식1, 표현식2)

  • 표현식 1 이NULL이면 표현식 2를 출력(두 표현식의 데이터 타입이 같아야함)

    NULLIF(표현식1, 표현식2)

  • 표현식1이 표현식2와 같으면 NULL, 아니면 표현식1 출력

    COALESCE(표현식1,..,표현식N)

  • 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식 리턴,
  • 모든 표현식이 NULL이면 NULLD을 리턴

    NULL과 공집합

    테이블 안에 값이 NULL이면 NULL, 테이블 이 선택안되면 공집합
    공집합을 NULL로 바꾸기 위해 적절한 함수 사용 EX)MAX()

NULLIF

1
2
3
4
--사원 테이블에서 MGR과 7698이 같으면 NULL, 다르면 MGR 표시하라. 

SELECT ENAME, EMPNO, MGR, NULLIF(MGR, 7698) NUIF
FROM EMP;

COALESCE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--사원테이블에서 커미션을 1차선택값, 급여를 2차 선택값으로 선택하되 
--두 칼럼 모두 NULL이면 NULL로 표시

SELECT ENAME, COMM, SAL, COALESCE(COMM, SAL) COAL
FROM EMP;

--다른방법
SELECT ENAME, COMM, SAL
CASE WHEN COMM IS NOT NULL
THEN COMM
ELSE (CASE WHEN SAL IS NOT NULL
THEN SAL
ELSE NULL
END)
END COAL
FROM EMP;

[SQL] WHERE절

1. 연산자 종류

비교연산자

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167

=
>
<=
>
>=
```

### SQL연산자
- BETWEEN a AND b
(a 이상, b이하의 값)
- IN(a,b,c)
(a,b,c중 하나라도 일치하는 값이 있으면 true)
- LKIE '비교문자열'
비교문자열과 형태일치(%, _)
- IS NULL
NULL인 경우(=NULL은 사용할 수 없음)

### 논리연산자
- AND
- OR
- NOT

### 부정비교연산자
- !=
(같지 않다)
- NOT 칼럼명= a
(칼럼명의 값과 a가 같지 않다)
- NOT 칼럼명 > a
(a보다 칼럼명의 값이 크다)

### 부정SQL연산자
- NOT BETWEEN a AND b
(a와 b사이에 있지 않다. a,b 포함하지 않음)
- NOT IN(a,b,c)
(a,b,c값과 일치 하지 않음)
- IS NOT NULL
(NULL 값을 갖지 않음, !=NULL 사용불가)

## 2.비교연산자

- STRING은 ''나 ""으로 묶어서 사용
- 숫자는 "",''사용 안 함

예제)

COFFEELIST 테이블에서 브랜드가 스타벅스 커피중에 가격이 5000원 이하이고 용량이 200m이상인 커피의 브랜드, 종류, 가격, 용량순으로 조회하시오.
```sql
SELECT 브랜드, 종류, 가격 FROM COFFEELIST
WHERE 브랜드 = '스타벅스' AND 가격 <=5000 AND 용량 >=200;
```

### 문자유형 비교방법
**CHAR VS CHAR**
- 길이가 다른 CHAR은 작은쪽에 SPACE추가하여 비교
- 서로 다른 문자가 나올때 까지 비교
- 달라진 첫 문자의 값에 따라 크기 결정
- BLANK 수만 다르면 서로 같은 값으로 결정

**VARCHAR2 VS CHAR**
- 서로다른 문자가 나올때까지 비교
- 길이다 다르면 짧은것이 끝날때까지만 비교 후 길이가 긴 것이 긴것으로 결정
- 길이가 같고 같은것이 없으면 같은것으로 결정
- VARCHAR2는 NOT NULL까지 길이를 말함(?)

**NUMVER VS 문자열**
- 상수를 변수 타입과 동일하겨 변경 후 비교
- 변수쪽이 CHAR 유형 타입이면 CAHR VS CHAR 적용
- 변수쪽이 VARCHAR2유형 타입이면 VARCHAR2 VS CHAR 적용

## 3. SQL 연산자
- 모든 데이터 타입에 적용가능한 연산자 소개
### IN(a,b,c) 연산자
- ()안에든 조건 중 하나와 일치하면 참


예제1)
COFFEELIST 테이블에서 브랜드가 스타벅스, 커피빈, 이디아인 데이터를 모두 조회하시오.
```sql
SELECT * FROM COFFEELIST
WHERE 브랜드 IN('스타벅스', '커피빈', '이디아');
```

예제2)
COFFEELIST 테이블에서 브랜드가 스타벅스이면서 가격이 5000원 이거나, 브랜드가 이디아이면서 가격이 3000원인 커피 데이터를 모두 조회 하시오.
* 결과 데이터 : 스벅 5000원커피 , 이디아 3000원 커피
```sql
SELECT * FROM COFFEELIST
WHERE (브랜드, 가격) IN(('스타벅스',5000),('이디아', 3000));
```

예제3)
COFFEELIST 테이블에서 브랜드가 스타벅스이거나 이디아이고, 가격이 5000원이거나 3000원인 데이터를 모두 조회하시오.
(예제2번과 결과가 다르다 비교하길)
* 결과 데이터 : 스벅 5000원 커피, 스벅 3000원커피, 이디아 5000원 커피, 이디아 3000원 커피
```sql
SELECT * FROM COFFEELIST
WHERE 브랜드 IN('스타벅스','이디아') OR 가격 IN(5000, 3000);
```

### LIKE 연산자
- %는 아무 데이터나 다 받음
- _는 한표시당 한 글자만 받음

예제)
COFFEELSIST테이블에서 종업원 성이 김 씨인 커피점 조회하시오.
```sql
SELECT * FROM COFFEELIST
WHERE 종업원 LIKE '김%';
```

### BETWEEN a AND b 연산자

예제)
COFFEELIST테이블에서 가격이 3000에서 5000원인 데이터 조회.
* 결과값 : 커피가격이 3000원이상 5000원이하인 커피 데이터 리스트

```sql
SELECT * FROM COFFEELIST
WHERE 가격 BETWEEN 3000 AND 5000;
```

### IS NULL 연산자
- NULL 과 수치 연산은 NULL값 리턴
- NULL과 비교연산은 FALSE리턴
- 특정값과 비교할 수 없고 크기 비교 불가

```sql
SELECT * FROM COFFEELIST
WHERE 브랜드 = NULL;
--결과값 : 선택된 레고드가 없음. (브랜드 = NULL)이 FALSE이기 때문

SELECT * FROM COFFEELIST
WHERE 브랜드 IS NULL;
--결과값 : 브랜드칼럼에 NULL이 들어가있는 데이터 조회
```

## 4. 논리연산자
### AND
해당되는 조건이 모두 참이어야 참
### OR
앞뒤의 조건 중 하나라도 참이면 참
### NOT
뒤에오는 조건과 반대되는 결과 리턴
- 연산자의 우선순위
(), NOT, AND, OR 순서이므로 ()를 적절히 사용하여 원하는 조건을 형성해야함

## 5. 부정연산자
### 논리부정연산자
### 부정 SQL연산자

## 6. ROWNUM
### ROWUNUM
- 임시로 부여되는 행 번호
- 테이블에서 원하는 행만 가져올때 WHERE절에서 행의 개수를 제한하는 목적으로 사용

```sql
--1행만 가져올때
SELECT * FROM COFFEELIST WHERE ROWNUM=1;
SELECT * FROM COFFEELIST WHERE ROWNUM<=1;
SELECT * FROM COFFEELIST WHERE ROWNUM<2;

--2행 이상 가져올때
SELECT * FROM COFFEELIST WHERE ROWNUM<=3;
SELECT * FROM COFFEELIST WHERE ROWNUM=3;--이건 사용불가(무조건 1행부터 데이터를 가져오기때문)
--고유한 키나 인덱스로 활용가능
UPDATE MY_TABLE SET COLUMN1 = ROWNNUM;

[SQL] TCL(TRANSACTION CONTROL LANGUAGE)

1.개요

  • 데이터베이스의 논리적 연산단위
  • 한 개 이상의 데이터베이스 조작단위(하나 이상의 SQL구문포함)
  • ALL OR NOTHING개념
  • 특성 :
    • 원자성(atomicity)-정의된 연산이 모두 성공해야함.하나라도 실패시 모두 실행하지 않음.
    • 일관성(consistency)-실행전에 내용잘못이 없다면 실행후 데이터베이스의 내용에 잘못이 있으면 안 됨
    • 고립성(isolation)-다른 트랜잭션의 영향을 받으면 안 됨
    • 지속성(durability)-성공한 트랜잭션이 생신한 데이터베이스내용은 영구적으로 저장

2.COMMIT

COMMIT

  • 입력이나 수정한 자료를 저장하고싶을때 COMMIT명령을 내려 저장
    (COMMIT전)
  • BUFFER에만 영향을 받았기에 데이터 변경 이전상태로 복구가능
  • 현재 사용자가 SELECT 문장으로 결과 확인 가능
  • 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없음
  • 변경된 행은 잠금(LOCKING)이 설정되어 다른 사용자가 변경할 수없음
    (COMMIT후)
  • 데이터 변경사항이 데이터베이스에 반영
  • 이전데이터 영구삭제
  • 모든 사용자가 결과 확인가능
  • 관련된 행의 잠금이 해제, 다른사용자들이 조작가능
1
2
-- 데이터 수정 변경 후
COMMIT;

AUTO COMMIT(SQL Sever방식)

  • DDL,DML이 수행될 때마다 DBMS가 트랜잭션 컨트롤하는방식,
    명령이 성공적으로 수행되면 자동으로 COMMTI,
    실패하면 ROLLBACK됨

암시적트랜잭션(ORACLE방식)

  • 트랜젝션 시작은 DBMS가, 끝은 사용자가 COMMIT, ROLLBACK으로 처리

명시적트랜잭션

  • 트랜젝션 시작과 끝을 사용자가 BEGIN TRANSACTION || COMMIT TRANSACTION ,
    ROLLBACK TRANSACTION으로 처리

3.ROLLBACK

ROLLBACK

  • 데이터 이전상태로 복구, 관련된 행에 대한 잠금이 풀림
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    --데이터 수정 변경 후
    ROLLBACK;
    ```

    ## 4.SAVEPOINT
    ### SAVEPOINT
    - ROLLBACK이 실행될 저장점을 지정
    - 복수저장점 정의가능
    - 먼저 정의된 SAVEPOINT로 롤백할 경우 이후 저장된 SAVEPOINT로 되돌릴 수 없음
    - DDL문장을 실행하면 자동커밋됨
    - DML 명령 후 DDL명령을 입력시 DML, DDL 명령모두 자동커밋
    - 데이터베이스 정상종료하면 자동 커밋
    - 어플리케이션 이상 종료는 자동 롤백
    ```sql
    SAVEPOINT SVPT1;
    ROLLBACT TO SVPT1;

    SAVE TRANSACTION SVPT2;
    ROLLBACK TRANSACTION SVPT2;

[SQL] DML(DATA MANIPULATION LANGUAGE)

생성된 테이블안에 데이터를 입력, 수정,삭제, 조회 하는 언어

  • AUTO COMMIT이 되질 않음
  • 입력후 COMMIT하면 저장, ROLLBACK하면 SAVEPOINT나 제일 최근 COMMIT전으로 돌아감

1. INSERT

INSERT

  • 한번에 한건의 행만 입력됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--원하는 칼럼에만 데이터 입력하는 방법
--칼럼명 입력하지 않은 칼럼은 NULL이나 DEFALUT값 입력됨
INSERT INTO 테이블명 (칼럼명1, 칼럼명2, ... , 칼럼명N)
VALUES (값1, 값2,..., 값N);

--테이블에 설정된 모든 컬럼에 데이터 입력하는 방법
--생성한 컬럼 순서대로 모든 값을 입력

INSERT INTO 테이블명
VALUES (값1, 값2, ...,값N);
```

## 2.UPDATE

### UPDATE
- 데이터 수정
- WHERE절을 사용하지 않으면 컬럼 전체가 수정할 값으로 변경됨


```sql
UPDATE 테이블명 SET 수정할값이있는컬럼명 = 수정할값 [WHERE 조건입력];

3.DELETE

DELETE

  • 데이터삭제
  • WHERE절 사용하지 않으면 컬럼전체 DATA가 삭제됨
1
DELETE [FROM] 테이블명 [WHERE 조건입력];

4. SELECT

SELECT

  • 사용자가 입력한 데이터 조회
  • DISTINCT옵션(ALL은 DEFAULT옵션임) : 중복된 데이터가 있으면 1번만 출력
  • *은 WILDCARD 모든 컬럼
  • ALIAS 컬럼에 별명붙이기: 컬럼바로 뒤에 옴, AS 생략가능
    ""는 공백, 특수문자를 포함할경우, 대소문자 구별이 필요할 경우 사용
    
  • 테이블에 있는 모든 데이터 조회(WILDCARD * 사용)
1
SELECT [ALL | DISTINCT]  * FROM 테이블명
  • 테이블에 있는 원하는 컬럼에 있는 데이터 조회(+별명붙이기)
1
2
SELECT 컬럼명1 [[AS] "벌명1"], 컬럼명2 [[AS] "별명2"], ..., 컬럼명3 [[AS] "별명3"] 
FROM 테이블명;
  • DISTINCT옵션
1
SELECT DISTINCT 칼럼명1 FROM 테이블명;

5.산술연산자 합성연산자

산술연산자(NUMBER자료형에 사용)

()연산자 우선순위 괄호
‘* ‘
‘/‘
‘+’
‘-‘

(CONCATENATION)합성연산자

  • 문자와 문자의 연결 ‘||’ 사용
  • CONCAT(STRING1, STRING2)
  • 칼럼과 문자 또는 다른 칼럼과 연결
  • 문자표현식의 결과의해 새로운 칼럼 생성
  • 산술연산자 예제
1
2
3
4
5
6
7
SELECT 칼럼명(숫자데이터타입)-칼럼명(숫자데이터타입) AS 차이 FROM 테이블명;
```

- 합성연산자 예제

```sql
SELECT 칼럼명(STRING데이터타입) || 칼럼명(STRING데이터타입) AS 문자열합 FROM 테이블명;

[SQL] DDL(Data Definiation Language)

*자동으로 COMMIT됨(AUTO COMMIT)

1.자주쓰이는 데이터 유형

CHARCTER(s)

  • 고정길이 문자열정보
  • (s)만큼의 최대 고정길이를 갖고 할당된 변수값의 길이가 s보다 작을때는 공백으로 채움
  • ‘AA’=’AA ‘

VARCHAR2(s)

  • 가변길이 문자열정보
  • s만큼 최대값 입력가능, s이하의 변수길이값입력시 변수길이만큼 바이트적용
  • ‘AA’ != ‘AA ‘

NUMBER-정수, 실수 등 숫자정보

  • NUMBER(4,2) 8은 전체자리수, 2는 소수점 자리수(1234.56)를 나타냄

DATE-날짜와 시각정보

  • 1초돤위로 관리*

2.CREATE TABLE

테이블 생성식

1
2
3
4
5
6
CREATE TABLE TABLENAME(
COLUMNNAME1 DATATYPE [DEFAULT 형식] [NULL || NOT NULL],
COLUMNNAME2 DATATYPE [DEFAULT 형식] [NULL || NOT NULL],
...
COLUMNNAMEN DATATYPE [DEFAULT 형식] [NULL || NOT NULL]
);

테이블 생성시 주의사항

  • 벤더에서 정의한 예약어는 쓸 수 없음
  • A-Z(대소문자), 0-9, _, $, # 문자만 허용됨
  • 테이블명 칼럼명 첫 글자는 반드시 문자로 와야함

제약조건(CONSTRAINT)

  • 사용자가 원하는 조건의 데이터남 유지하기위한, 데이터 무결성을 유지하기위해 특정 칼럼에 설정하는 제약
  • 테이블 생성시 추가하거나 테이블 생성후 ALTER TABLE 이용해서 추가할 수 있음
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
32
33
34
35
36
ALTER TABLE MEMBERS ADD CONSTRAINT CK_MEMBERS_POINT CHECK(POINT<10) NOVALIDATE;#PRIMARY KEY(기본키)-각 행의 고유의 식별 데이터-하나의 테이블당 한개만 설정 가능-NULL 입력 불가능#UNIQUE KEY(고유키)-행데이터를 고유하게 식별하기 위한 키-테이블당 여러개 설정 가능-NULL 입력 가능--기본키 및 외래키(TABLENAME1이름의 테이블이 생성되어 있다고 가정) 입력방법1
CREATE TABLE TABLENAME(
COLUMNNAME1 DATATYPE [DEFAULT 형식] [NOT NULL],
COLUMNNAME2 DATATYPE [DEFAULT 형식] [NOT NULL],
...
COLUMNNAMEN DATATYPE [DEFAULT 형식] [NOT NULL],

CONSTRAINT PK_TABLENAME_COLUMNNAME1 PRIMARY KEY(COLUMNNAME1),
CONSTRAINT FK_TABLENAME_COLUMNNAME2 FOREGIN KEY(COLUMNNAME2)
REFERENCES TABLENAME2(COLMNUMNAME1)

);
--기본키 입력방법2
CREATE TABLE TABLENAME(
COLUMNNAME1 DATATYPE PRIMARYKEY [NOT NULL],
COLUMNNAME2 DATATYPE [DEFAULT 형식] [NOT NULL],
...
COLUMNNAMEN DATATYPE [DEFAULT 형식] [NOT NULL],

);

--기본키 및 외래키(TABLENAME1이름의 테이블이 생성되어 있다고 가정) 입력방법3
--테이블 생성 후(테이블 명 = TABLENAME)
ALTER TABLE TABLENAME
ADD CONSTRAINT PK_TABLENAME_COLUMNNAME1 PRIMARYKEY(COLUMNNAME1);

ALTER TABLE TABLENAME
ADD CONSTRAINT FK_TABLENAME_COLUMNNAME2 FOREGIN KEY(COLUMNNAME2)
REFERENCES TABLENAME2(COLMNUMNAME1)

--기본키 및 외래키 삭제
ALTER TABLE TABLENAME
DROP CONSTRAINT PK_TABLENAME_CONLUNMNAME1;

ALTER TABLE TABLENAME
DROP CONSTRAINT FK_TABLENAME_CONLUMNNAME2;

NOT NULL

  • NULL 값 입력금지
  • DEFAULT상태에서는 NULL 허가
  • NULL : 공백(“”), 숫자0이 아님, 정의되지 않은 미지의 값, 현재 데이터를 입력하지 못하는 경우
    NULL + 0 = NULL;
    NULL + ‘CHAR’ = NULL;

CHECK

  • 입력할수 있는 값의 범위를 제한

FOREIGN KEY(외래키)

  • 관계형데이터베이스에서 테이블간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우 외래키 생성
  • 외래키 지정시 참조 무결성 제약옵선 선택가능

생성된 테이블 구조확인

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
DESCRIBE TABLENAME;
DESC TABLENAME;
```

### SELECT 문장을 통한 테이블 생성
TABLENAME과 같은 내용의 테이블 TABLENAME1을 복사해서 생성

```sql
CREATE TABLE TABLENAME1
AS SELECT * FROM TABLENAME;
```

## 3.ALTER TABLE

### ADD COLUMN
- 테이블에 컬럼 추가
- 추가된 칼럼은 테이블의 마지막 컬럼이 되고 컬럼위치를 지정하는것은 불가능

```sql
ALTER TABLE TABLENAME
ADD NEWCOLUMNNAME DATATYPE;
```

### DROP COLUNM
- 컬럼 삭제
- 데이터유무에 상관없이 삭제 가능
- 한번에 하나의 칼럼만 삭제가능
- 삭제후 최소 하나이상의 칼럼이 테이블에 존재해야함
- 삭제된 갈럼은 복구 불가능

```sql
ALTER TABLE TABLENAME
DROP COLUMN COLUMNNAME1;
```

### MODIFY COLUMN
- 칼럼 데이터 유형, 디폴트값(DEFAULT), NOT NULLL 제약조건 변경
- 칼럼의 크기를 늘릴 수는 있지만 줄일수는 없음(기존데이터 훼손방지)
- 칼럼이 NULL 값만 가지고 있으면 데이터 유형 변경가능\
- 칼럼에 행이 없거나 NULL값만 가지고 있으면 칼럼의 폭 줄이기 가능
- DEFALUT값 변경시, 변경작업 이후 발생하는 행 삽입에만 영향을 미침
- 칼럼에 NULL값이 없을 경우에만 NOT NULL 제약조건을 추가할 수 있음

```sql
ALTER TABLE TABLENAME
MONIFY (COLUMNNAME1 DATATYPE [DEFAULT] [NOT NULL],
COLUMNNAME2 DATATYPE [DEFAULT] [NOT NULL],
...
COLUMNNAMEN DATATYPE [DEFAULT] [NOT NULL]
);
```

### RENAME COLUMN
- 칼럼명 변경
- 해당 칼럼과 관계된 제약조건이 자동으로 변경

```sql
ALTER TABLE TABLENAME
RENAME COLUMN COLUMNNAME TO NEWCOLUMNNAME;

DROP CONSTRAINT

  • 테이블 생성시 부여했던 제약조건 삭제
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
ALTER TABLE TABLENAME
DROP CONSTRAINT PK_TABELNAME_COLUMNNNAME;
```

### ADD CONSTRAINT
- 제약조건 추가
- 외래키설정하면 참조된 테이블의 데이터 삭제가 불가능 할수도 있음

```sql
ALTER TABLE TALBENAME
ADD CONSTRAINT PK_TALBENAME_COLUMNNAME PRIMARY KEY(COLUMNNAME);

ALTER TABLE TABLENAME
ADD CONSTRAINT FK_TABLENAME_COLUMNNAME
FOREGIN KEY(COLUMNNAME) REFERENCES TABLENAME1(COLUMNNAME1);
```


## 4. RENAEM TABLE
### RENAME TABLE
- 테이블 이름변경

```sql
RENAME TABLE TABLENAME TO NEWTABLENAME;
```


## 5.DROP TABLE
### DROPT TABLE
- 테이블 삭제
- CASCADE CONSTRAINT는 해당 테이블과 관계있던 참조 제약조건도 삭제한다는 뜻

```sql
DROP TABLE TABLENAME [CASCADE CONSTRAINT];
```

## 6. TRUNCATE TABLE

### TURNCATE TABLE
- 테이블의 모든 행(데이터)삭제
- DML로 분류할수도 있지만 AOUTO COMMIT특성이 있어 DDL로도 구분가능
- DELETE와는 다름
- 정상적인복구가 불가능

```sql
TURNCATE TABLE TABLENAME;
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×