Home 챕터3 - 쿼리 입문
Post
Cancel

챕터3 - 쿼리 입문

본 포스트는 O’REILLY의 러닝 SQL(앨런 볼리외 저, 류수미/송희정 옮김, 한빛미디어) 저서를 통해 학습한 내용을 작성자 임의 대로 요약 및 정리한 것입니다.


SELECT 문의 다른 부분들, 그리고 그것들의 상호작용 방식을 알아봄.


3.1. 쿼리 역학Query Mechanics

MySQL에서 쿼리가 실행되는 방법 살펴보기

mysql CLI에서

  • 사용자 이름, 비밀번호 입력
    –> 로그인
    –> 서버가 사용자, 비밀번호 맞는지 확인
    –> 맞다면 데이터베이스 연결 생성
       (이 연결은 서버 종료될 때까지 유지됨)
    –> MySQL 서버에 대한 각 연결엔 고유한 식별자 할당됨.

  • 쿼리가 서버로 전송될 때마다
      서버는 구문 실행 전 다음 사항 확인.

    • 이 구문 실행할 권한permission 있는가?
    • 원하는 데이터 액세스 가능한 권한이 있는가?
    • 구문의 문법이 정확한가?
      –> 세 단계 통과 시,
          쿼리는 쿼리 옵티마이저로 전달됨.
      –> 옵티마이저는
          쿼리 실행에 필요한 실행계획 선택.
          (FROM 절에 명명된 테이블에 조인할 순서,      그리고 사용 가능 인덱스 확인)
      –> 서버가 쿼리 실행 마치면
          호출한 응용 프로그램으로 결과셋 반환
          (이 결과셋은 행, 열 포함하는 하나의 테이블)

    만약, 쿼리가 아무런 결과도 얻지 못하면
    이러한 메시지가 표시됨.

    1
    
      Empty set
    

3.2. 쿼리 절Query Clauses

SELECT 문은 여러 개의 구성요소 및 절clause로 구성.

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY

3.3. SELECT

  3.3.1. SELECT 절에 추가 가능한 것

  • 숫자 또는 문자열과 같은 리터럴literal
  • transaction.amout * -1과 같은 표현식
  • ROUND(transaction.amout, 2)와 같은 내장함수built-in 호출
  • 사용자 정의 함수 호출

  3.3.2. 중복 제거

  SELECT 키워드 바로 뒤에
DISTINCT 키워드 추가하기!!

1
2
3
SELECT DISTINCT actor_id
FROM film_actor
ORDER BY actor_id;

※주의
DISTINCT 결과 생성에는
데이터 정렬이 포함됨.
따라서 데이터 용량 클수록 시간 오래 걸림.

3.4. FROM

 3.4.1. 테이블 유형

  네 가지의 유형

  • 영구permanent 테이블
    : CREATE [table] 문으로 생성

  • 파생derived table 테이블
    : 하위 쿼리에서 반환하고 메모리에 보관된 행
      FROM 절 내의 서브쿼리subquery가 파생 테이블 생성
      서브쿼리로 생성된 데이터는
    쿼리 기간 동안만 보관 후 삭제됨.

  • 임시temporary 테이블
    : 메모리에 저장된 휘발성 데이터
    1
    
    CREATE TEMPORARY TABLE actors_j
    

      이런 식으로 임시 테이블 생성가능.
    이 임시 테이블은
    트랜잭션 끝나거나 DB 세션 닫힐 때 사라짐.

  • 가상virtual 테이블(VIEW)
    : CREATE VIEW 문으로 생성
      뷰는 데이터 딕셔너리에 저장된 쿼리.
    테이블처럼 동작하지만
    뷰에 저장된 데이터는 존재하진 않음.

  뷰에 대한 쿼리 실행 시
쿼리가 뷰 정의와 합쳐짐.

  사용자로부터 칼럼을 숨기고
복잡한 DB 설계를 단순화하는 경우에 사용.

 3.4.2. 테이블 연결

  FROM 절에 둘 이상의 테이블 있으면
그 테이블을 연결하는 데 필요한 조건도 포함해야 함.
(이건 ANSI의 승인 방법 사항)


3.4. WHERE

  관심 없는 행을 필터링하는 방법.
  AND, OR, NOT 등의 연산자 사용가능.

  조건을 함께 그룹화하려면
괄호 사용.


3.5. GROUP BY 절과 HAVING

  DB 서버가 데이터 정제하는 흐름 찾아보기 가능.

  데이터를 열 값 별로 그룹화함.

GROUP BY 사용법
WHERE 절 (위치)에서
원시 데이터 필터링하는 HAVING 사용.


3.6. ORDER BY

  3.6.1. 순서를 통한 정렬

  SELECT 절의 칼럼으로 정렬 시
이름 대신 칼럼 나열 순서 기준으로 참조 가능.

1
2
3
4
5
6
SELECT c.first_name,
       c.last_name,
       time(r.rental_date)
~~~~
~~~~
ORDER BY 3 DESC;

==> 세 번째 칼럼 기준으로 정렬

Contents