Learning SQL 3장 요약 - 쿼리 입문

SQL

2022. 11. 24. 16:21


3장 쿼리 입문

 

select 문의 다른 부분과 상호작용하는 방식을 살펴본다.

 

쿼리역학

 

쿼리가 서버로 전송되면 서버는 다음 사항을 확인한다.

  1. 쿼리 실행 권한이 있는가?
  2. 데이터 접근 권한이 있는가?
  3. 문법은 정확한가?

이를 통과하면, 쿼리는 쿼리 옵티마이저에게 전달된다.

그리고 옵티마이저는 실행 계획을 선택한다.

서버가 쿼리 실행을 마치면 mysql 도구 등의 응용 프로그램으로 결과셋을 반환한다.

아무 결과도 없다면 Empty Set이란 메시지를 표시한다.

 

쿼리 절(clause)

절 이름 목적
select 쿼리 결과에 포함할 열을 결정
from 데이터를 검색할 테이블과, 테이블을 조인하는 방법을 식별
where 불필요한 데이터를 걸러냄
group by 공통 열 값을 기준으로 행을 그룹화
having 불필요한 그룹을 걸러냄
order by 하나 이상의 열을 기준으로 최종 결과의 행을 정렬

 

Select 절 - 열(Column) 결정하기

 

모든 열과 모든 행 불러오기

SELECT *
FROM language;

 

특정 열 불러오기

SELECT name
FROM language;

 

테이블 열, 리터럴, 표현식, 내장함수 불러오기

SELECT
    language_id, // 테이블 열
    'COMMON' language_usage, // 리터럴
    language_id * 3.1415927 lang_pi_value, // 표현식
    upper(name) language_name // 내장함수
    
FROM language;

 

열의 별칭 - as

사실 이전 쿼리에서 열의 별칭을 사용했다.

별칭임을 돋보이려면 as 키워드를 사용하면 된다.

SELECT
    language_id,
    'COMMON' AS language_usage,
    language_id * 3.1415927 AS lang_pi_value,
    upper(name) AS language_name
    
FROM language;

 

중복 제거 - distinct

SELECT DISTINCT actor_id
FROM film_actor
ORDER BY actor_id;

 

From 절 - 테이블 결정하기

테이블에는 다음과 같은 네 가지 유형이 있다.

유형 설명
영구 테이블 create table 문으로 생성
파생 테이블 하위 쿼리에서 반환하고 메모리에 보관된 행
임시 테이블 메모리에 저장된 휘발성 테이블
뷰(가상 테이블) create view 문으로 생성

 

파생 테이블

from 절 내에서의 서브쿼리는 파생 테이블을 생성하는 역할을 한다.

예) 파생 테이블 cust을 만드는 예시

SELECT concat(cust.last_name, ', ', cust.first_name) full_name
FROM
    (SELECT first_name, last_name, email
    FROM customer
    WHERE first_name = 'JESSIE')
cust;

cust의 데이터는 쿼리기간이 끝나면 삭제된다.

서브쿼리의 자세한 내용은 9장에서 확인하자.

 

임시 테이블

트랜잭션이 끝나거나 DB세션이 닫힐 때까지 보관되는 휘발성 테이블이다.

예) 성이 J로 시작하는 배우를 임시로 저장하는 예시

CREATE TEMPORARY TABLE actors_j
    (actor_id smallint(5),
    first_name varchar(45),
    last_name varchar(45)
);

INSERT INTO actors_j
SELECT actor_id, first_name, last_name
FROM actor
WHERE last_name LIKE 'J%';

SELECT * FROM actors_j;

 

뷰(가상 테이블)

뷰는 데이터 딕셔너리에 저장된 쿼리이다.

테이블처럼 동작하지만, 뷰에는 데이터가 존재하지 않는다.

이 때문에 가상 테이블이라고도 불린다.

뷰를 정의하는 예시

CREATE VIEW cust_vw AS
SELECT customer_id, first_name, last_name, active
FROM customer;

뷰에서 쿼리하는 예시

SELECT first_name, last_name
FROM cust_vw
WHERE active = 0;

 

Where 절 - 행 필터링

예) G등급 영화이면서 대여기간이 7일 이상인 영화 검색

SELECT title
FROM film
WHERE rating = 'G' AND rental_duration >= 7;

필터조건 여러개를 사용할 땐

and, or, not과 같은 연산자와 괄호를 사용한다.

(자세한 내용은 4장 참조)

 

Group by 절과 having 절

모든 행을 살펴보는 대신,

서버가 데이터를 우선 그룹화하고 정제(having)하고 나서 살펴본다.

 

예) rental 테이블의 16,044 행을 모두 찾는 대신

서버가 모든 내역을 그룹화하고 각 고객의 대여 횟수를 계산한 다음

대여 횟수가 40 이상인 고객만 반환하는 쿼리

SELECT c.first_name, c.last_name, count(*)
FROM customer c
	INNER JOIN rental r
    ON c.customer_id = r.customer_id
GROUP BY c.first_name, c.last_name
HAVING count(*) >= 40;

다른 절보다 어렵다.

group by 및 having에 대한 자세한 내용은 8장 참조.

 

Order by 절 - 결과셋 정렬

SELECT c.first_name, c.last_name, time(r.rental_date) rental_time,
FROM customer c
	INNER JOIN rental r
    ON c.customer_id = r.customer_id
WHERE date(r.rental_date) = '2005-06-14'
ORDER BY c.last_name, c.first_name;

c.last_name에 같은 행이 여러개 있다면,

2차적인 정렬 기준으로 c.fisrt_name을 지정할 수 있다.

 

만약 내림차순을 하고 싶다면 desc 키워드를 사용한다. (descending의 약자)

ORDER BY time(r.rental_date) desc;

 

열의 순서로 참조할 수도 있다.

ORDER BY 3 desc;

select 절의 3번째 열을 내림차순 한다는 뜻이다.