[데이터베이스 & SQL 첫걸음] 9주차 공부

김서영·2021년 11월 5일
0

SQL 문의 기본

데이터를 갱신, 삽입, 제거해보자

데이터 갱신에는 UPDATE
데이터 삽입에는 INSERT
데이터 제거에는 DELETE

데이터를 변경하는 UPDATE문

UPDATE 테이블명 SET 열명 = 값;
UPDATE 테이블명 SET 열명 = 값 WHERE 조건;

데이터를 입력하는 INSERT문

INSERT INTO 테이블명(열1[,열2,...]) VALUES (값1[,값2,...]);

데이터를 제거하는 DELETE문

DELETE FROM 테이블명;
DELETE FROM 테이블명 WHERE 조건;

뷰를 작성하고 복수 테이블에서 선택해 보자

뷰, View

CREATE VIEW 뷰 명 (열명1[,열명2,...]) AS SELECT문;

장점

  1. 복잡한 SELECT문을 일일이 매번 기술할 필요X
  2. 필요한 열과 행만 사용자에게 보여줄 수 있고, 갱신 시에도 뷰 정의에 따른 갱신으로 한정할 수 있음.
  3. 1과 2의 이점을 데이터 저장 없이 실현 가능. 뷰를 제거해도 참조하는 테이블은 영향을 받지 않음.

한계

뷰로의 입력과 갱신에는 몇가지 제한이 붙음. 기본적으로는 어떤 행이 대응하는 지 모르거나 어떤 값을 넣으면 좋을지 모르는 경우에는 갱신할 수 없음.

서브쿼리

메인(주)쿼리와 대비해 SELECT문의 결과를 마치 데이터처럼 다루거나 수치처럼 취급해 조건문에 이용.

결합

2개 이상의 테이블을 대상으로 실행할 때 이용되는 결합.
하나의 테이블에 있는 열만으로는 데이터가 충족되지 않는 경우에 열을 가지고 오는 조작.

  • 내부 결합
  • 외부 결합

내부 결합, Inner Join

지정한 결합 조건에 일치하는 행만을 2개의 테이블로부터 가져옴.
WHERE, ORDER BY, LIMIT, GROUP BY, HAVING 지정.
SELECT 선택하고 싶은 열 리스트 FROM 첫번째 테이블명 INNER JOIN 두번째 테이블명 ON 결합 조건;

외부 결합, Outer Join

한 쪽 테이블을 기준으로 전체 행을 표시하고 다른 테이블은 값이 있으면 표시. LEFT OUTER JOIN시, 왼쪽 테이블(첫번째 테이블)이 기준이 되어 전체 행이 표시. 다른 테이블의 행 데이터는 결합 조건과 일치할 때 그 값이 되고, 일치하는 것이 없으면 NULL.

SELECT 선택하고 싶은 열 리스트 FROM 첫번째 테이블명 LEFT OUTER JOIN 두번째 테이블명 ON 결합 조건;

집계와 서브쿼리

대표적인 집계 함수

  • COUNT(집합)
  • SUM(집합)
  • AVG(집합)
  • MIN(집합)
  • MAX(집합)

행 개수 구하기 - COUNT

COUNT로 행 개수 구하기

COUNT(집합)
SELECT COUNT(*) FROM 테이블명;
몇 개의 행이 있는 지를 반환.

SELECT 구는 WHERE 구보다 나중에 내부적으로 처리 되어,
WHERE 구로 조건을 지정하면, 테이블 전체가 아닌 검색된 행이 COUNT로 계산.

집계함수와 NULL값

집계함수는 집합 안에 NULL값이 있을 경우 무시함.
다만, COUNT(*)의 경우 모든 열의 행수를 카운트하기 때문에 NULL값이 있어도 해당 정보가 무시되지 않음.

Sample21 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4NULLNULL

SELECT COUNT(no),COUNT(name) FROM Sample21;

COUNT(no)COUNT(name)
43

DISTINCT로 중복 제거

중복된 값을 제거하는 함수, DISTINCT.
DISTINCT는 예약어로 열명이 아님.
ALL과 DISTINCT 중 어느 것도 지정하지 않은 경우에는 중복된 값이 제거되지 않음. 즉, 생략할 경우에는 ALL로 간주.

Sample21 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4NULLNULL

SELECT ALL name FROM Sample21;

name
A
A
B
NULL

SELECT DISTINCT name FROM Sample21;

name
A
B
NULL

집계함수에서 DISTINCT

name 열에서 NULL 값을 없애고, 중복하지 않은 데이터의 개수를 구하는 경우.

ALL과 DISTINCT는 인수가 아니므로 콤마를 붙이지 않음.

Sample21 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4NULLNULL

SELECT COUNT(ALL name), COUNT(DISTINCT name) FROM Sample21;

COUNT(ALL name)COUNT(DISTINCT name)
32

COUNT 이외의 집계함수

  • SUM( [ALL|DISTINCT] 집합)
  • AVG( [ALL|DISTINCT] 집합)
  • MIN( [ALL|DISTINCT] 집합)
  • MAX( [ALL|DISTINCT] 집합)

SUM으로 합계 구하기

집합의 합계를 구함.
SUM 집계함수에 지정되는 집합은 수치형 뿐임. 문자열형이나 날짜시간형은 안됨. COUNT값처럼 NULL값을 무시함.

Sample51 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

SELECT SUM(quantity) FROM Sample51;

SUM(quantity)
16

AVG로 평균내기

AVG 집계함수로 집합의 평균값을 구할 수 있음. NULL값 무시하여, NULL값을 제외하고 평균값을 계산함. NULL값을 0으로 간주해서 평균을 내고 싶으면 CASE를 사용하여 NULL을 0으로 변환한 뒤 사용.

Sample51 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

SELECT AVG(quantity), SUM(quantity)/COUNT(quantity) FROM Sample51;

AVG(quantity)SUM(quantity)/COUNT(quantity)
4.00004.0000

SELECT AVG(CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) AS avgnull0 FROM Sample51;

avgnull0
3.2000

MIN.MAX로 최솟값.최댓값 구하기

MIN 집계함수, MAX 집계함수는 최솟값과 최댓값을 구할 수 있음.
문자열형과 날짜시간형에도 사용할 수 있음. NULL값을 무시함.

Sample51 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

SELECT MIN(quantity), MAX(quantity), MIN(name), MAX(name) FROM Sample51;

MIN(quantity)MAX(quantity)MIN(name)MAX(name)
110AC

그룹화 - GROUP BY

SELECT * FROM 테이블명 GROUP BY 열1, 열2, ...

GROUP BY로 그룹화

Sample51 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

name 열에서 같은 값을 가진 행끼리 한데 묶어 그룹화한 집합을 집계함수로 넘겨줄 수 있음.

SELECT name FROM Sample51 GROUP BY name;

name
A
B
C
NULL

DISTINCT를 지정했을 때와 같은 결과.
GROUP BY 구에 열을 지정하여 그룹화하면 지정된 열의 값이 같은 행이 하나의 그룹으로 묶임.

중복을 제거하는 DISTINCT와 그룹화하는 GROUP BY의 차이점

GROUP BY 구를 지정하는 경우에는 집계함수와 함께 사용하지 않으면 별 의미가 없음.

Sample51 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

SELECT name, COUNT(name), SUM(quantity) FROM Sample51 GROUP BY name;

nameCOUNT(name)SUM(quantity)
NULL0NULL
A23
B110
C13

HAVING 구로 조건 지정

집계함수는 WHERE 구의 조건식에서 사용할 수 없음.
집계한 결과에서 조건에 맞는 값을 따로 걸러내기 위해 SELECT 명령에서는 HAVING 구가 있음.

내부 처리 순서

WHERE구->GROUP BY구->HAVING구->SELECT구->ORDER BY구
WHERE 구로 행을 검색하는 처리가 GROUP BY로 그룹화하는 처리보다 순서상 앞임.
또한, SELECT 구보다도 먼저 처리되어 별명을 사용할 수 없음.

Sample51 테이블이 아래와 같을 때,

nonamequantity
1A1
2A2
3B10
4C3
5NULLNULL

SELECT name, COUNT(name) FROM Sample51 GROUP BY name HAVING COUNT(name)=1;

nameCOUNT(name)
B1
C1

복수열의 그룹화

GROUP BY에서 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 지정할 수 없음. (에러 발생)

결괏값 정렬

GROUP BY 지정을 해도 정렬이 되지 않기 때문에 ORDER BY 사용.

profile
하지만 저는 이겨냅니다. 김서영이죠?

0개의 댓글