SQL_2. Introduction to SQL (1/2)

소고기는레어·2020년 11월 14일
0
post-thumbnail

SQL의 기본 문법과 Query에서의 실행 순서

SQL에서 가장 기초가 되는 문법들은 다음과 같다.

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
;

그리고 이 문법들로 Query를 작성했을 때 실행 순서는 다음과 같다.

  1. FROM
  2. SELECT
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. ORDER BY
  7. LIMIT
  8. ;

그리고 각자의 역할을 간략히 표현하자면 다음과 같다.

FROM : Coulmn을 불러올 테이블을 선택
SELECT : FROM 에서 선택한 테이블에서 불러올 Column을 선택
WHERE : SELECT 에서 불러온 Column 필터링하기
GROUP BY : 집계함수 결과를 그룹화하기
HAVING : 집계함수의 결과 기준으로 필터링하기
ORDER BY : 정렬 순서 정하기
LIMIT : 출력할 결과의 개수 정하기
; : 하나의 Query가 종료되는 지점

각 키워드들은 대소문자를 구분하지 않으며 따라서 다음과 같이 쓸 수도 있다.

from
From
FroM

하지만 키워드와 키워드를 제외한 다른 Query의 구성요소들을 구분하기 위해 다음과 같이 대문자로 쓰는 것을 권장한다.

FROM

이제 각 키워드들의 역할과 사용법, 그리고 다양한 바리에이션에 대해서 하나씩 알아보도록 하자.


Column(Field) 선택하기

SELECT, FROM

SELECT FROM

SELECTFROM 은 거의 한몸이라고 봐도 무방할 정도로 같이 붙어다닌다.
FROM 이 테이블을 선택하면, SELECT 가 그 테이블에서 Column을 가져오기 때문이다.
아래와 같은 Query를 예시로 들 수 있다.

SELECT 
	city_name
FROM 
	city;

위의 예시는 'city' 테이블에서 'city_name'이란 Column을 추출하는 Query이다.
참고로 아래의 Query들도 위의 Query와 동일한 결과가 나온다.

SELECT city_name
FROM city;
select
city_name
from
city;

줄바꿈과 들여쓰기를 통해 가독성을 높여주는 것이 좋기 때문에 첫번째 Query와 같이 사용하는 것을 추천한다.

또한 Column은 한개 이상의 복수도 선택이 가능하다.

SELECT 
	city_name,
    	population
FROM 
	city;

이 Query는 'city' 테이블에서 'city_name' 과 'population'이란 Column을 추출하게 된다.

또한 * 을 통해 모든 Column을 불러올 수도 있다.

SELECT 
	*
FROM 
	city;

이렇게 되면 'city' 테이블에 속한 모든 Column을 불러오게 된다.

SELECT DISTINCT

SELECT DISTINCT

SELECT DISTINCTSELECT 로 불러오는 결과에 중복값을 포함시키지 않고 고유 값만 불러오고 싶을 때 사용할 수 있다.

SELECT 
	DISTINCT country
FROM
	city;

위의 Query는 'city' 테이블에서 'country' 정보를 가져오는데 중복되지 않는 고유값만 출력해준다.

COUNT, COUNT(DISTINCT ...)

COUNT

COUNT 는 Column의 Row 개수가 몇개인지 세어주는 역할을 한다.

SELECT
	COUNT(city_name)
FROM
	city;

이 Query는 city_name, 즉 도시의 이름들을 나열하는 것이 아닌 도시의 개수를 알려주는 Query이다.

DISTINCT 와 응용하여 사용할 수도 있다.

SELECT
	COUNT(DISTINCT city_name)
FROM
	city;

'city_name'의 고유값의 수를 출력하게 된다.


Filtering 하기

WHERE, AND

WHERE

WHERE 를 사용하면 필터를 거쳐서 Column을 결과로 출력할 수 있게된다.
사용할 수 있는 필터는 다음과 같다

= : 같다
<> : 같지 않다.
< : 미만
> : 초과
<= : 이하
>= : 이상

위의 필터를 다음과 같이 사용할 수 있다.

SELECT
	city_name
FROM
	city
WHERE 
	city_name = 'seoul';

위의 Query는 'city_name', 그 중에서도 'seoul'이란 이름을 갖고 있는 도시를 불러오는 Query이다.

SELECT
	city_name,
    	population
FROM
	city
WHERE 
	population >= 1000000;

이것은 인구가 1000000명이 넘는 도시의 이름과 해당 도시의 인구수를 불러오는 쿼리이다.

눈치 챘을지 모르겠지만 위의 두 Query에서 seoul은 어퍼스트로피''로 감싸져있고 1000000은 감싸져있지 않은 이유는 seoul은 문자열로 이루어져있기 때문이다. 필터값이 문자열일 경우 위와 같이 어퍼스트로피로 감싸주어야 한다.

또한 AND 를 활용하여 복수의 필터를 적용할 수 있다.

SELECT
	city_name,
    	population
FROM
	city
WHERE 
	population >= 1000000
    	AND country = 'South_Korea';

이 Query는 인구수가 1000000명 이상인 대한민국 도시를 불러오는 Query이다.
아래는 AND의 틀린 사용법 예시이다.

SELECT
	city_name,
    	population
FROM
	city
WHERE 
	population >= 1000000
   	AND <= 2000000;

이 잘못된 Query는 AND 뒤에 'population' 이라는 Column이 들어가지 않았다.
같은 Column의 필터여도 AND 뒤에 개별의 Column을 지정해 주어야한다.

SELECT
	city_name,
   	 population
FROM
	city
WHERE 
	population >= 1000000
    	AND population <= 2000000;

이와 같이 수정하여 옳은 Query로 만들 수 있다.

OR

OR

AND 의 경우에는 모든 필터, 즉 조건을 충족해야만 결과로 출력이 되지만
OR 은 복수의 조건 중 한가지만 충족하여도 결과로 출력이 된다.

SELECT
	country,
    	city_name
FROM
	city
WHERE 
	country = 'USA'
    	OR country = 'China';

이 Query는 'country'가 미국이거나 중국일 경우 해당 'city_name'을 출력하게 된다.
또한 AND 와 마찬가지로 개별 Column을 지정해야 하므로 다음은 유효하지 않다.

SELECT
	country,
    	city_name
FROM
	city
WHERE 
	country = 'USA' OR 'China';

그리고 ANDOR 는 함께 결합하여 사용할 수 있다.
이 때는 개별 절을 괄호()로 꼭 묶어주어야 한다.

SELECT
	country,
    	city_name
FROM
	city
WHERE 
	(country = 'USA' OR country = 'China')
    	AND (city_name = 'new_york' OR city_name = 'shanghai');

이 Query는 미국이나 중국의 도시 중에서 이름이 뉴욕이거나 상하이인 도시를 불러오게 된다.

BETWEEN

BETWEEN

지정된 범위 내에서 결과를 필터링하는 Query는 아래와 같이 쓸 수 있다.

SELECT
	city_name,
   		population
FROM
	city
WHERE 
	population >= 1000000
    	AND population <= 2000000;

이 Query는 BETWEEN 을 이용하여 더 간단하게 작성할 수 있다.

SELECT
	city_name,
		population
FROM
	city
WHERE
	population BETWEEN 1000000 AND 2000000;

위 두개의 Query는 모두 같은 결과를 제공한다. 인구수가 1000000명 이상 2000000명 이하인 도시의 이름과 인구수를 불러오게 된다. 이것과 앞서 배운 것들을 활용해 더욱 복잡하고 유용한 Query를 만들 수 있다.

SELECT
	city_name,
		population,
        	country
FROM
	city
WHERE
	population BETWEEN 1000000 AND 2000000
    	AND country = 'USA'
        AND (city_name = 'new_york' OR city_name = 'LA');

이 쿼리는 인구수가 100만 이상 200만 이하고 미국의 도시이며 이름이 뉴욕 혹은 LA인 도시를 불러오게 된다.

IN

IN

만약 미국, 중국, 대한민국, 일본, 러시아에 속한 도시들을 불러오고 싶다면 아래와 같은 Query를 작성하게 된다.

SELECT
	city_name,
    	country
FROM
	city
WHERE
	country = 'USA'
    	OR country = 'China'
        OR country = 'South_Korea'
        OR country = 'Japan'
        OR country = 'Russia';

이 과정은 매우 귀찮고 오래 걸릴 것이다. 하지만 IN 을 통해 조금 더 빠르고 편한 방법을 사용할 수 있다.

SELECT
	city_name,
    	country
FROM
	city
WHERE
	country IN ('USA', 'China', 'South_Korea', 'Japan', 'Russia');

이 Query는 첫번째 Query와 같은 결과를 불러올 것이다.

NULL

IS NULL IS NOT NULL

NULL은 누락되었거나 알 수 없는 값을 나타낸다. 우리는 이러한 NULL 값을 찾기 위해 아래와 같은 Query를 작성할 수 있다.

SELECT
	COUNT(*)
FROM 
	city
WHERE
	country IN NULL;

이 Query는 국가 정보가 누락된 도시의 수를 불러오게 된다.
국가 정보가 누락된 도시의 수를 알았다면 다음은 누락된 도시들의 이름을 불러와보자.

SELECT
	city_name
FROM 
	city
WHERE
	country IS NULL;

국가 정보가 누락된 도시 이름들이 나열 될 것이다.
또한 IS NOT NULL 을 사용하여 국가 정보가 누락되지 않은 도시 또한 불러올 수 있다.

LIKE, NOT LIKE

LIKE NOT LIKE

LIKENOT LIKE 는 문자열 데이터를 필터링하는데 사용할 수 있다.
= 이나 IN 은 문자열이 정확히 일치하는 경우에만 결과로 불러오지만, LIKENOT LIKE 를 사용하면 문자의 패턴으로 결과를 불러올 수 있게된다.
LIKE 는 두가지의 와일드카드와 함께 사용된다. 그 와일드카드는 아래와 같다.

% : %의 자리에는 복수의 문자가 들어갈 수 있다. A% 는 'APPLE', 'Alice', 'App', 'Am' 등의 결과를 불러올 수 있다.
_ : _의 자리에는 하나의 문자만 들어가게 된다. A_는 'As', 'AI', 'AT' 등의 결과를 불러올 수 있다.

사용 예시는 다음과 같다.

SELECT
	city_name
FROM
	city
WHERE
	city_name LIKE 'new%';

이 Query는 'new%' 로 이루어진 도시의 이름들을 불러온다. 불러오는 결과로는 'new_york', 'new_jersey' 등이 있을 것이다.
또한 NOT LIKE 를 통해 해당 패턴의 문자열을 포함하지 않는 도시 또한 불러올 수 있을 것이다.

profile
https://www.rarebeef.co.kr/

0개의 댓글