데이터 갱신에는 UPDATE
데이터 삽입에는 INSERT
데이터 제거에는 DELETE
UPDATE 테이블명 SET 열명 = 값;
UPDATE 테이블명 SET 열명 = 값 WHERE 조건;
INSERT INTO 테이블명(열1[,열2,...]) VALUES (값1[,값2,...]);
DELETE FROM 테이블명;
DELETE FROM 테이블명 WHERE 조건;
CREATE VIEW 뷰 명 (열명1[,열명2,...]) AS SELECT문;
뷰로의 입력과 갱신에는 몇가지 제한이 붙음. 기본적으로는 어떤 행이 대응하는 지 모르거나 어떤 값을 넣으면 좋을지 모르는 경우에는 갱신할 수 없음.
메인(주)쿼리와 대비해 SELECT문의 결과를 마치 데이터처럼 다루거나 수치처럼 취급해 조건문에 이용.
2개 이상의 테이블을 대상으로 실행할 때 이용되는 결합.
하나의 테이블에 있는 열만으로는 데이터가 충족되지 않는 경우에 열을 가지고 오는 조작.
지정한 결합 조건에 일치하는 행만을 2개의 테이블로부터 가져옴.
WHERE, ORDER BY, LIMIT, GROUP BY, HAVING 지정.
SELECT 선택하고 싶은 열 리스트 FROM 첫번째 테이블명 INNER JOIN 두번째 테이블명 ON 결합 조건;
한 쪽 테이블을 기준으로 전체 행을 표시하고 다른 테이블은 값이 있으면 표시. LEFT OUTER JOIN시, 왼쪽 테이블(첫번째 테이블)이 기준이 되어 전체 행이 표시. 다른 테이블의 행 데이터는 결합 조건과 일치할 때 그 값이 되고, 일치하는 것이 없으면 NULL.
SELECT 선택하고 싶은 열 리스트 FROM 첫번째 테이블명 LEFT OUTER JOIN 두번째 테이블명 ON 결합 조건;
대표적인 집계 함수
COUNT(집합)
SELECT COUNT(*) FROM 테이블명;
몇 개의 행이 있는 지를 반환.
SELECT 구는 WHERE 구보다 나중에 내부적으로 처리 되어,
WHERE 구로 조건을 지정하면, 테이블 전체가 아닌 검색된 행이 COUNT로 계산.
집계함수는 집합 안에 NULL값이 있을 경우 무시함.
다만, COUNT(*)의 경우 모든 열의 행수를 카운트하기 때문에 NULL값이 있어도 해당 정보가 무시되지 않음.
Sample21 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | NULL | NULL |
SELECT COUNT(no),COUNT(name) FROM Sample21;
COUNT(no) | COUNT(name) |
---|---|
4 | 3 |
중복된 값을 제거하는 함수, DISTINCT.
DISTINCT는 예약어로 열명이 아님.
ALL과 DISTINCT 중 어느 것도 지정하지 않은 경우에는 중복된 값이 제거되지 않음. 즉, 생략할 경우에는 ALL로 간주.
Sample21 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | NULL | NULL |
SELECT ALL name FROM Sample21;
name |
---|
A |
A |
B |
NULL |
SELECT DISTINCT name FROM Sample21;
name |
---|
A |
B |
NULL |
name 열에서 NULL 값을 없애고, 중복하지 않은 데이터의 개수를 구하는 경우.
ALL과 DISTINCT는 인수가 아니므로 콤마를 붙이지 않음.
Sample21 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | NULL | NULL |
SELECT COUNT(ALL name), COUNT(DISTINCT name) FROM Sample21;
COUNT(ALL name) | COUNT(DISTINCT name) |
---|---|
3 | 2 |
집합의 합계를 구함.
SUM 집계함수에 지정되는 집합은 수치형 뿐임. 문자열형이나 날짜시간형은 안됨. COUNT값처럼 NULL값을 무시함.
Sample51 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | C | 3 |
5 | NULL | NULL |
SELECT SUM(quantity) FROM Sample51;
SUM(quantity) |
---|
16 |
AVG 집계함수로 집합의 평균값을 구할 수 있음. NULL값 무시하여, NULL값을 제외하고 평균값을 계산함. NULL값을 0으로 간주해서 평균을 내고 싶으면 CASE를 사용하여 NULL을 0으로 변환한 뒤 사용.
Sample51 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | C | 3 |
5 | NULL | NULL |
SELECT AVG(quantity), SUM(quantity)/COUNT(quantity) FROM Sample51;
AVG(quantity) | SUM(quantity)/COUNT(quantity) |
---|---|
4.0000 | 4.0000 |
SELECT AVG(CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) AS avgnull0 FROM Sample51;
avgnull0 |
---|
3.2000 |
MIN 집계함수, MAX 집계함수는 최솟값과 최댓값을 구할 수 있음.
문자열형과 날짜시간형에도 사용할 수 있음. NULL값을 무시함.
Sample51 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | C | 3 |
5 | NULL | NULL |
SELECT MIN(quantity), MAX(quantity), MIN(name), MAX(name) FROM Sample51;
MIN(quantity) | MAX(quantity) | MIN(name) | MAX(name) |
---|---|---|---|
1 | 10 | A | C |
SELECT * FROM 테이블명 GROUP BY 열1, 열2, ...
Sample51 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | C | 3 |
5 | NULL | NULL |
name 열에서 같은 값을 가진 행끼리 한데 묶어 그룹화한 집합을 집계함수로 넘겨줄 수 있음.
SELECT name FROM Sample51 GROUP BY name;
name |
---|
A |
B |
C |
NULL |
DISTINCT를 지정했을 때와 같은 결과.
GROUP BY 구에 열을 지정하여 그룹화하면 지정된 열의 값이 같은 행이 하나의 그룹으로 묶임.
GROUP BY 구를 지정하는 경우에는 집계함수와 함께 사용하지 않으면 별 의미가 없음.
Sample51 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | C | 3 |
5 | NULL | NULL |
SELECT name, COUNT(name), SUM(quantity) FROM Sample51 GROUP BY name;
name | COUNT(name) | SUM(quantity) |
---|---|---|
NULL | 0 | NULL |
A | 2 | 3 |
B | 1 | 10 |
C | 1 | 3 |
집계함수는 WHERE 구의 조건식에서 사용할 수 없음.
집계한 결과에서 조건에 맞는 값을 따로 걸러내기 위해 SELECT 명령에서는 HAVING 구가 있음.
WHERE구->GROUP BY구->HAVING구->SELECT구->ORDER BY구
WHERE 구로 행을 검색하는 처리가 GROUP BY로 그룹화하는 처리보다 순서상 앞임.
또한, SELECT 구보다도 먼저 처리되어 별명을 사용할 수 없음.
Sample51 테이블이 아래와 같을 때,
no | name | quantity |
---|---|---|
1 | A | 1 |
2 | A | 2 |
3 | B | 10 |
4 | C | 3 |
5 | NULL | NULL |
SELECT name, COUNT(name) FROM Sample51 GROUP BY name HAVING COUNT(name)=1;
name | COUNT(name) |
---|---|
B | 1 |
C | 1 |
GROUP BY에서 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 지정할 수 없음. (에러 발생)
GROUP BY 지정을 해도 정렬이 되지 않기 때문에 ORDER BY 사용.