[230704] DQL(SELECT) (DAY5) - 구디아카데미후기 IT국비지원 민경태 강사님

MJ·2023년 7월 5일

수업 TIL🐣💚

목록 보기
5/68

🔻DQL

  • 데이터 질의어 (Data Query Language)
  • 테이블이나 뷰 등의 DB 객체에서 원하는 행을 조회
  • SELECT
    • SELECT 칼럼1, 칼럼2, ...
      FROM 테이블이름
      [WHERE 조회
      조건]
      [GROUB BY 그룹칼럼
      [HAVING 그룹
      조건]][ORDER BY 정렬_칼럼]
    • 수행(해석) 순서 : FROM -> WHERE -> ... -> SELECT

DUAL 테이블

  1. SELECT문의 필수 구조는 SELECT 칼럼 FROM 테이블 이므로 테이블이 반드시 필요
  2. 단순 연산이나 함수 결과 확인 시에는 테이블이 필요하지 않은 경우가 있음
  3. 이 때 SELECT 문법을 만족시키기 위해 써주는 테이블이 DUAL 테이블
  • DUAL 테이블은 SYS 계정이 소유
SELECT ABS(-5)  FROM DUAL;

Alias

: 별명 지정한 뒤 조회

  • SELECT ~ AS 별명
  • 별명은 자바와 맞춰줄 때 사용되기도 함
  • 칼럼에 별명 지정 = AS (생략 가능하지만 권장X)
  • 테이블에 별명 지정 = 띄어쓰기
SELECT E.FIRST_NAME AS 이름, E.LAST_NAME ASFROM EMPLOYEES E;
-- E.FIRST_NAME = EMPLOYEES 테이블의 FIRST_NAME 칼럼

DISTINCT

  • 중복 제거
  • 중복을 제거할 칼럼 앞에 적어줌
-- 사원 테이블에서 전화번호가 '515'로 시작하는 전화번호의 중복을 제거하고 조회하기
SELECT DISTINCT PHONE_NUMBER
  FROM EMPLOYEES
 WHERE PHONE_NUMBER LIKE '515%';
-- 사원들이 근무하는 부서의 갯수 조회
SELECT COUNT(DISTINCT DEPARTMENT_ID) AS 전체부서수
  FROM EMPLOYEES; 

WHERE

  • 사용 가능한 데이터 타입
    • 문자, 숫자, 날짜, NULL
    • 날짜 : 날짜는 작은 따옴표(')로 묶어서 작성하거나 TO_DATE, TO_TIMESTAMP 함수로 작성
    • NULL : IS NULL 또는 IS NOT NULL
  • 좋은 WHERE절 작성법
    • 가능하면 인덱스가 설정될 칼럼을 사용
      • 인덱스: 빠른 검색을 위해 특정 칼럼에 설정
      • PK 자동으로 인덱스 추가되어 있음 -> PK로 검색하면 빠른 검색 가능
      • UNIQUE 자동으로 인덱스 추가되어 있음
    • 등호(=) 왼쪽은 가공하지 않고 사용
      • 인덱스가 설정된 칼럼을 함수 등으로 가공하면 인덱스를 사용할 수 없음

ORDER BY

SELECT * FROM PRODUCT_TBL ORDER BY CATEGORY ASC, AMOUNT DESC;
-- CATEGORY=오름차순, AMOUNT=내림차순
SELECT * FROM PRODUCT_TBL ORDER BY CATEGORY, AMOUNT DESC;
-- 오른차순은 생략 가능, CATEGORY는 DESC 아닌거 주의
  • 조회 결과 정렬
  • 오름차순 ASC, 내림차순 정렬은 DESC
  • 오름차순 순서
    • 타입이 다른 경우 1,2,3,4 순으로 동작
    1. 문자: 영문(알파벳순), 한글(가나다순)
    2. 숫자: 작은 숫자 먼저
    3. 날짜: 과거 날짜 먼저
    4. NULL

GROUP BY

  • 같은 값을 가진 데이터들을 하나의 그룹으로 묶어서 처리하는 것
  • 통계를 내는 목적으로 사용 (합계, 평균, 최댓값, 최솟값, 갯수 등)
  • 조회하려는 칼럼은 반드시 GROUP BY 절에 명시되어 있어야 함
--사원 테이블에서 동일한 부서번호를 가진 사원들을 그룹화하여 각 그룹별로 몇명의 사원이 있는지 조회
SELECT DEPARTMENT_ID    -- GROUP BY 절에서 지정한 칼럼만 조회 가능
     , COUNT(*)
  FROM EMPLOYEES
 GROUP BY DEPARTMENT_ID;

HAVING 절

  • GROUP BY 절 이후에 사용
  • GROUP BY 절을 이용한 조회 결과에 조건을 지정하는 경우 사용
  • GROUP BY 절이 필요하지 않은 조건은 WHERE절로 지정 (성능 문제)
    • WHERE의 실행 순서가 GROUP BY보다 빠르기 때문. WHERE로 먼저 조건 지정을 하면 GROUP BY로 그룹화해줘야하는 전체 양이 줄어들음
    • 그룹화 이전 조건 처리 = WHERE EX) 서울 제외한 지역별 사용자 수
    • 그룹화 이후 조건 처리 = HAVING EX) 지역별 사용자 수 2명
--사원 테이블에서 각 부서별 사원수가 20명 이상인 부서를 조회
-- 조건: 부서별 사원수 >=20
-- 조건에서 사용되는 부서별  사원수는 GROUP BY 절이 필요하므로 HAVING 절로 처리
SELECT DEPARTMENT_ID
     , COUNT(*)
  FROM EMPLOYEES
 GROUP BY DEPARTMENT_ID
HAVING COUNT(*) >= 20;
-- 사원 테이블에서 각 부서별 사원수를 조회. 단, 부서번호가 없는 사원은 제외
-- 조건: 부서번호 IS NOT NULL
-- 조건에서 사용되는 부서번호는 GROUP BY 절이 필요없으므로 WHERE절로 처리
SELECT DEPARTMENT_ID
     , COUNT(*)
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID IS NOT NULL 
 --GROUP BY를 하지 않아도 알 수 있는 조건은 WHERE로 작성 (성능문제)
 GROUP BY DEPARTMENT_ID; 


🟢 구디아카데미후기 IT국비지원 민경태 강사님 수업 5일차! 🟢

오늘은 SELECT문에 대해서 집중적으로 배웠다. SELECT문은 검색 결과를 바로 확인할 수 있어서 재밌었다. 더 어려워지기 전에 열심히 복습해야겠다.

0개의 댓글