본문 바로가기

Database/MySQL

[데이터베이스(강의)] 5. SQL로 데이터 조회 (Select)

 

 

지금까지 만든 테이블

 


 

[ SELECT statement ]

 

SELECT attribute(s)

FROM table(s)

[ WHERE condition(s) ]

 

 

 

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

 

SELECT name, position FROM employee WHERE id = 9;

                projection attributes                                  selection condition 

=>  selection condition 을 통해 선택된 튜플의 값들 중에서

       projection attributes 에 의해 지정된 attribute에 대응하는 값들만 가져오게 된다.

 


 

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

         project 테이블                                                     employee 테이블

 

 

SELECT employee.id, employee.name, position

FROM project, employee

WHERE project.id=2002 and project.leader_id = employee.id;

              selection condition                  join condition

 

 

** employee 테이블과 project 테이블의 attribute 이름( id, name )이 같아서 각 속성 앞에 테이블 이름을 붙여줌.

 


 

* AS 사용하기

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

 - AS는 생략 가능하다.

 

 

 

SELECT employee.id, employee.name, position

FROM project, employee

WHERE project.id=2002 and project.leader_id = employee.id;

 

====== AS 사용하면

 

SELECT E.id, E.name, position

FROM project AS P, employee AS E

WHERE P.id=2002 and P.leader_id = E.id;

 

 

결과는 똑같음.


 

이 때 나온 결과값의 attribute들에 새로운 이름을 붙이고 싶을때도 AS 사용.

 

SELECT E.id AS leader_id, E.name AS leader_name, position
FROM employee AS E, project AS P
WHERE P.id=2002 and P.leader_id = E.id;

 

SELECT E.id leader_id, E.name leader_name, position
FROM employee AS E, project AS P
WHERE P.id=2002 and P.leader_id = E.id;

 

** 생략도 가능

 


 

* DISTINCT 사용하기 

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

 

 

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

   employee        works_on (연결고리 테이블)      project

 

 

SELECT P.id, P.name

FROM project AS P, employee AS E, works_on AS W

WHERE E.position = 'DSGN' and

              W.proj_id = P.id and W.empl_id = E.id;

 

 

이 때 id의 중복값을 제거하고 싶다면

 

 

SELECT DISTINCT P.id, P.name

FROM project AS P, employee AS E, works_on AS W

WHERE E.position = 'DSGN' and W.proj_id = P.id and W.empl_id = E.id;

 


 

* LIKE 사용하기 

 

 

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

 

SELECT name

FROM employee 

WHERE name LIKE 'N%' or name LIKE '%N'

                                                      0개 이상의 임의의 갯수를 가지는 문자.

 


 

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

 

SELECT name

FROM employee

WHERE name LIKE '%NG%';

 


 

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

 

SELECT name

FROM employee

WHERE name LIKE '

J___

';  

 

 


 

* escape 문자와 함께 LIKE 사용하기

 

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

 

SELECT name

FROM project

WHERE name LIKE '\%%' or name LIKE '%\_';

                          백슬래쉬 => 문자 그대로 적용

 


 

 

LIKE : 문자열 pattern matching 에 사용.

reserved character  => % : 0개 이상의 임의의 개수를 가지는 문자들을 의미

                                  =>  _  : 하나의 문자를 의미

escape character    =>  \  : 예약 문자를 escape시켜서 문자 본연의 문자로 사용하고 싶을 떄 사용. 

 


 

* (asterisk)

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

 

 

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

 

SELECT * FROM employee WHERE id = 9;

 


 

SELECT *

FROM project, employee

WHERE project.id=2002 and project.leader_id = employee.id;

 

=> 두 테이블에 대한 모든 attributes 표시.


 

* SELECT without WHERE

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

 


[ 주의사항 ]

 

1. SELECT로 조회할 때 조건들을 포함해서 조회를 한다면, 이 조건들과 관련된 attributes에 index가 걸려있어야 합니다.

  그렇지 않다면 데이터가 많아질수록 조회 속도가 느려집니다.

 

i.g. SELECT * FROM employee WHERE position = 'dev_back';

       => position 에 대해 index가 걸려있어야 빠른 조회 가능.

 

 

2. 이 내용은 MySQL 기준. 다른 RDBMS의 SQL 문법은 조금씩 다를 수 있음.

 

3. SELECT와 관련하여 대표적으로 중요한 기본기들만! 이외에도 여러 조회 기능들/세부 사항들이 있음.

 


 

https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5