javaboiii의 DataBase/DB 요약정리(Do it! 오라클 데이터베이스)

DB -5) WHERE절과 연산자

javaboiii 2024. 7. 28. 18:11

DataBase

5-1. 필요한 데이터만 쏙 출력하는 WHERE절

WHERE절은 SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력하는 데 사용합니다. 그리고

여러 연산자를 함께 사용하면 더욱 세밀하게 데이터를 검색할 수 있습니다.

 

SELECT * FORM 테이블명
WHERE 조건;

 

WHERE절은 많은 데이터 중에서 어떤 조건에 일치하는 행만 골라내어 조회하는데 사용합니다.

SELECT [조회할 열1 이름], [열2 이름],....[열N 이름]
FROM [조회할 테이블명]
WHERE [조회할 행을 선별하기 위한 조건식];

 

키워드 필수 요소 선택 요소 설명
WHERE 조건식 - 조회 조건 지정

 

WHERE절이 포함된 SELECT문을 실행하면 조회할 테이블의 각 행에 WHERE절의 조건식을 대입하여 결과가 '참'인

경우에만 출력됩니다. 이 논리적 의미의 '참'을 true로 '거짓'인 경우를 false로 표현합니다.

5-2. 여러 개 조건식을 사용하는 AND, OR 연산자

WHERE절에서는 조건식을 여러 개 지정할 수 있습니다. 이때 사용하는 것이 바로 논리 연산자 AND, OR입니다.

SELECT * FROM 테이블명
WHERE
	조건식1
AND
	조건식2;

 

조건식이 모두 '참'인 행만 출력합니다.

 

SELECT * FROM 테이블명
WHERE
	조건식1
OR
	조건식2;

OR 연산자를 사용한 SELECT문의 결과는 조건식1이 '참'이거나 조건식2가 '참'인 행을 모두 출력합니다.

WHERE절 조건식의 개수

SELECT * FROM 테이블명
WHERE
	[조건식1]
AND
	[조건식2]
OR
	[조건식3]
    ....
AND
	[조건식N]

위와 같이 WHERE절에 사용할 수 있는 조건식의 개수는 사실상 제한이 없다고 보아도 무방합니다.

조건식을 두 개 이상 사용할 경우에도 각 조건식 사이에 AND 또는 OR 연산자를 추가하여 사용할 수 있습니다.

이후 더 많은 AND,OR 연산자를 사용한 조건식을 사용할 수 있습니다.

5-3. 연산자 종류와 활용 방법

산술 연산자

더하기, 빼기 같은 수치 연산을 하는 곱하기 *, 나누기 /을 사용합니다.

SQL문에서는 나머지 연산자를 제공하지 않짐만 mod라는 함수를 통해 나머지 연산 같은 기능을 사용할 수 있습니다.

비교 연산자

대소 비교 연산자

비교 연산자는 SQL문을 작성할 때 자주 사용하는 연산자로 연산자 앞뒤에 있는 데이터 값을 비교하는 데 사용합니다.

연산자 사용법 설명
> A > B A 값이 B 값을 초과할 경우 true
>= A >= B A 값이 B 값 이상일 경우 true
< A < B A 값이 B 값 미만일 경우 true
<= A <= B A 값이 B 값 이하일 경우 true

 

대소 비교 연산자는 비교 대상인 데이터가 숫자가 아닌 문자열일 때도 사용할 수 있습니다.

SELECT *
	FORM 테이블명
WHERE NAME >= 'F';

이름의 첫 문자가 F와 같거나 뒤쪽인 것만 검색합니다.

 

문자열을 비교할 때 영어 사전처럼 알파벳 순서로 문자열의 '대소'를 비교합니다. 조건식 NAME >= 'F'는

NAME 열 값이 첫 문자와 대문자 F를 비교했을 때 알파벳 순서상 F와 같거나 뒤에 있는 문자열을 출력하라는 의미 입니다.

 

등가 비교 연산자

연산자 양쪽 항목이 같은 값인지 검사하는 연산자가 바로 등가 비교 연산자입니다. WHERE절의 조건식에서 사용한

= 기호가 대표적인 등가 비교 연산자입니다. 등가 비교 연산자는 연산자의 양쪽 항목 값이 같으면 true가 반환됩니다.

이와 반대로 연산자 양쪽 값이 다를 경우 true를 반환하는 연산자도 있습니다.

많은 프로그래밍 언어에서 = 기호는 대입의 의미로 사용하지만 SQL문에서는 본래 기호 의미 그대로 '양쪽 데이터가 같은지 다른지'를

확인하는 데 사용합니다.

연산자 사용법 의미
= A = B A 값이 B 값과 같을 경우 true, 다를 경우 false를 반환
!= A != B A 값과 B 값이 다를 경우 true, 같을 경우 false 반환
<> A <> B
^= A ^= B

 

!=, <>, ^=는 '같지 않다'는 의미로 사용할 수 있는 세 가지 방식 모두 같은 결과 값을 출력합니다.

논리 부정 연산자

만약 A 값이 true일 경우 논리 부정 연산자의 결과 값은 false가 됩니다. 반대로 A 값이 false인 경우에 논리 부정 연산자의

결과 값은 true가 됩니다.

SELECT * FROM 테이블명
WHRER NOT 조건식;

 

보통 NOT 연산자를 IN, BETWEEN, IS NULL 연산자와 복합적으로 사용하는 경우가 많고, 대소/등가 비교 연산자에 직접

사용하는 경우는 별로 없습니다. 하지만 복잡한 여러 개 조건식이 AND, OR로 묶여 있는 상태에서 정반대 결과를 얻고자

할 때에는 유용하게 사용할 수 있습니다. 복잡한 조건식에 정반대의 최종 결과를 원할 때, 조건식을 일일이 수정하여 작성하는 것보다 NOT 연산자로 한 번에 뒤집어서 사용하는 것이 간편하고 SQL문 작성 시간도 줄일 수 있기 때문입니다.

IN 연산자

= 기호는 WHERE 조건식에서 특정 열 데이터 값만을 조회하고자 할 때 사용합니다.

출력하고 싶은 열의 조건이 여러 가지일 때 OR 연산자로 여러 조건식을 묶어 주는 것도 하나의 방법이지만. 조건이 늘어날수록 조건식을 많이 작성해야 하기 때문에 조금 번거롭습니다.

이때 IN 연산자를 사용한다면 특정 열에 해당하는 조건을 여러 개 지정할 수 있습니다. IN 연산자의 기본 형식은 다음과 같습니다.

SELECT [조회할 열1 이름], [열2 이름],...[열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 IN (데이터1, 데이터2,....데이터N);
키워드 필수 요소 선택 요소 설명
IN 열 이름
조회할 열의 데이터 목록
- 특정 열에 포함된 데이터를
여러 개 조회할 때 사용

 

IN 연산자 앞에 논리 부정 연산자 NOT을 사용하면 간단하게 반대 경우를 조회할 수 있습니다.

SELECT *
FROM 테이블명
WHERE 열이름 NOT IN (데이터1, 데이터2, ... 데이터N);

BETWEEN A  AND B 연산자

특정 열 값의 최소/최고 범위를 지정하여 해당 범위 내의 데이터만 조회할 경우에 대소 비교 연산자 대신

BETWEEN A AND B 연산자를 사용하면 간단하게 표현할 수 있습니다.

SELECT [조회할 열1 이름], [열2 이름],....,[열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;
키워드 필수 요소 선택 요소 설명
BETWEEN A AND B 열이름, 최솟값, 최댓값 - 일정 볌위 내의 데이터를 조회할 때 사용

 

마찬가지로 NOT연산자를 앞에 붙이면 범위 외의 값을 가진 데이터만 출력할 수 있습니다.

LIKE 연산자와 와일드 카드

LIKE 연산자는 이메일이나 게시판 제목 또는 내용 검색 기능처럼 일부 문자열이 포함된 데이터를 조회할 때 사용합니다.

SELECT * FROM 테이블명
WHERE 열이름 LIKE 'S%';

 

열이름 LIKE 'S%' 조건식은 열의 값이 대문자 S로 시작하는 데이터를 조회하라는 뜻입니다.

이 조건식에서 사용한 % 기호를 와일드 카드(wild card)라고 합니다. 와일드 카드는 특정 문자 또는 문자열을 대체하거나

문자열 데이터의 패턴을 표기하는 특수 문자입니다. LIKE 연산자와 함께 사용할 수 있는 와일드 카드는 _와 %입니다.

종류 의미
_ 어떤 값이든 상관없이 한 개의 문자 데이터를 의미
% 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미

 

앞에서 사용한 LIKE S%는 시작 문자가 S면 그 뒤에 어떤 문자 몇 개가 오든 상관없이 LIKE연산자를 사용한 조건식의

결과 값은 true가 됩니다. 만약 두 번쨰 글자가 S인 데이터를 조회하고 싶다면 다음과 같이 사용할 수 있습니다.

SELECT * FROM 테이블명
WHERE 열이름 LIKE '_S%';

-- 두 번째 문자는 반드시 S고 S앞에는 반드시 한 문자가 와야합니다.

 

어떤 단어가 포함된 제목 또는 본문 검색과 같은 기능을 구현할 때는 원하는 문자열 앞뒤 모두 와일드 카드를 붙여 줄 수 있습니다. AM이라는 단어를 포함하는 데이터를 조회할 때 SELECT문은 다음과 같이 작성할 수 있습니다.

SELECT * FROM 테이블명
WHERE 열이름 LIKE '%AM%';

 

해당 열의 값에 AM이라는 단어가 포함되어 있고 AM앞, 뒤에 몇글가자 오건 어떤 종류의 문자가 오건 상관없이 데이터가 출력됩니다.

 

와일드 카드 문자가 데이터 일부일 경우

데이터에 와일드 카드 기호로 사용되는 _나 % 문자가 데이터로 포함된 경우가 있을 수 있습니다. 이 경우에 _문자나

%문자를 포함한 데이터를 조회하기 위해서 와일드 카드 문자를 쓰는 것은 애매해집니다. 하지만 ESCAPE절을 사용하면

_, %를 와일드 카드 기호가 아닌 데이터로서의 문자로 다루는 것이 가능합니다. 예를 들어 LIKE문을 사용하여 데이터 앞에

A_A 문자를 가지고 있는 데이터를 찾으려면 다음과 같이 SQL문을 작성하면 됩니다.

SELECT * FROM 테이블명
WHERE 열이름 LIKE 'A\_A%' ESCPAE '\';

 

A\_A%에서 \ 문자 바로 뒤에 있는 _는 와일드 카드 기호로서가 아닌 데이터에 포함된 문자로 인식하라는 의미입니다.

ESCAPE절에서 지정할 수 있습니다. 그리고 \ 외에 다른 문자도 지정하여 사용할 수 있습니다.

 

LIKE 연산자와 와일드 카드 문자의 성능

LIKE 연산자와 와일드 카드를 사용한 SELECT문은 사용하기 간편하고 기능 면에서 활용도가 높지만 데이터 조회 성능과

관련된 의견은 다양합니다.

행 수가 어마어마한 테이블을 여러 개 조합하여 데이터를 조회하는 경우가 있을 수 있습니다. 데이터 조회 속도는 제공하려는 서비스 질과 직접적으로 연관되는 일이 빈번하기 때문에 데이터 조회 속도는 매우 중요합니다.

LIKE 연산자와 와일드 카드를 활용한 SELECT문은 와일드 카드를 어떻게 사용하느냐에 따라 데이터를 조회해 오는 시간에 차이가 난다고 알려져 있고 데이터베이스 관련 인터넷 켜뮤니티나 블로그 글 등에서 이와 관련된 이야기가 많이 오갑니다.

IS NULL 연산자

NULL은 데이터베이스에서 중요한 의미가 있습니다. 특수한 데이터 형식입니다. 

NULL은 데이터 값이 완전히 '비어 있는' 상태를 말합니다. 숫자 0은 값 0이 존재한다는 뜻이므로 NULL과 혼동하지 않도록 주의 해야합니다. NULL의 의미를 예를 들어 설명하면 다음과 같습니다.

의미
값이 존재하지 않음 통장을 개설한 적 없는 은행 고객의 계좌 번호
해당 사항 없음 미혼인 고객의 결혼기념일
노출할 수 없는 값 고객 비밀번호 찾기 같은 열람을 제한해야 하는 특정 개인 정보
확정되지 않은 값 미성년자의 출신 대학

 

따라서 NULL은 '현재 무슨 값인지 확정되지 않은 상태' 이거나 '값 자체가 존재하지 않은 상태'를 나타내는 데이터에 사용합니다. NULL은 산술 연산자와 비교 연산자로 비교해도 결과 값이 NULL이 되기 때문에 어떤 값인지 모르는 값에 숫자를 더해도 어떤 값인지 알 수 없고, 어떤 값인지 모르는 값이 특정 값보다 큰지 작은지 알 수 없는 것과 같은 이치입니다.

 

WHERE절은 조건식의 결과 값이 true인 행만 출력하는 데이처럼 연산 결과 값이 NULL이 되어 버리면 조건식의 결과는

false도 true도 아니게 되므로 출력대상에서 제외됩니다.

 

특정 열 또는 연산의 결과 값이 NULL인지 여부를 확인하려면 IS NULL 연산자를 사용해야합니다.

 

NULL이 아닌 데이터만 조회하려면 IS NOT NULL을 사용하면 됩니다. 

 

데이터가 NULL인지 아닌지를 확인하는 용도로만 사용하는 IS NULL과 IS NOT NULL 연산자는 매우 자주 사용됩니다.

집합 연산자

관계형 데이터베이스 개념은 집합론에서 시작되었습니다. SQL문에서는 SELECT문을 통해 데이터를 조회한 결과를 하나의 집합과 같이 다룰 수 있는 집합 연산자를 사용할 수 있습니다.

 

두개의 SELECT문 사이에 사용하는 UNION 연산자가 바로 집합 연산자 입니다. 이 연산자는 합집합을 의미하는 연산자입니다. 여기서 주의할 점은 집합 연산자로 두 개의 SELECT문의 결과 값을 연결할 때 각 SELECT문이 출력하려는 열 개수와 각열의 자료형이 순서 별로 일치해야 한다는 것입니다.

최종 출력되는 열 이름은 먼저 작성한 SELECT문의 열 이름으로 표기된나는 것에 주의해야 합니다.

 

오라클 데이터베이스에서 사용하는 집합 연산자는 다음과 같습니다.

종류 설명
UNION 연결된 SELECT문의 결과 값을 합집합으로 묶어 줍니다. 결과 값의 중복은 제거됩니다.
UNION ALL 연결된 SELECT문의 결과 값을 합집합으로 묶어 줍니다.
중복된 결과 값도 제거 없이 모두 출력 됩니다.
MINUS 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합 처리합니다.
먼저 작성한 SELECTANS의 결과 값 중 다음 SELECT문에 존재하지 않는 데이터만 출력됩니다.
INTERSECT 먼저 작성한 SELECT문과 다음 SELECT문의 결과 값이 같은 데이터만 출력됩니다.
교집합과 같은 의미입니다.

 

UNION은 데이터 중복을 제거한 상태로 결과 값을 출력하고 UNION ALL은 중복 데이터도 모두 출력합니다. 둘 다 합집합

을 의미하는 연산자이지만 결과 값이 달라지므로 사용할 때 주의 해야합니다.

 

MINUS 연산자는 차집합을 의미하는데 두 SELECT문을 MINUS 연산자로 묶어 주면 두 SELECT문의 결과 값이 같은 데이터는 제외하고 첫 번째 SELECT문의 결과 값이 출력됩니다.

 

INTERSECT 연산자는 교집합을 의미하므로 두 SELECT문의 결과 값이 같은 데이터만 출력됩니다.

연산자 우선순위

우선순위 연산자 설명
높음













낮음
* , / 산술 연산자 곱하기, 나누기
+, - 산술 연산자 더하기, 빼기
=, !=, ^=, <>, >, >=, <, <= 대소 비교 연산자
IS (NOT) NULL, (NOT) LIKE, (NOT) IN (그 외) 비교 연산자
BETWEEN A AND B BETWEEN 연산자
NOT 논리 부정 연산자 NOT
AND 논리 연산자 AND
OR 논리 연산자OR

 

수학식에서와 마찬가지로 먼저 수행해야 하는 연산식을 소괄호( )로 묶어 주면 연산식의 기본 우선순위와는 별개로

괄호 안의 연산식을 먼저 수행합니다.

잊기 전에 한 번 더

Q1. EMP 테이블을 사용하여 다음과 같이 사원 이름(ENAME)이 S로 끝나는 사원 데이터를 모두 출력하는 SQL문을 작성해 보세요.

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

Q2. EMP 테이블을 사용하여 30번 부서(DEPTNO)에서 근무하고 있는 사원 중에 직책이(JOB)이 SALESMAN인 사원의 사원 사원 번호, 이름, 직책, 급여, 부서 번호를 출력하는 SQL문을 작성해 보세요.

SELECT
	EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE
	DEPTNO = 30
AND
	JOB = 'SALESMAN';

Q3. EMP 테이블을 사용하여 20번, 30번 부서에 근무하고 있는 사원 중 급여(SAL)가 2000 초과인 사원을 다음 두 가지 방식의 SELECT문을 사용하여 사원번호, 이름, 급여, 부서번호를 출력하는 SQL문을 작성해 보세요.

  • 집합 연산자를 사용하지 않는 방식
  • 집합 연산자를 사용한 방식

집합 연산자를 사용하지 않은 방식

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (20, 30) AND SAL > 2000;

 

집합 연산자를 사용한 방식

SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20 AND SAL > 2000
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30 AND SAL > 2000;

Q4. NOT BETWEEN A AND B 연산자를 쓰지 않고, 급여(SAL) 열 값이 2000 이상 3000이하 범위 이외의 값을 가진 데이터만 출력하도록 SQL문을 작성해 보세요.

SELECT *
FROM EMP
WHERE SAL < 2000 OR SAL > 3000;

Q5. 사원 이름에 E가 포함되어 있는 30번 부서의 사원 중 급여가 1000~2000 사이가 아닌 사원이름, 사원번호, 급여, 부서번호를 출력하는 SQL문을 작성해 보세요.

SELECT ENAME, EMPNO, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30
  AND ENAME LIKE '%E%'
  AND (SAL < 1000 OR SAL > 2000);

Q6. 추가 수당이 존재하지 않고 상급자가 있고 직책이 MANAGER, CLERK인 사원 중에서 사원이름의 두 번째 글자가 L이 아닌 사원의 정보를 출력하는 SQL문을 작성해 보세요.

SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO
FROM EMP
WHERE (COMM IS NULL OR COMM = 0) -- 추가 수당이 존재하지 않는 사원
  AND MGR IS NOT NULL -- 상급자가 있는 사원
  AND JOB IN ('MANAGER', 'CLERK') -- 직책이 MANAGER 또는 CLERK
  AND ENAME NOT LIKE '_L%'; -- 사원이름의 두 번째 글자가 L이 아닌 사원