티스토리 뷰

반응형

안녕하세요 Pingu입니다.🐧

 

지난 글에서는 데이터 베이스의 역사와 관계형 DB에 대해 알아봤는데요, 지난 글에 이어 이번 글에서는 SQL(Structed Query Language)로 관계형 데이터 베이스의 데이터를 사용해보려고 합니다. 깊게 보려는 의도는 아니고 간단하게 학교에서 배운 내용의 기억을 되살리는 용도로 글을 쓰려고 합니다.

 

이번 글에서 사용할 데이터는 dev.mysql.com/doc/index-other.html 여기에서 받으실 수 있어요~

SELECT

SELECT <컬럼 이름>
FROM <테이블 이름>
WHERE <검색 조건>

SELECT는 위와 같은 방식으로 사용할 수 있는 문법입니다. 목적은 "하나 또는 그 이상의 테이블에서 데이터를 추출하는 SQL의 데이터 조작 언어(DML) 중 하나입니다. 위의 코드를 보면 SELECT와 함께 쓰이는 FROM, WHERE 구문도 볼 수 있는데요, 코드에도 적혀있듯 FROM에는 테이블 이름, WHERE은 검색 조건을 정해줍니다. 만약 이를 해석해보면

 

~테이블에서 (FROM) ~~ 한 조건을 만족하는 (WHERE) ~컬럼을 선택합니다. (SELECT)

 

SQL은 이렇게 자연어로도 쉽게 이해할 수 있는 쉬운 문법입니다.

 

그럼 한 번 실제로 사용해볼까요?

SELECT Name, Continent, Population
FROM world.country
WHERE Name = 'South Korea';

world.country 테이블에서 Name이 'South Korea'인 데이터의 Name, Continent, Population 컬럼 내용을 가지고 오겠다는 SQL문을 수행했더니 위와 같이 잘 나오는 것을 볼 수 있습니다.

 

만약 모든 컬럼을 보고 싶을 땐 귀찮게 SELECT 뒤에 모두 입력하는 것이 아닌 *를 사용하면 됩니다.

SELECT *
FROM world.country
WHERE Name = 'South Korea';

 

기본 함수들

그럼 이제 SELECT, FROM, WHERE로 다양한 데이터를 불러올 수 있게 되었으니 좀 더 디테일한 작업을 해보겠습니다. world 데이터베이스의 컬럼 중에는 LifeExpectancy, 즉 기대 수명에 대한 컬럼이 있는데 어떤 어떤 나라가 가장 기대 수명이 긴지 알아보려면 어떻게 해야 할까요?

 

SQL에는 다양한 기본 함수가 존재합니다. 

  • COUNT
    • 조건에 맞는 데이터의 수
  • MAX
    • 데이터 중 가장 큰 값
  • MIN
    • 데이터 중 가장 작은 값
  • AVG
    • 데이터들의 평균값
  • SUM
    • 데이터들의 합
  • IN
    • 말 그대로 어떤 조건 안에 존재하는 데이터
  • BETWEEN AND
    • 말 그대로 어떤 조건 사이에 존재하는 데이터
  • LIKE
    • 아래 예를 보면 이해가 빠릅니다.
SELECT Name
From world.country
WHERE Name like "So%"

즉 Name이 So로 시작하는 데이터들을 가지고 올 때 사용할 수 있습니다.

 

그럼 다시 문제로 돌아가서 가장 기대수명이 높은 데이터를 가지고 오고 싶다면 아래와 같이 SQL문을 작성하면 됩니다.

SELECT *
FROM world.country
WHERE LifeExpectancy = (SELECT max(LifeExpectancy) FROM world.country)

실행하면 위와 같이 83.5가 가장 높은 기대수명을 가진 데이터라는 것을 알 수 있습니다.

 

SQL에는 정렬 구문도 존재합니다.

이번에는 기대 수명이 79 이상인 나라들을 이름을 기준으로 내림차순으로 데이터를 불러와보겠습니다.

SELECT *
FROM world.country
WHERE LifeExpectancy > 79
ORDER BY Name desc;

만약 오름차순을 원한다면 desc 대신에 asc를 사용하시면 됩니다.

 

SQL에는 그룹화를 적용할 수도 있는데요, 그룹화를 사용하여 Region이 Eastern Asia인 나라들을 모아보겠습니다.

SELECT Name,Region
FROM world.country
WHERE Region = "Eastern Asia"
GROUP BY Name,Region;

이번 글을 쓰면서 GROUP BY가 가장 어려웠던 거 같습니다. SELECT에서 선택한 컬럼을 GROUP BY에도 모두 써줘야 결과를 얻을 수 있었습니다.

 

사실 예제를 제 맘대로 구성하다 보니 위의 예를 만들게 되었는데, GROUP BY를 설명하기엔 좋지 않은 예였어요.

하지만 이를 통해 발생한 의문을 통해 GROUP BY를 확실하게 이해할 수 있었습니다.

 

제 의문은 이거였어요.

 

방금 수행한 Region이 Eastern Asia인 데이터를 불러오는 작업을 아래와 같이도 수행할 수 있잖아요?

SELECT Name,Region
FROM world.country
WHERE Region = "Eastern Asia"

위의 SQL문도 동일한 결과를 가져옵니다. 그럼 굳이 한 줄을 더 써가며 GROUP BY를 써야 하는 이유는 뭘까요?

 

차이점을 알기 위해 열심히 찾아봤더니 위와 같이 저렇게만 쓰면 GROUP BY를 쓸 이유는 없었습니다.

아래와 같이 전체가 아닌 그룹에서만 처리하고 싶을 때 그룹화를 사용하기 위해 GROUP BY는 존재했어요.

SELECT Region, Max(LifeExpectancy)
FROM world.country
GROUP BY Region

즉 위와 같이 Region으로 그룹화를 시키고 해당 그룹의 기대 수명을 가져오는 작업과 같이 어떤 그룹에서 특정 작업을 할 때 GROUP BY를 사용하는 것이죠!

아까 제가 해본 Region이 Eastern Asia인 데이터를 가져오는 예는 GROUP BY 예로는 적절하지 못했던 거 같아요.

 

GROUP BY는 HAVING과 함께 쓸 수 있는데요, 일단 예를 보겠습니다.

SELECT Region, Max(LifeExpectancy)
FROM world.country
GROUP BY Region
HAVING sum(Population) > 1000000000

HAVING은 그룹화를 시킨 녀석들을 모두 보겠다는 것이 아닌 HAVING 조건을 만족하는 녀석들만 보겠다는 말입니다.

즉 위의 예는 Region별로 그룹화를 시킨 뒤 해당 그룹의 인구 총합이 10억 이상인 Region의 최대 기대수명을 가져오겠다는 SQL문이 됩니다.

 

이렇게 간단하게 SQL 문법을 복습해봤습니다.

GROUP BY 같은 경우에는 학교에서 배울 때 제대로 이해하지 못했던 거 같은데, 이젠 확실히 이해한 거 같아 좋은 공부였던 거 같습니다!

 

감사합니다!

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함