지구정복

[SQLD] 16. WHERE절 본문

자격증 정복/SQLD

[SQLD] 16. WHERE절

eeaarrtthh 2020. 11. 9. 22:49
728x90
반응형

1. WHERE 조건절 개요

  1. 테이블에 있는 모든 자료가 아닌 원하는 자료만을 검색하기 위해 사용
  2. 두개 이상의 테이블에 대한 조인조건이나 결과를 제한하기 위한 조건 기술 가능
  3. WHERE 조건절 없이 모든 자료를 검색하게 되면 FULL TABLE SCAN이 발새하게 되어 CPU, MEMORY, 네트워크를 과다하게 사용한다.
  4. 구문
    1. 조건식: 컬럼명(조건식의 좌측), 비교 연산자, 문자,숫자,표현식(조건식의 우측)/비교 컬럼명(조인시)

2. 연산자의 종류

  1. 연산자의 종류

  2. 연산자의 우선순위
    1. 우선순위를 놓쳐 실수하지 않기 위해 괄호 사용을 권고한다.

3. 비교 연산자

  1. 예제
    1. TEAM ID라는 팀명의 데이터 타입은 CHAR(3) 인데 비교 연산자 오른쪽에 K02의 값을 작은따옴표(' ')나 큰따옴표(" ")와 같은 인용 부호로 묶어서 처리하지 않았기 때문에 발생하는 에러
    2. NUMERIC과 같은 숫자형 형태의 값은 인용부호를 사용하지 않는다.
  2. 문자 유형간의 비교 조건이 발생하는 경우
    1. 예제

      1. WHERE HEIGHT )= 170 조건을 WHERE HEIGHT ) = '170' 이라고 표현하더라도,HEIGHT라는 칼럼이 숫자 유형의 변수이므로 내부적으로 ' 170'이라는 문자열을 숫자 유형 170으로 바꾸어 처리

4. SQL 연산자

  1. SQL 문장에서 사용하도록 기본적으로 예약되어 있는 연산자로서 모든 데이터 타입에 대해서 연산이 가능한 4 가지 종류가 있다.

가. IN (list) 연산자

  1. 예제1
  2. 예제2

    1. 다중 리스트를 이용한 IN 연산자는 SQL 문장을 짧게 만들어 주면서도 성능측면에서도 장점을 가질 수 있는 매우 유용한 연산자이므로 적극적인 사용을 권고
    2. 아래와는 다른 결과를 가지는 것 유의

나. LIKE 연산자

  1. 와일드카드(한 개 혹은 0개 이상의 문자를 대신해서 사용하기 위한 특수문자)를 활용
  2. 예제

다. BETWEEN a AND b 연산자

  1. 예제

라. IS NULL 연산자

  1. NULL(ASCII 00)은 값이 존재하지 않는 것으로 확정되지 않은 값을 표현할 때 사용한다.
  2. 어떤 값보다 크거나 작지도 않고 ' '(공백, ASCII 32) 이나 O(Zero, ASCII 48)과 달리 비교 자체가 불가능한 값이다.
    1. NULL 값과의 수치 연산은 NULL 값을 리턴한다
    2. NULL 값과의 비교연산은 거짓(FALSE)을 리턴한다.
  3. NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 정해진 문구를 사용해야 제대로 된 결과를 얻을 수 있다.
  4. 예제
    1. 문법 에러는 나지 않지만 WHERE 절의 조건이 거짓(FALSE) 이 되어 WHERE 절의 조건을 만족하는 데이터 를 한건도 얻지 못하게 된 것으로 의 미 없는 SQL이 된다.

5. 논리 연산자

  1. 비교 연산자나 SQL 비교 연산자들로 이루어진 여러 개의 조건들을논리적으로 연결시키기 위해서 사용되는 연산자
  2. 논리 연산자의 종류
  3. 예제
    소속팀이 삼성블루원즈이거나 전남드래곤즈에 소속된 선수들이어야 하고
    포지션이 미드필더 (MF:Midfielder) 이어야 한다.
    키는 170 센티미터 이상이고 180 이하여야 한다.
    1. 포지션이 미드필더가 아닌 선수들이 출력된 것은 논리 연산자의 우선 순위 때문이다.(OR 논리 연산자보다 AND 논리 연산자를 먼저 실행)
    2. 괄호를 사용해 우선 순위를 올바르게 수정한다.
    3. SQL 비교 연산자인 ' IN'과 논리 연산자인 ' OR'은 결과도 같고 내부적으로 처리하는 방법도 같다

6. 부정 연산자

  1. 부정 연산자 종류
  2. 예제
    삼성블루왕즈 소속인 선수들 중에서 포지션이 미드필더 (MF: Midfielder) 가 아니고, 키가 175 센티미터
    이상 185 센티미터 이하가 아닌 선수들의 자료를 찾아본다.
    1. 쿼리1
    2. 쿼리2

7. ROWNUM, TOP 사용

가. ROWNUM(오라클)

  1. 컬럼과 비슷한 성격의 Pseudo Column으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호
  2. 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용
    1. SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1
    2. SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;

나. TOP 절(SQL Server)

  1. 결과 집합으로 출력되는 행의 수를 제한
    1. SELECT TOP(l) PLAYER_NAME FROM PLAYER;
    2. SELECT TOP(N) PLAYER NAME FROM PLAYER;
  2. 표현식
    1. Expression 반환할 행의 수를 지정하는 숫자이다.
    2. PERCENT 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨 을 나타낸다.
    3. WITH TIES : ORDER BY 절이 지정된 경우에만 사용할 수 있으며. TOP N(PERCENT) 의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.
  3. SQL 문장에서 ORDER BY 절이 사용되지 않으면 Oracle의 ROWNUM과 SQL Server의 TOP 절은 같은 기능을 하지만. ORDER BY 절이 같이 사용되면 기능의 차이가 발생한다.

 

 

 

 

정리

--IN : 리스트에 있는 값 중에서 어느 하라나라도 일치하면 된다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID IN ('K02', 'K07');

SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN ( ('MANAGER', 20), ('CLERK', 30) );

SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE JOB IN ('MANAGER', 'CLECK') AND DEPTNO IN (20, 30);

--LIKE : 와일드카드(%)를 사용해서 0 개 이상의 어떤 문자를 의미
-- _ : 1개인 단일 문자를 의미
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE PLAYER_NAME LIKE '장__';

SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE PLAYER_NAME LIKE '장%';

--BETWEEN A AND B : A와 B의 값을 포함하는 범위를 의미
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE HEIGHT BETWEEN 170 AND 180
ORDER BY HEIGHT ASC;

--IS NULL 또는 IS NOT NULL : 널이거나 널이지 않은 값을 찾아냄
SELECT PLAYER_NAME, POSITION
FROM PLAYER
WHERE POSITION IS NULL;

SELECT PLAYER_NAME, POSITION
FROM PLAYER
WHERE POSITION IS NOT NULL;

----논리연산자
--AND과 OR : 연산 순서는 AND 다음 OR이므로 아래 TEAM_ID에 괄호를 안치면 다른 포지션 선수들까지 출력된다.
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07')
    AND POSITION = 'MF'
    AND HEIGHT BETWEEN 170 AND 180
ORDER BY HEIGHT ASC;

----부정연산자
--NOT 컬럼명 = : ~와 같지않다.
--NOT 컬럼명 > : ~보다 크지 않다.
--!= / <> / ^= : 같지 않다.
--NOT BETWEEN A AND B : A와 B 값 사이에 있지 않다.
--NOT IN (list) : list 값과 일치하지 않는다.
SELECT PLAYER_NAME, TEAM_ID, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'K02'
    AND NOT POSITION = 'MF'
    AND NOT HEIGHT BETWEEN 175 AND 185;
    
----ROWNUM사용
--ROWNUM : 테이블에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE절에서 행의 
--개수를 제한하는 목적으로 사용
SELECT PLAYER_NAME
FROM PLAYER
WHERE ROWNUM = 1;

SELECT PLAYER_NAME
FROM PLAYER
WHERE ROWNUM <= 5;

 

 

[출처]

wiki.gurubee.net/pages/viewpage.action?pageId=27427434

728x90
반응형
Comments