Database/SQL

[SQL] SELECT

Untitled_Blue 2023. 5. 16. 23:07
반응형

안녕하세요. 이번 글은 SELECT문에 대한 설명입니다.

- SELECT문이란?

  • select : 데이터베이스 내 테이블에 저장되어 있는 자료들을 표(Table) 형식으로 조회할 수 있는 명령어

DQL에 해당되며 데이터베이스를 다루면서 제일 많이 사용될 문법이다. 왜냐하면 데이터를 추가, 삭제, 수정 작업 후 제대로 원하는 데이터 처리 작업이 잘 반영되었는지 확인하는 것을 시작으로 where이나 order by와 같이 특정 조건을 추가해서 사용자가 원하는대로 데이터를 볼 수도 있기 때문이다. 우리들도 인터넷 쇼핑몰이나 게시글을 볼 때도 정렬 기능을 사용해서 신상품순, 오름차순, 내림차순, 가격높은순, 리뷰많은순, 인기순 등등으로 조회하고 대개적으로 상단에 붙어있는 검색창을 사용해서 원하는 단어만 조회할 수 있도록 검색하지 않는가? 그런 것과 마찬가지이다. 데이터베이스에서도 where, order by 같은 조건문과 다양한 함수들을 사용해서 필요한 내용들만 검색할 수 있다. 이는 차근차근 설명할 예정이다.

- 데이터베이스 내 테이블 조회

select * from tab;

상단의 코드는 데이터베이스에 있는 모든 테이블을 조회하는 코드이다. 이때 select 뒤에 *이 붙는데 이는 모든 칼럼을 조회한다는 의미이고 from 뒤에는 테이블명을 입력하는데 tab을 입력하면 tab이라는 이름의 테이블 내에서 데이터를 조회하겠다는 뜻이다. 결과는 다음과 같다.

다음과 같이 현재 데이터베이스에 내장되어있는 테이블의 목록을 모두 조회 가능하다는 점을 확인할 수 있다.

그 중에서는 우리는 SQL을 공부하면서 제일 많이 다루게 될 테이블은 DEPT, EMP, SALGRADE인데 데이터를 조회하기에 앞서 각각의 테이블이 어떠한 구조를 가지고 있는지 확인해보자.

desc EMP;

EMP 테이블 구조

다음은 EMP라는 테이블을 구성하는 칼럼과 각각의 유형을 조회한 코드와 결과이다. 이때 유형은 프로그래밍 언어에서 자료형과 같은 존재이며 칼럼은 각각의 자료형에 맞게 열로 구성된 카테고리를 의미한다. 예를 들어 EMPNO라는 칼럼이 있는데 여기에는 유형에 맞게 NUMBER(4)라는 자료형 조건에 맞는 값만 들어갈 수 있다. 이러한 칼럼들은 select 뒤에 이들을 입력해서 원하는 칼럼만 조회하는데 사용된다. 한 개만 조회해도 되고 2개 이상 조회가능하다. 물론 테이블 내 모든 칼럼들에 대한 데이터를 보고 싶으면 *을 사용하면 된다. 하지만 특정 테이블에서 원하는 칼럼만 조회하고 싶은데 테이블의 구조를 모르면 불가능한 일이지 않겠는가? 이러한 점을 해결하기 위해서 DESC라는 명령어를 통해서 테이블의 구조를 조회하는 것이 좋다. 나머지 DEPT와 SALGRADE도 상단의 코드와 똑같은 방식으로 진행하면 된다.

desc DEPT;
desc SALGRADE;

상단의 코드를 하나씩 실행해보면 상단의 이미지와 같은 결과를 조회할 수 있을 것이다.

- SELECT문을 통한 테이블 내 데이터 조회

이제 테이블의 구조를 파악했으니 본격적으로 테이블의 데이터를 조회해보도록 하자.

  • select [칼럼명], ... from [테이블명]; : 테이블명 내 칼럼명과 관련된 데이터를 조회한다.

select문의 기본 구조는 다음과 같다. 뒤에 where 조건문과 order by, 함수 등을 사용해서 다채롭게 데이터를 조회할 수 있다. 이는 다음 글부터 차근차근 설명할 예정이다.

select * from EMP;

다음은 EMP 테이블의 모든 칼럼에 대한 데이터를 조회하는 명령어이다. 결과는 다음과 같다.

EMP 테이블의 모든 데이터 조회

다음과 같이 * 을 사용해서 테이블 내 모든 칼럼을 선택할 수 있으며 모든 칼럼에 대한 데이터를 포괄적으로 조회할 수 있다는 점을 확인할 수 있다. (여담으로 홍길동은 필자가 임의적으로 추가한 필드(데이터)다...)

select ENAME, HIREDATE, DEPTNO from EMP;

다음과 같이 EMP 테이블 안에서 원하는 칼럼만 임의적으로 골라서 출력할 수도 있다. 이때 칼럼명의 개수는 별도의 제한이 없으나 반드시 조회하고자 하는 테이블 내에 존재하는 칼럼만 작성해야 한다.

- DISTINCT

  • DISTINCT : 중복 데이터를 제거해서 보여주는 키워드

상단의 이미지처럼 몇몇 칼럼 내에서 중복되는 데이터가 존재하고 있다는 점을 확인할 수 있다. 우리는 칼럼명 바로 앞에 DISTINCT를 입력해서 해당 칼럼에서 중복되는 데이터를 제거한 후의 테이블 내 데이터를 확인할 수 있다.

select DISTINCT DEPTNO from EMP;

해당 코드를 입력한 후 실행하면 DEPTNO라는 칼럼 안에 30, 10, 20 총 3개의 필드가 조회되는 것을 확인할 수 있다. 이렇게 하나의 칼럼 외에도 여러 개의 칼럼의 중복성을 해결할 수 있다.

select DISTINCT DEPTNO, JOB from EMP;

해당 코드를 실행하면 상단 이미지와 같은 결과가 출력되는데 이 때 두 개의 칼럼 모두 각 칼럼 내 기준으로 봤을 때 중복되는 값이 출력되었음을 볼 수 있다. 하지만 이는 JOB 칼럼과 연결해서 보면 틀리게 나온 것이 아니라는 것을 알 수 있다. 먼저 10 CLERK를 보라. 그리고 DEPTNO가 10인 데이터를 모두 한 번씩 확인해보면 10 - CLERK가 전혀 없음을 확인할 수 있다. CLERK를 기준으로 봐도 DEPTNO의 데이터가 절대 겹치는 것이 없음을 알 수 있다. 그러므로 이들 셋(10, 20, 30 - CLERK은 서로 다르며 중복성이 없다. 여러 개의 중복성을 제거했을 때는 각 행마다 칼럼의 조합을 기준으로 다른 행에서 선택한 칼럼들의 값 조합이 같은 것을 볼 수 있다. 추가로 DISTINCT가 없으면 중복성을 제거하지 않겠다는 것이다.

- 별칭 지정

  • AS : 칼럼 뒤에 붙으며 해당 키워드 뒤에 사용자가 원하는 별칭을 지정할 수 있으며 출력(조회)할 때 지정한 별칭 그대로 적용할 수 있다. ( 적용법 : 칼럼명 as "별칭" ... from 테이블명 )
select ENAME, EMPNO ,JOB, DEPTNO, SAL, SAL * 12 from EMP;

이렇게 별도의 명칭없이 계산한 수식을 그대로 실행하면 데이터베이스는 SAL * 12 을 자동으로 칼럼명으로 인식하고 출력시킨다. 해당 칼럼에게 별칭을 지정해서 조금 더 가독성 좋게 해당 칼럼이 무슨 정보인지를 명시할 수 있다.

select ENAME as "사원명", EMPNO as "사번" ,JOB as "직책", DEPTNO as "부서번호", SAL as "월급", SAL * 12 as "연봉" from EMP;

다음과 같이 SAL * 12 뒤에 as "연봉"을 추가해서 SAL * 12가 연봉임을 각인시킬 수 있다. 기존에는 단순히 계산식으로만 봤을 때 처음 보는 사용자들은 해당 칼럼이 무엇을 의미하는 지를 모른다. 하지만 별칭을 지정해줌으로써 해당 칼럼의 의도를 보다 명확하게 전달해줄 수 있다. 이를 통해 별칭을 통해 해당 칼럼의 정보를 보다 더 명확하게 전달해주고 계산식의 경우 더 가독성 좋게 이끌어주는 있다는 점을 확인할 수 있다.

- 정렬하는 키워드 order by

  • order by 칼럼명 [ASC | DESC] : 칼럼명의 데이터의 정렬 기준을 정해주는 키워드 (오름차순 또는 내림차순)

order by를 통해 원하는 칼럼에 대한 데이터 정렬 기준을 지정할 수 있으며 만약 칼럼 뒤에 기준을 생략하면 오름차순으로 간주한다. 이때 ASC는 오름차순이며 10, 20, 30 또는 가, 나, 다, 라 ... 순서이며 DESC는 내림차순이며 오름차순과 대조된다. 30, 20, 10... 또는 E D C B A ... 순서로 큰 거에서 작은 것의 순서대로 정렬된다.

select * from EMP order by deptno;

다음과 같이 정렬기준을 별도로 명시하지 않으면 DBMS에서는 자동으로 오름차순으로 인식해서 오름차순으로 정렬한 조회 결과를 출력해준다. 생략값은 default값으로 ASC를 의미한다는 점을 확인할 수 있다.

select * from EMP order by deptno ASC;

별도로 ASC라는 정렬 기준을 언급하면 생략한 것과 똑같이 해당 칼럼의 오름차순 정렬이 된 점을 확인할 수 있다.

select * from EMP order by deptno DESC;

DESC라는 정렬 기준을 통해 해당 칼럼을 기준으로 데이터를 내림차순으로 정렬한 조회 결과를 확인할 수 있다.

select DEPTNO, ename from EMP order by deptno ASC, ENAME DESC;

다음과 같이 정렬 기준을 2개 이상 지정할 수 있다. 소스코드를 보면 DEPTNO를 오름차순하고 ENAME을 내림차순으로 한다는 점을 확인할 수 있다. 이때 2개 이상의 정렬 기준이 존재하면서 각각의 정렬 기준이 상반이면 어떻게 출력될까?

이 때는 맨 앞에 명시된 칼럼에 대한 정렬 기준을 우선으로 적용하고 첫 번째 정렬기준에 대한 정렬 결과를 바탕으로 다음 칼럼에 대한 정렬 기준에 맞게 정렬한다. 이는 실제 결과에서도 DEPTNO는 오름차순으로 올바르게 정렬된 점을 확인할 수 있음과 동시에 이를 보존하면서 ENAME을 내림차순으로 정렬해서 출력한 점을 확인 가능하다.

 

다음 글은 WHERE 절에 대한 설명입니다.

반응형