지지 On Air

2-1-4. WHERE절 본문

개발/SQL [SQLD&SQLP]

2-1-4. WHERE절

슈스 지지 2022. 7. 23. 18:57
반응형


where절은 원하는 자료를 검색하기 위해 꼭 필요합니다.

사실상 select -- from -- where  가 한 세트로 기본 구조라고 봐도 무방할 것 같아요 ㅎㅎ 


 

과목 II. SQL 기본과 활용
  - 제1장 SQL 기본
    > 제4절 WHERE절

 

1. WHERE 조건절 개요

원하는 자료만 검색하기 위해 SQL무낭에 WHERE절을 사용하여 자료를 제한할 수 있다.

 

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

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

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

- 비교 연산자

- 문자 숫자 표현식(보통 조건식의 우측에 위치)

- 비교 칼럼명(JOIN 사용시)

 

2. 연산자의 종류

WHERE절에 조건식을 사용할때 사용되는 비교 연산자에 대해 살펴본다

WHERE절에 사용되는 연산자는 3가지 종류가 있다.

- 비교 연산자 (부정 비교 연산자 포함)

- SQL 연산자 (부정 SQL 연산자 포함)

- 논리 연산자

연산자의 종류

연산자의 우선순위는 다음과 같다.

1. 괄호()

2. 비교연산자, SQL 연산자

3. NOT 연산자

4. AND

5. OR

 

앞서 표에서 설명했듯, 비교연산자를 가지고 다양한 조건으로 SQL문을 작성해보자

다음과 같은 조건이 있다고 생각해보자.

소속팀이 수원FC이거나 FC서울에 소속된 선수들이며
포지션이 미드필더(MF)이어야 한다.
키는 170cm 이상이고 180cm이하여야 한다.

이러한 요구사항을 다음과 같이 비교연산자로 나타낼 수 있다.

1) 소속팀코드 = 수원FC
2) 소속팀코드 = FC서울
3) 포지션 = 미드필더 코드(MF)
4) 키 >= 170
5) 키 <= 180

 

SQL 문으로 작성하면 다음과 같다.

편의상 수원FC 코드는 K01, FC서울 코드는 K02라고 가정해보자

SELECT PLAYER_NAME AS 선수명, TEAM_ID AS 팀 코드, POSITION AS 포지션, HEIGHT AS 키
FROM PLAYER
WHERE TEAM_ID='K01' OR TEAM_ID='K02'
AND POSITION = 'MF'
AND HEIGHT >= '170' 
AND HEIGHT <= '180'

 

결과는 다음과 같이 나올 것이다.

선수명 팀 코드 포지션
장혁진 K01 MF 178
황순민 K01 MF 178
황인범 K02 MF 177
... ... ... ...

 

위의 조건들중 다음 조건을 다시 살펴보자.

소속팀이 수원FC(팀코드K01)이거나 FC서울(팀코드K02)인 선수들

이러한 요구사항은 위의 예제와 같이 비교연산자 OR을 이용해 표현할수도 있지만,  SQL연산자로 다음과 같이 표현할 수 있다.

소속팀코드 IN (K01, K02)

 

SQL문으로 표현하면 다음과 같다.

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, TEAM_ID AS 팀코드, BACK_NO AS 백넘버
FROM PLAYER
WHERE TEAM_ID IN ('K01', 'K02');

 

결과는 다음과 같이 나올것이다.

선수명 포지션 팀코드 백넘버
박주호 DF K01 6
이승우 FW K01 11
기성용 MF K01 6
... ... ... ...

 

첫번째 예제에서 사용되었던 비교 연산자 '=' 를 SQL 연산자 'LIKE'를 이용해 표현할 수 있다.

포지션이 FW인 선수를 검색한다면, 간단하게 POSITION='FW'로 검색할 수 있겠지만, POSITION LIKE 'FW'로 검색할 수도 있다.

LIKE 연산자에서는 와일드 카드를 사용할 수 있다. 와일드카드란 한 개 혹은 0개 이상의 문자를 대신해 사용하기 위한 특수문자를 의미한다.

와일드카드의 종류는 다음과 같다.

- % : 0개 이상의 어떤 문자

- _ : 1개인 단일 문자

 

와일드 카드를 쉽게 이해하기 위해 예제를 들면 다음과 같다

'박'씨 성을 가진 선수들

위와 같은 조건의 선수를 검색하려면 다음과 같이 표현한다.

선수명 LIKE '박%'

 

SQL문으로 표현하면 다음과 같다.

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

 

결과는 다음과 같이 나올 것이다.

선수명 포지션 백넘버
박주호 DF 6
박배종 GK 1
박민규 DF 3
... ... ...

 

이번에는 다음과 같은 조건이 있다고 생각해보자.

'박'씨 성을 갖고 끝글자가 '종'인 선수들

다음과 같이 표현한다.

선수명 LIKE '박_종';

 

첫번째 예제에서 키가 170cm 이상, 180cm 이하인 선수를 검색할때 >=, <= 연산자를 사용하였다.

다음과 같이 표현할 수도 있다.

키 BETWEEN 170 AND 180;

 

IS NULL 연산자

NULL은 값이 존재하지 않는 것으로, 어떤 값보다 크거나 작지도 않고 공백이나 0과 달리 비교 자체가 불가능하다.

따라서 연산 관련 NULL의 특징은 다음과 같다.

  • NULL 값과의 수치연산은 NULL 값을 리턴한다.
  • NULL 값과의 비교연산은 거짓(FALSE)을 리턴한다.
  • 어떤 값과 비교할 수도 없으며 특정값 보다 크다/작다고 표현할 수 없다.

따라서 NULL 값의 비교는 비교연산자인 =,>,>=,<,<= 를 통해 비교할 수 없으며, 비교하게되면 NULL을 리턴한다.

NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 정해진 문구만 사용해야 한다.

 

포지션이 정해지지 않아 NULL값인 선수들을 조회하는 SQL문은 다음과 같다.

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

앞서 설명한 것과 같이 'IS NULL' 을 사용하여 비교해야 한다.

결과는 다음과 같이 나올 것이다.

선수명 포지션 백넘버
김철수   999
박영희   888
...   ...

 

그러나 위에서 말했듯 IS NULL 이 아닌 = 연산자를 사용한다면,

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

다음과 같이 결과가 나올것이다.

선택된 레코드가 없습니다.

 

문법 오류가 나지는 않았지만, WHERE절의 조건이 FALSE가 되어 WHERE절의 조건을 만족하는 데이터가 한건도 없는 것이다.

 


SQL 전문가 가이드에서는 '비교 연산자', 'SQL 연산자', '논리연산자'를 소제목으로 나누어 설명하였지만,

어렵지 않은 부분이므로 따로 나누지 않고 이해할수 있게 예제로만 포스팅 하였습니다.

NULL 과 관련된 연산자의 경우 시험에 자주 출제 되므로 소제목으로 따로 나누었습니다.첫번째 예제에서 많은 부분이 설명되기 때문에 예제를 몇가지 생략하였는데, 혹시 다른 연산자에 대해 예제가 필요하시면 댓글로 알려주세요 :)

 

이번 포스팅에서는 제일 중요한 부분이 첨부한 그림(연산자의 종류)이 되겠네요 ㅎㅎ 구독과 댓글, 하트는 큰 힘이 됩니다 💕

 


본 포스팅은 '한국데이터산업진흥원' 에서 발행한 'SQL 전문가 가이드' 를 참고/인용 하였음을 밝힙니다.
반응형

'개발 > SQL [SQLD&SQLP]' 카테고리의 다른 글

2-1-6. ORDER BY 절  (12) 2022.07.28
2-1-5. GROUP BY, HAVING절  (8) 2022.07.27
2-1-3. 함수(2)  (2) 2022.07.22
2-1-3. 함수(1)  (4) 2022.07.21
2-1-2. SELECT문  (6) 2022.07.18
Comments