# DuckSQL

DuckSQL은 SQL을 이용하여 대용량 데이터 분석을 할수 있는 프로그램입니다.

<figure><img src="https://2795765414-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MS9MhFXMu-wLn13t9a8%2Fuploads%2FNhQhTptNXetqpowEmcWV%2FScreenshot%202023-05-17%20at%207.26.38%20AM.png?alt=media&amp;token=9ff38e83-b3bf-4dfb-8c23-a1322fff099a" alt=""><figcaption></figcaption></figure>

## 특징

* CSV파일 업로드시 자동 테이블 생성
* 빠른 쿼리 속도 (powered by [duckdb](https://duckdb.org/))

대용량 데이터 분석에 특화되어 타 데이터베이스(Mysql, Postgres..)에 비해 훨씬 빠른 속도로 분석 할 수 있습니다.


# 설치하기

현재 맥 버전만 지원합니다.

다운로드 받은 후 어플리케이션 폴더에 넣으면 됩니다.

{% embed url="<https://cdn.ducksql.com/release/darwin_amd64/DuckSQL.zip>" %}


# 기능

## 테이블 생성

CSV파일을 업로드 하면 자동으로 테이블이 생성됩니다. 컬럼 Type은 자동으로 추측하여 생성합니다.

##


# SQL이란?

SQL(Strutured Query Langauge)은 일반적으로 데이터베이스에서 원하는 값을 가져오거나 수정하는 등 데이터베이스와 상호작용하기 위한 작은 언어 입니다.

SQL은 표준화되어 하나의 DB를 정하고 SQL을 배우면, 나중에 다른 DB를 이용하더라도 쉽게 적응하여 사용할 수 있습니다.

## 데이터 분석을 위한 SQL

최근 퍼포먼스 마케팅, 그로쓰해킹 등 대용량의 데이터를 가공하여 의사결정을 하는 트렌드가 있습니다. 엑셀로 수백만 row의 데이터를 분석하기엔 어렵지만, SQL로 한다면 1초만에 데이터를 뽑아낼 수 있습니다.

## 쿼리문 기본

쿼리문의 대표적인 카테고리를 나눠보면 아래와 같습니다.

* INSERT : 신규 데이터 추가
* UPDATE : 기존 데이터 수정
* SELECT : 데이터 열람
* DELETE : 데이터 삭제

데이터 분석에 유일하게 필요한 것은 **SELECT** 입니다. SELECT문을 통해 데이터를 어떻게 가공하여 가져올지를 명시할 수 있습니다.


# SELECT 기본

## Table 이란?

테이블은 DB에서 데이터를 저장해두는 공간입니다. 엑셀의 sheet와 비슷하며, 차이점은 미리 컬럼의 이름과 데이터 형식을 정해둔다는 것 입니다. 대표적인 데이터 형식은 int(숫자), text(텍스트), timestamp(날짜)가 있습니다.

| id (int) | name (text)  | birth (timestamp) |
| -------- | ------------ | ----------------- |
| 1        | Heehong Moon | 1986-08-20        |
| 2        | Sunny Kim    | 1989-10-04        |
| 3        | Morning Moon | 2022-09-05        |

일반적으로 각 테이블에는 숫자로 된 id를 가지도록 테이블을 디자인 합니다. id는 고유값으로 특정한 row를 지칭할때 사용됩니다.

## SELECT의 기본 모양

```sql
-- users 이라는 테이블에 있는 id, name, birth 컬럼의 데이터를 가져옵니다.
SELECT id, name, birth 
FROM users;
```

테이블에 정의된 모든 컬럼을 가져오기 위해서 아래와 같이 간단하게 \* 을 사용할 수 있습니다.

```sql
-- users 테이블의 전체를 리턴합니다.
SELECT * 
FROM users;
```

## 조건식

전체 테이블에서 어떠한 조건을 만족하는 데이터만 가져오기 위해서는  WHERE 절을 이용합니다.&#x20;

```sql
-- users 테이블에서 id가 1인 행만 리턴합니다.
SELECT *
FROM users
WHERE id = 1;
```

숫자나 텍스트 형식에 사용할수 있는 다양한 조건 오퍼레이터가 있습니다. 대표적으로 사용되는 오퍼레이터 예제입니다.

| 오퍼레이터        | 의미                     | 예제                         |
| ------------ | ---------------------- | -------------------------- |
| =, !=        | 같다 또는 다르다.             | col\_name != 3             |
| >, >=, <, <= | 크다, 크거나 같다, 작다, 작거나 같다 | col\_name >= 10            |
| IN (...)     | 하나라도 같은게 있다            | col\_name IN (3, 6, 9)     |
| NOT IN (...) | ... 중 같은게 하나도 없다.      | col\_name NOT IN (3, 6, 9) |

여러가지 조건을 동시에 만족하는 행만 리턴하기 위해서는 AND 또는 OR 를 사용합니다. AND는 두 조건 모두 만족하는 경우, OR는 두 조건 중 하나만 만족해도 결과에 포함됩니다.

```sql
-- 2022년 1월 1일 이후 출생이면서 이름이 Heehong Moon인 유저를 가져옵니다.
SELECT *
FROM users
WHERE name = 'Heehong Moon' AND birth > '2022-01-01'
```

{% hint style="info" %}
텍스트를 조건으로 사용할때는 항상 Single Quote(')를 사용하여 묶어야 합니다. Double Quote(")를 사용하면 정상동작 하지 않습니다.
{% endhint %}

## NULL

데이터가 없는 없을 의미할때 NULL을 사용합니다. 주의 해야 할점은 데이터가 없는 조건을 걸때는 등호(=, !=)로 쿼리하면 안되고 IS, IS NOT 오퍼레이터를 사용해야 합니다.

| 오퍼레이터       | 의미      | 예제                    |
| ----------- | ------- | --------------------- |
| IS NULL     | 데이터가 없음 | col\_name IS NULL     |
| IS NOT NULL | 데이터가 있음 | col\_name IS NOT NULL |

## 정렬

조건식에 맞는 행을 어떤 순서로 정렬할지 정할수 있습니다. 특정 컬럼의 오름차순 또는 내림 차순으로 정렬할 수 있습니다.

기본값은 오름차순이며, 오름차순일때는 ASC, 내림 차순은 DESC 로 지정합니다.

```sql
-- id 가 1보다 큰 유저의 생일을 내림차순으로 가져옵니다.
SELECT *
FROM users
WHERE id >= 1
ORDER BY birth DESC
```

정렬 순서를 여러개 지정하려면 콤마로 할수 있습니다.

```sql
-- 생일 내림차순으로 정렬, 생일이 같은 경우 id를 오름차순으로 정렬
SELECT *
FROM users
ORDER BY birth DESC, id ASC
```

## LIMIT

쿼리에서 가져오는 데이터 개수를 제한합니다. 쿼리의 조건식에 부합하는 행이 100개 라도 LIMIT 10을 하면 10개만 가져옵니다.

```sql
-- 1990년 이후 출생한 유저의 3명만 가져옵니다.
SELECT *
FROM users 
WHERE birth > '1990-01-01'
ORDER BY birth DESC
LIMIT 3
```

## 연습

### 데이터

{% file src="/files/L0Box9lkvDEt8XIQsYON" %}

* id : 고유 id
* kakao\_id : 카카오로 가입한 유저의 id
* fb\_id : 페이스북으로 가입한 유저의 id
* google\_id : 구글로 가입한 유저의 id
* name : 유저 이름
* created\_time : 가입일
* last\_login : 마지막 로그인 시간

### 문제

* id가 207751 보다 큰 유저
* 이름이 Lois Wagner 인 유저
* 구글로 가입한 유저 10명
* 카카오로 가입한 유저 3명을 가입일 내림차순으로 정렬
* 페이스북으로 가입한 유저 중 2020-12월 이후 로그인 한 유저


# 함수 사용하기

다양한 데이터 타입에 따른 함수 및 오퍼레이터를  제공합니다. 예를들어 숫자형의 경우 사칙연산, 텍스트형의 경우 문자열 길이 구하기등 동작을 할수 있습니다.

## 데이터 Type

대표적으로 많이 사용되는 데이터 형식은 아래와 같습니다.

* **INT, BIGINT** : 정수
* **Float, Double** : 소수점을 포함하는 숫자
* **TEXT, VARCHAR** : 텍스트
* **Timestamp** : 날짜 및 시간
* **Boolean** : 참 또는 거짓

{% hint style="info" %}
일반적인 경우 Type을 명시하지 않아도 동작하지만, Type이 필요한 경우 valu&#x65;**::int** 와 같이 Type을 명시할 수 있습니다.
{% endhint %}

## 숫자관련 함수

* 사칙 연산 : +, -, /, %
* ceil, floor, round&#x20;

## 텍스트 함수

* ||&#x20;
* left, right
* trim
* length
* lower, upper
* substr

## 날짜 함수

* \+ interval&#x20;
* date\_trunc
* date\_diff


# 집계하기

Count

DISTINCT

GROUP BY

HAVING

* count
* sum
* avg
* min, max


# 조인

JOIN(INNER JOIN)

LEFT JOIN

RIGHT JOIN


# 서브 쿼리

SELECT (SELECT..)

SELECT from (SELECT ...)

SELECT from where col in (SELECT ...)


# 복잡한 쿼리 짜기

WITH a AS ( ...) select ..


# 서울시 공공데이터

data.go.kr 에서 받은 csv 파일입니다.

## 서울시 부동산 실거래가

{% embed url="<https://cdn.ducksql.com/%E1%84%89%E1%85%A5%E1%84%8B%E1%85%AE%E1%86%AF%E1%84%89%E1%85%B5%20%E1%84%87%E1%85%AE%E1%84%83%E1%85%A9%E1%86%BC%E1%84%89%E1%85%A1%E1%86%AB%20%E1%84%89%E1%85%B5%E1%86%AF%E1%84%80%E1%85%A5%E1%84%85%E1%85%A2%E1%84%80%E1%85%A1%20%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%87%E1%85%A9.csv.zip>" %}

## 서울시 전월세 실거래가

{% embed url="<https://cdn.ducksql.com/%E1%84%89%E1%85%A5%E1%84%8B%E1%85%AE%E1%86%AF%E1%84%90%E1%85%B3%E1%86%A8%E1%84%87%E1%85%A7%E1%86%AF%E1%84%89%E1%85%B5_%E1%84%8C%E1%85%A5%E1%86%AB%E1%84%8B%E1%85%AF%E1%86%AF%E1%84%89%E1%85%A6%E1%84%80%E1%85%A1.csv.zip>" %}


