본문 바로가기

DB/DB 강의

DB 5강

SELECT로 데이터 조회하기

 

SELECT statement

  • ID가 9인 임직원의 이름과 직군 알고 싶음

selection condition, projection attributes

  • selection condition: employee라는 table에서 어떤 tuple을 선택할지 조건 명시
  • projection attributes: 내가 알고 싶은 attributes 지정하여 그 attributes에 대응하는 값들만 가지고 오겠다는 의미
  • 즉 SELECT문을 수행하게 되면 selection condition을 통해 선택된 tuple의 값들 중에서, projection attributes에 의해 지정된 그 attribute에 대응하는 값만 가져오게 됨. 다시 말해, 위의 그림과 같이 교차된 값들만 가져옴

SELECT문을 실행한 결과

 


<정리> SELECT statement

 

SELECT attribute(s)

FROM table(s)

[WHERE condition(s)];

  • SELECT 키워드 + 알고싶은 attribute list
  • FROM 키워드 + 어떤 table에서부터 읽어올지 지정, query문에 따라 table 2개 이상 올 수 있음
  • WHERE 키워드 + 관심있어  하는 tuple들만 가지고 오고 싶은 경우 조건 작성

 

 


SELECT statement

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

이 query문은 2개의 table과 관련 있음

 

위 query문을 table schema로 분석

  • leader_id를 통해 EMPLOYEE table에 접근 가능해짐
  • leader_id가 EMPLOYEE table의 id를 가리키는 reference하는 foreign key 이기에
  • PROJECT id는 PROJECT table에 있지만, 최종적으로 가져와야 하는 정보들은 EMPLOYEE에 있음
  • 위 2개의 table 연관되어 있음   

 

 

위 내용을 바탕으로 작성한 SQL문

  • join condition: 두 개의 table 연결시키는 역할 
  • join condition에 의해 project table에 있는 leader_id의 값인 13이 employee table에 있는 id의 값 13과 연결됨
  • 이에 최종적으로, selection condition이 EMPLOYEE table의 해당 tuple까지도 선택함
  • join condition에 의해 연결되었기에 

위 SQL문 수행한 결과

 

table 이름과 attribute 이름을 반드시 같이 적어줘야 하는 경우

  • EMPLOYEE table과 PROJECT table에 동일한 이름의 attribute가 존재함 (id, name)
    • attribute 이름은 같은 table 안에서만 겹치지 않으면 됨
    • 서로 다른 table이라면 attribute 이름이 같을 수도 있음
  • attribute 이름이 충돌하지 않는 경우, table 이름 써도 되고 안 써도 됨
  • attribute 이름이 충돌하는 경우, 반드시 table 이름과 attribute 이름 같이 써야 됨

table 이름 같이 적어주지 않은 경우, ERROR 발생

 


SELECT문과 관련된 기본적으로 제공되는 여러가지 키워드

 

AS

  • AS는 테이블이나 attribute에 별칭을 붙일 때 사용
  • AS는 생략 가능

 

AS 키워드

  • AS 키워드를 통해 각 테이블에 별칭을 붙인 경우
  • select 결과로 나오는 attribute 이름에 대해 새로운 이름 부여한 경우

 

AS 생략 가능

 


DISTINCT

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

먼저, 개념적으로 정리 필요

  • EMPLOYEE table: 디자이너들이 어떤 프로젝트에 일하고 있는지, 즉 POSITION attribute의 값이 DSGN으로 표시되어 있는 것에 관심 있기에 이 테이블 필요.
  • PROJECT table: 그 임직원이 참여하고 있는 프로젝트에 관심이 있는 것이기에 이 테이블 필요.
  • WORKS_ON table: 위 두 개의 테이블을 연결시켜주기에 이 테이블 필요. 이 테이블은 어떤 임직원이 어떤 프로젝트에서 일하고 있는지에 대한 정보를 담고 있기에. 

 

위 개념을 바탕으로 SQL문 작성

 

위 SQL문을 수행한 결과 -> 중복된 tuple 있음

 

DISTINCT 키워드

  • attribute 이름 앞에 DISTINCT 적어주면 attribute 조합에 대해서 중복된 tuple들은 제거해줌.

 

 

<정리> DISTINCT 사용하기

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

 


LIKE

 

 

LIKE 사용하기

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

LIKE 키워드 (% 사용)

 


LIKE 사용하기

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

앞 뒤로 %기호 붙여줘야 함

 


LIKE 사용하기

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

LIKE 키워드 (_ 사용)

 


escape 문자와 함께 LIKE 사용하기

  • 위에서 본 것과 같이 %, _가 특별한 의미를 가지는데, 그게 아닌 %, _를 문자 본연의 의미로 사용하고 싶을 때는?

 

  • %로 시작하거나 _로 끝나는 프로젝트 이름을 찾고 싶다면?
  • SELECT name FROM project WHERE name LIKE '\%%' or name LIKE '%\_';
    • \% : \ 뒤에 %를 붙이게 되면 이 %를 특별한 의미의 %가 아니라, 문자 그대로의 % 의미로 사용하라는 의미
    • \% 뒤에 나오는 %는 특별한 의미를 가지는 %임. 즉, 0개 이상의 임의의 개수를 가지는 문자를 의미 
  • 특별한 의미를 가지는 문자가 있을 때, 특별한 의미로서가 아니라 문자 본연의 의미를 가지도록 만들어주는 것을 escape라고 함. 
  • 위의 예시에서는 \(백슬래시)가 escape 문자가 됨.  

 


LIKE 정리

 


 *(asterisk)

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

 

*(asterisk) 사용하기

  • ID가 9인 임직원의 모든 attribute를 알고 싶음

모든 attribute를 알고 싶은 경우, * 사용

 


두 개의 table에 대한 모든 attribute들이 표시된 경우

 


SELECT without WHERE

  • 모든 임직원의 이름과 생일을 알고 싶음 

 

<정리> SELECT without WHERE

  • 테이블에 있는 모든 tuples를 반환함

주의 사항

  1. SELECT로 조회할 때 조건들을 포함해서 조회를 한다면 이 조건들과 관련된 attributes에 index가 걸려있어야 한다. 그렇지 않다면 데이터가 많아질 수록 조회 속도가 느려진다.
  • ex: SELECT * FROM employee WHERE position = 'dev_back';
  • employee table에서 position이 'dev_back'만 조회하고 싶은 경우, position에 대해서 인덱스가 걸려 있어야 employee table에 데이터가 아무리 많이 있더라도 이 query문을 실행하는 속도가 느려지지 않고 빠르게 유지될 수 있음.
  • " index에 대한 내용은 나중에 영상에서 언급하겠다."

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

 

 

 

 

'DB > DB 강의' 카테고리의 다른 글

DB 7강  (0) 2023.09.20
DB 6강  (1) 2023.09.19
DB 4강  (2) 2023.09.13
DB 3강  (0) 2023.09.12
DB 2강  (0) 2023.09.12