일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 쉬운 코드
- SDK
- 트랜잭션
- 개발남노씨
- 백엔드
- 김영한
- 갤럭시 S24
- 쉬운코드
- 커널 동기화
- concurrency control
- 반효경
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- 네트워크
- 온디바이스AI
- 시스템프로그래밍
- 운영체제
- Extendable hashing
- SQL
- B tree 데이터삽입
- recoverability
- Git
- 코딩애플
- 인터럽트
- 데이터베이스
- CPU 스케줄링
- 코딩테스트 [ ALL IN ONE ]
- 프로세스 주소 공간
- vite
- 시그널 핸들러
- 운영체제와 정보기술의 원리
- Today
- Total
티끌모아 태산
SQL 데이터 조회 본문
지금까지 데이터베이스를 정의하고 스키마를 정의한 후 데이터를 추가, 수정, 삭제하는 방법에 대해서 배웠습니다. 이번시간에는 select 문을 활용해서 데이터를 읽어오는 기본적인 문법에 대해서 알아보도록 하겠습니다.
SELECT statement -> 데이터 조회하기
- ID가 9인 임직원의 이름과 직군을 알고 싶다.-> employee table 참조
SELECT name, position FROM employee WHERE id = 9;
employee 테이블에서 이름과 직군 데이터를 조회한다.
- projection attributes: 내가 원하는 속성
- selection condition: 조건
✅- 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;
총 두개의 테이블을 확인해서 데이터를 읽어와야한다. 두 개의 데이터를 연결하기 위한 join condition 필요!
그리고 SELECT 문을 작성할 때, 테이블 이름과 속성을 함께 작성하는 이유는 테이블 마다 속성 이름이 똑같은 경우가 있기 때문에 혼동을 막기 위해서 작성합니다. 아래 사진에서 PROJECT 테이블에서 leader_id 는 고유하기 때문에 테이블 이름과 함께 안써줘도 되지만 좀 더 명시적으로 해주기 위해서 아래와 같이 작성하는 것을 추천합니다.
AS
AS는 테이블이나 attribute에 별칭을 붙일 때 사용한다. 그리고 생략이 가능하다. AS를 사용하는 이유는 좀 더 효율적으로 쿼리문을 작성하기 위함입니다. 좀 전에 더 명시적으로 데이터를 표현하기 위해서 project.id or employee.id 이런식으로 작성한다고 했는데, 만약 데이블 이름이 길면 일일이 타이핑하는 것이 번거로운 일이될 수 있습니다.
위 사진은 테이블 이나 속성값의 이름이 길어질 경우 귀찮은 작업을 수 있습니다.
이렇게 AS 를 통해서 길이를 줄이는 작업을 수행할 수 있습니다.
따라서 이렇게 작성을 해서 귀찮은 작업을 줄일 수 있습니다. 게다가 결과의 필드값도 명시적으로 작성해 주기 위해서 다음과 같이 작성할 수 있습니다.
DISTINCT -> SELECT 결과에서 중복된 튜플 제거
distinct 문을 이해하기 위해서 먼저 예를들어보자.
✅- 디자이너들이 참여하고 있는 프로젝트의 ID와 이름을 알고 싶다. -> employee, works_on, project tables 참조. 이때, 중복된 튜플을 제거하고 싶다.
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 문을 사용한다.
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;
이렇게 중복된 값이 제거됐음을 확인할 수 있습니다. 결국에 distinct 문은 select 결과에서 중복된 튜플을 제외하고 싶을 때 사용한다.
LIKE
✅- 이름이 N으로 시작하거나 N으로 끝나는 임직원들의 이름을 알고 싶다. -> employee table 참조
SELECT name FROM employee WHERE name LIKE 'N%' or LIKE '%N'
이때, '%' 는 '0개 이상의 임의의 문자들을 의미한다.'
- 이름에 NG가 들어가는 임직원들의 이름을 알고싶다. -> employee table 참조
SELECT name FROM employee WHERE name LIKE '%NG%'
- 이름이 J로 시작하는, 총 네 글자의 이름을 가지는 임직원들의 이름을 알고 싶다. -> employee table 참조
SELECT name FROM employee WHERE name LIKE 'J_ _ _'
escape 문자와 함께 LIKE 사용하기
- %로 시작하거나 _ 로 끝나는 프로젝트 이름을 찾고 싶다면? -> project table 참조 백슬레쉬(\)를 사용하면 %와 _ 를 본연의 문자 그대로 사용한다.
SELECT name FROM project WHERE name LIKE '\%%' or name LIKE '%\_';
* (asterisk) 사용하기 -> 선택된 튜플의 모든 필드값들을 보여주고 싶을 때
- ID가 9인 임직원의 모든 attributes를 알고 싶다.-> employee table 참조
SELECT * FROM employee WHERE id = 9;
또 다른 예시로는 다음과 같습니다.
SELECT without WHERE -> 테이블에 있는 모든 튜플을 반환한다.
- 모든 임직원의 이름과 생일을 알고 싶다.-> employee table 참조
SELECT name, birth_date FROM employee;
❗️주의사항
1. SELECT로 데이터를 조회할 때 조건들을 포함해서 조회를 한다면 이 조건들과 관련된 attributes에 index가 걸려있어여합니다. 왜냐하면 만약 index를 걸어주지 않는다면 데이터가 많이 쌓일 수록 조회 속도가 느려지기 때문입니다.
SELECT * FROM employee WHERE position = 'dev_back';
이렇게 작성했을 때, position에 대해 index가 걸려있어야지 데이터가 많아도 조회하는데 속도가 떨어지지 않습니다.
'CS 지식 > 데이터베이스' 카테고리의 다른 글
⭐️SQL 데이터 조회: subquery (0) | 2023.09.14 |
---|---|
⭐️SQL을 통한 데이터 추가, 수정, 삭제 (1) | 2023.09.08 |
SQL의 기본 개념과 문법 (0) | 2023.09.07 |