[Oracle] WHERE절, BETWEEN절, IN절, LIKE절, NULL, ORDER BY절
by 캐떠린WHERE
- 레코드(행)를 검색한다.
- 원하는 행만 추출하는 역할
- 조건절에 반드시 컬럼이 포함되지 않아도 된다.
SELECT *
FROM tblInsa
WHERE 1 = 1;
-- 전원 통과 > 여기서 WHERE절은 있으나 마나!
- where절은 java의 foreach문 돌듯이 한 줄씩 검사한다!
--SQL 형식
[WITH <Sub Query>]
SELECT column_list -- 3. 컬럼 지정(보고 싶은 컬럼만 가져오기) > Projection
FROM table_name -- 1. 테이블 지정
[WHERE search_condition] -- 2. 조건 지정(보고 싶은 행만 가져오기) > Selection
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expresstion [ASC|DESC]];
WHERE절 사용 예시
SELECT * FROM tblCountry WHERE name = '대한민국';
SELECT * FROM tblCountry WHERE population >= 4405;
SELECT * FROM tblCountry WHERE continent = 'AS' or continent = 'EU';
-- (주의) 키워드, 식별자는 대소문자 구분 안하지만 데이터는 구분 한다!!
-- 1. 몸무게가 60kg 이상이고, 키가 170cm 미만
SELECT * FROM tblComedian WHERE weight >= 60 AND height < 170;
-- 2. 몸무게가 70kg 이하인 여자만 가져오시오.
SELECT * FROM tblComedian WHERE weight <= 70 AND gender = 'f';
-- 3. 부서가 '개발부'이고, 급여(basicpay)가 150만원 이상 받는 직원을 가져오시오.
SELECT * FROM tblInsa WHERE buseo = '개발부' AND basicpay >= 1500000;
-- 4. 급여(basicpay) + 수당(sudang)을 합한 금액이 200만원 이상 받는 직원을 가져오시오.
SELECT * FROM tblInsa WHERE (basicpay + sudang) >= 2000000;
BETWEEN
- where절에서 사용 → 조건으로 사용
- 컬럼명 BETWEEN 최솟값 AND 최댓값
- 범위 조건
- 가독성 때문에 사용
- 최솟값, 최댓값을 포함한다.(inclusive)
- 문자형에서 사용할 경우 문자코드 값을 비교한다.
- 날짜시간형에서 사용할 경우 바로 비교가 가능하다.
SELECT * FROM TBLINSA WHERE BASICPAY >= 1000000 AND BASICPAY <= 1200000; --(부등호 왼쪽: 검사 대상, 부등호 오른쪽: 대조할 값)
SELECT * FROM TBLINSA WHERE BASICPAY BETWEEN 1000000 AND 1200000;
SELECT * FROM TBLINSA WHERE BASICPAY BETWEEN 1020000 AND 1100000;
-- 비교 연산
-- 1. 숫자형
SELECT * FROM TBLINSA WHERE BASICPAY >= 1000000 AND BASICPAY <= 1200000;
SELECT * FROM TBLINSA WHERE BASICPAY BETWEEN 1000000 AND 1200000;
-- 2. 문자형(문자코드)
SELECT * FROM TBLINSA WHERE NAME > '이순신'; --문자 코드값 비교. java의 name.compareTo("이순신")
SELECT * FROM EMPLOYEES WHERE FIRST_NAME >= 'K' AND FIRST_NAME <= 'L';
SELECT * FROM EMPLOYEES WHERE FIRST_NAME BETWEEN 'J' AND 'L';
-- 3. 날짜시간형 > 비교연산자로 바로 비교가 가능하다.
SELECT * FROM TBLINSA WHERE IBSADATE >= '2000-01-01'; --2000년 이후에 입사한 직원
--2000-01-01 ~ 2000-12-31
SELECT * FROM TBLINSA WHERE IBSADATE >= '2000-01-01' AND IBSADATE <= '2000-12-31';
SELECT * FROM TBLINSA WHERE IBSADATE BETWEEN '2000-01-01' AND '2000-12-31';
IN
- where절에서 사용 → 조건으로 사용
- 열거형 조건
- 컬럼명 IN (값, 값, 값)
- CASE-END문에서 사용 시, 표준은 WHEN NOT 컬럼명 IN (값) ~ 이나, 가독성 때문에 WHEN 컬럼명 NOT IN (값) ~ 으로 많이 사용한다.
- 가독성 향상
-- 아래 두 문장은 동일한 결과를 가진다.
SELECT * FROM TBLINSA
WHERE BUSEO = '개발부' OR BUSEO = '총무부' OR BUSEO = '홍보부';
SELECT * FROM TBLINSA
WHERE BUSEO IN ('개발부', '총무부', '홍보부');
BETWEEN 또는 IN 사용을 지양하는 회사가 종종 있다고 한다.
⇒ 성능 문제 때문인데, 상대적으로 비교 연산자보다 느리다. 10만건 이상의 데이터가 있을 시 확실히 딜레이가 있으나 그 이하는 사용해도 무관하다.
LIKE
- WHERE절에서 사용 → 조건으로 사용
- 패턴 비교
- 컬럼명 like '패턴 문자열'
- 정규 표현식의 초간단 버전
LIKE절의 패턴 문자열 구성 요소
- _ : 임의의 문자 1개
- % : 임의의 문자 N개(0~무한대)
LIKE절 사용 예시
SELECT * FROM TBLINSA WHERE NAME LIKE '김__';
SELECT * FROM TBLINSA WHERE NAME LIKE '_길_';
SELECT * FROM TBLINSA WHERE NAME LIKE '__수';
SELECT * FROM TBLINSA WHERE NAME LIKE '김%';
SELECT * FROM TBLINSA WHERE NAME LIKE '%길%'; -- 이름에 '길'이 포함된 케이스를 전부 다 찾으세요.
SELECT * FROM TBLINSA WHERE NAME LIKE '%수';
-- 771212-1022432
SELECT * FROM TBLINSA WHERE SSN LIKE '______-2______';
SELECT * FROM TBLINSA WHERE SSN LIKE '%-2%';
(RDBMS에서의) NULL
- 컬럼값(셀)이 비어있는 상태
- null 상수 제공
- 대부분의 언어는 null은 연산의 대상이 될 수 없다.(★★★★★)
- WHERE절에서 사용
- 컬럼명 IS NULL
- 컬럼명 IS NOT NULL
- NULL을 확인하기 위한 별도의 구문으로 'IS'를 사용한다.
'='으로 NULL값을 확인하면 왜 어떤 결과도 존재하지 않을까?
피연산자에 NULL이 들어가면 전체 연산의 결과는 NULL이다. 조건이 쓰일 때 NULL이 들어가면 false의 개념으로 받아들이기 때문이다.
마치 1 = 2;라고 작성한 것과 동일하다. 따라서 해당 질문에 YES라고 대답할 수 있는 결과는 존재하지 않으므로, 어떤 결과도 존재하지 않게 된다.
따라서 =, <> 모두 사용 불가하다. ⇒ 그러므로 IS NULL, IS NOT NULL을 사용하자!
NULL 사용 예시
-- 인구수가 기재된 나라? (아래 두 쿼리문 모두 사용 가능 하나, 두번째 쿼리문이 직관적이기 때문에 사용 빈도수가 더 높다.)
SELECT * FROM TBLCOUNTRY WHERE NOT POPULATION IS NULL;
SELECT * FROM TBLCOUNTRY WHERE POPULATION IS NOT NULL; -- 사용 빈도수 더 높음!(***) > 직관적인 표현
-- 연락처가 없는 직원?
SELECT * FROM TBLINSA WHERE TEL IS NULL ;
-- 연락처가 있는 직원?
SELECT * FROM TBLINSA WHERE TEL IS NOT NULL ;
-- 아직 실행하지 않은 할 일?
SELECT * FROM TBLTODO WHERE COMPLETEDATE IS null;
-- 실행 완료한 일?
SELECT * FROM TBLTODO WHERE COMPLETEDATE IS NOT NULL;
-- 도서관 > 대여 테이블(컬럼: 대여날짜, 반납날짜)
-- 아직 반납을 안 한 사람은?
SELECT * FROM 도서대여 WHERE 반납날짜 IS NULL;
-- 반납이 완료된 사람은?
SELECT * FROM 도서대여 WHERE 반납날짜 IS NOT NULL;
ORDER BY
- 형식
ORDER BY 컬럼명 ASC;
ORDER BY 컬럼명 DESC;
-- ASC(ascending): 오름차순 > 생략 시 기본적으로 오름차순 정렬된다.
-- DESC(descending): 내림차순
- 원본 테이블을 정렬하는 것이 아니라, 결과 테이블을 정렬한다.
(오라클에 저장된 데이터는 오라클 스스로 관리한다. 따라서 우리는 오라클에 저장된 원본 테이블이 아닌 툴에서 SELECT문을 사용하여 조회하는 결과 테이블을 정렬한다.) - 1차 정렬 및 N차 정렬도 가능하다.
- 비교할 수 있는 숫자, 문자(문자코드), 날짜 정렬이 가능하다.
- CASE-END는 독립적으로 ORDER BY절에서 사용 가능하다.(아래 예시 참고)
- ORDER BY절 실행 순서
SELECT 컬럼 리스트 -- 3. 컬럼 지정(보고 싶은 컬럼만 가져오기) > Projection
FROM 테이블 -- 1. 테이블 지정
WHERE 조건 -- 2. 조건 지정(보고 싶은 행만 가져오기) > Selection
ORDER BY 정렬기준; -- 4. 원하는 순서대로 정렬
ORDER BY절 사용 예시
-- 1차 정렬
SELECT * FROM tblInsa ORDER BY name DESC;
-- N차 정렬
SELECT * FROM tblInsa ORDER BY buseo ASC; -- 1차 정렬
SELECT * FROM tblInsa ORDER BY buseo ASC, JIKWI DESC; -- 2차 정렬
SELECT * FROM tblInsa ORDER BY buseo ASC, jikwi DESC, basicpay DESC; -- 3차 정렬
-- 숫자 정렬
SELECT * FROM tblInsa ORDER BY basicpay DESC;
-- 문자 정렬
SELECT * FROM tblInsa ORDER BY name ASC;
-- 날짜 정렬
SELECT * FROM tblInsa ORDER BY ibsadate DESC;
-- (참고) 컬럼리스트의 컬럼 순서로도 표현이 가능하다.(SQL의 INDEX는 1부터 시작)
-- 단, 잘 안쓰는 문법이라 알아만 두고 사용하지는 말 것! 유지보수에 취약하므로 비권장!!!!!
SELECT name, buseo, jikwi FROM tblInsa ORDER BY 3;
-- 가공된 값의 정렬
-- 급여(basicpay + sudang)를 가장 많이 받는 직원순으로 가져오시오.
SELECT * FROM tblInsa ORDER BY (basicpay + sudang) DESC;
-- 직위순으로 정렬: 부장 > 과장 > 대리 > 사원 순으로
SELECT
name, jikwi,
CASE
WHEN jikwi = '부장' THEN 4
WHEN jikwi = '과장' THEN 3
WHEN jikwi = '대리' THEN 2
WHEN jikwi = '사원' THEN 1
END AS jikwiseq
FROM tblInsa
ORDER BY jikwiseq DESC; -- SELECT 과정을 거치고 ORDER BY로 넘어오기 때문에 SELECT에서 만든 ALIAS 사용이 가능하다!
-- CASE-END는 독립적으로 ORDER BY절에서 사용 가능하다.
SELECT
name, jikwi
FROM tblInsa
ORDER BY CASE
WHEN jikwi = '부장' THEN 4
WHEN jikwi = '과장' THEN 3
WHEN jikwi = '대리' THEN 2
WHEN jikwi = '사원' THEN 1
END DESC;
-- 직원: 남자 > 여자 순으로
SELECT
name, ssn
FROM tblInsa
ORDER BY CASE
WHEN ssn LIKE '%-1%' THEN 1
WHEN ssn LIKE '%-2%' THEN 2
END ASC;
-- 남자 직원만 가져오기
SELECT * FROM tblInsa WHERE ssn LIKE '%-1%'; -- (방법 1) > 가장 쉬운 방법
SELECT *
FROM tblInsa
WHERE CASE
WHEN ssn LIKE '%-1%' THEN 1
WHEN ssn LIKE '%-2%' THEN 2
END = 1; -- (방법 2) > 이 방법은 CASE-END를 사용하기 위해 억지부린 것. 결론: CASE-END는 컬럼이 들어갈 수 있는 곳에는 항상 들어갈 수 있다.
*글 작성에 참고한 내용: 학원 쌤의 열정적인 수업
'Oracle' 카테고리의 다른 글
[Oracle] 함수 :: 집계 함수(Aggregation Function) (2) | 2024.03.16 |
---|---|
[Oracle] 컬럼 리스트에서 할 수 있는 행동 :: SELECT절 (2) | 2024.03.15 |
[Oracle] 연산자 (0) | 2024.03.15 |
[Oracle] 잠깐! Commit에 대해 알아보자 :: SQL Developer와 DBeaver의 commit 설정 특징 (1) | 2024.03.15 |
[Oracle] SELECT문 (0) | 2024.02.27 |
블로그의 정보
All of My Records
캐떠린