본문 바로가기
DB/SQL 활용

SQL 활용 - WHERE 절 활용법(비교연산자, SQL 연산자, 논리연산자, 부정연산자)

by 참외롭다 2024. 2. 1.
반응형

SQL 활용 - WHERE 절 활용법(비교연산자, SQL 연산자, 논리연산자, 부정연산자)

 

 

사용자가 원하는 조건의 자료만을 검색하기 위해 WHER 절을 사용해 데이터의 출력을 제한합니다. WHERE 절에는 두 개 이상의 테이블에 대한 조인 조건을 기술하거나 결과를 제한하기 위한 조건을 기술할 수 있습니다. WHERE 조건절이 없는 FULL TABLE SCAN 문장은 SQL 튜닝의 1차적인 검토 대상입니다. 데이터에 특정 조건을 부여할 목적으로 사용되는

WHERE 절은 fROM 절 뒤에 위치합니다.

 

SELECT [DISTINCT/ALL]
  칼럼명 [ALIAS 명]
FROM 테이블명
WHERE 조건식;

 

 

WHERE 절은 FROM 절 다음에 위치하며, 조건식은 아래 내용으로 구성됩니다.

 

- 칼럼명(보통 조건식의 좌측에 위치)

- 비교 연산자

- 문자, 숫자, 표현식

- 비교 칼럼명

 

연산자의 종류

 

-- 비교 연산자
  -- = : 같다.
  -- > : 보다 크다.
  -- >= : 보다 크거나 같다.
  -- < : 보다 작다.
  -- <= : 보다 작거나 같다

-- SQL 연산자
  -- BETWEEN a AND b : a 와 b 값 사이의 값 (a,b 포함)
  -- IN (list) : 리스트에 있는 값 중 어느 하나라도 일치한다.
  -- LIKE '비교문자열' : 비교문자열과 형태가 일치(%,_사용)
  -- IS NULL : NULL 값을 갖는다.

-- 논리연산자

  -- AND : 앞에 있는 조건과 뒤에 오는 조건이 참이 되면 결과도 참이 된다.
  -- OR :  앞의 조건이 참이 되거나 뒤의 조건이 참이 되면 결과도 차미다.
  -- NOT : 뒤에 오는 조건에 반대되는 결과를 돌려준다.

-- 부정비교연산자

  -- != : 같지않다.
  -- ^= : 같지않다.
  -- <> : 같지않다.
  -- NOT 칼럼명 = : ~ 와 같지 않다.
  -- NOT 칼럼명 > : ~ 보다 크지 않다.

-- 부정 SQL 연산자

  -- NOT BETWEEN a AND b : a와 b 값 사이에 있지 않다.(a,b 값을 포함하지 않는다.)
  -- NOT IN (list) : list 값과 일치하지 않다.
  -- IS NOT NULL : NULL 값을 갖지 않는다.

-- 연산자 우선순위
-- 1 : 괄호()
-- 2 : 비교 연산자, SQL 연산자
-- 3 : NOT 연산자
-- 4 : AND
-- 5 : OR

 

연산자의 우선수위는 다음과 같습니다.

 

- 괄호로 묶은 연산을 제일 먼저 연산합니다.
- 연산자 중 비교연산자, SQL 연산자가 먼저 처리됩니다.
- 부정 연산자가 처리됩니다.
- 논리 연산자 중에 AND,OR 순서로 처리합니다.

 

실수하기 쉬운 비교 연산자와 논리 연산자의 경우 괄호를 사용해 우선순위를 표시하는 것이 권장됩니다.

비교 연산자

비교 연산자는 칼럼의 특정한 값과 조건을 비교하는데 사용됩니다.

 

-- 첫 번째 요구 사항인 소속팀이 삼성블루윙즈라는 조건을 WHERE 절로 옮겨서 SQL 문장을 완성한다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID = "K02";

 

문자 유형간 비교

 

비교 연산자의 양쪽이 모두 CHAR 타입인 경우

 

- 길이가 서로 다르면 짧은 쪽에 스페이스를 추가해 길이를 같게 한 후 비교합니다

- 서로 다른 문자가 나올 때 까지 비교합니다

- 달라진 첫 번째 문자의 값에 따라 크기를 결정합니다.

- 문자 끝에 있는 공백의 수만 다르다면 서로 같은 값으로 판단합니다.

 

비교 연산자의 어느 한 쪽이 VARCHAR 타입인 경우

 

- 서로 다른 문자가 나올때 까지 비교합니다.

- 길이가 다르면 짧은 것이 끝날 때 까지만 비교한후 기리가 긴 것이 크다고 판단합니다

- 길이가 같고 다른 것이 없다면 같다고 판단합니다.

- 문자 끝 블랭크도 문자로 취급하기때문에 문자가 같더라도 블랭크 수가 다르면 다른 값으로 취급합니다.

 

상수값과 비교할 경우

 

- 상수 쪽을 문자열의 타입과 동일하게 바꾸고 비교합니다.

- 변수 쪽이 CHAR 타입이면 위의 CHAR 유형 타임의 경우를 적용합니다.

- 변수 쪽이 VARCHAR 타입이면 위의 VARCHAR 유형 타입의 경우를 적용합니다

 

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID >= 170;

 

SQL 연산자

 

SQL을 작성할때 사용하도록 기본적으로 예약돼있는 연산자로 모든 데이터 타입에 대해 가능한 4가지 종류의 연산자가 있습니다.

 

IN (list) 연산자

 

컬럼의 데이터가 LIST에 선언된 요소와 일치하는지 체크합니다. 다중리스트를 사용해 튜플형식으로 비교도 가능합니다. 다중리스트를 이용한 in 연산자는 쿼리문을 짧게 만들어주면서도 성능 면에서 장점이 있습니다.

 

-- 소속팀 코드에 관련된 IN () 형태의 SQL 연산자를 사용해 WHERE 절에 사용한다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID IN ('K02', 'K07');

-- 사원 테이블에서 JOB이 MANAGER 이면서 20번 부서에 속하거나, JOB이 CLERK 이면서 30번 부서에 속하는 사원의 정보를 IN 연산자의 다중 리스트를 이용해 출력하라.
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN (('MANAGER', 20), ('CLERK', 30))

 

LIKE 연산자

 

문자열 비교를 위한 연산자로 와일드카드(%,_)를 사용해 유사한 문자열을 비교할 수 있습니다.

 

-- 요구 사항의 두 번째 조건에 대해서 LIKE 연산자를 WHERE 절에 적용해서 실행한다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE POSITION LIKE 'MF';

 

 

-- % : 0개 이상의 어떤 문자를 의미한다.
-- _ : 1개인 단일 문자를 의미한다.

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE POSITION LIKE '장%';

-- 세글자 이름을 가진 선수 중 '장'씨 성을 갖고 끝 글자가 '호'인 선수들의 정보를 조회하는 WHERE 절을 작성한다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE POSITION LIKE '장_호';

 

BETWEEN A AND B 연산자

 

A 와 B 사이에 컬럼의 값이 포함되는지 체크합니다.

 

-- 세 번째로 키가 170 센티미터 이상 180 센티미터 이하인 선수들의 정보를 BETWEEN a AND b 연산자를 사용해 WHERE 절을 완성한다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE HEIGHT BETWEEN 170 AND 180;

 

IS NULL 연산자

 

데이터베이스에서 NULL 은 값이 아닌 확정되지 않은 상태를 말합니다. 값이 아니므로 비교할 수 없기 때문에 IS NULL 연산자로 NULL 인지 아닌지 체크합니다.

 

- NULL 값과의 수치연산의 결과는 항상 NULL 입니다.
- NULL 값과의 비교연산의 결과는 항상 False 입니다.

- NULL은 어떤 값과도 비교할 수 없으며, 특정 값과의 대/소 비교를 할 수 없습니다.

 

-- 선택된 레코드는 반드시 없습니다.
-- 문법적 에러는 나지 않았지만 WHERE 절의 조건이 False로 판명되어 WHERE절의 조건을 만족하는 데이터는 항상 없습니다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE POSITION = NULL;

-- POSITION 칼럼 값이 NULL인지를 판단하기 위해서는 IS NULL을 사용해 비교합니다.

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE POSITION IS NULL;

 

논리 연산자

 

논리 연산자는 비교 연산자나 SQL 연산자로 구성된 여러 조건을 논리적으로 연결하기 위해 사용합니다. 연산자의 우선순위는 (), NOT, AND, OR 순입니다.

 

- AND

- OR

- NOT

 

-- 소속이 K02 이거나 K03 이고
-- 포지션이 미드필더이고
-- 키는 170 cm 이상 180 이하여야한다.

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
OR  TEAM_ID = 'K07'
AND POSITION = 'MF';
AND HEIGHT >= 170
AND HEIGHT <= 180

 

실행 결과를 보면 포지션이 'MF' 가 아닌 선수들의 명단이 출력됐다. 그 이유는 AND 연산자가 OR 연산자보다 우선순위가 높아 먼저 실행됐기 때문이다. 논리 연산자들이 여러 개 같이 사용됐을때 처리 우선 순위는 (), NOT, AND, OR 순이다.

 

-- 괄호를 사용해 다시 적용한다.
SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE
(
  TEAM_ID = 'K02'
  OR
  TEAM_ID = 'K07'
)
AND POSITION = 'MF';
AND HEIGHT >= 170
AND HEIGHT <= 180

-- IN 와 BETWEEN a AND b 연산자를 활용해 같은 결과를 출력하는 SQL 문장을 작성한다. 두 개의 SQL 문장은 DBMS 내부적으로 같은 프로세스를 거쳐 수행된다.

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID IN ('K02', 'K07')
AND POSITION = 'MF';
AND HEIGHT BETWEEN 170 AND 180;

 

부정 연산자

 

- !=
- ^=
- <>
- NOT 칼럼명 =
- NOT 컬럼명 >
- NOT BETWEEN a AND b
- NOT IN (list)
- IS NOT NULL

-- K02 소속인 선수 중에 포지션이 미드필더가 아니고, 키가 175 cm 이상 185 cm 이하가 아닌 선수를 검색

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND POSITION != 'MF'
AND HEIGHT NOT BETWEEN 175 AND 185;

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND POSITION <> 'MF'
AND HEIGHT NOT BETWEEN 175 AND 185;

-- 국적이 NULL 이 아닌 선수를 검색
SELECT PLAYER_NAME AS 선수명, NATION AS 국적
FROM PLAYER
WHERE NATION IS NOT NULL;
반응형