Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

노력하는문돌이

2. 조건문(WHERE, AND, OR ..) 본문

프로그래밍 언어 공부/SQL

2. 조건문(WHERE, AND, OR ..)

성균관_해태 2021. 10. 12. 14:03

0. 들어가기 전

1에서는 테이블을 조회하기 위한 명령어를 봤다면, 이제는 조건문을 활용하여 필요한 데이터만 조회하는 명령어를 정리할 것이다. PANDAS에서의 조건문, R에서의 SELECT/FILTER와 같은 함수와 동일한 작업을 수행하는 명령문들이 있다.


1. 조건문 명령어

1-1. WHERE절

  • SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력하는데 사용
  • 여러 연산자와 함께 사용하면 더욱 세밀한 데이터 검색 가능
  • FROM 절 뒤에 원하는 조건문을 작성하면 된다.
## WHERE절 활용 형테
SELECT 열, 열2, 열3 ...
FROM 테이블
WHERE 조건식;

## 예시
SELECT * FROM EMP
WHERE COL1 = 30;

1-2. AND/OR 연산자

  • 조건식을 여러 개 지정할 수 있는 명령어
## AND 조건문
SELECT * FROM TABLE
WHERE 열1 = 30 AND 열2 = '조건2'; ## STRING에 대한 조건은 ''안에 넣어서 비교

## OR 조건문
SELECT * FROM TABLE
WHERE 열1 = 30 OR 열2 = '조건2;

## 산술 연산자 (EX1)
SELECT * FROM TABLE
WHERE 열1 = SAL*12;    ## 이렇게 다른 연산자와 함께 사용 가능

## 산술 연산자 (EX2)
SELECT * FROM TABLE
WHERE 열2 > 30;

## 문자 대소비교
SELECT * FROM TABLE
WHERE 열1 >= 'F'; ## 문자에 대소비교를 넣으면, 첫 글자가 F와 같거나 F 뒤인 ROW 출력

## 문자 대소비교2
SELECT * FROM TABLE
WHERE 열2 <= 'FORD'; ## 첫글자가F, 두번째가O, 세번째가R .. 보다 작은 ROW 출력
1-3. 등가비교 연산자
연산자 사용법 의미
= A = B A와 B가 같을 경우 T, 다를 경우 F
!= A != B A와 B가 다를 경우 T, 같을 경우 F
<> A <> B
^= A ^= B
1-4. 논리 부정 연산자
  • Python에서의 NOT 명령어와 동일하게, TRUE와 FALSE를 반대로 반환할 때 사용하는 명령어
  • 조건문 앞에 NOT을 붙임으로써 출력값을 반대로 뒤집을 수 있음
SELECT * FROM TABLE
WHERE NOT SAL = 3000; ## 이러면 SAL이 3000이 아닌 값으로 반환​

 

1-5. IN 연산자

  • 특정 열에 해당하는 조건을 여러 개 지정할 수 있는 명령어
  • 파이썬에서 LIST COMPREHENSION에서의 IN 함수와 동일한 역할 수행
## 기본 문법 형태
SELECT [조회할 열], [열2], [열3]
FROM [테이블]
WHERE [열 이름] IN (데이터1, 데이터2, 데이터,3 ..);

## 예시1
SELECT * FROM EMP
WHERE JOB IN ('MANAGER','SALESMAN','CLERK'); ## JOB이 MANAGER,SALESMAN,CLERK인 사람만 도출

## 예시2
SELECT * FROM EMP
WHERE JOB NOT IN ('MANAGER','SALESMAN','CLERK') ## 예시1과 반대되는 사람만 도출

1-6. BETWEEN A AND B 연산자

  • 특정 열 값의 최소 및 최고 범위를 지정하여 해당 범위 내의 데이터만 조회하는 명령어
  • FROM 절 다음에 BETWEEN 최소 AND 최대로 표현하면 된다
## 기본 예제
SELECT * FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;

## NOT과 함께 쓰는 예지
SELECT * FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000;​

1-7. LIKE 연산자와 와일드 카드

  • LIKE 연산자는 일부 문자열이 포함된 데이터를 조회할 때 사용
  • LIKE 연산자와 함께 사용할 수 있느 와일드카드는 _와 %가 있음
- 어떤 값이든 상관없이 한 개의 문자 데이터를 의미
% 길이와 상관없이(문자 없는 경우도 포함) 모든 문자 데이터를 의미
## 기본 문법
SELECT * FROM EMP
WHERE 열1 LIKE 조건;

## 예제1
SELECT * FROM EMP
WHERE 열1 LIKE 'S%'; ## 열1의 첫 글자가 S로 시작하는 모든 값 반환

## 예제2
SELECT * FROM EMP
WHERE 열1 LIKE '_L%'; ## 열1의 두 번째 글자가 L로 시작하는 모든 값 반환

## 예제3
SELECT * FROM EMP
WHERE 열1 LIKE '%AM%'; ## 열1의 중간 글자가 AM이 들어간 모든 값 반환

## 예제4
SELECT * FROM EMP
WHERE 열1 NOT LIKE '%AM%'; ## 열1의 중간 글자가 AM이 안 들어간 모든 값 반환​
  • 와일드 카드 문자가 데이터 일부일 경우에는 ESCAPE절을 사용하면 된다
  • ESCAPE 절을 쓸 때는 '\'를 아래의 빈칸 자리에 사용해주면 된다.
## ESCAPE 절 예시
SELECT * FROM TABLE
WHERE 열1 LIKE 'A( )_A%' ESCPAE '( )'; ## 여기서 ( )은 위의 원화 표시임. 여기서 안 보여서 대체함​

1-8. IS NULL 연산자

  • NULL은 데이터가 비어있는 상태를 의미하며, IS NULL 연산자는 그런 NULL 값들을 조회해주는 명령어
  • NULL은 연산 자체가 무의미해지는 현상이 발생해서 기존의 연산자(=,+,* 등)은 무의미할 수 있음
  • 이럴 때 활용하는 것이 IS NULL
## 기본 형태
SELECT * FROM TABLE
WHERE 열 IS NULL;

## NOT과 응용
SELECT * FROM TABLE
WHERE 열 IS NOT NULL; ## 다른 연산자와 다르게 IS와 NULL 사이에 NOT이 들어감

1-9. 집합 연산자

  • 합집합, 교집합처럼 데이터 간의 집합 관계를 바탕으로 데이터를 조회할 때 활용하는 명령어
  • 두 개의 SELECT 문 사이에 넣으면 된다
  • 이때, 두 SELECT 절의 COLUMN의 개수와 자료형이 동일해야 한다. 만약 다를 경우 오류를 반환한다
종류 설명
UNION 연결된 SELECT문의 결과 값을 합집합으로 묶어 줍니다. 결과 값의 중복은 제거됩니다.
UNION ALL 연결된 SELECT문의 결과 값을 합집합으로 묶어 줍니다. 중복된 결과 값도 제거 없이 모두 출력
MINUS - 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합 처리
- 먼저 작성한 SELECT문의 결과 값 중 다음 SELECT문에 존재하지 않는 데이터만 출력 (차집합)
INTERSECT 먼저 작성한 SELECT문과 다음 SELECT문의 결과 값이 같은 데이터만 출력 (교집합)
## 열 개수와 열 자료형이 같다는 가정 하에
SELECT 열1, 열2, 열3 FROM TABLE
WHERE 열1 = 10

UNION ## 이 자리에 UNION ALL, MINUS, INTERSECT 등이 들어가면 됨

SELECT 열1,열5,열6 FROM TABLE
WHERE 열1 = 20;

 

2. 연습문제 풀이

2-1. 이름이 S로 끝나는 사원 데이터 출력

SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM EMP
WHERE ENAME LIKE '%S';

2-2. SALESMAN이면서 30번 부서에서 근무하는 사원 데이터 출력

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

2-3. 20번, 30번 부서에 근무하고 있으며, 급여가 2000 초과인 사원 데이터 출력

## 1번 : 집합 연산자를 사용하지 않은 방식
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (20,30) AND SAL > 2000;

## 2번 : 집합 연산자 사용
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20 AND SAL > 2000;

UNION

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

2-4. SAL 열 값이 2000이상 3000이하 범위 이외의 값을 가진 데이터만 출력 (BETWEEN 사용 X)

SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM TABLE
WHERE SAL < 2000

UNION

SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM TABLE
WHERE SAL > 3000

2-5. 사원 이름에 E가 포함되어 있는 30번 부서의 사원 중 급여가 1000~2000 사이가 아닌 데이터

SELECT ENAME,EMPNO,SAL,DEPTNO FROM EMP
WHERE ENAME LIKE'%E%' AND SAL NOT BETWEEN 1000 AND 2000;

2-6. 추가 수당이 존재 X, 상급자 존재, 직책이 MANAGER, CLERK인 사원 중 두 번째 글자가 L인 사원

SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM EMP
WHERE SAL IS NULL AND MGR IS NOT NULL AND ENAME NOT LIKE '_L%';