Oracle - 3일차

donghani·2024년 1월 30일

반갑습니다. 글이 연속해서 올라가는 거 같아보이지만 아숩게도, 어제 마무리를 못써서 그렇습니다 하 하 하

🎈필요한 데이터만 쏙 출력하는 WHERE

WHERE은 SELECT와 함께 데이터를 조회할 때, 특정 조건을 기준으로 원하는 행을 출력할 때 사용한다. 이 때 연산자를 여러 개를 사용할 수 있다.
FROM절에 뒤에다가 사용한다.

SELECT *
    FROM EMP
WHERE EMPNO = 7782;

WHERE문의 기본 형태는, WHERE [조회할 행을 선별하기 위한 조건식];
으로 이루어진다.
조건식이 필수 요소라고 볼 수 있고, 조건식의 TRUE에 해당하는 행을 출력시켜준다.

🎈WHERE과 함께 쓰는 연산자들

WHERE은 논리 연산자를 이용해서, 조건식을 여러 개 지정할 수 있다.
논리 연산자랑 우리가 코딩에서 많이 배우는 그것들을 의미한다.

SELECT *
    FROM EMP
WHERE DEPTNO = 30
    AND JOB = 'SALESMAN';#부서번호가 30이면서 직업이 salesman인 행

AND와 OR의 구분은 논리 회로에서 지겹게 했으니 넘어가자
이고, 이거나(AND, OR)

실무는 AND를 많이 사용(1개월 이내의 출금 데이터만 보도록 하자) 처럼
2가지 조건이 모두 만족하는 경우의 조회를 원한다고 한다.


산술 연산자
우리가 쓰는 더하기, 빼기, 곱하기, 나누기
식을 써서 조건식을 사용할 수 있다.
단, 나머지 연산자(mod)는, oracle에서만 사용할 수 있다. sql문은 NO, NO!

비교 연산자
대소 비교 연산자
데이터 값을 비교하는데 사용한다.
숫자 뿐만 아니라 문자열도 비교 할 수 있다.

SELECT *
    FROM EMP
WHERE ENAME >= 'F'; 
#이럴 경우 사전 순서로 F보다 뒤에 있거나 ENAME이 크다는 뜻, 사전 순서상, F랑 같은 경우를 출력한다.
SELECT *
    FROM EMP
WHERE ENAME <= 'FORZ';
#이럴 때는 한 글자씩 비교해서 같다면 뒤에 문자가 순서상 빠르면 출력하는 식으로 첫 글자인 F부터 비교하는 식으로 수행한다.

등가 비교 연산자
=, !=, <>, ^=
같다와 3가지는 같지 않다이다. !=는 프로그래밍 언어에서 익숙하나 <>, ^=은 익숙하지 않으니 잘 정리해놓자

논리 부정 연산자
!=, <>, ^=와 같이 쓸 수 있는 연산자이다.
NOT을 쓰면 된다.

IN 연산자
= 기호로 열이 여러 개의 직업을 전부 조회해야할 때 OR을 써서 코드를 길어지게 하는 것 보다
IN을 써서 한 줄의 코드로 묶어서 사용할 수 있다.

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

이런 식으로
SELECT 조회할 열 이름
FROM 조회할 테이블 이름
WHERE 열 이름 IN (데이터1, ... 데이터N)
사용하면 코드가 간결해지고 하나의 열에서 원하는 것을 전부 엮어서 사용할 수 있다.

IN은 NOT IN으로 써서 원하는 것이 아닌 것들을 전부 출력시킬 수 도 있다.

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

다음과 같은 코드가 그렇다고 볼 수 있다.

BETWEEN A AND 연산자
2000이상 3000이하를 표현할 때, AND로 2줄로 표현할 수 있으나,
이번에도, 더 간단한 조건으로 만들 수 있다.
BETWEEN A AND B다.
A-> 최솟값 B->최댓값이다.
IN과 똑같은 구조이다.
이것 또한 NOT를 BETWEEN 앞에 쓰면 똑같이 2000이상 3000이하가 아닌 것들을 출력해준다.

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

SELECT *
    FROM EMP
WHERE ENAME LIKE 'S%';
#S%은 S로 시작하는 데이터를 조회하라는 의미
# %이라는 기호를 와이들 카드라고 한다.
#와일드 카드는 특정 문자 또는 문자열을 대체하거나 문자열 데이터의 패턴을 표기하는 특수 문자이다.
#와일드 카드는 2가지가 있는데, - : 어떤값이든 상관없이 한 개의 문자 데이터를 의미
#%: 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미
SELECT *
    FROM EMP
WHERE ENAME LIKE '_L%';
# 두번째 글자가 L인 ENAME의 열을 출력한다는 의미
WHERE ENAME LIKE '%AM%';
# AM이 들어가는 열을 출력해라 : 본문 검색의 기능에 앞뒤로 와일드 카드 붙이기
WHERE ENAME NOT LIKE '%AM%';

와일드 카드 문자가 데이터 일부일 경우엔는 ESCAPE 문자 \을 사용한다.
와일드 카드 문자 앞에 \을 붙인다.(C++의 문자 처리와 유사함)

서비스 조회 부분에서 LIKE 연산자와 와일드 카드를 활용한 SELECT문을 잘 써야한다. (속도와 매우 연관)

IS NULL 연산자
NULL : 데이터 값이 완전히 비어있는 상태, 0이 아님 0 또한 값이 존재하는 것이기 때문이다.
NULL은 4가지 의미로 설명할 수 있다.
1. 값이 존재하지 않음 : 개설한적 없는 계좌번호
2. 해당 사항 없음 : 미혼의 결혼기념일
3. 노출할 수 없는 값 : 고객 비밀번호 찾기 같은 열람 제한해야하는 개인 정보
4. 확정되지 않는 값 : 고졸의 출신 대학

NULL은 값에서 사용하는 연산자를 사용해도 의미가 없다. 비교를 해도 NULL이 되기 때문이다.
그렇기 때문에 IS NULL을 사용하는 이유이다.

SELECT *
    FROM EMP
WHERE COMM IS NULL;
WHERE MGR IS NOT NULL; # 이런식으로 NULL이 아닌 열을 출력할 수 있다.
# 매우 자주 사용되는 연산자이므로 사용법을 기억하자
WHERE SAL > NULL
OR COMM IS NULL;
#이러한 OR문은 출력이 된다. 
#IS NULL로 NULL이 값이 있는 것을 알았기 때문에, 하나의 True가 존재하기 때문이다. AND는 안된다.

🎈집합 연산자

SELECT문을 통해 데이터를 조회한 결과를 하나의 집합과 같이 다룰 수 있는 UNION이 존재한다.
두 개 이상의 SELECT문의 결과 값을 연결할 때 사용한다.

SELECT EMPNO, ENAME, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 10
UNION
SELECT EMPNO, ENAME, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 20;

다음과 같이 활용 할 수 있다. 주의해야 할 점은
select문이 출력하는 열 개수와 각 열의 자료형이 순서별로 일치해야 한다는 점이다.
열 개수도 같아야 하고 각각의 열이 똑같은 자료형이여야한다는 점을 명심하자

SELECT EMPNO, ENAME, SAL, DEPTNO
    FROM EMP
    WHERE DEPTNO = 10
UNION
SELECT SAL, JOB, DEPTNO, SAL
    FROM EMP
    WHERE DEPTNO = 20;
#다음과 같다면 맨 앞에 열 이름을 따르고, 자료형이 같기 때문에 올바른 출력이 된다.

집합 연산자는 4가지 종류가 있는데
UNION : 연결된 SELECT문을 합집합으로 묶어 준다. 결과 값의 중복을 제거한다.
UNION ALL : 연결된 SELECT문을 합집합으로 묶어 준다. 결과 값의 중복 또한 출력한다.
MINUS : 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합 처리한다. 먼저 작성한 SELECT문의 결과 중 다음 SELECT문에 존재하지 않는 데이터만 출력된다.
INTERSECT : 교집합, SELECT문 두개의 결과 값이 같은 것만 출력한다.

🎈연산자의 우선순위

수학식의 곱하기, 나누기가 1등
그 다음이 더하기 빼기
그 다음이 대소 비교 연산자
그 다음이 연산자
그 다음이 BETWEEN A AND B
그 다음이 논리 부정 연산자 NOT
그 다음이 AND
그 다음이 OR이다.

🎈연습문제 풀이

Q1. EMP 테이블을 사용하여 사원이름이 S로 끝나는 사언 데이터를 모두 출력하라
SELECT
FROM EMP
WHERE ENAME LIKE '%S';
그냥 LIKE 써도 됐음...
Q3. 급여가 2000초과이면서 부서 번호가 20,30에서 근무하는 사원을 집합 연산자 사용 안하고 풀어보기
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE SAL > 2000
AND DEPTNO IN (20,30);
Q4. NOT BETWEEN A AND B 연산자를 쓰지 않고, 급여 값이 2000이상 3000이하 범위가 아닌 데이터만 출력하도록 해봐라
SELECT

FROM EMP
WHERE SAL < 2000
OR SAL > 3000;
원래 코드에 WHERE 부분을 전부 NOT를 씌운다고 생각하면
AND가 NOT이면 OR이 된다 생각하자

profile
컴퓨터 공학과 이방인

0개의 댓글