티스토리 뷰

반응형

COUNT로 행 갯수 구하기

SELECT COUNT(*) FROM 테이블명 [WHERE 열명=조건];
//테이블에 존재하는 [조건을 만족하는] 모든 행의 갯수

SELECT COUNT(열명1), COUNT(열명2) FROM 테이블명;
//열명1과 열명2의 갯수를 별도로 센다.
//NULL은 집계함수가 세지 않는다.

DISTINCT로 중복 제거하기

SELECT ALL 열명 FROM 테이블명;
SELECT 열명 FROM 테이블명;
//ALL 키워드는 기본값이다.
//모든 열 조회

SELECT DISTINCT 열명 FROM 테이블명;
//중복된 값을 제거하여 조회한다.

SELECT COUNT(DISTINCT 열명) FROM 테이블명;
//중복값을 제거하고 행의 갯수를 센다.

SUM으로 합계 구하기

SELECT SUM(열명) FROM 테이블명;
//열의 합계를 구하여 출력한다.
//NULL 값은 무시한다.

AVG로 평균내기

SELECT AVG(열명) FROM 테이블명;
//열의 평균을 구하여 출력한다.
//NULL 값은 무시한다.

SELECT AVG(CASE WHEN 열명 IS NULL THEN 0 ELSE 열명 END)
FROM 테이블명;
//NULL을 0으로 간주하고 싶다면 CASE문을 이용한다.

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

SELECT MIN(열명) FROM 테이블명;
SELECT MAX(열명) FROM 테이블명;

GROUP BY로 그룹화하기

  • GROUP BY는 다른 집계함수와 같이 쓰인다.
  • 집계함수를 잘 쓰기 위해서는 GROUP BY를 적절하게 사용할 줄 알아야 한다.
  • GROUP BY에서 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 지정할 수 없다. (어떤 행을 출력해야 하는지 알 수 없기 때문) ex) SELECT 열명1, 열명2 FROM 테이블명 GROUP BY 열명1;
SELECT * FROM 테이블명 GROUP BY 열명;
//명시한 열명에 대해서 같은 열명을 쓰는 경우 하나의 그룹으로 취급한다.
//마치 DISTINCT를 지정했을 때처럼

SELECT COUNT(열명1), SUM(열명2) FROM 테이블명 GROUP BY 열명3;
//GROUP BY는 다른 집계함수와 쓰여야 그 힘을 발휘한다.
//열명3이 같은 경우로 묶어서 COUNT(열명1), SUM을(열명2)를 계산한다.

HAVING 구로 '집계함수'의 조건걸기

  • WHERE 구에서는 집계함수를 사용할 수 없다.
    • WHERE 구 → GROUP BY 구 → SELECT 구 → ORDER BY구 순서로 처리되기 때문이다.
    • (그러므로, ORDER BY구에서는 HAVING 구 없이 집계함수를 사용할 수 있다.)
SELECT 열명 FROM 테이블 GROUP BY 열명
HAVING COUNT(열명) = 1;
//열명의 COUNT집계가 1인 경우만 조회한다. 

서브쿼리

  • 서브쿼리란 SQL 명령문 안에서 SQL 문을 괄호로 묶어 지정하는 방식.
DELETE FROM 테이블명 WHERE 열명 = (SELECT MIN(열명) FROM 테이블명));
//'열명'에 해당하는 값중 가장 작은 값을 삭제하는 쿼리
//참고로 MySQL에서는 실행되지 않는다. 

DELETE FROM 테이블명 WHERE 열명 = (SELECT 열명 FROM
(SELECT MIN(열명) AS 열명 FROM 테이블명) AS x);
//MySQL에서는 인라인 뷰로 임시 테이블을 만들도록 해야 한다.

SELECT 
    (SELECT COUNT(*) FROM 테이블명1) AS t1,
    (SELECT COUNT(*) FROM 테이블명2) AS t2;
//서브쿼리를 이용한 조회
//Oracle 등에서는 뒤에 'FROM 테이블명'을 생략할 수 없다.

UPDATE 테이블명 SET 열명 = (SELECT MAX(열명) FROM 테이블명);
//서브쿼리를 이용한 갱신

SELECT * FROM (SELECT * FROM 테이블명) [AS] sq;
//FROM 구에서 쓰인 서브쿼리
//sq는 테이블의 별명이다. (subquery) 

INSERT INTO 테이블명 VALUES (
    (SELECT COUNT(*) FROM 테이블명1),
    (SELECT COUNT(*) FROM 테이블명2));
//VALUES 구에서 서브쿼리 사용하기.

클라이언트 변수

  • MySQL 클라이언트에 한해 변수를 다음과 같이 구현할 수 있다.
    set @a = (SELECT MIN(열명) FROM 테이블명);
    //@a라는 이름의 변수에 대입
    DELETE FROM 테이블명 WHERE 열명=@a;

스칼라 값

  • 단 하나의 열의, 단 하나의 값(행)만 존재하는 것을 '스칼라 값' 이라고 한다. 혹은 단일 값이라고도 한다.
  • 스칼라 값은 서브쿼리로서 사용하기 간편하다. = 연산자를 사용하여 비교하는 경우를 생각해보자.

EXISTS (데이터 존재 유무 확인)

  • 서브쿼리를 사용해 검색할 때 '데이터가 존재하는지 아닌지' 판별한다.
UPDATE 테이블명1 SET 열명1 = '있음' WHERE
    EXISTS (SELECT * FROM 테이블명2 WHERE 테이블명2.열명 = 테이블명1.열명2);
//EXISTS 구를 먼저 살펴보자!
//테이블명1에 열명1, 열명2가 존재할 때, 
//테이블명2_열명1과 테이블명1_열명2가 같은 경우 열명1을 '있음'으로 갱신한다.
  • EXISTS의 부정을 필요로 하는 경우, NOT EXISTS를 사용한다.
  • 열명이 중복되지 않으면 테이블명.열명 이 아닌 열명만을 사용할 수 있다.

상관 서브쿼리

  • 서브쿼리는 단독으로 실행될 수 있다.
  • 상관 서브쿼리는 단독으로 실행될 수 없다. 위의 EXISTS 구는 상관 서브쿼리다. 왜냐하면 테이블명1에 열명을 사용하고 있기 때문이다.

IN (집합간의 비교하기)

SELECT * FROM 테이블명 WHERE 열명 IN (3,5);
//마치 OR문을 사용하는 것처럼 3,5인 경우를 조회한다.

SELECT * FROM 테이블명 WHERE 열명 IN
    (SELECT 열명2 FROM 테이블명2);
//서비쿼리로 지정하기

참고도서
SQL 첫걸음 - 아사이 아츠시

반응형
댓글