본문 바로가기
DataBase

[SQL] SELECT의 기본 및 관련 연산자 총 정리

by 정성주의 기록 2025. 10. 30.

개요

RDBMS에서 주로 사용하는 조회문과 관련한 기본 문법을 다룹니다.

 

⚙ 테이블의 구조 보기

DESC dept;

결과

이름     널?       유형
DEPTNO NOT NULL NUMBER(2)

DNAME           VARCHAR2(14)
LOC             VARCHAR2(13)

👀 테이블 조회

SQL을 하면서 가장 많이 사용하는 절이다. SELECT는 일정한 기준 순서가 있다.

이 순서를 지키면서 작성하도록 하자.

SELECT 컬럼명
  FROM 테이블명
 WHERE 조건식
 GROUP BY 컬럼명
 ORDER BY 컬럼명1 [ASC|DESC], 컬럼명2 [ASC|DESC], 컬럼명3 [ASC|DESC] ...

테이블 조회 전체 조회하기*(Asterisk)

-- tab 테이블에 있는 모든 속성 조회 
-- (row,record,tuple) 전부 가져옴
SELECT * FROM emp;

결과

7369	SMITH	CLERK	7902	80/12/17	800		20
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7788	SCOTT	ANALYST	7566	87/04/19	3000		20
7839	KING	PRESIDENT		81/11/17	5000		10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7876	ADAMS	CLERK	7788	87/05/23	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7902	FORD	ANALYST	7566	81/12/03	3000		20
7934	MILLER	CLERK	7782	82/01/23	1300		10

테이블 조회 중복은 제외하고 가져오기

DISTINCT로 중복을 제외하고 레코드를 가져올 수 있다.

-- 중복되는 것이 있는 경우 제외해서 선택할 수 있다.
-- DISTINCT  키워드 사용할 것
-- 실제 테이블에는 영향이 가지않는다.
SELECT DISTINCT job
from emp;
JOB
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST

테이블 조회 속성의 이름을 다시 정의해주기

테이블을 조회하다 보면 값을 다시 또 계산해줘야 하는 경우가 있다. 월급에서 12를 곱해서 연봉을 구하거나 하는 식이다. 월급 속성의 속성 명이 sal이고 sal * 12 로 연산을 했으면 속성은 sal * 12로 표시되어 읽기가 불편하다.

이럴 때 ALIAS 키워드로 별칭을 지어줄 수 있다.

AS를 써주어 사용한다.

SELECT ename, sal, sal * 12 AS "연봉"
FROM emp;

결과

ENAME SAL 연봉
SMITH	800	9600
ALLEN	1600	19200
WARD	1250	15000
JONES	2975	35700
MARTIN	1250	15000
BLAKE	2850	34200
CLARK	2450	29400
SCOTT	3000	36000
KING	5000	60000
TURNER	1500	18000
ADAMS	1100	13200
JAMES	950	11400
FORD	3000	36000
MILLER	1300	15600

테이블 조회 정렬하여 조회하기

그냥 SELECT * FROM 테이블 명으로 모든 테이블을 가져오는 경우 적절한 출력 기준이 없다. 데이터의 입력 순서대로 출력 된다고 하지만 그마저도 확실한 것은 아니다. 그래서 데이터를 조회할 때 정렬하여 조회하는 경우가 많다.

ORDER BY 기준속성1 [ASC,DESC], 기준속성2 [ASC,DESC]

ASC : 오름차순(생략 가능) DESC : 내림차순

--SELECT 속성명1,속성명2,속성명n...
--FROM 테이블명...
-- ORDER BY 정렬기준속성1 [ASC,DESC], 정렬기준속성2 [ASC,DESC]를 사용하여 정렬할 수 있다.
-- [ASC,DESC] 
-- ASC : 오름차순 
-- 

SELECT ename,sal
FROM emp
ORDER BY sal;

결과

ENAME SAL
SMITH	800
JAMES	950
ADAMS	1100
WARD	1250
MARTIN	1250
MILLER	1300
TURNER	1500
ALLEN	1600
CLARK	2450
BLAKE	2850
JONES	2975
SCOTT	3000
FORD	3000
KING	5000

테이블 조회 정렬하여 조회하기 (정렬 기준 2개)

정렬 기준을 2가지로 하여 작성할 수 있다.

deptno 부서 번호 → 월급

부서를 기준으로 먼저 정렬되고 월급을 기준으로 오름차순으로 출력한다.

-- 정렬 기준 2개를 작성할 수 있다.
SELECT  empno,ename,job,deptno
FROM emp
ORDER BY deptno ASC, sal ASC;

결과

EMPNO ENAME JOB DEPTNO
7934	MILLER	CLERK	10
7782	CLARK	MANAGER	10
7839	KING	PRESIDENT	10
7369	SMITH	CLERK	20
7876	ADAMS	CLERK	20
7566	JONES	MANAGER	20
7788	SCOTT	ANALYST	20
7902	FORD	ANALYST	20
7900	JAMES	CLERK	30
7654	MARTIN	SALESMAN	30
7521	WARD	SALESMAN	30
7844	TURNER	SALESMAN	30
7499	ALLEN	SALESMAN	30
7698	BLAKE	MANAGER	30

테이블 조회 SELECT 절에 없는 컬럼으로 정렬

SELECT 절에 없는 컬럼, 즉 출력했을 때 보이지는 않지만 테이블에는 있는 속성으로도 정렬할 수 있다. 현재 oracle 예시 테이블에는 사번, 이름, 하는 일, 관리자, 입사일, 부서 번호 등이 있지만 부서 번호를 SELECT로 출력하지 않지만 SELECT로 다른 열을 정렬하여 테이블을 조회할 수 있다.

SELECT empno,ename,hiredate
FROM emp
ORDER BY deptno,ename;

결과

EMPNO ENAME HIREDATE
7782	CLARK	81/06/09
7839	KING	81/11/17
7934	MILLER	82/01/23
7876	ADAMS	87/05/23
7902	FORD	81/12/03
7566	JONES	81/04/02
7788	SCOTT	87/04/19
7369	SMITH	80/12/17
7499	ALLEN	81/02/20
7698	BLAKE	81/05/01
7900	JAMES	81/12/03
7654	MARTIN	81/09/28
7844	TURNER	81/09/08
7521	WARD	81/02/22

테이블 조회 조건을 정하여 제한하여 가져오기

조건을 걸어서 원하는 조건의 레코드만 조회할 수 있다.

SELECT 속성명

FROM 테이블명

WHERE 컬럼명 연산자 값 조건식 (TRUE,FALSE)

양식

SELECT 속성명
FROM 테이블명
WHERE 컬럼명 연산자 값 조건식 (TRUE,FALSE)
ORDER BY 속성명 [ASC,DESC]

부서 번호가 10인 레코드를 이름순으로 정렬하여 조회하기

SELECT empno,ename,job,mgr,deptno
FROM emp
WHERE deptno = 10
ORDER BY ename;

결과

EMPNO ENAME JOB MGR DEPTNO
7782	CLARK	MANAGER	7839	10
7839	KING	PRESIDENT		10
7934	MILLER	CLERK	7782	10

테이블 조회 조건을 정하여 제한하여 가져오기 (조건 2개)

[OR,AND]를 통해서 2가지 이상의 조건을 작성할 수 있다.

코드 구조

SELECT 속성명
FROM 테이블명
WHERE 컬럼명 연산자 값 조건식 (TRUE,FALSE) [OR,AND]를 통해서 2가지 이상의 조건을 작성할 수 있다.
ORDER BY 속성명 [ASC,DESC]

연봉이 3000이상이고 부서 명이 20인 사람을 이름 순으로 정렬하여 가져오기

SELECT empno,ename,job,mgr,sal,deptno
FROM emp
WHERE sal >= 3000 AND deptno = 20
ORDER BY ename;

결과

EMPNO ENAME JOB MGR SAL DEPTNO
7902	FORD	ANALYST	7566	3000	20
7788	SCOTT	ANALYST	7566	3000	20

👿 ORACLE 문자열 관련 처리 메커니즘

1️⃣ **테이블에 들어있는 문자열**의 **대소문자 구분**을 철저히 한다.

2️⃣ 조건식이나 문자열 관련된 처리는 SINGLE QUOTATION MARK로 한다. ['SMITH']

📆 ORACLE 날짜 관련 처리 메커니즘

1️⃣ **테이블에 들어있는 날짜형식**을 철저히 지켜야 한다.

2️⃣ 조건식이나 날짜와 관련된 처리는 SINGLE QUOTATION MARK로 한다. ['SMITH']

테이블 조회 조건을 정하여 제한하여 가져오기 문자열형식

emp 테이블에는 SMITH라는 데이터가 이름으로 들어가 있다. 그래서 SELECT로 SMITH라는 이름을 가진 사원을 조회하려고한다.

SELECT *
FROM emp
WHERE ename = 'SMITH'; 

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7369	SMITH	80/12/17	800	20

테이블 조회 조건을 정하여 제한하여 가져오기 날짜 형식

1980년 12월 17일에 입사한 사람을 조회하려고 한다.

방식 1

-- 날짜와 관련된 처리도 ' 홑따옴표로 해야한다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE hiredate  = '80/12/17'; -- '19801217'

방식 2

-- 날짜와 관련된 처리도 ' 홑따옴표로 해야한다.
SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE hiredate  = '19801217';

출력

EMPNO ENAME HIREDATE SAL DEPTNO
7369	SMITH	80/12/17	800	20

상기 내용과 같이 날짜 형식을 지켜주면 된다.

테이블 조회 조건식 문자열의 대소 비교

emp 테이블에 BLAKE 라는 이름을 가진 사원이 있다.

안쓸거 같긴 한데 정리는 해두려고 적었다.

BLAKE는 BLA로 비교했을때 까지는 조회가 되었다.

--문자열 대소비교 가능  이름이 F보다 큰 사원  
SELECT *
FROM emp
WHERE ename >= 'BLAL'
ORDER BY ename; 

결과

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7902	FORD	ANALYST	7566	81/12/03	3000		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7839	KING	PRESIDENT		81/11/17	5000		10
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7934	MILLER	CLERK	7782	82/01/23	1300		10
7788	SCOTT	ANALYST	7566	87/04/19	3000		20
7369	SMITH	CLERK	7902	80/12/17	800		20
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30

테이블 조회 BETWEEN 연산자

expression [NOT] BETWEEN low AND high

BETWEEN연산자는 두가지 의 값을 비교하는 곳에 사용된다. ≥ ≤와 동일한 결과가 검색 되지만 특수한 경우가 아니라면 BETWEEN연산자를 사용할 것을 권장한다.

The  low and high specify the lower and upper values of the range to test. The low and high values can be literals or expressions.

low와 high에 해당하는 값은 값이나 식이 올 수 있다.

테이블 조회 LIKE 활용한 와일드카드 패턴

expression [NOT] LIKE pattern [ESCAPE escape_characters]

expression : 열이름이나 식이 들어간다.

pattern : 찾을 문자열에 대한 패턴이나 식이들어간다 패턴에는 와일드 카드 문자가 포함된다 .

와일드 카드 문자는 다음과 같다.

% : 0개 이상의 문자 매칭

_ : 단일 문자 매칭 ,문자 1개 매칭

  • % (percent) matches any string of zero or more characters.
  • _ (underscore) matches any single character.

테이블 조회 [% 활용] 특정문자로 시작하는 이름 찾기

The following example uses the % wildcard to find the phones of contacts whose last names start with 'M':

사원 테이블에는 MARTIN, MILLER가 있다고 하자.

‘M’으로 시작하는 이름을 찾고 싶을 때 활용하는 방법은 다음과 같다.

SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE 'M%';

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7654	MARTIN	81/09/28	1250	30
7934	MILLER	82/01/23	1300	10

테이블 조회 [% 활용] 특정문자로 끝나는 이름 찾기

사원 테이블에는 TURNER, MILLER, 등 ER로 이름이 끝나는 사람이 2명 있다.

‘ER’로 끝나는 이름을 찾고 싶을 때 활용하는 방법은 다음과 같다.

SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE'%ER';

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7844	TURNER	81/09/08	1500	30
7934	MILLER	82/01/23	1300	10

테이블 조회 [% 활용] 특정문자가 포함된 이름 찾기

사원 테이블에는 SMITH,MARTIN,SCOTT,TURNER등 이름에 T가 포함된 사람이 4명이 있다.

특정 글자가 포함된 이름을 찾고 싶을 때의 방법은 다음과 같다.

SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE'%T%';

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7369	SMITH	80/12/17	800	20
7654	MARTIN	81/09/28	1250	30
7788	SCOTT	87/04/19	3000	20
7844	TURNER	81/09/08	1500	30

테이블 조회 [ _ 활용] 특정 문자가 포함된 이름 찾기

이름이 두글자인 사원을 찾고싶다고 가정하자

_를 두번 사용해주면 된다.

SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE'__';

결과

EMPNO ENAME HIREDATE SAL DEPTNO

결과가 나타나지않음

테이블 조회 [ _ 활용] 특정 문자가 포함된 이름 찾기

_는 보통 글자수랑 관련하여 사용한다. 2글자인 이름, 4글자인 이름 등

뒤에서 A+두글자로 이름이 끝나는 사원을 찾고싶다고 가정하자

%A__를 사용해주면 된다.

SELECT empno,ename,hiredate,sal,deptno
FROM emp
WHERE ename LIKE '%A__';

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7521	WARD	81/02/22	1250	30
7698	BLAKE	81/05/01	2850	30
7782	CLARK	81/06/09	2450	10
7876	ADAMS	87/05/23	1100	20

테이블 조회 [NULL 조회]

이때 까지 정리한 연산자로는 NULL값을 조회할 수 가 없었다.

comm(커미션)이 0원인 사원을 조회하려면 NULL값으로 판단을 해주어야해서 NULL조회도 필요하다는 생각이 들었다.

테이블 조회 [NULL인 값 조회 하기]

SELECT empno,ename,hiredate,sal,deptno,comm
FROM emp
WHERE comm IS NULL;

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7369	SMITH	80/12/17	800	20	
7566	JONES	81/04/02	2975	20	
7698	BLAKE	81/05/01	2850	30	
7782	CLARK	81/06/09	2450	10	
7788	SCOTT	87/04/19	3000	20	
7839	KING	81/11/17	5000	10	
7876	ADAMS	87/05/23	1100	20	
7900	JAMES	81/12/03	950	30	
7902	FORD	81/12/03	3000	20	
7934	MILLER	82/01/23	1300	10	

테이블 조회 [NULL이 아닌 값 조회 하기]

SELECT empno,ename,hiredate,sal,deptno,comm
FROM emp
WHERE comm IS NOT NULL;

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7499	ALLEN	81/02/20	1600	30	300
7521	WARD	81/02/22	1250	30	500
7654	MARTIN	81/09/28	1250	30	1400
7844	TURNER	81/09/08	1500	30	0

테이블 조회 [집합 연산자]

쿼리문 컬럼의 타입과 갯수가 동일해야 한다. 꼭 이름이 같은 필요는 없다.

테이블 조회 [합집합 UNION]

  1. UNION : 중복을 제거한다.[데이터 베이스는 중복을 싫어하기 때문에 이걸 많이 사용할 듯]
  2. UNION ALL : 중복을 제거하지 않는다.

부서번호가 10이거나 20인 데이터들을 조회하시오. 단 UNION을 사용하여 조회하시오.

SELECT empno, ename,sal,deptno
FROM emp
WHERE deptno = 10
UNION
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno = 20;

결과

EMPNO ENAME SAL DEPTNO
7369	SMITH	800	20
7566	JONES	2975	20
7782	CLARK	2450	10
7788	SCOTT	3000	20
7839	KING	5000	10
7876	ADAMS	1100	20
7902	FORD	3000	20
7934	MILLER	1300	10

테이블 조회 [차집합 MINUS]

A-B = (A U B) - B

SELECT empno,ename,sal,deptno
FROM emp
MINUS
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno = 10
ORDER BY deptno, ename;

결과

EMPNO ENAME HIREDATE SAL DEPTNO
7876	ADAMS	1100	20
7902	FORD	3000	20
7566	JONES	2975	20
7788	SCOTT	3000	20
7369	SMITH	800	20
7499	ALLEN	1600	30
7698	BLAKE	2850	30
7900	JAMES	950	30
7654	MARTIN	1250	30
7844	TURNER	1500	30
7521	WARD	1250	30

테이블 조회 [교집합 INTERSECTION] INTERSECT키워드

양쪽 모두에서 포함된 행을 검색

INTERSECT

전체사원 테이블에서 deptno가 10인 사원을 가져오고 싶을 때 교집합도 활용할 수 있다.

원래라면 그냥 WHERE deptno = 10 으로해도 되지만 문법을 익힌다는 차원에서 한번 작성해보았다.

SELECT empno,ename,sal,deptno
FROM emp
INTERSECT
SELECT empno,ename,sal,deptno
FROM emp
WHERE deptno = 10
ORDER BY deptno, ename;

결과

EMPNO ENAME SAL DEPTNO
7782	CLARK	2450	10
7839	KING	5000	10
7934	MILLER	1300	10

'DataBase' 카테고리의 다른 글

[Oracle] Oracle 문자열 관련 함수 정리  (0) 2025.11.11