All of My Records

[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'를 사용한다.

&lsquo;=&rsquo; 으로 NULL 값 확인 시, 아무 결과도 존재하지 않는다.

 

NULL값을 확인할 수 있는 별도의 구문 &lsquo;IS&rsquo;를 사용해야 한다.

 

'='으로 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는 컬럼이 들어갈 수 있는 곳에는 항상 들어갈 수 있다.

 

*글 작성에 참고한 내용: 학원 쌤의 열정적인 수업

블로그의 정보

All of My Records

캐떠린

활동하기