본문 바로가기
Infra & Security Eng/Database Engineering

SELECT문 기본 문법과 활용, 테이블 목록 및 구조 확인, 올바른 데이터 검색, NVL 함수, 연결 연산자 검색, 중복 제거와 정렬

by 엔지니어 E 2026. 1. 26.
반응형

데이터베이스 관리 시 SQL 이용은 필수적이다

SQL 문은 기본 규칙
1. 반드시 ';'으로 끝난다
2. SQL 문은 대소문자를 구별하지 않는다
3. SQL 문은 여러 줄에 기술 가능하다
4. 들여 쓰기 가능하다
5. SQL 문은 반드시 결과(출력)가 존재한다.

 

1. SELECT문 기본 문법

SELECT란?
데이터베이스의 데이터를 조회할 때 사용하는 가장 기초적인 문법

절별 역할 - SELECT * | [DISTINCT] 컬럼|수식 [AS 별명], ...... FROM 테이블명;
SELECT로 시작하는 부분은 SELECT절, FROM으로 시작하는 부분은 FROM절이라고 한다
ex. SELECT result * FROM score;

1) SELECT절: 출력할 대상을 지정 
(1) *: 테이블의 모든 컬럼을 의미함
(2) 컬럼(ex. SALARY) 혹은 수식(ex. SALARY * 12 )
(3) AS: 컬럼에 별명을 붙여 출력함 (ex. SELECT NAME, SALARY, SALARY * 12 AS ANNUAL_SALARY FROM EMP;)

2) FROM절: 데이터를 가져올 테이블 이름을 지정

핵심 규칙 
1) SELECT절과 FROM절을 생략할 수 없다
2) 구분: 여러 컬럼을 나열 할 때는 쉼표(,)을 사용
3) 종료: 문장의 끝에는 세미콜론(;)을 입력

 

2. 테이블 목록 및 구조 확인하기

데이터를 조회 하기 전에 내가 어떤 테이블을 가지고 있는지, 그 테이블은 어떻게 구성되어 있는지 확인하는 명령어

1) 테이블 목록 확인- SELECT * FROM tab;
현재 접속한 유저(user)가 소유한 모든 테이블의 리스트를 확인

2) 테이블 구조 확인 - DESC 테이블;
특정 테이블의 어떤 칼럼들로 구성되어 있는지, 각 컬럼의 데이터 타입은 무엇인지 상세 구조를 확인

예제 
1. SQL> SELECT * FROM emp; - emp 테이블에 들어있는 모든 데이터를(컬럼 전부) 다 보여줘
2. SQL> SELECT eno, ename 2 FROM emp; - emp 테이블에서 사번과 이름 컬럼만 선택해서 보여줘

 

3. 올바른 데이터 검색: 무결성 입증하기 

1) SQL> SELECT ename, job FROM emp; - 무결성 입증(x)
2) SQL> SELECT eno, ename, job FROM emp; - 무결성 입증(o)

1번 명령어는 이름, 직무를 추출해내는 명령어이다. 이름은 중복될 수 있으므로 무결성을 입증할 수 없다. 고로, 2번 같이 사번 등의 
고유 식별하는 함께 조회해야 데이터 중복(동일 이름) 등을 방지하고 무결성을 보장할 수 있게 된다

 
💡참고사항 

1) SQL 문을 자연어로 바꾸는 훈련을 하는 것이 좋다 
ex) SQL < SELECT eno, ename, job FROM emp; => 자연어: 직원 보직 현황 좀 알려줘 


왼쪽 정렬: 문자(0001)  / 오른쪽 정렬: COMM(숫자)
* 문자와 숫자를 제대로 써야 한다 

 

4. 다양한 SELECT문 활용

1) 수식 검색(= 수식을 입력해서 출력함) - SELECT [수식] FORM dual; 
(1) SELECT 절에 수식 사용 가능
(2) SELECT 절에 컬럼이 없는 경우 FORM 절에는 더미 테이블명인 dual을 사용 - select절에는 반드시 FROM 절을 써야 되기 때문에 테이블이 없지만 dual; 을 써서 형식을 맞추게 된다 (테이블과 상관없이 수식출력 할때)

2) 별명을 이용한 검색
예시 - SELECT eno AS "사원 번호", ename AS "이름" FROM emp; 
(AS 생략가능 , 문자에 공백이 없다면 " " 생략 가능 = SELECT eno "사원 번호", ename 이름 FROM emp;)

* "사원 번호" = 공백이 있으므로 " " 써야 한다 = 사원_번호 - " " 안쓰고 _이걸로 써도 된다 


3) 널이 포함된 연산 (위에 사진에서 빨간색 친 것) 
연산이 제대로 안되기 때문에 널이 안들어가게 컬럼 값이 NULL 이면 치환값으로 바꾼다 

기존 공식: SELECT eno, ename, sal, comm, sal*12+comm FROM emp; 에서
sal*12+nvl(comm,0) FROM emp; 로 명령어를 수정 한다 

* 이 데이터에서 NULL을 0으로 치환 하면 된다. 간단히 말해서 comm을 더하는 (+) 것이므로 0 으로  치환 해야 한다. 만약에 comm을 곱하는 (*) 거면 1로 치환해야 한다

 

5. 연결 연산자(||)를 이용한 문자열 결합 및 조회

1) 연결 연산자: 서로 다른 컬럼이나 리터럴을 하나의 연속된 문자열로 합쳐서 조회할 때 사용하는 기호로 내가 의도한 문장을 연결해서 출력이 가능함 - SELECT [컬럼 | '리터럴'] ||, ...... FROM 테이블; 

2) 연결 연산자 특징:
(1) 여러 개의 데이터를 마치 하나의 문장처럼 이어서 출력할 수 있어, 보고서 형태의 결과를 만들 때 유용
(2) 리터럴은 내가 출력하고 싶어서 직접 타이핑한 데이터로 문자, 숫자, 날짜를 의미한다 
* 리터럴은 숫자를 제외하고 반드시 ' '(단일 인용부호) 를 사용한다 

3) 연결 연산자를 이용한 검색 예시

(1) SQL> SELECT ename||sal 이름_급여 2 FROM emp; - ename과 sal이 하나의 컬럼으로 출력됨


(2) SQL> SELECT ename||' '||sal 이름_급여 2 FROM emp; - ename과 sal 중간에 ' '(공백 리터럴) 을 넣어서 띄어쓰기가 가능하게 됨 


(3) SQL> SELECT ename||'의 업무는 '||job||'입니다.' 2 FROM emp;
ename || '의 업무는 ' || job || '입니다.' - '의 업무 '는 한칸 띄우고 '를 넣었기 때문에 업무는 v(한칸 띄우고) 경영입니다. 로 출력됨 

4) 주의할 연결 연산자
SQL> SELECT ename||' '||sal+100 이름_급여 2 FROM emp; - 에서 문자열(sal)과 100을 더했기 때문 에러가 나는 것임 
=> SQL> SELECT ename||' '||(sal+100) 이름_급여 2 FROM emp; - 괄호를 넣어 수정 한다

* 에러가 나는 이유는 SQL에서 더하기(+)가 연결(||)보다 순위가 높아서, 문자열인 이름과 숫자를 먼저 더하려고 시도하기 때문이다. 글자(이름)에 숫자(100)를 더하라는 말도 안 되는 계산을 먼저 하려다가 문법 오류가 발생하는 것이다. 괄호가 없으면 글자+숫자로 인식해서 에러가 나는 것이고, 괄호가 있으면 숫자+숫자로 인식 해서 먼저 처리하므로 오류가 나지 않게 된다

* 연산자가 많을 때 계산식은 괄호를 쳐서 계산하는 것을 권장

5) 중복 제거
(1) SELECT(ALL) job 업무 FROM emp; (중복 허용) - 테이블에 들어있는 데이터를 있는 그대로 전부 꺼내온다. 만약 업무가 SALESMAN인 사람이 4명 있다면 , 결과창에도 SALESMAN이 4줄 또같이 출력 된다

(2) SELECT DISTINCT job 업무 FROM emp;(중복 제거) - 데이터를 꺼낸 후, 똑같은 내용이 있으면 한줄만 남기고 나머지는 숨긴다. SALESMAN이 4명이든 10명이든 결과창에는 SALESMAN이라는 글자가 딱 한번만 나타난다 

(3) 중복과 정렬
어떤 데이터가 중복되고 어떤 데이터가 중복이 안되어있는지 알 수 있는 방법: 데이터 정렬

* 데이터 정렬하면 같은 값이 붙여 나온다
* 일반적으로 중복 제거를 위해 정렬을 수행하는 다른 데이터베이스와 달리, 오라클은 성능 최적화를 위해 DISTINCT 사용 시 내부적으로 정렬을 수행하지 않을 수 있다. 따라서 데이터가 특정 순서대로 출력되길 원한다면 반드시 ORDER BY 절을 추가해야 한다