DataBase

[DATABASE] 연산자 종류

개발메모장 2025. 5. 12. 21:42

MSSQL 기준으로 작성

연산자

  • 값(데이터) 또는 표현식 간의 연산(계산, 비교,  조합 등) 을 수행하는 기호 또는 키워드
  • DBMS 마다 조금씩 다다르고 지원되는게 있고 안되는게 있으니 해당 DBMS에서 어떤 연산자를 제공하는지를 잘 확인하자

연산자 종류

  • 산술 연산자
  • 비교 연산자
  • 논리 연산자
  • 문자열 연산자
  • NULL처리 연산자
  • 집합 연산자
  • 기타 특수 연산자

산술 연산자

  • 숫자 데이터를 다룰 때 사용하는 기본적인 연산자들
  • SELECT 문 등 계산을 직접할 수 있게 도와준다.
  • 주로 숫자 컬럼이나 상수 값에 연산을 적용할 때 사용

산술 연산자 종류

연산자 의미 예시 결과 예시
+ 더하기 SELECT 100 + 100 200
- 빼기 SELECT 100 - 99 1
* 곱하기 SELECT 100 * 100 10000
/ 나누기 SELECT 10 / 5 2
% 나머지 SELECT 4 % 3 1
  • % 나머지 연산자는 DBMS 마다 지원 여부가 다르기 때문에 잘 확인해야한다.

비교 연산자

  • 비교 연산자는 값을 비교할 때 사용한다.
  • WHERE절, CASE문, IF문 등에서 자주 사용되고 참(True)/거짓(False) 결과를 반환

비교 연산자 종류

연산자 의미 예시 설명
= 같다 AGE = 30 나이가 30과 같은지 
!= 또는 <> 같지 않다 AGE != 30,  AGE <> 30 나이가 30이 아닌
>, < 크다(초과), 작다(미만) AGE > 30,  AGE < 30 30보다 큰 나이, 30보다 작은 나이
>=, <= 크거나 같다(이상), 작거나 같다(이하) AGE >= 30, AGE <= 30 나이가 30 이상, 나이가 30 이하
BETWEEN A  AND  B A 이상 B 이하 AGE BETWEEN 20 AND 30 나이가 20 이상 부터 30 이하
IN (...) 목록에 포함 AGE IN (20, 30) 나이가 20, 30과 같은
NOT IN (...) 목록에 미포함 AGE NOT IN (20, 30) 나이가 20, 30과 같지 않은

논리 연산자

  • 여러 조건을 결합하거나 부정할 때 사용
  • WHERE 절, HAVING 절, CASE 문, IF 문 등에서 사용

논리 연산자 종류

연산자 의미 예시 설명
AND 그리고 (모두 참) AGE >= 20 AND AGE <= 30 20이상이면서 30세 이하
OR 또는 (하나라도 참) CITY = '서울' OR CITY = '부산' 도시가 서울이거나 부산
NOT 부정 (반대로) NOT CITY = '서울' 서울이 아닌 도시

논리 연산자의 우선순위

  1. NOT
  2. AND
  3. OR
  • 괄호를 () 사용해 명확하게 조건을 그룹화하는게 안전하다.
  • WHERE A AND B OR C 이런 식으로 쓰면 위험할 수 있다. => WHERE A AND (B OR C) 처럼 괄호를 사용

문자열 연산자

  • 문자열을 비교, 검색, 연결, 포함 여부 확인할 때 사용하는 연산자

문자열 연산자 종류

연산자 의미 예시 설명
+ 문자열 연결 '강' + '호' + '동' 문자열 연결
LIKE 문자열 패턴 일치 NAME LIKE '%호동%' 이름에 '호동'이 포함되어 있는지
NOT LIKE 문자열 패턴 불일치 NAME NOT LIKE '%호동%' 이름에 '호동'이 포함되지 않은
  • LIKE문 같은 경우 '%' 기준으로 패턴이 달라진다. ('%' 를 와일드 카드라고 부른다.)
  • LIKE '문자%' : 문자로 시작하는 / 예) LIKE '강%' => '강' 으로 시작하는 
  • LIKE '%문자' : 문자로 끝나는    / 예) LIKE '%호동' => '호동' 으로 끝나는
  • LIKE '%문자%' : 문자가 포함된 / 예) LIKE '%호동%' => '호동' 이 포함된 

NULL처리 연산자

  • NULL(값 없음) 여부를 검사

NULL처리 연산자 종류

연산자 의미 예시 설명
IS NULL NULL 인지? ADDRESS IS NULL 주소가 NULL 값인
IS NOT NULL NULL 아닌지? ADDRESS IS NOT NULL 주소가 NULL 값이 아닌

집합 연산자

  • 서로 다른  SELECT 결과를 병합하거나 비교할 때 사용
  • 집합 연산자의 주의점은 작성시 서로 컬럼 갯수가 동일해야한다.
  • 가급적이면 별칭은 컬럼끼리 통일시켜 맞추는게 좋다

집합 연산자 종류

연산자 의미 예시 설명
UNION 합집합 (중복 데이터 제거) SELECT NAME
FROM A
UNION
SELECT NAME
FROM B
A와 B의 결과를 합치되 중복 제거한 값
UNION ALL 합집합 (중복 데이터 포함) SELECT NAME
FROM A
UNION ALL
SELECT NAME
FROM B
A와 B의 결과를 합한 모든 값(중복 포함)
INTERSECT 교집합 SELECT NAME
FROM A
INTERSECT
SELECT NAEM
FROM B
A와 B 둘 다 있는 값
EXCEPT 차집합 SELECT NAME
FROM A
EXCEPT
SELECT NAME
FROM B
A에는 있지만 B에는 없는 값

집합 연산자 예시

예시 테이블

예시 테이블

UNION

  • UNION으로 직원과 인턴 테이블의 이름을 한 테이블로 출력하고 싶다.
  • UNION은 중복데이터가 제거된다.
  • 예상되는 데이터는 이름이 겹치는 '홍길동', '김영희' 는 두 번 나오는게 아니라 한 번씩만 나온다.

결과

쿼리문

SELECT EMP_NM AS NAME
FROM EMPLOYEES
UNION
SELECT INTERNS_NM AS NAME
FROM INTERNS

UNION ALL

  • UNION ALL 로 직원과 인턴 테이블의 이름을 한 테이블로 출력하고 싶다.
  • UNION ALL 은 중복데이터를 제거하는 UNION과는 달리 모든 데이터를 포함시킨다.
  • 예상되는 데이터는 각각 테이블 5명 + 5명 해서 총 10개의 데이터가 출력된다.

결과

쿼리문

SELECT EMP_NM AS NAME
FROM EMPLOYEES
UNION ALL
SELECT INTERNS_NM AS NAME
FROM INTERNS

INTERSECT

  • INTERSECT은 교집합이다.
  • 서로 중복되는 데이터를 출력해주기 때문에 예상되는 데이터는 두 테이블에서 같은 데이터를 가진  '홍길동', '김영희'이다.

결과

쿼리문

SELECT EMP_NM AS NAME
FROM EMPLOYEES
INTERSECT
SELECT INTERNS_NM AS NAME
FROM INTERNS

EXCEPT

  • EXCEPT 는 차집합이다.
  • A 테이블에는 있지만 B에는 없는 값 
  • 즉 직원(EMPLOYEES) 테이블에는 있지만 인턴(INTERS) 테이블에 없는 값
  • '홍길동', '김영희' 는 직원 테이블과 인턴 테이블에 둘다 있고
  • 직원 테이블에 '이철수', '박민수', '최유리'는 직원 테이블에만 있고 인턴 테이블에는 없기 때문에 저 3명의 이름이 출력된다.

결과

쿼리문

SELECT EMP_NM AS NAME
FROM EMPLOYEES
EXCEPT
SELECT INTERNS_NM AS NAME
FROM INTERNS

기타 특수 연산자

  • 특정 상황에서 사용되는 연산자

기타 특수 연산자의 종류

연산자 의미
EXISTS 서브쿼리 결과가 존재할 경우 TRUE
NOT EXISTS 서브쿼리 결과가 없는 경우 TRUE
ALL 서브쿼리 결과과 모두 조건을 만족하면 TRUE
ANY 서브쿼리 결과 중 하나라도 조건을 만족하면 TRUE

기타 특수 연산자 예시

예시 테이블

SALARY가 위에 테이블과 데이터가 다르다

EXISTS

  • 서브쿼리 결과가 존재할 경우 TRUE를 반환한다.
  • 그럼 직원 테이블에서 인턴 테이블의 급여(SALARY)가 같은 직원들을 조회하고 싶다.
  • 직원 테이블에 '김영희' (3000), '최유리' (2000)이 인턴 테이블에 '유재석' (3000), '박병수' (2000)과 급여가 일치한다.
  • 예상되는 데이터는 '김영희', '최유리' 가 출력된다.

결과

쿼리문

SELECT 
	E.EMP_NM AS '직원',
	E.SALARY AS '급여'
FROM EMPLOYEES E
WHERE EXISTS (
	SELECT I.SALARY
	FROM INTERNS I
	WHERE I.SALARY = E.SALARY
)

NOT EXISTS

  • 서브쿼리 결과가 없는 경우 TRUE를 반환한다.
  • 그럼 반대로 직원 테이블의 급여와 인턴 테이블의 급여가 서로 맞지 않은 직원을 조회하고 싶다.
  • 예상되는 데이터는 '홍길동' (4000), '이철수' (5000), '박민수' (6000) 이다.

결과

쿼리문

SELECT 
	E.EMP_NM AS '직원',
	E.SALARY AS '급여'
FROM EMPLOYEES E
WHERE NOT EXISTS (
	SELECT I.SALARY
	FROM INTERNS I
	WHERE I.SALARY = E.SALARY
)

ALL

  • 서브쿼리 결과가 모두 만족하는 경우 TRUE를 반환한다.
  • 직원들 중 인턴 급여 보다 높은 직원들 보고 싶다.
  • 인턴 테이블에서 제일 높은 급여는 '유재석' (3000)이다.
  • 직원들 중 3000을 넘는 급여를 가진 직원은 '홍길동' (4000), '이철수' (5000), '박민수' (6000) 이다.

결과

쿼리문

SELECT E.EMP_NM, E.SALARY
FROM Employees E
WHERE E.SALARY > ALL (
    SELECT SALARY FROM Interns
);

ANY

  • 서브쿼리 결과중 하나라도 조건에 맞으면 TRUE를 반환한다.
  • 직원들 중에서 인턴과 비교했을 때 인턴보다 낮은 직원이 있는지 보고싶다.
  • 인턴 테이블 최고 급여자는 '유재석' (3000)이다.
  • 직원 테이블에서 '유재석' (3000) 보다 낮은 직원은 '최유리' (2000)이다.

결과

 

쿼리문

SELECT E.EMP_NM, E.SALARY
FROM Employees E
WHERE E.SALARY < ANY (
    SELECT SALARY FROM Interns
);