SELECT [열] FROM [테이블] WHERE [열] = [조건값]
1) 2) 3)
1) [열] : 조건을 적용할 열을 입력한다
2) = : 조건을 적용할 연산자 종류를 입력한다
3) [조건값] : 사용자 조건값을 입력한다.
symbol열의 값이 'MSFT'인 데이터 검색하기
SELECT * FROM nasdaq_company WHERE symbol = 'MSFT'
여기서는 조건에 해당하는 값과 같은 데이터를 검색하려고 비교 연산자 =를 사용했다.
SQL Server는 이 외에도 다음과 같은 연산자를 제공 :
연산자 | 설명 |
---|---|
< | 필터링 조건보다 작은 값을 검색 |
<= | 필터링 조건보다 같거나 작은 값을 검색 |
= | 필터링 조건과 같은 값을 검색 |
> | 필터링 조건보다 큰 값을 검색 |
>= | 필터링 조건보다 같거나 큰 값을 검색 |
<>, != | 필터링 조건과 같지 않은 값을 검색 |
!< | 필터링 조건보다 작지 않은 값을 검색 |
!> | 필터링 조건보다 크지 않은 값을 검색 |
숫자형, 문자열형, 날짜형 등 여러 자료형과 비교연산자를 사용 했을 떄 어떤 결과가 나오는지 살펴보자
SELECT * FROM nasdaq_company
WHERE ipo_year = 2021
=================================
SELECT * FROM nasdaq_company
WHERE ipo_year < 2021
=================================
SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT'
=================================
SELECT * FROM nasdaq_company
WHERE symbol < 'MSFT'
=================================
SELECT * FROM nasdaq_company
WHERE last_crawel_date = '2021-10-14'
=================================
SELECT * FROM nasdaq_company
WHERE last_crawel_date < '2021-10-14'
=================================
연산자 | 설명 |
---|---|
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은 WHERE문과 함께 사용하며 검색하는 값의 범위를 지정 할 수 있음
SELECT * FROM nasdaq_company
WHERE ipo_year BETWEEN 2010 AND 2011
2010을 포함한 큰 ipo_year와 2011을 포함한 작은 ipo_year가 반환됨
=============================
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'
*보통은 날짜형 데이터값이 어느 시간 단위까지 정되는지 살펴보면서 '시','분','초'를 적정히 생략하고 사용!
SELECT * FROM nasdaq_company
WHERE symbol BETWEEN 'A' AND 'B'
=========================================
간단히 NOT을 조합한다
SELECT * FROM nasdaq_company
WHERE symbol NOT BETWEEN 'A' AND 'B'
==========================================
AND : 2개의 조건이 모두 만족하느 ㄴ데이터만 검색
OR : 입력한 두 조건 중 하나라도 만족 하는 데이터를 모두 검색
SELECT * FROM nasdaq_company
WHERE sector = 'Finance' AND industry = 'Major Banks'
==========================================
SELECT * FROM nasdaq_company
WHERE last_crawel_date >= '2021-03-17'
AND last_crawel_date <= '2021-03-19'
==========================================
SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT' OR symbol = 'XXXX'
여러 데이터를 검색하려고 OR를 여러 번 사용하면 비효율적
===================================
SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT' OR symbol = 'AMD' OR symbol = 'AMZN'
이런 경우에는 OR를 반복해서 쓰지 않는다
IN을 쓴다
- OR와 같은 역할을 하지만 쉼표를 사용한다
사용방법만 다르다
여러개의 OR를 쓰는 상황이라면 쉼표로 가분한 값을 나열하는 방식으로
SELECT * FROM nasdaq_company
WHERE symbol IN ('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은 데이터가 없는 상태를 말한다 == 아예 정의되지 않은 값
!!! 0이나 공백 문자가 아님 !!!
NULL은 IS NULL 또는 IS NOT NULL을 사용해 필터링 한다
= 연산자로 찾을 수 없음 : NULL은 정의되지 않은 상태이므로 일반적인 연산자로 비교할 수 없기 때문
SELECT * FROM nasdaq_company
WHERE sector IS 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')