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