SQL 첫걸음 19-21강 정리
20 Jan 2020책을 보면서 공부한 내용 복습 및 정리
기본설정
- Mysql 서버 켜기
- Mysql 실행하기
- sample database 사용 설정하기
$ mysql.server start
$ sudo mysql
mysql> use sample;
19강 물리 삭제와 논리 삭제
데이터베이스에서 데이트를 삭제할 때는 ‘물리 삭제’와 ‘논리 삭제’ 두 가지 방법이 있다. 먼저 물리 삭제는 DELETE
명령어를 이용해 직접 데이터를 삭제하는 방법이다. 논리 삭제는 테이블에 삭제플래그 같은 열을 준비하여 데이터를 삭제하는 대신 UPDATE
명령어를 이용해 삭제플래그의 값을 변경하는 방식이다. 실제 테이블에는 데이터가 남아 있지만 SELECT를 할 때 삭제플래그에 값이 있는 데이터를 제외하고 가져오도록 한다.
no | a | 삭제플래그 |
---|---|---|
1 | ABC | 0 |
2 | DEF | 0 |
3 | GHI | 1 |
논리 삭제는 데이터를 삭제하지 않으므로 삭제 전으로 간단하게 되돌릴 수 있다는 장점이 있지만 저장공간을 절약할 수 없다는 단점이 있다.
20강 COUNT
SQL의 대표적인 집계함수는 아래의 5가지이다. 일반적인 함수는 인수로 하나의 값을 지정하는 반면에, 집계함수는 인수로 집함을 지정한다.
COUNT(집합)
SUM(집합)
AVG(집합)
MIN(집합)
MAX(집합)
그 중 행의 개수를 셀 때 사용하는 COUNT를 사용해보도록 한다. COUNT의 인수로 *가 지정되어 있는데 이는 모든 열, 즉 테이블 전체라는 의미를 가진다.
집계 함수의 특징은 여러 개의 값에서 하나의 값을 계산한다는 것이다. 그러므로 집계 함수를 SELECT 구에 쓰면 WHERE 구의 유무와 상관없이 하나의 결과값을 반환한다.
name이 A인 데이터를 모두 가져오면 총 2개의 행을 불러오며 각 열의 값을 알 수 있다. 이 때 같은 WHERE 구를 지정하여 COUNT로 가져오면 결과는 행의 개수 하나만 반환한다.
COUNT의 인수로 각 열을 지정할 수도 있다. 열을 지정할 때는 그 열에 한해서 행의 개수를 구하는데 이럴 때는 NULL 값을 제외하고 처리한다. 아래 예에서는 COUNT에서 각각 no와 name의 개수를 세도록 하고 있다. name 열은 NULL이 있는데 이 값은 제외해서 처리한 것을 볼 수 있다.
sample51에는 name이 중복되는 값이 있다. 중복된 값을 제거할 때는 DISTINCT
를 사용한다. 아래 예에서는 ALL
도 함께 사용하고 있다. ALL은 중복 유무와 관계없이 모든 행을 반환한다.
DISCTINCT나 ALL을 집계 함수와 함께 사용할 때는 집계 함수의 인수에 포함하여 사용한다. 아래 예에서는 집계 함수에 ALL과 DISTINCT를 사용하였다. ALL은 생략해도 결과는 같다.
21강 COUNT 이외의 집계함수
COUNT 이외에도 SUM, AVG, MIN, MAX도 마찬가지로 ALL 또는 DISTINCT와 함께 사용할 수 있다.
SUM
SUM은 집합의 합계를 구하는 함수이다. SUM에 지정할 수 있는 집합은 수치형 뿐으로 문자열이나 날짜시간형은 SUM에서 사용할 수 없다. 또한, COUNT와 마찬가지로 NULL을 제외한 값을 합계로 낸다.
AVG
AVG는 평균을 구하는 함수이다. 역시 수치형만 가능하며 NULL값을 무시한다. 만약 NULL값을 0으로 간주하고 싶다면 CASE
를 사용하여 NULL을 0으로 변환한 후 사용하면 된다.
SELECT AVG(CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) AS avg FROM sample51;
MIN & MAX
MIN과 MAX는 최소값과 최대값을 구하며 NULL을 무시하는 규칙은 같고 대신 문자열형과 날짜시간형에도 사용할 수 있다는 점이 다르다.