상세 컨텐츠

본문 제목

5. SQL로 데이터 조회하기(1)

CS전공 지식/4. 데이터베이스 개론 & SQL

by 본투비곰손 2023. 8. 17. 22:36

본문

728x90

SELECT statement

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

mysql> SELECT name, position FROM employee WHERE id=9;
+-------+----------+
| name  | position |
+-------+----------+
| HENRY | HR       |
+-------+----------+
1 row in set (0.00 sec)
SELECT projection attributes FROM table(s)_name WHERE selection condition and join condition

project 2002를 리딩하고 있는 임직원의 ID와 이름과 직군을 알고 싶다. (다중 조건 쿼리문)

mysql> SELECT employee.id, employee.name, position//project에도 id,name table가 있어서 구분 필요!!
    -> FROM project, employee
    -> WHERE project.id = 2002 and project.leader_id=employee.id;
+----+--------+----------+
| id | name   | position |
+----+--------+----------+
| 13 | JISUNG | PO       |
+----+--------+----------+
1 row in set (0.01 sec)

AS

  • AS는 테이블이나 attribute에 별칭(arias)을 붙일 때 사용한다.
  • AS는 생략 가능 하다.
mysql> SELECT E.id, E.name, position
    -> FROM project AS P, employee AS E
    -> WHERE P.id = 2002 AND P.leader_id=E.id;
+----+--------+----------+
| id | name   | position |
+----+--------+----------+
| 13 | JISUNG | PO       |
+----+--------+----------+
1 row in set (0.00 sec)
mysql> 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;
+-----------+-------------+----------+
| leader_id | leader_name | position |
+-----------+-------------+----------+
|        13 | JISUNG      | PO       |
+-----------+-------------+----------+
1 row in set (0.00 sec)

DISTINCT

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

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

 SELECT P.id project_id, P.name project_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;
+------------+------------------+
| project_id | project_name     |
+------------+------------------+
|       2003 | 홈페이지 UI 개선 |
|       2003 | 홈페이지 UI 개선 |
+------------+------------------+
2 rows in set (0.00 sec)

중복 되는 값 제외

 SELECT DISTINCT P.id project_id, P.name project_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;
+------------+------------------+
| project_id | project_name     |
+------------+------------------+
|       2003 | 홈페이지 UI 개선 |
+------------+------------------+
2 rows in set (0.00 sec)

LIKE

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

SELECT name
    -> FROM employee
    -> WHERE name LIKE'N%' or name LIKE'%N';
+--------+
| name   |
+--------+
| BROWN  |
| NICOLE |
+--------+
2 rows in set (0.00 sec)

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

SELECT name
    -> FROM employee
    -> WHERE name LIKE'%NG%';
+--------+
| name   |
+--------+
| DINGYO |
| JISUNG |
+--------+
2 rows in set (0.00 sec)

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

 SELECT name FROM employee WHERE name LIKE'J___';
+------+
| name |
+------+
| JANE |
+------+
1 row in set (0.00 sec)

escape 문자와 함께 LIKE 사용하기

  • %로 시작하거나 _로 끝나는 프로젝트 이름을 찾고 싶다면?

mysql> SELECT name FROM project WHERE name LIKE '\%%' or name LIKE '%_';
Empty set (0.00 sec)

LIKE 정리

*(asterisk) 사용하기

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

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

SELECT * FROM employee WHERE id=9;
+----+-------+------------+------+----------+----------+---------+
| id | name  | birth_date | sex  | position | salary   | dept_id |
+----+-------+------------+------+----------+----------+---------+
|  9 | HENRY | 1982-05-20 | M    | HR       | 82000000 |    NULL |
+----+-------+------------+------+----------+----------+---------+
1 row in set (0.00 sec)

두 table에 대한 모든 attributes가 출력된다.

SELECT *
-> FROM project, employee
-> WHERE project.id = 2002 and project.leader_id=employee.id;
+------+-----------------------------+-----------+------------+------------+----+--------+------------+------+----------+----------+---------+
| id | name | leader_id | start_date | end_date | id | name | birth_date | sex | position | salary | dept_id |
+------+-----------------------------+-----------+------------+------------+----+--------+------------+------+----------+----------+---------+
| 2002 | 확장성 있게 백엔드 리팩토링 | 13 | 2022-01-23 | 2022-03-23 | 13 | JISUNG | 1989-07-07 | M | PO | 90000000 | 1005 |
+------+-----------------------------+-----------+------------+------------+----+--------+------------+------+----------+----------+---------+
1 row in set (0.00 sec)

WHERE없는 SELECT

테이블에 있는 모든 tuples을 반환 한다.

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

SELECT name, birth_date
    -> FROM employee;
+---------+------------+
| name    | birth_date |
+---------+------------+
| MESSI   | 1987-02-01 |
| JANE    | 1996-05-05 |
| JENNY   | 2000-10-12 |
| BROWN   | 1996-03-13 |
| DINGYO  | 1990-11-05 |
| JULIA   | 1986-12-11 |
| MINA    | 1993-06-17 |
| HENRY   | 1982-05-20 |
| NICOLE  | 1991-03-26 |
| SUZANNE | 1993-03-23 |
| CURRY   | 1998-01-15 |
| JISUNG  | 1989-07-07 |
| SAM     | 1992-08-04 |
+---------+------------+
13 rows in set (0.00 sec)

주의 사항

  • SELECT로 조회할 때 조건들을 포함해서 조회를 한다면 이 조건들과 관련된 attributes에 index가 걸려있어야 합니다. 그렇지 않다면 데이터가 많아질수록 조회 속도가 느려 집니다.
    i.g. SELECT * FROM employee WHERE position = ‘dev_back’
  • 내용은 MySQL 기준으로 다른 RDBS에서는 다를 수 있음
  • SELECT와 관련하여 대표적으로 중요한 기본기만 적었음 그 외 여러 기본적인 조회 기능들과 세부 사항이 있음
728x90

관련글 더보기