학습목표
- SELECT의 기본적 구조 & 실행순서
- 관계대수의 기본연산 & SQL 문법 -> 연관지어 이해
- 데이터 조회: 연산자, 단일행 함수, 집계 함수
- NULL이 포함되었을 때 연산은 어떻게 되는지
- GROUP BY & HAVING -> 테이블 데이터를 그룹별 집계
- ORDER BY -> 데이터 정렬 & 조회
SELECT 쿼리의 기본 구조
- SELECT: 조회를 위한 DML
- SELECT의 결과: 릴레이션
- 관계대수의 기본 연산들 -> SQL 구문으로 구현
Basic 구조
select ATTRIBUTE_1, ATTRIBUTE_2, ..., ATTRIBUTE_n
from TABLE_1, TABLE_2, ..., TABLE_m //조회할 대상 릴레이션(단일 테이블/조인 연산자 등..)
where SELECT_PREDICATE;
처리하는 순서: "from -> where -> select"
조회할 대상 릴레이션 고르고(from), 조건에 맞는(where) 투플만을 조회(select)
Full 구조
select ATTRIBUTE_1, ATTRIBUTE_2, ..., ATTRIBUTE_n //5
from TABLE_1, TABLE_2, ..., TABLE_n //1
where SELECT_PREDICATE //2
group by GROUPTING_ATTRIBUTES //3
having GROUP_AGGREGATION_FUNCTION //4
order by ORDERING_ATTRIBUTES //6
from -> where -> group by -> having -> select -> order by
내가 조회할 릴레이션을 꺼내(from): 단일테이블/카티션곱/조인/서브쿼리
조건을 만족하는 투플만을 포함(where)
컬럼명 기준으로 그루핑하고(group by)
특정 조건으로 그룹을 필터링(having)
걸러낸 행의 특정 열 조회(select)
조회한 데이터 정렬하여 출력(order by)
SELECT 절
: 최종 결과에 포함될 속성(컬럼)만 선별
: 관계대수의 "project 연산(∏𝐴1,𝐴2,…,𝐴𝑘 (𝑟))"과 대응
‼️ 항상 from 다음 순서로 읽는 것 명심 ‼️
select name from instructor;
=> "instructor" 테이블에서 name 컬럼을 select 해올 것
select * from instructor;
=> "instructor" 테이블에서 모든 컬럼을 select 해올 것
* 테이블명, 컬럼명은 일반적으로 대소문자 구분 x (Name == NAME == name)
BUT, 시스템마다 다를 수 잆고 가독성 문제 때문에 -> 대문자/소문자로 통일 권장
옵션: DISTINCT & ALL
관계대수의 결과 릴레이션은 중복이 제거된 결과이지만(집합 개념)
SQL의 결과 릴레이션은 중복이 포함된 결과이다.(실제: ALL이 디폴트)
=> 중복 제거하려면 DISTINCT 옵션 줘야 함
select dept_name from instructor;
<DISTINCT>
: 중복행 데이터 제거
select distinct dept_name from instructor;
<ALL>
: 중복행 강제로 포함
select all dept_name from instructor;
FROM 절
조회 대상 릴레이션 기술(단일 테이블/조인 연산 결과/서브쿼리 결과 릴레이션)
-> 조회 대상 릴레이션으로 관계대수의 카티션 곱(𝑟 × s), 조인 연산(𝑟⨝𝜃𝑠) 지원
select * from instructor, teaches; //instructor 릴레이션과 teaches 릴레이션의 카티션 곱
ID와 같이 동일한 컬럼명은 내부적으로 instrcutor.ID와 teaches.ID로 구별(=관계대수)
WHERE 절
: 카티션 곱의 결과 릴레이션에서 where 절의 조건을 만족하는 행만 선택
: 관계대수의 "select 연산(𝜎𝑝(𝑟))"과 대응
select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
select name
from instructor
where dept_name = 'Comp.Sci.';
select name, dept_name, course_id
from instructor, teaches
where (instructor.ID = teaches.ID) and (instructor.dept_name = 'Comp.Sci.'); //조건 여러 개 주기도 가능
Rename 연산
테이블 별칭(Alias)
: 테이블에 별칭 부여(ex. from...as...) => as 생략 가능
* 실제 테이블 스키마의 테이블명이 변경되는 것은 아님
* 다양한 테이블 조회 연산 시 편의성을 위해서(특히 조인)
* 해당 쿼리에서는 기존 테이블명이 아닌, 별칭으로만 사용 가능
<예제1>
select T.name, T.dept_name, T.salary
from instructor as T, instructor as S // T & S로 rename
where (T.salary > S.salary) and (S.dept_name = 'Comp.Sci.');
1. from절
=> 조회 대상 릴레이션: T(instructor)와 S(instructor) => instructor 테이블 두 개만 놓고 보기
T | S |
2. where절
조건 만족하는 투플 필터링
3. select절
name, dept_name, salary 열만 추출
<예제2>- 중복 제거: "distinct" 추가
select distinct T.name, T.dept_name, T.salary
from instructor T, instructor S
where (T.salary > S.salary) and (S.dept_name = 'Comp.Sci.');
컬럼 별칭(Alias)
: 컬럼명에 별칭 부여(ex. select ... as ...) => as 생략 가능
* 실제 테이블 스키마의 컬럼명이 변경되는 것은 아님
* 테이블 조회 결과의 가독성을 위해서
* SELECT절, ORDER BY절에서만 컬럼 별칭 사용 가능(WHERE 절에서는 사용 불가)
** "from->where->group by->having->select->order by" 순서로 실행되기 때문에 당연한 것 !!
select name as instructor_name
from instructor;
select name as 'instructor name' //띄어쓰기 반영하려면 작은따옴표
from instructor;
문자열, 컬럼 별칭, 테이블 별칭 관련 문법 정리
- 문자열: 데이터에 작은 따옴표 추가 -> 따옴표 사용 가능 & 대소문자 구분 필수
- 컬럼 별칭: as 생략 가능하고 띄어쓰기할 때 따옴표 가능 -> SELECT, ORDER BY절은 별칭 사용 가능(WHERE절은 불가) & 대소문자 구분 필수는 아님
- 테이블 별칭: as 생략 가능하지만 따옴표 금지(공백 금지) -> 원래 테이블명 대신 별칭만 사용 가능
=> 컬럼 별칭 & 테이블 별칭은 모두 해당 쿼리 안에서만 유효
'백엔드 > SQL' 카테고리의 다른 글
SQL 7장 (0) | 2025.04.14 |
---|---|
DML: SQL 연산자와 내장 함수(1) (0) | 2025.04.13 |
DML: INSERT & DELETE & UPDATE (0) | 2025.04.11 |
DDL: 제약조건 & 인덱스 & 스키마 변경/삭제 (0) | 2025.04.06 |
SQL을 활용한 데이터 정의와 조작 (0) | 2025.04.04 |