Do It SQL입문 03-2 WHERE문으로 조건에 맞는 데이터 검색하기

stan·2023년 6월 18일
0

T - SQL (SQL Server)

목록 보기
6/12
  • 시스템의 부하를 줄이려면 필요한 데이터만 검색 해야 함
  • 필요한 열만 검색시 행전체가 다 검색되므로 그러하다고 볼 수 없다
  • 실무에선 엄청난 양의 데이터가 저장되므로 매번 전체 행을 가져오면 안 될 것 !!

원하는 조건에 맞는 행을 검색하는 방법을 알아보자

WHERE문의 기본 형식

SELECT [열] FROM [테이블] WHERE [열] = [조건값]

                         		  1)  2)   3)
                                  

1) [열] : 조건을 적용할 열을 입력한다
2) = : 조건을 적용할 연산자 종류를 입력한다
3) [조건값] : 사용자 조건값을 입력한다.

WHERE 문으로 특정 값 검색하기

symbol열의 값이 'MSFT'인 데이터 검색하기

SELECT * FROM nasdaq_company WHERE symbol = 'MSFT'

  • 이렇게 데이터를 필터링 하면 원하는 데이터만 빠르게 검색할 수 있고 세스템의 부하를 줄일 수도 있다

WHERE문에는 다양한 연산자를 사용할 수 있다.

여기서는 조건에 해당하는 값과 같은 데이터를 검색하려고 비교 연산자 =를 사용했다.

SQL Server는 이 외에도 다음과 같은 연산자를 제공 :

연산자설명
<필터링 조건보다 작은 값을 검색
<=필터링 조건보다 같거나 작은 값을 검색
=필터링 조건과 같은 값을 검색
>필터링 조건보다 큰 값을 검색
>=필터링 조건보다 같거나 큰 값을 검색
<>, !=필터링 조건과 같지 않은 값을 검색
!<필터링 조건보다 작지 않은 값을 검색
!>필터링 조건보다 크지 않은 값을 검색

<=등의 크기 비교 연산자는 숫자에만 사용하기를 권장

  • 문자열에서도 사용은 가능
  • 하지만 이러한 연산자는 데이터베이스 시스템이 정의한 정렬 기준에 따라 결괏값이 달라짐 : 데이터 속성에 따라 적절히 사용해야 한다

검색할 때 정렬이 중요한 데이터는 ORDER BY문을 사용하는 것이 좋다

WHERE 문에서 비교 연산자 사용하기

숫자형, 문자열형, 날짜형 등 여러 자료형과 비교연산자를 사용 했을 떄 어떤 결과가 나오는지 살펴보자

숫자형 ipo_year가 2021년인 행을 검색

SELECT * FROM nasdaq_company
WHERE ipo_year = 2021

=================================

숫자형 ipo_year가 2021년 '미만'인 행을 검색

SELECT * FROM nasdaq_company
WHERE ipo_year < 2021

=================================

문자열형 symbol이 MSFT인 행을 검색

SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT'

=================================

문자열형 symbol이 MSFT'미만'인 행을 검색

SELECT * FROM nasdaq_company
WHERE symbol < 'MSFT'

=================================

날짜형 last_crawel_date가 2021년 10월 14일인 행을 검색

SELECT * FROM nasdaq_company
WHERE last_crawel_date = '2021-10-14'

=================================

날짜형 last_crawel_date가 2021년 10월 14일 '미만'인 행을 검색

SELECT * FROM nasdaq_company
WHERE last_crawel_date < '2021-10-14'

=================================

WHERE문에서 논리 연산자 사용하기

  • 논리 연산자는 조건의 참, 거짓을 판단
  • 더 복잡한 조건문이 필요한 경우 비교 연산자화 조합해 많이 사용 !
연산자설명
ALL모든 비교 집합이 TRUE(참)이면 TRUE
AND두 부울 표현식이 모두 TRUE이면 TRUE
ANY비교 집합 중 하나라도 TRUE이면 TRUE
BETWEEN피연산자가 범위 내에 있으면 TRUE
EXISTS하위 쿼리에 행이 포함되면 TRUE
IN피연산자가 리스트 중 하나라도 포함되면 TRUE
LIKE피연산자가 패턴과 일치하면 TRUE
NOT부울 연산자를 반대로 실행
OR하나의 부울식이 TRUE이면 TRUE
SOME비교집합중 일부가 TRUE이면 TRUE

BETWEEN을 이요한 데이터 검색

BETWEEN은 WHERE문과 함께 사용하며 검색하는 값의 범위를 지정 할 수 있음

  • 보통은 날짜형 데이터에 사용
  • 하지만 문자열형이나 숫자형 데이터에도 사용 가능

ipo_year열의 2010~2022 범위에 해당 하는 값을 검색

SELECT * FROM nasdaq_company
WHERE ipo_year BETWEEN 2010 AND 2011

2010을 포함한 큰 ipo_year와 2011을 포함한 작은 ipo_year가 반환됨

  • BETWEEN은 조건값을 포함해 데이터를 검색함

=============================

last_crawel_date 열에서 2013년 3월 17일 부터 2013년 3월 19일 까지의 데이터를 검색

SELECT * FROM nasdaq_company
WHERE last_crawel_date BETWEEN '2021-03-17' AND '2021-03-19'

!날짜형 데이터를 검색할 때는 밀리초를 고려해야 함

  • 예 : 2021-03-17을 조건값으로 사용하면 실제로는 2021-03-17 00:00:00.000 이 조건문에 사용됨

    정확한 날짜형 값을 조건값에 사용하려면 다음과 같이 쿼리를 작성 :

    SELECT * FROM nasdaq_company
    WHERE last_crawel_date = '2021-03-17 00:00:00.000'

    *보통은 날짜형 데이터값이 어느 시간 단위까지 정되는지 살펴보면서 '시','분','초'를 적정히 생략하고 사용!

    문자열 범위를 지정해 검색 : symbol열에서 A와B를 포함한 값을 검색

    SELECT * FROM nasdaq_company
    WHERE symbol BETWEEN 'A' AND 'B'

=========================================

BETWEEN을 사용하되 범위를 포함하지 않은 데이터를 검색 ! :

간단히 NOT을 조합한다

Symbol열의 A~B 범위값을 제외하고 검색

SELECT * FROM nasdaq_company
WHERE symbol NOT BETWEEN 'A' AND 'B'

==========================================

AND 와 OR를 이용한 데이터 검색

  • WHERE문에서 논리연산자인 AND와OR를 사용해 여러 조건을 결합

AND : 2개의 조건이 모두 만족하느 ㄴ데이터만 검색
OR : 입력한 두 조건 중 하나라도 만족 하는 데이터를 모두 검색

sector가 'Finance'이면서 industry가 'Major Banks'인 데이터를 검색

SELECT * FROM nasdaq_company
WHERE sector = 'Finance' AND industry = 'Major Banks'

==========================================

2013년 3월 17일~ 2013년 3월 19일을 포함한 날짜 검색

SELECT * FROM nasdaq_company
WHERE last_crawel_date >= '2021-03-17'
AND last_crawel_date <= '2021-03-19'

==========================================

symbol이 'MSFT'또는 'XXXX'인 데이터 검색

SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT' OR symbol = 'XXXX'

여러 데이터를 검색하려고 OR를 여러 번 사용하면 비효율적

===================================

OR를 2개 이상 사용한 데이터 검색

SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT' OR symbol = 'AMD' OR symbol = 'AMZN'

이런 경우에는 OR를 반복해서 쓰지 않는다
IN을 쓴다
- OR와 같은 역할을 하지만 쉼표를 사용한다
사용방법만 다르다

여러개의 OR를 쓰는 상황이라면 쉼표로 가분한 값을 나열하는 방식으로

IN을 사용해 OR반복 사용을 대체한 데이터 검색

SELECT * FROM nasdaq_company
WHERE symbol IN ('MSFT', 'AMD', 'AMZN')

===================================

요구 사항 : sector가 'Technology'또는 'Consumer Services'이렴ㄴ서 symbol이 'MSFT', 'AMD', 'AMZN'인 데이터를 검색한다.

SELECT * FROM nasdaq_company
WHERE symbol IN ('MSFT', 'AMD', 'AMZN') AND sector IN ('Technology','Consumer Services')

소괄호 사용

SELECT * FROM nasdaq_company
WHERE (sector = 'Technology' OR sector = 'Consumer Services')
AND symbol IN ('MSFT,'AMD','AMZN')

💡논리 연산자 우선순위

우선순위 문제있는 쿼리문 :

SELECT * FROM nasdaq_company
WHERE sector = 'Technology' OR sector = 'Consumer Services'
AND symbol IN ('MSFT, 'AMD, 'AMZN')

실제 진행 순서 ↓
.................................................................

SELECT * FROM nasdaq_company
WHERE sector = 'Technology'

.................................................................

SELECT * FROM nasdaq_company
WHERE sector = 'Consumer Services'
AND symbol IN ('MSFT','AMD','AMZN')
.................................................................

===================================

좋은 쿼리란 가독성을 포함해 요구 사항을 적확히 반영하면서 성능도 효울적인 코드를 말한다

NULL 데이터 검색

NULL은 데이터가 없는 상태를 말한다 == 아예 정의되지 않은 값

!!! 0이나 공백 문자가 아님 !!!

NULL은 IS NULL 또는 IS NOT NULL을 사용해 필터링 한다

= 연산자로 찾을 수 없음 : NULL은 정의되지 않은 상태이므로 일반적인 연산자로 비교할 수 없기 때문

sector 데이터가 NULL인 데이터 검색

SELECT * FROM nasdaq_company
WHERE sector IS NULL

sector 데이터가 NULL이 아닌 데이터 검색

SELECT * FROM nasdaq_company
WHERE sector IS NOT NULL

===================================

퀴즈 3) nasdaq_company 테이블에서 ipo_year가 2021이면서, sector가 Finance이면서
symbol이 AGAC, TIRX, VLATW인 목록을 출력

SELECT * FROM nasdaq_company
WHERE ipo_year = 2021
AND sector = 'Finance'
AND symbol IN('AGAC', 'TIRX', 'VLATW')

profile
이진 입니다

0개의 댓글