SQL 연산자 - 집합 연산자

두 개 이상의 SELECT문으로 조회한 결과를 하나의 결과로 연결하여 보여줄 때 사용 합니다. 이때 두 SELECT 문의 컬럼 갯수와 각 컬럼의 자료형, 순서가 일치해야 합니다. 서로 다른 타이블이나 컬럼에 대해서 수행이 가능 합니다. 이때 결과로 출력되는 컬럼명은 앞에 오는 SELECT문의 컬럼명이 사용 됩니다.

 

집합연산자들은 집합관계를 생각하시면 쉽게 이해하실 수 있습니다. 다음은 집합연산자 들에 대한 간략한 설명입니다. 

종류 설명 집합관계
UNION 두개이상의 SELECT문을 하나의 결과 값으로 출력합니다. 이때 중복값은 제외 합니다. A ∪ B(합집합)
UNION ALL 두개이상의 SELECT문을 하나의 결과 값으로 출력합니다. 이때 중복값은 제외하지 않습니다. A, B
MINUS 먼저 작성된 SELECT 문의 결과 값 중 다음 SELECT 문에 없는 결과 값만 출력 합니다. A - B(차집합) 
INTERSECT 먼저 작성된 SELECT 문과 다음 SELECT 문의 결과 값이 같은 것만 출력 합니다. A  B(교집합)

 

1. UNION 연산자

사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 결과를 출력하는 SELECT문과 30인 결과를 출력하는 SELECT 문을 이용하여, 부서번호가 10 또는 30인 사원정보를 출력해 봅시다. EMP 테이블의 구조 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 30;

이때 출력할 컬럼의 숫자가 다르거나, 출력할 열의 자료형이 다른 경우에는 오류가 발생하여 실행되지 않습니다.

 

데이터 형만 같다면, 컬럼명에 영향을 받지 않음도 테스트 해 봅시다. 사원정보 테이블에서 급여(SAL)와 급여외 수당(COMM)은 NUMBER로 유형이 동일합니다. 이 컬럼의 위치를 두번째 SELECT 문에서 바꾸어 보면 어떻게 될까요? 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, COMM, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30;

아래 보시는 결과과 같이 컬럼명은 첫번째 SELECT 문에 사용된 것이 그대로 사용 되었고, 결과 자료는 각 SELECT 문의 수행 결과가 그대로 연결되었습니다.

실 사용시에도 이런 경우에는 오류가 발생하지 않으니, 작성시 유의 하시기 바랍니다.

 

2. UNION ALL 연산자

사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 SELECT 문 2개를 연결해 봅시다. 이때 UNION을 사용하면, 중복이 제거되어 SELECT 문 두개를 연결한 의미가 없습니다. 중복해서 2번 표현 되게 하려면 어떻게 해야 할까요? 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

 


3. MINUS 연산자

집합연산자를 이용하여 사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 정보만 제외하고 출력하는 쿼리를 만들어봅시다. 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
MINUS
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

결과와 같이 첫 번째 SELECT문의 결과값에서 두 SELECT문의 결과값이 같은 데이터를 제외한 값들이 출력됩니다.

 

4. INTERSECT 연산자

두개의 SELECT 문에서 공통적인 결과 값을 갖는 데이터만 출력하려면 어떻게 하면 될까요? 

SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
INTERSECT
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

결과와 같이 첫 번째 SELECT문의 결과값과 두 SELECT문의 결과값이 같은 데이터들이 출력됩니다.

'DataBase' 카테고리의 다른 글

데이터 변경 시 유의 사항  (0) 2025.07.28
[ORACLE] ORACLE 함수  (1) 2025.07.28
SQL 연산자 - LIKE 연산자  (0) 2025.07.25
SQL 연산자 - BETWEEN ~ AND ~ 연산자  (1) 2025.07.24
SQL 연산자 - IN 연산자  (2) 2025.07.23

LIKE 연산자

LIKE 연산자는 특정한 내용을 포함 하고 있는 데이터 값을 조회하고 싶을때 사용하실수 있습니다.
예를 들어 이름(ENAME)이 알파벳 'A'로 시작하는 사원 데이터를 출력 하고 싶은 경우 아래와 같이 조회 하시면 됩니다. 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

SELECT *
FROM EMP
WHERE ENAME LIKE 'A%'; 

조건문에 'A%'는 알파벳 'A'로 시작하는 모든 것 이라는 뜻을 담고 있습니다. 이때 사용 하는 '%' 기호를 와일드 카드(wild card)라고 합니다. 와일드 카드는 특정 문자 또는 문자열을 대체하거나, 문자열 데이터의 패턴을 표시하는 특수문자로 LIKE문에서 사용하는 와일드 카드로는 '%' 이외에 '_'가 있습니다. 

  • '_' :   어떤 값이든 상관없이 한 개의 문자열 데이터를 의미
  • '%'  : 길이와 상관없이 모든 물자열 데이터를 의미

두개의 와일드 카드를 모두 이용해서 데이터를 찾을 수도 있습니다. 예를 들어 이름(ENAME)의 두번째 알파벳이 'A'인 사원 데이터를 출력 하고 싶은 경우 아래와 같이 조회 하시면 됩니다.

SELECT *
FROM EMP
WHERE ENAME LIKE '_A%';

이와 같이 와일드 카드를 이용하면, 자료의 일부만 알아도 해당 자료를 조회 하실 수 있습니다.

 

이번에는 이름(ENAME)의 알파벳이 'A'인 사원 데이터를 출력 하고 싶은 경우 어떻게 하면 될까요? 와이들 카드 '%'를 앞, 뒤 두번 사용하여 아래와 같이 조회 하시면 됩니다.

SELECT *
FROM EMP
WHERE ENAME LIKE '%A%';

 

 

BETWEEN ~ AND ~ 연산자

BETWEEN ~ AND ~ 연산자는 일정 범위 안의 데이터를 조회할 때 사용하는 연산자 입니다.

SELECT    [조회할 열 이름 1], [조회할 열 이름 2], ..., [조회할 열 이름 n], 
FROM       [조회할 테이블 이름]
WHERE    열 이름 BETWEEN 최소값 AND 최대값;

예를들어 급여(SAL)가 2,000 ~ 3,000 사이인 사원 데이터를 출력하고 싶은 경우 아래와 같이 조회 하시면 됩니다. 

예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

SELECT *
FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;

위와 같은 결과가 출력되도록 비교연산자 '>=', '<=' 와 논리연산자 'AND'를 사용하여 쿼리를 작성하실수도 있습니다.

SELECT *
FROM EMP
WHERE JOB = 'CLERK' OR JOB = 'SALESMAN' OR JOB = 'MANAGER';

이렇게 표현 하는 것도 하나의 방법이지만, ' BETWEEN ~ AND ~'을 이용하는 것이 훨씬 간단해 보입니다.   

 

이번에는 반대의 경우를 생각해 봅시다. 급여(SAL)가 2,000 ~ 3,000 사이 외인 사원 데이터를 출력 하고 싶을 때는 어떻게 하면 될까요? 아래와 같이 조회 하시면 됩니다.

SELECT *
FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000;

IN 앞에 NOT를 붙여 반대의 상황을 조회 할 수 있도록 합니다. '논리 연산자 (Logical Operators)' 부분에서 설명한 바와 같이 NOT 연산자를 적용하면 TRUE/FALSE로 나오는 결과 값의 반대 값을 반환 합니다.

 

 

 

 

'DataBase' 카테고리의 다른 글

SQL 연산자 - 집합 연산자  (0) 2025.07.26
SQL 연산자 - LIKE 연산자  (0) 2025.07.25
SQL 연산자 - IN 연산자  (2) 2025.07.23
SQL 연산자 - 논리 연산자 (Logical Operators) - 작성중  (1) 2025.07.22
[DBMS] PostgreSQL  (0) 2025.07.21

SQL 연산자 - IN 연산자

IN 연산자는 특정 컬럼의 여러가지 데이터 값을 조회하고 싶을때 사용하실수 있습니다.

SELECT    [조회할 열 이름 1], [조회할 열 이름 2], ..., [조회할 열 이름 n], 
FROM       [조회할 테이블 이름]
WHERE    열 이름 IN (조건 데이터 1, 조건 데이터 2, ..., 조건 데이터 n);

예를 들어 직책(JOB)이, CLERK, SALESMAN, MANAGER 인 사원 데이터를 출력 하고 싶은 경우 아래와 같이 조회 하시면 됩니다. 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.

SELECT *
FROM EMP
WHERE JOB IN ('CLERK', 'SALESMAN', 'MANAGER');

위와 같은 결과가 출력되도록 비교연산자 '=' 와 논리연산자 'OR'를 사용하여 쿼리를 작성하실수도 있습니다.

SELECT *
FROM EMP
WHERE JOB = 'CLERK' OR JOB = 'SALESMAN' OR JOB = 'MANAGER';

이렇게 표현 하는 것도 하나의 방법이지만, 조건이 늘어 날 수록 조건식이 많아져 번거로울 수 있습니다. 

 

이번에는 반대의 경우를 생각해 봅시다. 직책(JOB)이, CLERK, SALESMAN, MANAGER 이 아닌 경우를 출력 하고 싶을 때는 어떻게 하면 될까요? 아래와 같이 조회 하시면 됩니다.

SELECT *
FROM EMP
WHERE JOB NOT IN ('CLERK', 'SALESMAN', 'MANAGER');

IN 앞에 NOT를 붙여 반대의 상황을 조회 할 수 있도록 합니다. '논리 연산자 (Logical Operators)' 부분에서 설명한 바와 같이 NOT 연산자를 적용하면 TRUE/FALSE로 나오는 결과 값의 반대 값을 반환 합니다.

 

 

 

'DataBase' 카테고리의 다른 글

SQL 연산자 - LIKE 연산자  (0) 2025.07.25
SQL 연산자 - BETWEEN ~ AND ~ 연산자  (1) 2025.07.24
SQL 연산자 - 논리 연산자 (Logical Operators) - 작성중  (1) 2025.07.22
[DBMS] PostgreSQL  (0) 2025.07.21
[DBMS] MariaDB  (0) 2025.07.21

SQL 연산자 - 논리 연산자 (Logical Operators)

 

연산자 연산 설명 사용법
AND A AND B   모든 조건이 참일 때 TRUE를 반환한다.  
OR A OR B   A와 B 둘중 하나가 참일 때 TRUE를 반환한다.  
NOT NOT ~ 논리 부정 연산자 제시된 조건을 부정한다.
XOR A XOR B    

 

AND 연산자

OR 연산자

 

NOT 연산자

제시된 조건의 결과와 반대되는 값을 얻고 싶을때 사용하는 연산자 입니다.   NOT 연산자를 적용하면 TRUE/FALSE로 나오는 결과 값의 반대 값을 반환 합니다. 예를 들어 사원정보(EMP) 테이블에 있는 부서번호(DEPTNO)가 10이 아닌 직원의 정보를 알고 싶다면 아래와 같이 조회 하시면 됩니다. 

SELECT *
FROM EMP
WHERE NOT DEPTNO = 10;

 

'DataBase' 카테고리의 다른 글

SQL 연산자 - BETWEEN ~ AND ~ 연산자  (1) 2025.07.24
SQL 연산자 - IN 연산자  (2) 2025.07.23
[DBMS] PostgreSQL  (0) 2025.07.21
[DBMS] MariaDB  (0) 2025.07.21
[DBMS] MySql  (0) 2025.07.21

+ Recent posts