WHERE
WHERE절은 SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력할 때 사용한다.
자바나 파이썬등의 언어에서 사용하는 if조건절과 비슷하네? 라는 생각이 들었다.
SELECT DEPTNO
FROM EMP
WHERE DEPTNO = 10; --DEPTNO가 10인 행만 출력하기

만약 조건이 여러개라면??
위에서 말했듯이 자바나 파이썬등의 언어와 비슷한 점이 여기서도 나타난다.
조건을 여러개 걸고 싶을 때 OR, AND등을 사용했는데 SQL도 이를 통해 여러 조건을 명시할 수 있다.
--부서번호가 10이거나 30인
SELECT DEPTNO
FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 30;
--직업이 'SALESMAN'이고 부서번호가 30인 사원의 이름
SELECT DEPTNO
FROM EMP
WHERE JOB = 'SALESMAN' AND DEPTNO = 30;


처음에 AND와 OR을 만났을 때 헷갈렸던 경험이 있었는데 이때 나는 한글로 이해해보니 좀더 와닿았다.
예를들어
나는 서울에 살고(그리고) 남자이다. 예문의 문맥을 보면 서울과 남자라는 조건을 둘다 만족해야한다.
따라서 AND는 조건이 모두 충족이 돼야 TRUE라고 생각하자
사람들중 서울에 살거나 여자인 사람은? 이라는 예문을 보면 서울에 사는 사람이거나, 여자이거나, 서울에 살면서 여자인 사람을 찾는구나를 알 수 있다.
따라서 OR은 조건 중 한개만 충족이 되면 TRUE라고 생각하자
산술연산자
우리가 흔히 아는 +, -, 곱하기(*), 나누기(/)이다.
산술연산자를 활용해 계산된 값을 출력, 조건에 걸기 등이 가능하다.
SELECT ENAME, SAL*12
FROM EMP;
SELECT ENAME, SAL*12
FROM EMP
WHERE SAL*12 = 9600;


비교 연산자
크기를 비교하는 대소 비교 연산자, 등가비교 연산자가 있다.
먼저 대소 비교 연산자를 살펴보자. (우리가 아는 크기를 비교하는 연산자 그것이 맞다!)
SELECT ENAME, SAL*12
FROM EMP
WHERE SAL*12 < 15600;

위와 같이 조건절에 무엇보다 큰값, 작은값 등을 뽑아낼 수 있다.
다음으로 등가비교 연산자는 =,!=이 대표적으로 있다.
SELECT JOB
FROM EMP
WHERE JOB = 'SALESMAN';
SELECT JOB
FROM EMP
WHERE JOB !='SALESMAN';


같지 않다는 연산자에는 !=도 있고 <>, ^=도 있으니 한번 실행해보자!
논리 부정 연산자
이는 NOT 연산자를 활용한다면 TRUE면 FALSE로 FALSE면 TRUE로 결과 값을 반환한다.
쉽게 생각해서 진실을 거짓으로 만들고 거짓을 진실로 만들어주는 것과 같이 반대로 만들어준다고 생각하다.
SELECT JOB
FROM EMP
WHERE NOT JOB = 'SALESMAN';

출력결과를 보면 JOB = 'SALESMAN'이 FALSE인 경우를 출력해 != 'SALESMAN' 의 조건과 같은 효과를 낸다.
따라서 나는 영어를 해석하듯이 이해하면 빠르다고 했던거 처럼 JOB이 SALESMAN이 아닌거(NOT)를 출력하라!
라고 이해했을 때 와닿았다.
IN 연산자
IN 연산자를 활용해 OR과 같은 효과를 낼 수 있다.
따라서 IN연산자를 통해 OR를 사용해서 여러 조건을 걸어야할 때 간단히 표현할 수 있다.
SELECT DEPTNO
FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 30;
SELECT DEPTNO
FROM EMP
WHERE DEPTNO IN (10,30);
그러면 IN은 어떻게 이해하는게 좋을까??
내가 이해한 방법은 ()로 묶인 집합? 틀?이라고 생각하고
'DEPTNO가 집합? 틀? 안에 있는 것들 중 하나이니 ?라고 물어보는 거다'라고 이해하면 쉬웠다.
BETWEEN A AND B연산자
마치 AND와 같은 효과를 내는 연산자이다.
예를 들어 SAL이 1250 이상이고 3000이하일때 조건을 건다면 다음과 같이 표현이 가능하다.
SELECT SAL
FROM EMP
WHERE 1250 <= SAL AND 3000 >= SAL;
SELECT SAL
FROM EMP
WHERE SAL BETWEEN 1250 AND 3000;
이때 BETWEEN은 이상 이하 라는것을 잊지말기!
LIKE 연산자와 와일드카드
LIKE 연산자는 일부 문자열이 포홤된 데이터를 조회할 때 사용한다.
예를 들어 이름에 S가 들어간 사람 뽑기 등이 있다.
와일드카드는 문자열의 패턴을 지정할 수 있게 해준다.
_는 어떤 값이든 상관없이 한 개의 문자데이터 -> LIKE '_S' 라면 (아무글자한개S) 형태
%는 길이와 상관없이 어떤 문자든 가능(0개도 가능) -> LIKE '%S' 아무글자~~~~~~~S형태
SELECT ENAME
FROM EMP
WHERE ENAME LIKE '_L%';
--LIKE를 해석하면 다음과 같다 첫글자는 뭐가 오든 상관이 없고
--두번째 글자가 L이여야하면 뒤에 길이에 상관없이 모든 글자가 가능한 경우를 출력
SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%L%';
--어느 위치든 L이 있다면 출력


또한 _와일드 카드는 한글자를 의미 하므로 _를 사용해서 어떤 문자가 몇번째에 속해있는 문자열을 출력하라가 가능하다!
예를 들면 __L%과 같이 3번째 글자가 L인 경우 출력하기!
IS NULL연산자
NULL값인 행을 출력하고자 할 때 먼저 떠오르는건 컬럼 = NULL 조건이 먼저 떠오르겠지만
NULL은 모르는 값, 알 수 없는 값으로 해당 되기 때문에 산술연산에 의해 계산이 되면 모르는값 즉 ?로 나와서 원하는대로 결과를 얻을 수 없다.
그래서 필요한 것이 IS NULL이다.
SELECT *
FROM EMP
WHERE COMM IS NULL;
SELECT *
FROM EMP
WHERE COMM IS NOT NULL;


위에서 배운 NOT 활용해 NULL이 아닌경우를 출력하고자 할 때 활용이 가능하다.
집합 연산자
SELECT문을 통해 조회한 결과들을 한번에 합쳐서 중복을 없애고 출력해주는 방법이다. (UNION, UNION ALL등)
이때 두 개의 결과를 합칠 때 출력하는 열의 개수와 각 열의 자료형의 타입이 동일해야한다.
--열 개수가 달라서 오류
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO = 20;
--열의 자료형이 달라서 오류
SELECT ENAME, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;
나는 그럼 자료형은 같은데 컬럼명이 다르면 오류가 발생하지 않나 라는 생각이 들어 실행 해봤다.
SELECT SAL, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

오류가 발생하지 않지만 먼저나온 SELECT절에 컬럼명이 출력되고 원치 않는 컬럼들이 합쳐졌다!
다음으로 중복을 없애지 않고 합쳐주는 UNION ALL이 있다.
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;


다음과 같이 UNION과 UNION ALL 의 차리을 확연히 볼 수 있다.
다음으로 MINUS, INTERSECT가 있다.
MINUS는 한국말로 빼기로 차집합이라고 생각하면 되고
INTERSECT는 교차로 교집합이라고 생각하면 된다!!!
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
MINUS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
INTERSECT
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;


항상 출력기준은 먼저 나온 SELECT결과임을 잊지말자.
연산자 우선순위
여러 연산자는 우선순위를 가지고 있다. 즉 우리가 알고 있는 사칙연산에서 곱하기나 나누기가 덧셈,뺄셈보다 먼저 계산되는 거와 같은 개념이다.
우선순위 | 연산자 | 설명 |
높음 낮음 |
*, / | 곱하기, 나누기 |
+, - | 더하기, 빼기 | |
=, !=, ^=, <>, >, >=, <, <= | 대소 비교 연산자 | |
IS (NOT) NULL, (NOT) LIKE, (NOT) IN | (그 외) 비교 연산자 |
|
BETWEEN A AND B | BETWEEN 연산자 |
|
NOT | 논리 부정 연산자 NOT | |
AND | 논리 연산자 AND | |
OR | 논리 연산자 OR |
개인적인 생각으로 연산자 우선순위를 다 외우기는 힘들다고 생각한다.
하지만 우리에게는 좋은 무기?가 있다.
예를 들어 사칙연산에서 먼저 계산하고 싶은건 ()로 우선순위를 주는 것처럼
우리가 원하는대로 계산 순서가 있다면 ()로 묶어서 계산식을 표현해보자!!!!
'데이터베이스 > 오라클' 카테고리의 다른 글
[오라클] SQL의 조회 - SELECT문의 기본 형식 (0) | 2023.09.01 |
---|