[SQL] DQL / SELECT 기본 구문

Gabriela·2023년 7월 10일

[SQL] 데이터베이스

목록 보기
5/13
post-thumbnail

‣ DQL


  • 데이터 질의어 (Data Query Language)
  • 정의된 데이터베이스에서 데이터를 조회하는 역할을 수행하는 SQL문
  • 테이블(Table)이나 뷰(View) 등의 데이터베이스 객체에서 원하는 행(Row)을 조회하는 기능을 담당

⇢DQL 종류

  1. DQL에는 한 가지 쿼리문만 존재함 = SELECT
  2. SELECT문을 이용해 테이블에서 원하는 내용만 조회할 수 있음


‣ SELECT


⇢SELECT 실행순서

5 : SELECT 칼럼
1 : FROM 테이블
2 : WHERE 조건
3 : GROUP BY 그룹
4 : HAVING 그룹조건
6 : ORDER BY 정렬


SELECT 실행순서 예시

-- 사원 테이블에서 부서별 사원수를 조회하시오.
-- 가능
SELECT DEPARTMENT_ID, COUNT(*)  -- 3
  FROM EMPLOYEES                -- 1
 GROUP BY DEPARTMENT_ID;        -- 2
 
-- 불가능
SELECT DEPARTMENT_ID AS DEPT_ID, COUNT(*)  -- 3
  FROM EMPLOYEES                           -- 1
 GROUP BY DEPT_ID;                         -- 2 (GROUP BY 절이 실행되는 순서에서는 DEPT_ID가 존재하지 않기 때문에 오류가 발생)
-- 사원 테이블에서 부서별 연봉 평균과 사원수를 조회하시오. 부서별 사원수가 2명 이상인 부서만 조회하시오.
-- 불가능
SELECT DEPARTMENT_ID         AS 부서번호
     , ROUND(AVG(SALARY), 2) AS 평균연봉
     , COUNT(*)              AS 사원수    -- 4
  FROM EMPLOYEES                         -- 1
 GROUP BY DEPARTMENT_ID                  -- 2
HAVING 사원수 >= 2                        -- 3 (HAVING 절이 실행되는 순서에서는 "사원수"가 존재하지 않기 때문에 오류가 발생)
 ORDER BY DEPARTMENT_ID;                 -- 5

-- 가능
SELECT DEPARTMENT_ID         AS 부서번호
     , ROUND(AVG(SALARY), 2) AS 평균연봉
     , COUNT(*)              AS 사원수    -- 4
  FROM EMPLOYEES                         -- 1
 GROUP BY DEPARTMENT_ID                  -- 2
HAVING COUNT(*) >= 2                     -- 3
 ORDER BY 부서번호;                       -- 5 (ORDER BY 절이 실행되기 직전인 SELECT 절에서 "부서번호" 별명이 지정되었기 때문에 사용 가능)

⇢WHERE 절

  • WHERE 조건문
    • 테이블의 데이터 중에서 원하는 데이터만 선택적으로 조회하고자 할 때 사용하는 절
    • 칼럼 이름, 연산자, 상수 값, 표현식 등을 결합하여 다양한 형태로 작성

WHERE절에서 사용 가능한 데이터의 타입

  1. 문자 타입 : 문자는 작은 따옴표()로 묶어서 작성
  2. 숫자 타입 : 숫자는 그냥 작성
  3. 날짜 타입 : 날짜는 작은 따옴표()로 묶어서 작성하거나 TO_DATE / TO_TIMESTAMP 함수로 작성
  4. NULL : IS NULL 또는 IS NOT NULL

  • 상수 값은 대/소문자를 구분하므로 주의해야 함
    • WHERE MODEL = ‘A120’
    • WHERE MODEL = ‘a120’다른 조건식이므로 다른 결과가 조회됨

좋은 WHERE절 작성하기

  • (가능하면) 인덱스가 설정된 칼럼을 조건으로 사용할 것
    • PK, UNIQUE 칼럼은 자동으로 인덱스가 추가되므로 조건으로 사용하면 유리함
  • 등호(=) 왼쪽은 (가능하면) 가공하지 않고 그대로 사용할 것
    • 인덱스가 설정된 칼럼을 함수 등으로 가공하면 인덱스를 사용할 수 없음

⇢GROUP BY 절

  1. 같은 값을 가진 데이터들을 하나의 그룹으로 묶어서 처리한다.
  2. 통계를 내는 목적을 사용한다. (합계, 평균, 최댓값, 최솟값, 갯수 등)
  3. SELECT 절에서 조회하려는 칼럼은 "반드시" GROUP BY 절에 명시되어 있어야 한다.

GROUP BY 사용 예시

-- 1. 사원 테이블에서 동일한 부서번호를 가진 사원들을 그룹화하여 각 그룹별로 몇 명의 사원이 있는지 조회하시오.
SELECT DEPARTMENT_ID       -- GROUP BY 절에서 지정한 칼럼만 조회할 수 있다.
     , COUNT(*)
  FROM EMPLOYEES
 GROUP BY DEPARTMENT_ID;

  • 통계 함수가 사용되지 않으면 GROUPING을 하는 의미가 없음.
  • 하나의 그룹으로 묶는다 ⇒ 하나의 행으로 표현됨
  • GROUP BY 절은 실생활에 자주 사용되진 않지만
    • 사용 예시) 쇼핑몰 운영 시 월 간 구매 건수 / 합계 등을 내는 쿼리문을 짤 수 있음

참고, PARTITION BY

GROUP BY절 없이 통계 내기

  • PARTITION BY 구문 작성 방법

    SELECT 집계함수(컬럼명) OVER(PARTITION BY 컬럼명)
    FROM 테이블명;


  • 사용 예시
-- 참고. GROUP BY 절 없이 통계내기
SELECT DISTINCT DEPARTMENT_ID
     , COUNT(*) OVER(PARTITION BY DEPARTMENT_ID)
     , ROUND(AVG(SALARY) OVER(PARTITION BY DEPARTMENT_ID), 2)
  FROM EMPLOYEES;

⇢HAVING 절

  1. GROUP BY 절 이후에 나타난다.
  2. GROUP BY 절을 이용한 조회 결과에 조건을 지정하는 경우에 사용한다.
  3. GROUP BY 절이 필요하지 않는 조건은 WHERE 절로 지정한다.

  • GROUP BY를 해야만 하는 조건 ⇒ HAVING 절 사용
  • GROUP BY를 포함하지 않아도 되는 조건 ⇒ WHERER 절 사용
    (성능 향상의 문제)

HAVING 사용 예시

  • HAVING 처리
-- 4. 사원 테이블에서 각 부서별 사원수가 20명 이상인 부서를 조회하시오.
-- 조건 : 부서별사원수 >= 20
-- 조건에서 사용되는 부서별사원수는 GROUP BY절이 필요하므로 HAVING 처리
SELECT DEPARTMENT_ID
    , COUNT(*)
  FROM EMPLOYEES
 GROUP BY DEPARTMENT_ID
HAVING COUNT(*) >= 20;

  • WHERE 처리
-- 5. 사원 테이블에서 각 부서별 사원수를 조회하시오. 단, 부서번호가 없는 사원은 제외하시오.
-- 조건 : 부서번호 IS NOT NULL
-- 조건에서 사용되는 부서번호는 GROUP BY 절이 필요 없으므로 WHERE 절로 처리
SELECT DEPARTMENT_ID
    , COUNT(*)
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID IS NOT NULL
 GROUP BY DEPARTMENT_ID;

⇢ORDER BY

  • 조회 결과를 정렬하고자 할 때 사용하는 절
  • 오름차순 정렬과 내림차순 정렬로 구분
  • 오름차순 정렬은 ASC(Ascending), 내림차순 정렬은 DESC(Descending)
  • 언제나 마지막 순서로 적어주는 구문

[ASC] 오름차순 정렬 순서

  • 타입이 다른 데이터가 섞여 있는 경우 아래 기준으로 동작
  1. 문자
    • 영문 : 알파벳 순
    • 한글 : 가나다 순
  2. 숫자
    • 작은 숫자를 먼저 출력
  3. 날짜
    • 과거 날짜를 먼저 출력
  4. NULL

[DESC] 내림차순 정렬은 오름차순 정렬의 역순


ORDER BY 사용 예시

-- 11. 사원 테이블의 사원들을 연봉순으로 조회하기 (높은 연봉을 먼저 조회)
SELECT *
  FROM EMPLOYEES
 ORDER BY SALARY;  -- 기본 정렬 방식은 오름차순이다.
                   -- ASC(오름차순)는 생략 가능
 
SELECT *
  FROM EMPLOYEES
 ORDER BY SALARY ASC;  -- ASC : Ascending(오름차순)
 
SELECT *
  FROM EMPLOYEES
 ORDER BY SALARY DESC;  -- DESC : Descending(내림차순)


⇢DISTINCT 중복 제거

  • 위치 : 중복을 제거하고자 하는 칼럼 앞에 작성한다.

    SELECT DISTINCT 칼럼명 FROM 테이블명;


* Asterisk : 모든 칼럼 조회

  • 실무에서는 *를 금지한다 (이유 : 성능 떨어짐)

⇢ALIAS (AS)

  • 칼럼의 별명을 지정해서 조회할 수 있다

SELECT 칼럼명 AS 별명 FROM 테이블명;

  • 별명은 나중에 자바와 맞춰줄 때 사용되기도 한다.
  • 칼럼에 별명 지정 하는 방법: AS를 사용하거나 생략도 가능하다(생략은 권장X)
  • 테이블에 별명 지정 하는 방법 : 띄어쓰기(공백)


요약

  • DDL / DML / TCL / DQL
    • DDL
      • CREATE, ALTER, DROP, TRUNCATE
    • DML
      • INSERT, UPDATE, DELETE
    • TCL
      • COMMI, ROLLBACK
    • DCL
      • GRANT(권한 주기), REVOKE(권한 뺏기)
    • DQL
      • SELECT


profile
개발이 세상에서 제일 재밌어요

0개의 댓글