Post

[Database] (쉬운 코드) SQL로 데이터 조회하기 (SELECT)

쉬운 코드 강의 「데이터베이스」 내용을 바탕으로, SQL로 DB에 데이터를 조회하는 방법을 정리한 포스트 입니다.

[Database] (쉬운 코드) SQL로 데이터 조회하기 (SELECT)

아래의 내용은 MySQL 기준으로 작성한 것입니다. 다른 RDBMS의 SQL 문법은 조금씩 다를 수 있습니다.

테이블 구조

우선 시작하기에 앞서 내용 이해에 필요한 테이블 구조입니다.

데이터 조회하기


데이터베이스에 저장된 데이터를 조회하는 방법을 알아보자.

ex. ID가 9인 임직원의 이름과 직군을 알고 싶다

1
SELECT name, position FROM employee WHERE id = 9;
  • selection condition : 만족해야하는 조건을 의미하며 위의 코드에선는 id = 9 가 해당
  • projection attributes : 조건을 만족하는 튜플 중 원하는 attributes를 의미로 위 코드에서 name, position이 해당

위의 내용을 정리하면 다음과 같다.

1
2
3
SELECT attributes(s)
    FROM table(s)
    [WHERE condition(s)];

ex. project 2002를 리딩(leading)하고 있는 임직원의 ID와 이름과 직군을 알고 싶다.

1
2
3
SELECT employee.id, employee.name, position
    FROM project, employee
    WHERE project.id = 2002 and project.leader_id = employee.id;
  • join condition : 다른 테이블을 연결시키는 역할을 하는 조건으로 project.leader_id = employee.id 에 해당한다.

위의 코드에서 테이블 이름을 적어준 이유는 다른 테이블이지만 동일한 attribute가 있기 때문에 이를 구분하기 위해 붙여준 것이다. 또한 명시적으로 attribute를 적어주기 위해서 사용하는 경우도 있다.

AS


AS는 테이블이나 attribute에 별칭(alias)을 붙일 때 사용한다(생략 가능).

1
2
3
4
5
6
7
8
9
-- AS 키워드 사용 --
SELECT E.id AS leader_id, E.name AS leader_name, position
    FROM project AS P, employee AS E
    WHERE P.id = 2002 and P.leader_id = E.id;

-- AS 키워드 생략 --
SELECT E.id leader_id, E.name leader_name, position
    FROM project P, employee E
    WHERE P.id = 2002, and P.leader_id = E.id;

DISTINCT


DISTINCT는 select 결과에서 중복되는 tuples은 제외하고 싶을 때 사용한다.

ex. 디자이너들이 참여하고 있는 프로젝트들의 ID와 이름을 알고 싶다.

1
2
3
SELECT DISTINCT P.id, P.name
    FROM employee AS E, works_on AS W, project AS P
    WHERE E.position == "DSGN" and E.id == W.empl_id and W.proj_id == P.id;

LIKE


LIKE는 문자열에 대해서 pattern matching에 사용되는 키워드이다.

ex. 이름이 N으로 시작하거나 N으로 끝나는 임직원들의 이름을 알고 싶다.

1
2
3
SELECT name
    FROM employee
    WHERE name LIKE 'N%' or name LIKE '%N';

위의 코드에서 %의 의미는 0개 이상의 임의의 개수를 가지는 문자를 의미한다.

ex. 이름에 NG가 들어가는 임직원들의 이름을 알고싶다.

1
2
3
SELECT name
    FROM employee
    WHERE name LIKE '%NG%';

ex. 이름이 J로 시작하는, 총 네 글자의 이름을 가지는 임직원들의 이름을 알고싶다.

1
2
3
SELECT name
    FROM employee
    WHERE name LIKE 'J___';

만약에 %로 시작하거나 _로 끝나는 프로젝트 이름을 찾고 싶다면 SELECT name FROM project WHERE name LIKE '\%%' or name LIKE '%\_';처럼 백슬래쉬() 문자를 사용하면 된다.

위의 내용을 정리하면 다음과 같다.

*(asterisk)


*(asterisk)는 선택된 tuples의 모든 attributes를 보여주고 싶을 때 사용한다.

ex. ID가 9인 임직원의 모든 attributes를 알고 싶다.

1
SELECT * FROM employee WHERE id = 9;

만약 아래와 같은 코드를 실행하면 어떻게 출력이 될까?

1
2
3
SELECT *
    FROM project, employee
    WHERE project.id = 2002 and project.leader_id = employee.id;

위 코드의 결과는 조건에 해당하는 project 테이블의 튜플과 employee에 해당하는 튜플이 가로로 붙어서 출력된다.

SELECT without WHERE


WHERE이 없는 SELECT는 테이블에 있는 모든 tuple을 반환한다.

ex. 모든 임직원의 이름과 생일을 알고 싶다.

1
2
SELECT name, birth_date
    FROM employee;

주의 사항

SELECT로 조회할 때 조건들을 포함해서 조회를 한다면 이 조건들과 관련된 attributes에 index가 걸려있어야 한다. 그렇지 않다면 데이터가 많아질수록 조회 속도가 느려진다(index 관련은 추후애….)

This post is licensed under CC BY 4.0 by the author.