javaboiii의 DataBase/DB 요약정리(Do it! 오라클 데이터베이스)

DB - 4) SELECT문의 기본 형식

javaboiii 2024. 7. 27. 19:04

DataBase

SQL문을 작성할 때 테이블 이름과 열 이름은 대문자로 쓰기를 권장합니다. 많은 프로그래밍 언어안세어 대/소문자를

확실하게 구분해 사용할 수 있지만 SQL문은 대/소문자를 구분하지 않습니다. 그래서 대/소문자가 섞여 있는 프로그래밍

언어와 SQL문을 구분하고 가독성을 높이기 위해서 실무에서는 SQL문 전체를 대문자로 사용하는 경우를 흔하게 볼 수 있습니다.

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

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

행 단위로 조회하는 셀렉션

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

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

프로젝션(projection)은 열 단위로 원하는 데이터를 조회하는 방식입니다. 예를 들어 학생 테이블을 구성하는 전체 항목 중 학번과 이름 학과 코드만을 조회할 때 프로젝션을 사용합니다.

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

특정 테이블에서 조회하려는 행과 열을 모두 선별할 때 셀렉션과 프로젝션을 함께 사용할 수 있습니다. 예를 들어 전체 학생 중 졸업생만을 조회하되 학번, 이름, 학과 코드 항목만 출력되도록 선택하는 것입니다. 셀렉션과 프로젝션을 함께 사용하면 더욱 상세한 데이터 조회가 가능합니다.

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

조인(join)은 두 개 이상의 테이블을 양옆에 연결하여 마치 하나의 테이블인 것처럼 데이터를 조회하는 방식입니다.

조인은 관계형 데이터베이스에서 흔히 사용하는 방식으로 여러 테이블의 데이터를 하나의 테이블처럼 조회할 수 있습니다. 테이블은 아니지만 테이블과 같이 행과 열로 구성된 다른 '요소'를 활용하거나 같은 테이블을 여러 번 사용하여 SELECT문의 조인에 활용할 수도 있습니다.

4-3. SQL의 기본 뼈대, SELECT절과 FROM절

SELECT문은 데이터베이스에 보관되어 있는 데이터를 조회하는 데 사용합니다. SELECT절과 FROM절을 기본 구성으로

SELECT문을 작성하는데 FROM절은 조회할 데이터가 저장된 테이블 이름을 명시합니다. 그리고 SELECT절은 FROM절에 명시한 테이블에서 조회할 열이나 여러 열에 저장된 데이터의 조합 또는 연산식을 지정할 수 있습니다.

SELECT [조회할 열1 이름], [열2 이름], ...[열N 이름]
FROM [조회할 테이블 이름];

 

키워드 필수 요소 선택 요소 설명
SELECT 조회할 열 이름 또는 출력할 데이터를 하나 이상 지정 또는 애스터리스크(*)로 전체 열을 지정 - SELCT절, 조회할 열을 지정함
FROM 조회할 테이블 이름 - FROM절, 조회할 테이블을 지정함

띄어쓰기와 줄 바꿈을 적극 사용하여 가독성을 높이는 것을 권장합니다.

4-4. 중복 데이터를 삭제하는 DISTINCT

SELECT문으로 데이터를 조회한 후 DISTINCT를 사용하여 중복을 제거합니다. DISTINCT는 SELECT절에 열 이름을

명시하기 전에 선택적으로 사용할 수 있습니다.

SELECT DISTINCT 열이름
FROM 테이블 이름;

열이 한 개인 경우 중복 행은 한 개만 남겨 두고 그 밖의 행은 모두 제거합니다.

DISTINCT를 사용하면 중복이 제거되어 특정 열을 구성하는 데이터의 종류를 편하게 확인할 수 있습니다.

 

SELECT DISTINCT 열이름1, 열이름2
FROM 테이블 이름;

열이 여러 개인 경우 열1과 열2가 모두 중복된 데이터는 한 번만 출력됩니다.

 

SELECT ALL 열이름1, 열이름2
FROM 테이블이름;

ALL은 DISTINCT와 반대로 데이터 중복을 제거하지 않고 그대로 출력합니다.

ALL을 사용하여 데이터를 조회한 결과는 DISTINCT와 ALL을 사용하지 않고 열1, 열2를 조회한 결과와 같습니다.

즉, SELECT절에서 중복 설정이 없을 경우에 ALL을 기본으로 사용기 때문에 내용이 같아지는 것입니다.

4-5. 한눈에 보기 좋게 별칭 설정하기

SELECT문의 결과를 보면 SELECT절에 명시한 열 이름이 결과 화면의 위쪽에 출력되는 것을 확인할 수 있습니다.

SQL문에서는 최종 출력되는 열 이름을 임의로 지정할 수도 있습니다. 이렇게 본래 열 이름 대신 붙이는 이름을

별칭(alias)이라고 합니다.

별칭을 지정하는 방식

오라클에서 별칭을 지정하려면 다음과 같이 4가지 방식 중 하나를 선택하여 SELECT절에 사용합니다.

연산 및 가공된 문장 이후 한 칸 띄우고 별칭 지정
연산 및 가공된 문장 이후 한 칸 띄우고 별칭을 크따옴표(" ")로 묶어 지정
연산 및 가공된 문장 이후 한 칸 띄운 후 'AS', 한 칸 뒤에 별칭 지정
연산 및 가공된 문장 이후 한 칸 띄운 후 'AS', 한 칸 뒤에 별칭을 큰따옴표(" ")로 묶어 지정

 

별칭은 최종적으로 출력되기를 원하는 열 이름을 직접 지정할 때 주로 사용합니다. 또 단순히 긴 열 이름의 불편함 외에도 보안이나 데이터 노출 문제 때문에 별칭을 사용해야 할 때도 더러 있습니다.

 

'AS'가 붙은 형식을 주로 쓰는 이유는 조회해야 할 열이 수십, 수백 개일 경우에 어떤 단어가 별칭인지 알아보기 편하기 때문입니다. SELECT문을 비롯한 여러 SQL문은 프로그래밍 코드에서 그대로 사용하는 경우가 많습니다.

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

SELECT문을 사용하여 데이터를 조회할 때 시간이나 이름 순서 또는 어떤 다른 기준으로 데이터를 정렬해서 출력해야 

하는 경우가 종종 생깁니다. 이때 데이터를 정렬된 상태로 출력하기 위해 ORDER BY절을 사용하고 ORDER BY절은

SELECT문을 작성할 때 사용할 수 있는 여러 절 중 가장 마지막 부분에 씁니다.

SELECT [조회할 열1 이름], [열2 이름],.....[열N 이름]
FROM [조회할 테이블 명]
.
. (그 밖에 절)
.
ORDER BY [정렬하려는 열 이름(여러 열 지정 가능)] [정렬 옵션];
키워드 필수 요소 선택 요소 설명
ORDER BY 정렬하려는 열 이름을
하나 이상 지정
정렬하는 열마다
오름차순(ASC),
내림차순(DESC) 지정
ORDER BY절에 지정한 열은 먼저 지정한 열을
우선으로 정렬합니다. 만약 정렬 옵션을 지정하지 않을 경우 기본값으로 오름차순(ASC)이 설정됩니다

오름차순 사용하기

ORDER BY절에는 정렬 기준이 되는 열 이름을 지정합니다.

그리고 열 이름은 하나 또는 여러 개의 열을 지정할 수 있습니다.

SELECT * FROM 테이블명
ORDER BY 열이름;

내림차순 사용하기

SELECT * FROM 테이블명
ORDER BY 열이름 DESC;

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

ORDER BY절에는 우선순위를 고려하여 여러 개의 정렬 기준을 지정할 수 있습니다. 예를 들어 부서 번호를 오름차순으로 정렬하고, 부서번호가 같은 사원일 경우 급여를 기준으로 내림차순으로 정렬할 수도 있습니다.

SELECT * FROM 테이블명
ORDER BY 부서번호 ASC, 급여 DESC;

ORDER BY절에 첫 번째로 명시된 부서 번호 열을 기준으로 먼저 오름차순으로 정렬한 후에 부서 번호 열 값이 같은,

즉 같은 부서에서 근무하고 있는 사원들끼리는 급여가 높은 사원부터 낮은 사원으로 내림차순으로 정렬하여 출력합니다.

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

ORDER BY절을 사용한 정렬은 꼭 필요한 경우가 아니라면 사용하지 않는 것이 좋습니다. 여기 저기 흩어져 있는 데이터를

특정 기준에 따라 가지런히 순서를 맞추는 것은 많은 자원, 즉 비용을 소모하기 때문입니다. 특정 기준에 따라 두 개 데이터를 정렬하는 시간보다 열 개 데이터를 정렬하는 데에 시간이 더 많이 필요합니다.

ORDER BY절이 존재할 경우 SELECT문을 통해 조회할 데이터를 모두 확정한 상태에서 ORDER BY절의 명시된 기준에 따라 정렬합니다. 이때 데이터의 양 또는 정렬 방식에 다라 출력 데이터를 선정하는 시간보다 정렬하는 데 시간이 더 걸릴 수도 있습니다. 즉 정렬을 하지 않으면 결과를 더 빨리 출력할 수 있다는 이야기입낟. SQL문의 효율이 낮아지는 것은

서비스 응답 시간이 느려진다는 것을 뜻합니다. 따라서 정렬이 꼭 필요한 경우가 아니라면 ORDER BY절을 넣지 않도록 주의 해야합니다.

잊기 전에 한 번 더

Q1. 다음 문장의 빈칸을 채워 보세요.

SELECT문의 기본 구성 중 하나인 ㅁㅁㅁ절에는 조회할 열 또는 여러 열의 조합, 연산식을 지정합니다. 그리고

ㅁㅁㅁ절에는 조회할 데이터가 저장된 테이블 이름을 명시합니다. 만약 명신된 열이름이 너무 길다면 별도로 이름을 지정할 수 있으며 이름 ㅁㅁ이라고 합니다.

 

정답 : SELECT, FROM, 별칭

Q2. 출력 결과를 보고 출력 결과와 같은 결과가 나오도록 EMP 테이블의 JOB열 데이터를 중복 없이 출력해보세요.

출력 결과 :

JOB
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST

 

SELECT DISTINCT JOB FROM EMP;

Q3. 다음의 모든 조건을 만족하는 SQL문을 작성해 보세요.

더보기

조건 1) 조회할 테이블은 EMP 테이블이며 모든 열을 출력합니다.

조건 2) 출력되는 열의 별칭은 다음과 같습니다.

EMPNO 열 ▶ EMPLOYEE_NO

ENAME 열 ▶ EMPLOYEE_NAME

MGR 열    ▶ MANAGER

SAL 열     ▶ SALARY

COMM 열 ▶ COMMISSION

DEPTNO 열 ▶ DEPARTMENT_NO

 

조건 3) 부서 번호를 기준으로 내림차순으로 정렬하되 부서 번호가 같다면 사원 이름을 기준으로 오름차순 정렬

정답 : 

SELECT
	EMPNO AS EMPLOYEE_NO,
	ENAME AS EMPLOYEE_NAME,
	JOB,
	MGR AS MANAGER,
	HIREDATE,
	SAL AS SALARY,
	COMM AS COMMISSION,
	DEPTNO AS DEPARTMENT_NO
FROM 
	EMP
ORDER BY 
	DEPTNO DESC,
    ENAME ASC;