반응형
본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.
논리연산자는 두 개 이상의 조건을 주기 위해 사용된다.
OR 연산자
SELECT 열이름1, 열이름2 FROM 테이블명 WHERE 조건절1 OR 조건절2;
예제 (테이블명 : BRNCH_INFO)
- 각 열에 대한 설명
: 영업점 번호, 영업점 이름, 영업점 신선일, 영업점 폐쇄일, 영업점 인원, 경영평가
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRANCH_NUM | BRNCH_PERF |
789 | 시청 | 1990-03-12 | NULL | 13 | A |
640 | 여의도 | 2005-08-07 | NULL | 8 | B |
368 | 대치 | 2005-08-01 | 2013-07-09 | 13 | C |
248 | 창동 | 2000-11-30 | NULL | 12 | A |
547 | 종각 | 1993-02-21 | NULL | 11 | C |
780 | 명동 | 1999-09-22 | NULL | 8 | A |
987 | 역삼 | 2008-08-30 | NULL | 7 | B |
456 | 대학로 | 2010-12-01 | NULL | 8 | B |
650 | 신촌 | 2002-05-17 | NULL | 10 | C |
- Primary Key는 BRNCH_NO
더보기
CREATE TABLE BRNCH_INFO
(
BRNCH_NO INT NOT NULL,
BRNCH_NM CHAR(20) NOT NULL,
OPEN_DT date NOT NULL,
CLOSE_DT date NULL,
BRNCH_NUM INT NOT NULL,
BRNCH_PERF CHAR(20) NOT NULL
);
INSERT INTO BRNCH_INFO
VALUES
(789, '시청', '1990-03-12', NULL, 13, 'A'),
(640, '여의도', '2005-08-07', NULL, 8, 'B'),
(368, '대치', '2005-08-01', '2013-07-09', 13, 'C'),
(248, '창동', '2000-11-30', NULL, 12, 'A'),
(547, '종각', '1993-02-21', NULL, 11, 'C'),
(780, '명동', '1999-09-22', NULL, 8, 'A'),
(987, '역삼', '2008-08-30', NULL, 7, 'B'),
(456, '대학로', '2010-12-01', NULL, 8, 'B'),
(650, '신촌', '2002-05-17', NULL, 10, 'C');
문제
Q1. 위 테이블에서 직원수(BRANCH_NUM)가 10명 이상이거나 경영평가(BRNCH_PERF)가 ‘A’인 영업점 번호(BRNCH_NO), 영업점 인원(BRNCH_NUM), 경영평가(BRNCH_PERF)를 출력
BRNCH_NO | BRNCH_NUM | BRNCH_PERF |
368 | 13 | C |
547 | 11 | C |
650 | 10 | C |
더보기
SELECT BRNCH_NO, BRNCH_NM, BRNCH_NUM, BRNCH_PERF
FROM BRNCH_INFO
WHERE BRNCH_NUM >=10 OR BRNCH_PERF='A';
참고
- 연산의 우선순위에 있어서 AND가 OR보다 높음
- OR 연산자를 먼저 처리하기 위해서는 괄호가 필요
EXAMPLE 1) 아래 쿼리문의 결과는? (괄호 사용 X)
SELECT *
FROM BRNCH_INFO
WHERE OPEN_DT <= '1999-12-31' OR BRNCH_NUM = 8 AND BRNCH_PERF = 'A';
과정 1
- 위의 WHERE 조건을 나눠서 생각
- 괄호가 없으므로 AND 연산을 먼저 처리
SELECT *
FROM BRNCH_INFO
WHERE BRNCH_NUM = 8 AND BRNCH_PERF = 'A';
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRNCH_NUM | BRNCH_PERF |
780 | 명동 | 1999-09-22 | 8 | A |
과정 2
- 추가적으로 OR 연산 앞에 있는 조건을 이용해 출력
SELECT *
FROM BRNCH_INFO
WHERE OPEN_DT <= '1999-12-31';
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRNCH_NUM | BRNCH_PERF |
789 | 시청 | 1990-03-12 | 13 | A | |
547 | 종각 | 1993-02-21 | 11 | C | |
780 | 명동 | 1999-09-22 | 8 | A |
- 최종적으로 위 두 쿼리문의 결과를 OR 연산으로 출력하면 BRNCH_NO가 780인 경우가 중복되므로 아래와 같음
최종 결과
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRNCH_NUM | BRNCH_PERF |
789 | 시청 | 1990-03-12 | 13 | A | |
547 | 종각 | 1993-02-21 | 11 | C | |
780 | 명동 | 1999-09-22 | 8 | A |
EXAMPLE 2) 아래 쿼리문의 결과는? (괄호 사용)
SELECT *
FROM BRNCH_INFO
WHERE (OPEN_DT <= '1999-12-31' OR BRNCH_NUM = 8) AND BRNCH_PERF = 'A';
과정 1
- 괄호가 있는 OR연산 먼저 처리
SELECT *
FROM BRNCH_INFO
WHERE (OPEN_DT <= '1999-12-31' OR BRNCH_NUM = 8);
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRNCH_NUM | BRNCH_PERF |
789 | 시청 | 1990-03-12 | 13 | A | |
640 | 여의도 | 2005-08-07 | 8 | B | |
547 | 종각 | 1993-02-21 | 11 | C | |
780 | 명동 | 1999-09-22 | 8 | A | |
456 | 대학로 | 2010-12-01 | 8 | B |
과정 2
- AND 연산 뒷 조건 처리
SELECT *
FROM BRNCH_INFO
WHERE BRNCH_PERF = 'A';
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRNCH_NUM | BRNCH_PERF |
789 | 시청 | 1990-03-12 | 13 | A | |
248 | 창동 | 2000-11-30 | 12 | A | |
780 | 명동 | 1999-09-22 | 8 | A |
- 마지막으로 AND 연산을 처리하면 중복되는 BRNCH_NO가 789와 780만 있으므로 최종 출력은 아래와 같음
최종 결과
BRNCH_NO | BRNCH_NM | OPEN_DT | CLOSE_DT | BRNCH_NUM | BRNCH_PERF |
789 | 시청 | 1990-03-12 | 13 | A | |
780 | 명동 | 1999-09-22 | 8 | A |
⇒ 결론적으로 괄호의 사용에 따라 연산의 우선순위가 달라지기 때문에 최종 결과도 달라짐
반응형
'SQL' 카테고리의 다른 글
[SQL] 키워드 필터링 (LIKE) (0) | 2022.02.11 |
---|---|
[SQL] 논리 연산자 (IN, NOT IN) (0) | 2022.02.11 |
[SQL] 논리연산자 사용하기 (AND) (0) | 2022.02.08 |
[SQL] NULL값의 처리 (COALESCE) (0) | 2022.02.08 |
[SQL] 비교/산술 연산자 (=, <>, !=, ^=, <, > ...) (0) | 2022.02.08 |