티끌모아 태산

SQL 데이터 조회 본문

CS 지식/데이터베이스

SQL 데이터 조회

goldpig 2023. 9. 10. 16:06
728x90

  지금까지 데이터베이스를 정의하고 스키마를 정의한 후 데이터를 추가, 수정, 삭제하는 방법에 대해서 배웠습니다. 이번시간에는 select 문을 활용해서 데이터를 읽어오는 기본적인 문법에 대해서 알아보도록 하겠습니다.

SELECT statement -> 데이터 조회하기

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

- ID가 9인 임직원의 이름과 직군을 알고 싶다.-> employee table 참조

SELECT name, position FROM employee WHERE id = 9;

employee 테이블에서 이름과 직군 데이터를 조회한다. 

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

  • projection attributes: 내가 원하는 속성
  • selection condition: 조건

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

✅- project 2002를 리딩(leading) 하고 있는 임직원의 ID와 이름과 직군을 알고싶을 때 -> project, employee tables 참조

SELECT employee.id, employee.name, position FROM project, employee 
WHERE project.id = 2002 and project.leader_id = employee.id;

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

두개의 테이블을 확인해서 데이터를 읽어와야한다. 두 개의 데이터를 연결하기 위한 join condition 필요!

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드
출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

  그리고 SELECT 문을 작성할 때, 테이블 이름과 속성을 함께 작성하는 이유는 테이블 마다 속성 이름이 똑같은 경우가 있기 때문에 혼동을 막기 위해서 작성합니다. 아래 사진에서 PROJECT 테이블에서 leader_id 는 고유하기 때문에 테이블 이름과 함께 안써줘도 되지만 좀 더 명시적으로 해주기 위해서 아래와 같이 작성하는 것을 추천합니다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

AS

AS는 테이블이나 attribute에 별칭을 붙일 때 사용한다. 그리고 생략이 가능하다. AS를 사용하는 이유는 좀 더 효율적으로 쿼리문을 작성하기 위함입니다. 좀 전에 더 명시적으로 데이터를 표현하기 위해서 project.id or employee.id 이런식으로 작성한다고 했는데, 만약 데이블 이름이 길면 일일이 타이핑하는 것이 번거로운 일이될 수 있습니다. 

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

위 사진은 테이블 이나 속성값의 이름이 길어질 경우 귀찮은 작업을 수 있습니다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

이렇게 AS 를 통해서 길이를 줄이는 작업을 수행할 수 있습니다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

따라서 이렇게 작성을 해서 귀찮은 작업을 줄일 수 있습니다. 게다가 결과의 필드값도 명시적으로 작성해 주기 위해서 다음과 같이 작성할 수 있습니다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

DISTINCT -> SELECT 결과에서 중복된 튜플 제거

distinct 문을 이해하기 위해서 먼저 예를들어보자.

✅- 디자이너들이 참여하고 있는 프로젝트의 ID와 이름을 알고 싶다. -> employee, works_on, project tables 참조. 이때, 중복된 튜플을 제거하고 싶다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

SELECT 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;

위 쿼리문을 실행하면 다음과 같은 결과가 나옵니다. 그러면 결과 값에 중복되는 튜플들이 나오는데 중복을 제거하고 싶을 때 distinct 문을 사용한다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

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;

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

이렇게 중복된 값이 제거됐음을 확인할 수 있습니다. 결국에 distinct 문은 select 결과에서 중복된 튜플을 제외하고 싶을 때 사용한다.

LIKE

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

SELECT name FROM employee WHERE name LIKE 'N%' or LIKE '%N'

이때, '%' 는 '0개 이상의 임의의 문자들을 의미한다.'

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

- 이름에 NG가 들어가는 임직원들의 이름을 알고싶다. -> employee table 참조

SELECT name FROM employee WHERE name LIKE '%NG%'

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

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

SELECT name FROM employee WHERE name LIKE 'J_ _ _'

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

escape 문자와 함께 LIKE 사용하기

- %로 시작하거나 _ 로 끝나는 프로젝트 이름을 찾고 싶다면? -> project table 참조 백슬레쉬(\)를 사용하면 %와 _ 를 본연의 문자 그대로 사용한다.

SELECT name FROM project WHERE name LIKE '\%%' or name LIKE '%\_';

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

* (asterisk) 사용하기 -> 선택된 튜플의 모든 필드값들을 보여주고 싶을 때

- ID가 9인 임직원의 모든 attributes를 알고 싶다.-> employee table 참조

SELECT * FROM employee WHERE id = 9;

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

또 다른 예시로는 다음과 같습니다.

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

SELECT without WHERE -> 테이블에 있는 모든 튜플을 반환한다.

- 모든 임직원의 이름과 생일을 알고 싶다.-> employee table 참조

SELECT name, birth_date FROM employee;

출처:https://www.youtube.com/watch?v=dTBwgWMUguE&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=5, 쉬운코드

❗️주의사항

1. SELECT로 데이터를 조회할 때 조건들을 포함해서 조회를 한다면 이 조건들과 관련된 attributes에 index가 걸려있어여합니다. 왜냐하면 만약 index를 걸어주지 않는다면 데이터가 많이 쌓일 수록 조회 속도가 느려지기 때문입니다. 

SELECT * FROM employee WHERE position = 'dev_back';

이렇게 작성했을 때, position에 대해 index가 걸려있어야지 데이터가 많아도 조회하는데 속도가 떨어지지 않습니다.

 

728x90