클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

SELECT문의 기본 형식 3 - 책으로 학습하는 예제 및 연습문제 풀기 본문

알고리즘 및 자료 관리/데이터베이스

SELECT문의 기본 형식 3 - 책으로 학습하는 예제 및 연습문제 풀기

huenuri 2024. 8. 21. 16:15

어젯밤 3시가 다 되어서 잠을 청했으나 알람 시간보다 1시간 일찍 일어나 하루를 시작해본다. 이제 하루종일 공부할 수 있는 시간도 오늘밖에 남지 않아 많이 아쉬운 마음이다. 하루를 4시간으로 나누어서 4가지의 중요한 과목들을 집중해보기로 했다.
우선 새벽부터 아침식사 전까지는 데이터베이스 공부를 해볼 것이다. 어제 우여곡절 끝에 SCOTT 계정도 만들었으니 이제 책으로 공부를 할 수 있다.

아직 잠을 깨지 못해 비몽사몽하지만 바로 공부를 시작해보자! 이럴 때는 음악을 들으면 잠을 깨고 머릿속도 맑아진다. 오늘도 화이팅이다!

 

학습 내용

  1. 실습용 테이블 살펴보기
  2. 데이터를 조회하는 3가지 방법 : 셀렉션, 프로젝션, 조인
  3. SQL의 기본 뼈대 : SELECT 절과 FROW 절
  4. 중복데이터를 삭제하는 DISTINCT
  5. 한눈에 보기좋게 별칭 만들기
  6. 원하는 순서대로 정렬하는 ORDER BY
  7. 연습문제 풀며 단원 마무리하기

 

학습 시간

새벽 6시 ~ 8시 15분 <2시간 15분 소요>


 

 

 

실습용 테이블 살펴보기

1. 사원 정보가 들어있는 EMP 테이블

EMP는 employee의 약어이며 사원 데이터를 보관 및 관리하는 테이블이다.

실습 4-1 : EMP 테이블 구성 살표보기

어제처럼 표가 아닌 글자로만 출력이 되어 명령어를 책과 다르게 써보았다.

그랬더니 이렇게 표 모양으로 잘 출력이 되었다. 이제 구성하는 열을 한번 살펴보자. 앞으로 자주 보게 될 것이지 무엇을 뜻하는지 알고 있으면 좋을 것 같다.

 

1. EMPNO : 사원 번호

네 자리 숫자

2. ENAME : 사원 이름

10byte 크기의 가변형 문자열

3. JOB : 사원 직책

9byte 크기의 가변형 문자열

4. MGR : 직속 상관의 사원 번호

네 자리 숫자

5. HIREDATE : 입사일

날짜 데이터

6. SAL : 급여

두 자리 소수점을 포함하는 일곱 자리 숫자

7. COMM : 급여 외 추가 수당

두 자리 소수점을 포함하는 일곱 자리 숫자

8. DEPINO : 사원이 속한 부서 번호

두 자리 숫자

😲 가변형 문자열
여러 문자가 모여있는 문자열. 문자열 데이버가 10byte보다 작은 공간을 차지하는 경우 데이터가 차지하는 공간만큼만 저장공간을 할당함

 

 

 

2. 회사 부서 정보가 들어있는 DEPT 테이블

DEPT는 department의 약어이며 회사를 구성하는 부서 데이터를 관리하는 테이블이다.

이것도 역시 표도 출력될 수 있도록 설정해보았다.

1. DEPTNO : 부서 번호

두 자리 숫자

2. DNAME : 부서 이름

14byte 크기의 가변형 문자열

3. LOC : 부서가 위치한 지역

13byte 크기의 가변형 문자열

DEPTNO 열은 각 부서 데이터를 구분하는 유일한 값이며 기본키이다.


 

 

3. 사원들의 급여 정보가 들어있는 SALGRAGE 테이블

EMP 테이블에서 관리하는 사원들의 급여와 관련된 테이블

1. GRADE : 급여 등급

2. LOSAL : 급여 등급의 최소 급여액

3. HISAL : 급여 등급의 최대 급여액

SQL 문을 작성할 때 테이블 이름과 열 이름은 대문자로 쓰기를 권장


 

 

 

 

데이터를 조회하는 3가지 방법 - 셀렉션, 프로젝션, 조인

데이터베이스에 보관되어 있는 데이터를 조회하는데 사용하는 SELECT 문은 출력 데이터를 선정하는 방식에 따라 크게 3가지 방식으로 나뉜다.

 

1. 행 단위로 조회하는 셀렉션

셀렉션(Selection)은 행 단위로 원하는 데이터를 조회하는 방식이다. 테이블 전체 데이터 중 몇몇 가로줄의 데이터만 선택할 때 사용한다.

 

2. 열 단위로 조회하는 프로젝션

 

프로젝션(Projection)은 열 단위로 데이터를 조회하는 방식이다.

 

3. 셀렉션과 프로젝션 함께 사용하기

 

특정 테이블에서 조회하려는 행과 열을 모두 선별할 때 셀렉션과 프로젝션을 함께 사용할 수 있다.

 

4. 두 개 이상의 테이블을 사용하여 조회하는 조인

 

조인(Join)은 두 개 이상의 테이블을 양옆에 연결하여 마치 하나의 테이블인 것처럼 데이터를 조회하는 방식이다.
조인은 관계형 데이터베이스에서 흔히 사용하는 방식이다.


 

 

확인 문제 풀기

 


 

 

 

SQL의 기본 뼈대, SELECT절과 FROM절

SELECT문은 데이터베이스에 보관되어 있는 데이터를 조회하는데 사용한다. FROM 절은 조회할 데이터가 저장된 테이블의 이름을 명시한다. SELECT 절은 FROM 절에 명시한 테이블에서 조회할 열이나 여러 열에 저장된 데이터의 조합 또는 연산식을 지정할 수 있다.

 

 

 

1. *로 테이블 전체 열 출력하기

이 부분은 조금 전에 모두 풀어보았던 문제이지만 한번 더 복습하는 의미로 풀어보겠다.

처음에는 표 없이 출력이 되는 게 원래 맞는 모양이다.

 

 

 

 

2. 테이블 부분 열 출력하기

한 부서의 번호만 조회하고 싶을 때 쉼표로 구분한다.


 

 

 

중복 데이터를 삭제하는 DISTINCT

SELECT 문으로 데이터를 조회한 후 DISTINCT를 사용하여 중복을 제거한다. SELECT 절에 열 이름을 명시하기 전에 선택적으로 사용할 수 있다.

 

1. DISTINCT로 열 중복 제거하기(열이 한 개인 경우

 

2. DISTINCT로 열 중복 제거하기(열이 여러 개인 경우

JOB 열의 값이 MANAGER인 데이터가 3번 출력되고 있지만, 부서 번호는 각각 다르기 때문에 중복 데이터가 아니다.

 

 

 

3. ALL로 중복되는 열 제거 없이 그대로 출력

DISTINCT와 반대로 데이터의 중복을 제거하지 않고 그대로 출력한다.


 

 

 

한눈에 보기 좋게 별칭 설정하기

본래 열 이름 대신에 붙이는 이름을 별칭(allias)라고 한다.

 

1. 열과 연산식

연산식을 함께 사용하여 출력할 수 있다.

이렇게 계산된 내용은 사원의 '연간 총 수입'이다.

 

 

곱하기를 사용하지 않고 사원의 연간 총 수입 출력하기

긴 열의 이름을 짧고 간단한 다른 이름으로 출력하고 싶을 때 별칭을 사용한다.

 

 

 

2. 별칭을 지정하는 방식

별칭은 단순히 긴 열 이름의 불편함 외에도 보안이나 데이터 노출 문제 때문에 사용하는 경우도 있다.

 

 

 

3. 실무에서의 별칭 지정

실무에서는 별칭을 지정하는 4가지 방식 중 세번째 방식을 선호하는 경향이 있다. 우선 AS가 붙으면 어떤 단어의 별칭인지 알아보기 쉽다. 다른 한 가지 이유는 큰따옴표를 사용하지 않으려는 프로그래머들 습관 때문이다.
SELECT문을 비롯한 여러 SQL문은 프로그래밍 코드에서 그대로 사용하는 경우가 많다. 대부분 프로그래밍 언어에서 큰따옴표는 문자열 데이터의 시작과 끝을 알리는 기호로 이미 사용되고 있다.

따라서 코드에서 사용한 큰따옴표가 SQL문에 사용한 건지 아니면 기존 프로그래밍 코드에서 문법으로 사용한 건지를 구분할 추가작업이 필요하다.


 

 

 

원하는 순서로 출력 데이터를 정렬하는 ORDER BY

데이터를 정렬된 상태로 출력하기 위해 ORDER BY절을 사용한다. 이 절은 SELECT문을 작성할 때 사용할 여러 절 중 가장 마지막 부분에 쓴다.

 

 

 

1. 오름차순 사용하기

ORDER BY절에는 정렬 기준이 되는 열 이름을 지정한다. 그리고 열 이름은 하나 또는 여러 개의 열을 지정할 수 있다.

급여가 오름차순으로 정렬되었다.

 

 

 

 

 

2. 내림차순 사용하기

 

 

 

3. 각각의 열에 내림차순과 오름차순 동시에 사용하기

우선순위를 고려하여 여러 개의 정렬 기준을 지정할 수 있다.

 

 

 

4. ORDER BY절을 사용할 때 주의 사항

이 정렬은 꼭 필요한 경우가 아니면 사용하지 않는 것이 좋다. 여기저기 흩어져 있는 데이터를 특정 기준에 따라 가지런히 순서를 맙추는 것은 많은 자원, 즉 비용을 소모하기 때문이다. 특정 기준에 따라 2개 데이터를 정렬하는 시간보다 10개 데이터를 정렬하는데 시간이 더 많이 필요하다.

따라서 ORDER BY절이 존재할 경우 SELECT문을 통해 조회할 데이터를 모두 확정한 상태에서 ORDER BY절의 명시된 기준에 따라 정리한다. 정렬을 하지 않으면 결과를 더 빨리 출력할 수도 있으니 꼭 필요한 경우가 아니면 넣지 않도록 주의하라!


 

 

 

단원 마무리 문제 풀기

JOB 열 데이터를 중복 없이 출력하기

참고 없이 혼자서 문제를 잘 풀었다.

 

 

 

다음 조건을 만족하는 SQL문 작성하기

 

 

 

 

 

이렇게 어려운 문제까지 도전해서 모두 풀어보았다. 이제 SELECT문은 거의 완벽하게 출력할 수 있는 수준이 되었다.


 

 

 

학습을 마치고

최대한 빠르게 1시간만에 공부를 마치고 싶었는데 책에 예제가 정말 많아서 다 해보느라 시간이 좀 걸렸다. 그래도 2시간이 조금 넘는 시간동안 정말 많은 것들을 배울 수 있었다.
강의만 들으면 더 깊이있는 학습을 하기는 어렵다. 혼자서 이렇게 책을 보고 찾아보고 연구하는 시간동안 나의 지식과 적용력은 더 넓어지는 것 같다.

이제 어제 공부하려고 했던 WHERE절을 학습해보려고 한다.