이전 노션 블로그의 SQL Tutorial (2021.01.17)로부터 마이그레이션된 글입니다.
Where
SQL WHERE | Basic SQL - Mode Analytics
SQL WHERE 절
SELECT 과 FROM 을 사용하여 어떻게 데이터를 조회하는지 안다면, 다음은 WHERE 을 이용하여 데이터를 필터링하는 것 입니다.
SELECT *
FROM tutorial.us_hosting_units
WHERE month = 1
📌 이 절은 언제나 SELECT , FROM , WHERE 순서여야만 합니다.
WHERE은 어떻게 작동할까?
SQL WHERE 절은 영어 문장 해석하듯이 작동합니다. 위의 쿼리는 month column이 1의 값을 가진 row 만 포함한다는 점만 빼면, SELECT * FROM tutorial.us_hosting_units 와 똑같이 작동합니다.
엑셀에선, 다른 column들을 필터링하지 않고 조건의 대상인 column을 필터링하여 데이터를 조건에 맞게 정렬합니다. (조건의 대상에 해당된 column의 값만 조회됨) 다만 이 방식은 데이터를 망칠 수 있습니다. SQL을 사용하면, row의 모든 데이터들을 보존합니다. 만약 하나의 column의 값을 기준으로 필터링하는 WHERE 절을 사용하면, 조건에 해당하는 row의 모든 column의 값을 보게될 것 입니다. 이런 작동 방식은 각각의 row가 데이터의 핵심이자 상태이며, row에 포함된 모든 정보는 함게 포함되어야 한다는 생각 때문입니다.
다음장에서 배우는 비교와 논리 연산자를 이용하면 수많은 방법으로 결과를 필터링할 수 있습니다.
Comparsion Operators
SQL Comparison Operators | Basic SQL - Mode Analytics
숫자 데이터에서의 비교연산자
데이터를 필터링하는 가장 기본적인 방법은 비교연산자를 사용하는 것이다.
~와 같다 =
~와 같지 않다 !=
~보다 크다 >
~보다 작다 <
~보다 같거나 크다 >=
~보다 작거나 같다 <=
이런 비교연산자들은 숫자로 된 컬럼에 적용할 때 가장 적합합니다. 예를 들어, 서부 지역에서 30,000 주택 단위보다 큰 열만 반환하기 위해서 > 사용해봅시다.
SELECT *
FROM tutorial.us_housing_units
WHERE west > 30
숫자가 아닌 데이터에서의 비교연산자
위의 모든 연산자는 숫자가 아닌 데이터에서도 작동합니다. = 와 != 는 각각 어떤 값이든 일치 혹은 불일치하는 열들을 고르도록 해줍니다. 아래의 쿼리를 실행하면 1월 열들이 나타나지 않는 것을 볼 수 있을것입니다.
SELECT *
FROM tutorial.us_housing_units
WHERE month_name != 'January'
하지만, 이 연산자들을 사용할 때 중요한 규칙이 있습니다. 숫자가 아닌 값으로 연산자를 사용할 때, 작은 따옴펴로 값으르 표현해야만 합니다. 'value'
📌 SQL은 컬럼의 값을 레퍼런스하기 위해 작은 따옴표를 사용한다.
> , < 와 나머지 연산자들도 숫자가 아닌 데이터에 사용할 수 있지만, 이들은 알파벳을 기준으로 필터링합니다.
SELECT *
FROM tutorial.us_housing_units
WHERE month_name > 'January'
아래의 두 쿼리는 같은 쿼리이다. SQL에서 'Ja' 는 'J' 보다 크기때문에 'Janauary' 는 두 쿼리 모두의 범위 안이다.
SELECT *
FROM tutorial.us_housing_units
WHERE month_name >= 'January'
//
SELECT *
FROM tutorial.us_housing_units
WHERE month_name > 'J'
SQL에서의 산술
+ - * / 를 이용하면 산술을 할 수 있습니다. 하지만, 주어진 열안에서 컬럼끼리만 수행할 수 있습니다. 만약 여러 열에 걸쳐서 값을 계산하고 싶은경우, 을 사용해야만 하며, 이는 중급 SQL 섹션에서 다를 것입니다.
SELECT year,
month,
west,
south,
west + south As south_plus_west
FROM tutorial.us_housing_units
위의 예는 각 줄에서 south 와 west 컬럼의 합을 나타내는 컬럼을 만듭니다. You can chain arithemetic functions, including both column names and actual numbers. 이렇게 산술 함수를 가진 열들을 존재하는 데이터를 수정한 데이터를 통해 생성되기 때문에 유도된 열(derived columns)라고 부릅니다.
산술 계산은 수학의 산술의 우선순위가 적용되기 때문에 괄호 등을 사용할 수도 있습니다. 읽기 쉽게 만드는 것이 무조건 중요하지 않은 경우에는 괄호를 이용하여 산술을 조절하는 것이 좋습니다.
Logical Operators
Comparsion Operator는 간단한 비교를 해주지만, 더욱 복잡하거나 다양한 조건을 사용하기위해서는 Logical Operators를 사용해야합니다.
LIKE
LIKE 는 정확한 값보단 비슷한 값을 찾는 논리연산자이다. 다음과 같이 비교하면 "group" 컬럼에서 'Snoop' 으로 시작하는 모든 열들을 찾아줍니다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE "group" LIKE 'Snoop%'
📌 `"group"` 은 SQL 함수의 `GROUP` 과 겹치기 때문에 double quotes(`""`)를 사용했다. (single quotes가 아니다) 보통 double quotes는 컬럼의 이름을 지칭하기위해 사용된다.
- LIKE 는 대소문자를 구별안한다. (구별하기 위해서는 BINARY(column) )
- % 는 와일드카드라고 불리며, 어떤 문자, 공백이든 상관없을을 나타낸다.
- _ (a single underscore) 는 한 문자를 대체한다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE artist ILIKE 'dr_ke'
('drake' 'dreke' 'druke' ...)
IN
IN 은 찾아내고 싶은 값들의 리스트를 통해 열들을 찾는다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year_rank IN (1, 2, 3)
비교연산자처럼 숫자가 아닌 값들에도 사용할 수 있다. 단, single quotes를 사용해야한다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE artist IN ('Taylor Swift', 'Usher', 'Ludacris')
BETWEEN
BETWEEN 은 특정 범위안의 열들을 찾는다. 뒤에서 다루는 AND 연산자와 짝을 이룬다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year_rank BETWEEN 5 AND 10
이는 다음의 쿼리와도 똑같다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year_rank >= 5 AND year_rank <= 10
IS NULL
IS NULL 은 NULL값을 가진(값이 빈) 열들을 찾아준다. 이를 응용하면 IS NOT NULL 을 통해 값이 있는 열들만 고를수도 있다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE artist IS NULL
WHERE artist = NULL 이것은 작동하지 않는다. null 값에 산수를 할 수 없다.
AND OR NOT
AND OR NOT 은 WHERE 의 조건을 연결하는 연산자이다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year = 2012
AND year_rank <= 10
AND "group" ILIKE '%feat%'
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year = 2013
AND ("group" ILIKE '%macklemore%' OR "group" ILIKE '%timberlake%')
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year = 2013
AND year_rank NOT BETWEEN 2 AND 3
----------------------------------------------------------------------------
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year = 2013
AND year_rank NOT > 3
ORDER BY
ORDER BY 는 선택된 열들을 재정렬해준다. 디폴드는 오름차순이다.
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year = 2013
ORDER BY year_rank
----------------------------------------------------------------------------
ORDER BY year_rank DESC
여러 개의 컬럼을 기반으로 정렬하기
SELECT *
FROM tutorial.billboard_top_100_year_end
WHERE year_rank <= 3
ORDER BY year DESC, year_rank
- ORDER BY 의 조건은 콤마를 통해 구별한다.
- 콤마로 구별된 조건의 정렬 기준은 각자 설정해야 한다.
- 먼저 적혀있는 (제일 왼쪽) 조건이 우선적으로 정렬되며, 그 이후 그 다음 조건을 통해 정렬된다 (year > year_rank)
LIMIT
SQL LIMIT | Basic SQL - Mode Analytics
결과에 왜 LIMIT를 걸어야만 할까?
많이들 너무 긴 결과를 받는 것을 방지하기 위한 간단한 방법으로써 limits를 쓴다. 대부분의 쿼리들의 목적은 단순히 특정 테이블이 어떻게 생겼는지를 보는 것이다. - 데이터의 처음 몇 줄을 스캔하여 관심있는 필드와 해당 필드의 조작 방법을 파악하고자 할 것입니다. 만약 굉장히 큰 테이블에 쿼리하고 (수십만 혹은 수백만 줄과 같은) limit를 사용하지 않는다면, 처음 몇 줄만 원하는 당신에겐 이해되지 않을 정도의 긴 시간을 결과를 위해 기다릴 것이다.
SQL LIMIT 커멘드 사용
SQL 커멘드로 limit를 직접 추가할 수 있다. 아래의 문법은 100개 제한을 건다