본 포스트는 O’REILLY의 러닝 SQL(앨런 볼리외 저, 류수미/송희정 옮김, 한빛미디어) 저서를 통해 학습한 내용을 작성자 임의 대로 요약 및 정리한 것입니다.
SELECT
문의 다른 부분들, 그리고 그것들의 상호작용 방식을 알아봄.
3.1. 쿼리 역학Query Mechanics
MySQL에서 쿼리가 실행되는 방법 살펴보기
mysql CLI에서
사용자 이름, 비밀번호 입력
–> 로그인
–> 서버가 사용자, 비밀번호 맞는지 확인
–> 맞다면 데이터베이스 연결 생성
(이 연결은 서버 종료될 때까지 유지됨)
–> MySQL 서버에 대한 각 연결엔 고유한 식별자 할당됨.쿼리가 서버로 전송될 때마다
서버는 구문 실행 전 다음 사항 확인.- 이 구문 실행할 권한permission 있는가?
- 원하는 데이터 액세스 가능한 권한이 있는가?
- 구문의 문법이 정확한가?
–> 세 단계 통과 시,
쿼리는 쿼리 옵티마이저로 전달됨.
–> 옵티마이저는
쿼리 실행에 필요한 실행계획 선택.
(FROM
절에 명명된 테이블에 조인할 순서, 그리고 사용 가능 인덱스 확인)
–> 서버가 쿼리 실행 마치면
호출한 응용 프로그램으로 결과셋 반환
(이 결과셋은 행, 열 포함하는 하나의 테이블)
만약, 쿼리가 아무런 결과도 얻지 못하면
이러한 메시지가 표시됨.1
Empty set
- 이 구문 실행할 권한permission 있는가?
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;
==> 세 번째 칼럼 기준으로 정렬