Infra & Security Eng/Database Engineering
SELECT문 기본 문법과 활용, 테이블 목록 및 구조 확인, 올바른 데이터 검색, NVL 함수, 연결 연산자 검색, 중복 제거와 정렬
엔지니어 E
2026. 1. 26. 14:04
반응형

데이터베이스 관리 시 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 절을 추가해야 한다 |




