공대생의 공부흔적

[SQL#2] 쿼리(Simple Query), Projection, Selection 본문

Database & Big Data/SQL

[SQL#2] 쿼리(Simple Query), Projection, Selection

생대공 2024. 3. 9. 23:01

참고: Database Systems: The Complete Book (2nd edition)

이번 글에서는 SQL에서 쿼리를 작성하는 법에 대해 다룰 것이다.


Simple Queries

가장 간단한 형태의 쿼리는 어떤 relation에서 특정 조건을 만족하는 튜플을 요청하는 것이다. 

SELECT, FROM, WHERE라는 3개의 키워드를 통해 쿼리를 구성한다. 예시를 통해 살펴보자.

다음과 같은 데이터베이스 schema가 있다고 하자.

Movies(title, year, length, genre, studioName)

이때, 'Disney' 스튜디오에서 '1990'년에 나온 영화를 찾고자 한다면 다음과 같이 표현할 수 있다.

SELECT *
FROM Movies
WHERE studioName = 'Disney' AND year = 1990;
  • SELECT: 조건을 만족하는 튜플의 어떤 attribute를 불러올지 결정한다. *은 모든 attribute을 의미한다.
  • FROM: 어떤 relation에 쿼리를 요청할지 나타낸다.
  • WHERE: 찾고자 하는 튜플이 만족해야 할 조건을 나타낸다.

즉, 이 경우라면 다음과 같은 튜플이 쿼리의 결과로 나올 수 있는 것이다.

title year length genre studioName
Pretty Woman 1990 119 true Disney

 

Projection: SELECT 변화

모든 attribute가 아닌 특정 attribute만 추출하고 싶다면, 다음과 같이 SELECT에 변화를 주면 된다.

SELECT title, length
FROM Movies
WHERE studioName = 'Disney' AND year = 1990;

이 경우 결과는 다음과 같이 해당 튜플의 특정 attribute만 포함하는 형태로 나온다.

title length
Pretty Woman 119

Attribute 이름 바꾸기: AS

만약 attribute를 다른 이름으로 리턴하고 싶다면 다음과 같이 AS를 사용할 수 있다.

SELECT title AS name, length
FROM Movies
WHERE studioName = 'Disney' AND year = 1990;

이때 리턴되는 attribute의 이름은 title 대신 name이 되어 나온다.

name length
Pretty Woman 119

SELECT AS: expression 추가하기

attribute가 있는 자리에 expression을 추가할 수 있다. 분 단위의 length를 시간 단위로 표시하고 싶다면 다음처럼 쿼리를 작성할 수 있다.

SELECT title, length/60 AS lengthHrs
FROM Movies
WHERE studioName = 'Disney' AND year = 1990;
title lengthHrs
Pretty Woman 1.983

SELECT AS: expression에 상수 사용하기

또한, 다음과 같이 상수(예시에서는 'yes')를 expression으로 하여 새로운 attribute를 추가할 수도 있다.

SELECT title, 'yes' AS isMovie
FROM Movies
WHERE studioName = 'Disney' AND year = 1990;
title isMovie
Pretty Woman yes

 

Selection: WHERE 변화

이번엔 WHERE에 변화를 주어 다양하게 조건을 설정해보자.

기본적인 연산은 다음과 같다.

  • 비교: =(equl), <>(not equal), <, >, <=, >=
  • 산술: +, -, *, /, %
  • 문자열: 큰따옴표로 표현
  • 문자열 이어붙이기(concatenation): ||
  • 불 연산: AND, OR, NOT

이를 이용해 다음과 같은 쿼리를 만들어볼 수 있다.

SELECT title
FROM Movies
WHERE studioName = 'Dis' || 'ney' AND (year > 1900 OR length <= 100);

문자열 비교하기

위 연산 중 비교 연산을 문자열에서 수행하는 경우, 다음과 같은 규칙이 적용된다.

  • 동일한 character 시퀀스를 가지는 경우 두 문자열은 동일하다.
    • 이때, CHAR(n)에 의해 생기는 space 패딩은 무시한다.
  • <, >, <=, >= 연산은 사전식 순서에 기초하여 판단한다.
    • 'fodder' < 'foo'
    • 'bar' < 'bargain'