[ SQLD : II. SQL 기본 및 활용] 1-5. WHERE 절

문지은·2023년 6월 4일
0

SQLD

목록 보기
15/30
post-thumbnail

[SQLD 시험 대비] 2과목. SQL 기본 및 활용 : 1장. SQL 기본 - 5. WHERE 절

WHERE 절

WHERE 조건절 개요

  • 자신이 원하는 자료만을 검색하기 위해서 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한할 수 있다.
SELECT [DISTINCT/ALL] 칼럼명 [ALIAS명]
FROM 테이블명
WHERE 조건식;
  • WHERE 절은 FROM 절 다음에 위치하며, 조건식은 아래 내용으로 구성된다.
    • 칼럼(Column)명 (보통 조건식의 좌측에 위치)
    • 비교 연산자
    • 문자, 숫자, 표현식 (보통 조건식의 우측에 위치) - 비교 칼럼명 (JOIN 사용시)

연산자의 종류

  • WHERE 절에 사용되는 3가지 연산자
    • 비교 연산자 (부정 비교 연산자 포함)
    • SQL 연산자 (부정 SQL 연산자 포함)
    • 논리 연산자

연산자 우선순위

  • 괄호로 묶은 연산이 제일 먼저 연산 처리된다.
  • 연산자들 중에는 부정 연산자(NOT)가 먼저 처리되고,
  • 비교 연산자(=,>,>=,<,<=), SQL 비교 연산자(BETWEEN a AND b, IN (list), LIKE, IS NULL)가 처리되고,
  • 논리 연산자 중에서는 AND, OR의 순으로 처리된다.

비교 연산자

  • 비교 연산자 종류
  • 문자 유형간의 비교 조건이 발생하는 경우 처리 방법

예제

  • 소속팀이 삼성블루윙즈인 선수(소속팀코드 = 삼성블루윙즈팀 코드(K02)) 정보를 조회해보자.
    • CHAR 변수나 VARCHAR2와 같은 문자형 타입을 가진 칼럼을 특정 값과 비교하기 위해서는 인용 부호(작은따옴표, 큰따옴표)로 묶어서 비교 처리를 해야 한다.
    • NUMERIC 과 같은 숫자형 형태의 값은 인용부호를 사용하지 않는다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER
WHERE TEAM_ID = 'K02' ;
  • 포지션이 미드필더(MF)인 선수(포지션 = 미드필더 코드(MF)) 정보를 조회해보자.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION = 'MF';
  • "키가 170 센티미터 이상"인 선수 정보를 조회해보자.
    • 문자 유형 칼럼의 경우 WHERE TEAM_ID = K02 사례에서 ' ' 표시가 없는 경우 에러 가 발생하였지만, 숫자 유형 칼럼의 경우 숫자로 변환이 가능한 문자열(Alpha Numeric)과 비교되면 상대 타입을 숫자 타입으로 바꾸어 비교한다.
    • 예를 들면 [예제]의 WHERE HEIGHT >= 170 조건을 WHERE HEIGHT >= '170' 이 라고 표현하더라도, HEIGHT라는 칼럼이 숫자 유형의 변수이므로 내부적으로 ‘170’이라는 문자열을 숫자 유형 170으로 바꾸어 처리한다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE HEIGHT >= 170;

SQL 연산자

  • SQL 문장에서 사용하도록 기본적으로 예약되어 있는 연산자

IN 연산자

  • 사원 테이블에서 JOB이 MANAGER이면서 20번 부서에 속하거나, JOB이 CLERK이면서 30번 부서에 속하는 사원의 정보를 IN 연산자의 다중 리스트를 이용해 출력해보자.
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN (('MANAGER',20),('CLERK',30));
  • 아래와 같이 조회하면 JOB이 MANAGER이거나 CLERK이면서 20번 또는 30번 부서에 속하는 사원의 정보가 조회된다.
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE JOB IN ('MANAGER','CLERK') AND DEPTNO IN (20,30);

LIKE 연산자

  • 선수 테이블에서 포지션이 미드필더(MF)인 선수를 LIKE 연산자를 이용해서 조회해보자.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER
WHERE POSITION LIKE 'MF';
  • 위와 같은 경우에는 비교 연산자인 ‘=’을 사용해서 작성해도 같은 결과를 얻을 수 있다.
  • 한 개 혹은 0개의 문자를 확인하기 위해서는 와일드 카드를 사용한다.

와일드 카드

  • 한 개 혹은 0개 이상의 문자를 대신해서 사용하기 위한 특수 문자
    • % : 0개 이상의 어떤 문자를 의미
    • _ : 1개인 단일 문자를 의미

예제

  • “장”씨 성을 가진 선수들의 정보를 조회하는 WHERE 절을 작성해보자.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE PLAYER_NAME LIKE '장%';

BETWEEN a AND b 연산자

  • 키가 170 센티미터 이상 180센티미터 이하인 선수들의 정보를 조회해보자.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER
WHERE HEIGHT BETWEEN 170 AND 180;

IS NULL 연산자

  • NULL(ASCII 00)은 값이 존재하지 않는 것으로 확정되지 않은 값을 표현할 때 사용한다.
    • 어떤 값보다 크거나 작지도 않고 ‘ ’(공백, ASCII 32)이나 0(Zero, ASCII 48)과 달리 비교 자체가 불가능한 값인 것!
  • 연산 관련 NULL의 특성은 다음과 같다.
    • NULL 값과의 수치연산(+,-,*,/ 등)은 NULL 값을 리턴한다.
    • NULL 값과의 비교연산(=, >, >=, <, =)은 거짓(FALSE)을 리턴한다.
    • 어떤 값과 비교할 수도 없으며, 특정 값보다 크다, 적다라고 표현할 수 없다.
  • NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 정해진 문구를 사용해야 제대로 된 결과를 얻을 수 있다.

예제

  • POSITION 칼럼(Column) 값이 NULL 값인 선수를 조회해보자.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, TEAM_ID 
FROM PLAYER
WHERE POSITION IS NULL;

논리 연산자

  • 비교 연산자나 SQL 비교 연산자들로 이루어진 여러 개의 조건들을 논리적으로 연결시키기 위해서 사용되는 연산자
  • 논리 연산자들이 여러 개가 같이 사용되었을 때의 처리 우선순위는 ( ), NOT, AND, OR의 순서대로 처리된다.

예제

  • 다음 조건을 만족하는 선수 정보를 조회해보자.
소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들이어야 하고, 
포지션이 미드필더(MF:Midfielder)이어야 한다.
키는 170 센티미터 이상이고 180 이하여야 한다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER
WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07')
AND POSITION = 'MF'
AND HEIGHT >= 170
AND HEIGHT <= 180;
  • IN (list)와 BETWEEN a AND b 연산자를 활용하여 같은 결과를 출력할 수 있다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 FROM PLAYER
WHERE TEAM_ID IN ('K02','K07')
AND POSITION = 'MF'
AND HEIGHT BETWEEN 170 AND 180;

부정 연산자

  • 비교 연산자, SQL 비교 연산자에 대한 부정 표현을 부정 논리 연산자, 부정 SQL 연산자로 구분할 수 있다.

예제

  • 삼성블루윙즈 소속인 선수(TEAM_ID = 'K02')들 중에서 포지션이 미드필더(MF:Midfielder)가 아니고, 키가 175 센티미터 이상 185 센티미터 이하가 아닌 선수 정보를 조회해보자.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND NOT POSITION = 'MF'
AND NOT HEIGHT BETWEEN 175 AND 185;
  • 아래와 같이 작성할 수도 있다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키 
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND POSITION <>'MF'
AND HEIGHT NOT BETWEEN 175 AND 185;
  • 이번에는 국적 칼럼 이 NULL이 아닌 선수의 국적을 조회해보자.
SELECT PLAYER_NAME 선수이름, NATION 국적 
FROM PLAYER
WHERE NATION IS NOT NULL;

ROWNUM, TOP

ROWNUM

  • Oracle의 ROWNUM은 칼럼과 비슷한 성격의 Pseudo Column
  • SQL 처리 결과 집 합의 각 행에 대해 임시로 부여되는 일련번호
  • 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용
  • 한 건의 행만 가져오고 싶을 때는 = 연산자 사용 가능
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1;
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1;
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <2;
  • 건 이상의 N 행을 가져오고 싶을 때는 출력되는 행의 한계 지정
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N+1; 
  • ROWNUM은 테이블 내의 고유한 키나 인덱스 값을 만들 수도 있다.
UPDATE MY_TABLE SET COLUMN1 = ROWNUM;

TOP 절

  • SQL Server는 TOP 절을 사용하여 결과 집합으로 출력되는 행의 수를 제한할 수 있다.
TOP (Expression) [PERCENT] [WITH TIES]
  • Expression : 반환할 행의 수를 지정하는 숫자이다.
  • PERCENT : 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨을 나타낸다.
  • WITH TIES : ORDER BY 절이 지정된 경우에만 사용할 수 있으며, TOP N(PERCENT) 의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.
  • 한 건의 행만 가져오고 싶을 때는 아래처럼 작성한다.
SELECT TOP(1) PLAYER_NAME FROM PLAYER
  • 두 건 이상의 N 행을 가져오고 싶을 때는 출력되는 행의 개수를 지정할 수 있다.
SELECT TOP(N) PLAYER_NAME FROM PLAYER;
  • SQL 문장에서 ORDER BY 절이 사용되지 않으면 Oracle의 ROWNUM과 SQL Server 의 TOP 절은 같은 기능을 하지만, ORDER BY 절이 같이 사용되면 기능의 차이가 발생한다.
    • 이 부분은 이후에 다루어보겠다!
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글