今さら聞けないSQL

こちらのウェビナーで説明した内容の抜粋です。

https://pages.databricks.com/webinar-202211-SQL.html

ウェビナーで使用したノートブックはこちらにあります。

https://github.com/taka-yayoi/public_repo_2/tree/master/sql_webinar

スライドはこちら。

<script defer class="speakerdeck-embed" data-id="66290f58a0b840cb8afd1be133866738" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

# SQLとは

SQLが何かをお話しする前に、SQLとの関係が深いデータやデータベースの話をさせてください。

**データとは**

> **データ**とは1人または複数の人や物や事象に関する定性的または定量的な値の集まりである。

[データ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF)

例えば、以下の様にさまざまな人に関する属性の集合はデータと言えます。データは必ずしも電子データである必要はありません。この様な属性が紙の台帳に記載されていたとしてもデータであると言えます。
![Screen Shot 2022-11-28 at 12.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bd7323bc-e833-1156-4960-fa51f5d1cabc.png)

**データベースとは**

> コンピューティングにおいて、**データベース**は、電子的に保存され、アクセスできる組織化された**データの集合**である。

[データベース - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)

コンピュータで、これらデータを取り扱う際にデータベースを使用することは一般的です。そして、大量データを管理するデータベースに問い合わせるための言語が**SQL**です。

**SQL(Structured Query Language)とは**

> **SQL**は、関係データベース管理システム (RDBMS) において、データの操作や定義を行うための**データベース言語（問い合わせ言語）**、ドメイン固有言語である。プログラミングにおいてデータベースへのアクセスのために、**他のプログラミング言語と併用される**。

[SQL - Wikipedia](https://ja.wikipedia.org/wiki/SQL)

今では、データベースは生活の様々なシーンで活用されており、これらデータベースを操作するための言語がSQLとなります。
![Screen Shot 2022-11-28 at 12.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ceae5e13-2ae2-3412-fdce-3815fd2ef1f8.png)

いわゆる[クライアントサーバシステム](https://www.nic.ad.jp/ja/basics/terms/client-server-system.html#:~:text=%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%2F%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A8%E3%81%AF%E3%80%81%20%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF,%E4%BB%A5%E9%99%8D%E3%81%AB%E6%99%AE%E5%8F%8A%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)において、クライアントからデータベースに問い合わせる際にSQLが使用されます。
![Screen Shot 2022-11-28 at 12.53.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/87d5bb76-bdde-919a-71c1-2e2784b22198.png)

そして、データベースにあるデータをどの様に処理するのかをSQLで記述します。
![Screen Shot 2022-11-28 at 12.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ad0a6673-1124-16d1-ed97-310e72b1fbf3.png)

以下の様な処理をSQLで記述します。
- 列「Prefecture」のデータをすべてください。
- 列「pref_no」の昇順で並び替えたデータをください。
- 列「Prefecture」が「Hokkaido」であるすべての行をください。
- 列「date_timestamp」から年月を取り出し、「Prefecture」と年月ごとの「Cases」の合計をください。

以下に「列`Prefecture`のデータをすべてください」のSQLを示します。最もシンプルなSQLと言えます。
![Screen Shot 2022-11-28 at 12.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ebc11f70-0086-d175-2ec5-f8bf9c07f8f1.png)

```sql:SQL
SELECT Prefecture FROM covid_cases;
```

# SQLで何ができる？

データベースにあるデータに対するすべての操作が行えると言っても過言ではありません。できることが多岐に渡るため、ある程度の分類がされています。ここでは、データ分析を行うペルソナの使用頻度が高いDML(Data Manipulation Language)にフォーカスします。

- DDL(Data Definition Language)
    - データベース、テーブルなどを作成、削除します
    - CREATE/DROP/ALTER
- DML(Data Manipulation Language)
    - テーブルを検索したり、変更します
    - SELECT/INSERT/UPDATE/DELETE
- DCL(Data Control Language)
    - テーブルに対する権限設定などを行います
    - GRANT/REVOKE

SQLと言えば、**とにもかくにもSELECTからです**。**SELECT**(選択する)の名前が示す通り、取り出すデータを選択するために使用します。通常**SELECT**は**FROM**(から)と組み合わせます。**FROM**ではデータを取り出すテーブルを指定します。
![Screen Shot 2022-11-28 at 13.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/816bec93-d968-d802-5967-edc9b6b1a3e1.png)

**SELECTをいろいろカスタマイズしていきます**。上の例ではテーブルのすべての行を取り出してしまいます。**WHERE(そこでは〜である)** と抽出条件を組み合わせることで、取り出す行を限定することができます。
![Screen Shot 2022-11-28 at 13.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/93486a0e-ac94-7ab3-7952-2b1a743b97fc.png)

データベースを操作できる環境で以下のSQLを実行して、必要とするデータを取得していきます。
- SELECT
- GROUP BY
- CREATE VIEW
- 関数
- 述語(predicate)
- CASE
- UNION
- JOIN

データベースを操作できる環境は色々ありますが、ここでは**Databricksのレイクハウスプラットフォーム**を使用します。

以降で使用するデータに関しては、以下のノートブックを実行してください。ここでは、データがデータベース`japan_covid_takaakiyayoidatabrickscom`に格納されているものとします。

https://github.com/taka-yayoi/public_repo_2/blob/master/sql_webinar/00.%20%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E4%BD%9C%E6%88%90.py

## SQL基礎 - テーブルの参照

こちらではSQLの以下のSQLのうち、データの取り出しに使用する**DML**、特に参照系の操作にフォーカスして説明します。

- DDL(Data Definition Language)
- DML(Data Manipulation Language)
- DCL(Data Control Language)

```sql:SQL
-- 事前に作成しておいたデータベースを選択します
USE japan_covid_takaakiyayoidatabrickscom;
```

### SELECT

テーブルからデータを取り出す際に必須になるのが`SELECT`です。

```sql:SQL
-- テーブル「covid_cases」から全レコードを取得します
SELECT
  *
FROM
  covid_cases;
```
![Screen Shot 2022-11-28 at 14.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4fd6b8d8-c16b-0bd1-241f-45ba794b8872.png)

```sql:SQL
-- レコード件数を取得します
SELECT
  count(*)
FROM
  covid_cases;
```
![Screen Shot 2022-11-28 at 14.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bb181d84-3db1-3f1c-642a-ec2dbef19ba0.png)

```sql:SQL
-- ユニークな県名のみを取得します
SELECT
  DISTINCT Prefecture,
  pref_no
FROM
  covid_cases
ORDER BY -- 県番号の昇順でソートします
  pref_no ASC;
```

少し複雑になりましたが、`DISTINCT`でユニークな値を取り出しています。そして、`ORDER BY`で並び替えをおこなっています。`ASC`は昇順、`DESC`は降順です。

![Screen Shot 2022-11-28 at 14.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3ba81fbb-3ee5-2fef-c6c5-200216a25fd7.png)

### GROUP BY

集計キーを指定してテーブルのデータをグルーピングします。グループに対して集計関数(カウントや平均値など)を適用して、グループごとのデータを取得します。

```sql:SQL
SELECT
  Area,
  COUNT(*) AS count -- レコード数をカウントし、列名をcountにします
FROM
  covid_cases
GROUP BY -- Areaでグルーピングします
  Area
ORDER BY -- Areaごとの件数の降順でソートします
  count DESC;
```
![Screen Shot 2022-11-28 at 14.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d16dee8-61e8-308a-ef9d-70439aaf20e4.png)

### ビュー

ビューは保存済みのクエリーと言えます。特定の切り口で参照することが頻繁にある場合には、その切り口でビューを作成しておくと取り回しが楽になります。

```sql:SQL
CREATE
OR REPLACE VIEW tokyo_only AS
SELECT
  *
FROM
  covid_cases
WHERE -- Tokyoのレコードのみに限定します
  Prefecture = "Tokyo"
```

テーブルの様にビューにアクセスすることができます。

```sql:SQL
SELECT * FROM tokyo_only;
```
![Screen Shot 2022-11-28 at 14.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/941cc7dd-8d1a-8ad6-ea5e-4a0273db20ba.png)

### 関数

頻繁に使用する処理は関数によって実現することができます。

```sql:SQL
SELECT
  date(date_timestamp) || " : " || Cases AS date_case -- 日付と感染者数を結合して date_case という列を生成します
FROM
  tokyo_only;
```
![Screen Shot 2022-11-28 at 14.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/479a5453-d190-424c-3b5c-e6f38aec44d3.png)

### 述語(predicate)

テーブルから取得するデータを絞り組むには述語を指定します。以下の述語(WHERE句)では以下の条件を指定しています。すべて`AND`で結合されているので、すべての条件に合致した行のみが抽出されます。

- 日付`date(date_timestamp)`が`2022-01-01`と`2022-01-10`
- 県名に`shima`を含む。`Lower(Prefecture)`としているのは、ローマ字の大文字小文字があるので、小文字に揃えているためです。

```sql:SQL
SELECT
  *
FROM
  covid_cases
WHERE
  date(date_timestamp) BETWEEN "2022-01-01"
  AND "2022-01-10"
  AND Lower(Prefecture) LIKE "%shima%"
```
![Screen Shot 2022-11-28 at 14.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/330bfa92-d1e2-eb4d-a3de-033cfd6c5a33.png)

### CASE

取得するデータの内容に対して判定を行い、新たなデータを生成することができます。

```sql:SQL
SELECT
  Prefecture,
  CASE -- Prefectureの文字列に条件を適用した結果に基づく新たな列を作成します
    WHEN Lower(Prefecture) LIKE "%shima%" THEN "島を含む"
    ELSE "島を含まない"
  END AS shima_included
FROM
  covid_cases
GROUP BY
  Prefecture
```
![Screen Shot 2022-11-28 at 14.18.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/258e284d-80be-f49a-b873-a39ca362815f.png)

### UNION

2つ以上のテーブルを連結することができます。テーブルのデータを**縦方向**に連結するには`UNION`を使います。なお、`UNION`で結合するテーブルは**同じ列構成**である必要があります。

結合するために千葉県のみのデータをビューとして準備します。

```sql:SQL
CREATE
OR REPLACE VIEW chiba_only AS
SELECT
  *
FROM
  japan_covid_takaakiyayoidatabrickscom.covid_cases
WHERE
  Prefecture = "Chiba"
```

```sql:SQL
SELECT
  *
FROM
  tokyo_only
UNION
SELECT
  *
FROM
  chiba_only;
```
![Screen Shot 2022-11-28 at 14.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4321e3df-30af-77f5-f111-e8747b86a878.png)

### JOIN

テーブルのデータを**横方向**に連結するには`JOIN`を使います。

以下のテーブルの元データは[こちら](https://github.com/taka-yayoi/public_repo/blob/main/covid-19%20analytics%20with%20lakehouse/prefectural_capital.csv)にあります。

```sql:SQL
SELECT * FROM prefectural_capital;
```
![Screen Shot 2022-11-28 at 14.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/80fb14f0-6ea6-4ab3-7d73-57dfa65cd604.png)

県名`Prefecture`をキーとして二つのテーブルを連結します。

```sql:SQL
SELECT
  cc.*,
  pc.prefectural_capital
FROM
  covid_cases cc
  INNER JOIN prefectural_capital pc ON cc.Prefecture = pc.Prefecture;
```

これで新たに県庁所在地の列が追加されました。
![Screen Shot 2022-11-28 at 14.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/95d2bf4b-16a2-f46a-0bae-4984bff9e476.png)

### 分析の文脈でのSQLの活用

今では、機械学習やBIの文脈でSQLを活用するケースが増えています。「地方別、日別の感染者数の変化を見たい」というケースでは、以下の様なSQLを実行することになります。

```sql:SQL
SELECT
  Area,
  date(date_timestamp) AS date,
  SUM(Cases) AS total_cases
FROM
  covid_cases
GROUP BY
  Area,
  date
ORDER BY
  Area,
  date;
```
![Screen Shot 2022-11-28 at 14.24.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0f25346d-d9c5-230c-3e57-8d9d09a9220f.png)

さらに、これをグラフで可視化することも有効です。Databricksでは、取得したデータを簡単に可視化する機能が備わっています。
![Screen Shot 2022-11-28 at 14.24.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/01e6969b-407c-ddd2-573e-95c476244689.png)
![Screen Shot 2022-11-28 at 14.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0f51984f-f36a-8a41-c8e0-327a2eb27b19.png)

ノートブックでSQLの実行結果を視覚的に確認しながら、作業を進めることができます。
![Screen Shot 2022-11-28 at 14.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/59b49906-0706-3c66-d412-a9a7e10930fc.png)

さらには地図上に感染者数をマッピングすることもできます。

```sql:SQL
SELECT
  Prefecture,
  SUM(Cases) AS totale_cases
FROM
  covid_cases
GROUP BY
  Prefecture
```
![Screen Shot 2022-11-28 at 14.26.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce74f4c0-a99b-28c8-1520-2f668b01920c.png)

## SQL基礎 - テーブルの更新

次に、以下のSQLを実行してテーブルを更新していきます。
- INSERT
- UPDATE
- DELETE
- SELECT AS OF

こちらではSQLのうち、データの取り出しに使用する**DML**、特にテーブル更新の操作にフォーカスして説明します。

### テーブルの作成

更新処理を行うダミーのテーブルを作成します。なお、こちらの`DROP TABLE`や`CREATE TABLE`は**DDL**です。

```sql:SQL
-- テーブルが存在する場合には削除
DROP TABLE IF EXISTS dummy_covid;
```

```sql:SQL
-- covid_casesから取得したデータを使って新たにdummy_covidテーブルを作成します
CREATE TABLE dummy_covid COMMENT 'これは更新処理向けのダミーテーブルです。' AS
SELECT
  *
FROM
  covid_cases;
```

```sql:SQL
-- テーブルのメタデータを確認します
DESCRIBE TABLE EXTENDED dummy_covid;
```
![Screen Shot 2022-11-28 at 14.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a35c9dac-a580-4624-4786-49108b4a0fb5.png)

```sql:SQL
-- 都道府県別の合計感染者数を合計します
SELECT
  Prefecture,
  sum(cases) AS total_cases
FROM
  dummy_covid
GROUP BY
  Prefecture;
```
![Screen Shot 2022-11-28 at 14.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/21f2ff8e-e038-607b-f2fc-b31e5ac50b7a.png)

### UPDATE

テーブルのデータを更新するには`UPDATE`を使用します。

```sql:SQL
-- Hokkaidoの感染者数を100倍に更新します
UPDATE
  dummy_covid
SET
  cases = cases * 100
WHERE
  Prefecture = "Hokkaido";
```

```sql:SQL
-- 都道府県別の合計感染者数を合計します
SELECT
  Prefecture,
  sum(cases) AS total_cases
FROM
  dummy_covid
GROUP BY
  Prefecture;
```
![Screen Shot 2022-11-28 at 14.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/417a26b5-c5d3-d1bd-875b-fdbfdbf64d59.png)

### DELETE

データを削除するには`DELETE`を使用します。削除対象を限定するためには`WHERE`を使用します。

```sql:SQL
-- Hokkaidoのデータをすべて削除します
DELETE FROM
  dummy_covid
WHERE
  Prefecture = "Hokkaido";
```

```sql:SQL
-- 都道府県別の合計感染者数を合計します
SELECT
  Prefecture,
  sum(cases) AS total_cases
FROM
  dummy_covid
GROUP BY
  Prefecture;
```
![Screen Shot 2022-11-28 at 14.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c660c841-56c5-7f3c-fad2-84a59b590970.png)

### INSERT

テーブルにデータを追加するには`INSERT`を使います。

```sql:SQL
INSERT INTO
  dummy_covid(Prefecture, date_timestamp, cases, pref_no, Area)
VALUES("ぷりぷり県", "2022-10-28", 10, 99, "不明");
```

```sql:SQL
SELECT
  *
FROM
  dummy_covid
ORDER BY
  pref_no DESC;
```
![Screen Shot 2022-11-28 at 14.32.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4bae98fb-6cb1-26b5-b2d2-cd594585bcfe.png)

### 更新処理には注意が必要です

- 誤ってデータを消してしまった、上書きしてしまったということを避けることは正直困難です。
- そんな場合に頼りになる機能があります。Delta Lakeの**タイムトラベル**です。
- ここまで操作してきたテーブルの実態は[Delta Lake](https://delta.io/)というソフトウェアによって実装されているものです。
- Delta Lakeはトランザクション保証、インデックスなどの機能がサポートされていますが、上の様なケースで役立つのがデータのバージョン管理である**タイムトラベル**です。
- Delta Lakeのテーブルに実行される更新処理はすべて記録され、任意のタイミングにロールバックすることができます。

:::note
**参考資料** [Delta Lakeにダイビング：トランザクションログを読み解く](https://qiita.com/taka_yayoi/items/b7f628c219463e055592)
:::

#### DESCRIBE HISTORY

[Delta Lakeにおけるテーブルユーティリティコマンド \- Qiita](https://qiita.com/taka_yayoi/items/152a31dc44bda51eeecd#delta%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%B1%A5%E6%AD%B4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)

```sql:SQL
-- テーブルの更新履歴を確認します
DESCRIBE HISTORY dummy_covid;
```

これまでのテーブル更新処理がすべて記録されています。
![Screen Shot 2022-11-28 at 14.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/16e854d9-e80d-5d77-3621-28ca8809ce44.png)

```sql:SQL
-- バージョン0、テーブル作成直後の状態を参照します
SELECT
  *
FROM
  dummy_covid VERSION AS OF 0
ORDER BY
  pref_no DESC;
```

バージョン0では、行が追加されていないことが確認できます。
![Screen Shot 2022-11-28 at 14.35.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/41642062-37a1-faac-a0d6-8bb5dc1c5927.png)

#### SELECT AS OF

```sql:SQL
-- 都道府県別の合計感染者数を合計します
SELECT
  Prefecture,
  sum(cases) AS total_cases
FROM
  dummy_covid VERSION AS OF 0
GROUP BY
  Prefecture;
```

UPDATE、DELETE前の状態を参照することができます。
![Screen Shot 2022-11-28 at 14.35.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/703194a6-2824-8132-e4bf-71ef3b8a7be0.png)

#### RESTORE

[RESTORE \(Delta Lake on Databricks\) \| Databricks on AWS](https://docs.databricks.com/spark/latest/spark-sql/language-manual/delta-restore.html)

```sql:SQL
-- バージョン0の状態にレストアします
RESTORE TABLE dummy_covid TO VERSION AS OF 0;
```

```sql:SQL
-- テーブルの更新履歴を確認します
DESCRIBE HISTORY dummy_covid;
```
![Screen Shot 2022-11-28 at 14.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a78c30ec-8084-14de-b61e-232f28a888a0.png)

このように、Delta Lakeでデータを保持することで、安心してデータの操作が行える様になります。

# コラム1：SQLの読み方

:::note
個人の意見・感想です。
:::

英語の文法としてSQLを読むと理解しやすいです。

- SQLの柔軟性は素晴らしいものですが、その代償としていくらでも複雑になり得ます。
- 複雑なSQLを理解するには、
    - フォーマットして可読性を上げ、
    - 英語の文を読む語順 **(SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY)** でブロックを把握し、
        - **FROM**に記述されているテーブルから、
        - **WHERE**に記述されている抽出条件に基づいてレコードを抽出し、
        - **GROUP BY**に指定されている集約キーでグルーピングし、
        - **HAVING**に記述されている条件に基づいてグループを絞り込み、
        - **ORDER BY**に指定されているソートキーで並び替えて、
        - **SELECT**に指定されている列
    - を取得する。
- という流れで私は読んでいます。

サンプルで説明します。

1. 以下のようなSQLを想定します。
![Screen Shot 2022-11-28 at 14.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ee44b58a-02df-cee6-59d8-5e905e482689.png)
1. (Databricksを含め)大抵のIDEにはフォーマッター(formatter)が搭載されているのでそれを活用します。
![Screen Shot 2022-11-28 at 14.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1bf51c42-124e-ff28-3e1d-a0c6a3a4f195.png)
1. 以下のように整形されますので、前述の順序で処理を理解します。
![Screen Shot 2022-11-28 at 14.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/00c38984-fe1e-df2e-5faa-7b9e00c845a4.png)

# コラム2：ローコード・ノーコードツール

「SQLを知らなくてもローコード・ノーコードツールがあるじゃないか」と思われるかもしれません。

確かにローコード・ノーコードツールは便利です。定型文を書く手間を省くことができるなど、試行錯誤の過程で生産性を高める役に立ちます。

しかし、ノーコードツールで作成したロジックを本格運用する際には、以下を検討した上で全体的なワークフローを設計すべきです。

[なぜ我々はコードを書くのか - Qiita](https://qiita.com/taka_yayoi/items/5f9227b0876dedd35152)

- **機能性** コードは**ノーコード**ツールよりもリッチであり、多くの場合、5倍から10倍豊富です。同じソフトウェアにおいて、ドラッグ&ドロップのUIとコードベースのAPIを比較してください。ソフトウェアの開発者は、**ノーコード**インタフェースに組み込む前にAPIに新機能を組み込みます。多くの機能はノーコードバージョンに取り込まれることはありません。これは、数多くのオペレーターをグラフィカルなUIに取り込むには制限があるためです。
- **柔軟性** **ノーコード**ツールは一部の機能しかサポートしていないため、開発者は重要と考えるものにフォーカスします。シンプルな分析を行っているのであれば問題ありません。そうでなければ不幸なことになります。コードは無制限の柔軟性を持っています。これが、データサイエンス向けのすべての**ノーコード**ツールに、ユーザーがコードを挿入できるような**コードノード**機能がある理由です。
- **透明性** コードはありのままであり、検査に対してオープンです。**ノーコード**ツールではこれは常に真となりません。データサイエンティストは、自分の作業の精度に対して説明責任を持ちます。分析が適切ではなかったとしてもツールに文句を言うことはできません。コーディングをしているのであれば、データから洞察に至る処理パイプラインは完全に可視化されます。
- **効率性** 誰もゼロからコーディングはしません。データサイエンスチームは再利用なコードのコンポーネントを整理し共有します。実行性能を改善し、計算インフラストラクチャへのインパクトを最小化するために、コードを調整・チューニングすることができます。これはノーコードツールでは不可能です。

なお、Databricksでもローコードの[データ加工ツール(bamboolib)](https://qiita.com/taka_yayoi/items/7bf7813a84e169644876)を提供しています。この場合、pandasデータフレームをGUIで操作できますが、対応するPythonコードが自動で生成されるので、後段の開発にコードを活用することができる様になっています。
![Screen Shot 2022-11-28 at 14.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/984f662e-42f6-0cae-6a36-8cb3f9511412.png)

# SQL応用編

前のセクションではテーブルのデータに対してSQLを使用しましたが、処理の要件が複雑化するに伴い、さまざまな拡張が為されてます。

- JSONなど1行の中にネストされたデータの取り扱い
- 関数を引数に取る高階関数
- 地理空間情報の取り扱い

以下のノートブックでこれらの内容をウォークスルーしています。

https://github.com/taka-yayoi/public_repo_2/blob/master/sql_webinar/04.%20%E6%BA%96%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%87%E3%83%BC%E3%82%BF(JSON)%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC.sql

https://github.com/taka-yayoi/public_repo_2/blob/master/sql_webinar/05.%20%E9%AB%98%E9%9A%8E%E9%96%A2%E6%95%B0.sql

https://github.com/taka-yayoi/public_repo_2/tree/master/sql_webinar/06.%20%E5%9C%B0%E7%90%86%E7%A9%BA%E9%96%93%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%84%20-%20H3

# まとめ

SQLは手段であって目的ではありません。**SQLは何かしらの目的のもとでデータを加工、取得するために用いるものです。**
- ダッシュボードに表示するデータを準備するために**SQLを用い**、ダッシュボードからビジネス上の洞察を得る。
- 機械学習のトレーニングデータを準備するために**SQLを用い**、機械学習モデルに品質の良いデータを入力することで、精度の高いモデルを構築し、高精度な需要予測を実現する。

Databricksでは、以下のメリットを享受いただきながらSQLを活用いただくことができます。

- [Databricks SQL](https://www.databricks.com/jp/product/databricks-sql)
- ノートブックでのSQLサポート
- SQLの結果をダッシュボード、機械学習などとシームレスに連携
- 並列分散処理による高速化
- 高度な要件に答えるSQL拡張

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)