정의된 테이블 예시
- 테이블 명: article
attribute | type |
---|---|
id (PRIMARY KEY) | bigint |
title | varchar |
content | varchar |
created_at | datetime |
- 테이블 명: comment
attribute | type |
---|---|
id (PRIMARY KEY) | bigint |
article_id (FOREIGN KEY) | bigint |
content | varchar |
created_at | datetime |
데이터 조회
SELECT article.id, title, comment.content
FROM article, comment
WHERE comment.id = 10 and comment.article_id = article.id;
- WHERE
comment.id
selection condition
이라고 부르며 지정한 조건에 맞는 데이터를 조회한다.
comment.article_id = article.id
join condition
이라고 부르며 하나의 테이블의 attribute와 다른 테이블의 attribute가 일치하는 데이터를 조회한다.- 위와 같은 쿼리에서는
comment.article_id
와article.id
가 일치하는article
데이터를 조회한다.
- 정리하면
comment.id
가 10인comment
데이터를 조회하고comment.article_id
와article.id
가 일치하는article
데이터를 조회한다.
- SELECT
article.id
,comment.content
와 같이 앞에 테이블명을 명시적으로 지정해주는 이유는 두 테이블에 attribute가 중복되어 있기 때문이다. 만약 테이블명을 명시적으로 지정해주지 않는다면 두 테이블에 있는 데이터를 모두 조회하게된다.- 반면
article
의title
attribute는article
에서만 존재하기 때문에 테이블명을 지정해주지 않아도 된다.
NOTE
WHERE 절의 join condition에도 두 테이블의 attribute가 중복되는 경우 테이블명을 명시적으로 지정해주어야한다. 만약 지정해주지 않으면 에러가 발생한다.
Alias
SELECT A.id AS article_id, title, C.content AS comment_content
FROM article AS A, comment AS C
WHERE C.id = 10 and C.article_id = A.id;
- 각 테이블에
AS
로 Alias를 지정해주면 위와 같이 조금 더 간결하고 쉽게 작성할 수 있다. - 조회한 결과
id
,content
와 같이 어떤 테이블의 attribute인지 알기 어려울 때도 SELECT 부분에 Alias를 지정해 줄 수 있다. 예를 들어 위 쿼리에서보면id
의 경우article_id
라고 Alias를 지정해줌으로써article
테이블의 attribute라는 것을 정확하게 표현해줄 수 있다.
DISTINCT
SELECT DISTINCT C.content AS comment_content
FROM article AS A, comment AS C
WHERE A.id = 10 and C.article_id = A.id;
- 중복된 Tuple들을 제거할 때 사용한다.
- 위 쿼리를 예시로 보면 id가 10인
comment
의comment.content
를 모두 출력할때 중복된 tuple들을 모두 제거한다.
LIKE
SELECT title
FROM article
WHERE title LIKE 'A%' or title LIKE '%A';
%
: 0개 이상의 임의의 문자를 의미한다.A%
: A로 시작하는 문자%A
: A로 끝나는 문자%A%
: 중간에 A가 들어가는 문자
_
: 하나의 문자를 의미한다.A___
: A로 시작하면서 뒤에 3개의 문자가 존재하는 것을 의미
- 위 쿼리에서는 A로 시작하는
title
또는 A로 끝나는title
을 조회하게된다.
NOTE
% 또는 _ 자체를 조회해야할 경우 \%, \_ 처럼 앞에 \를 붙여준다.
* (asterisk)
SELECT *
FROM article
WHERE id = 1;
*
: 모든 attribute를 출력하고자 할 떄 사용한다. 두 테이블을 조회할 경우에도 두 테이블의 attribute를 모두 출력한다.