Chapter 09

SQL文法【初級編 - データ加工】

ますみ / 生成AIエンジニア
ますみ / 生成AIエンジニア
2024.12.21に更新

はじめに

みなさんは、データ加工をする機会はありますでしょうか?
初心者の方で、SQLコマンドの使用に慣れていないかもしれません。

この章では、データを効率的に加工し、活用しやすい形に変形するための重要なSQLコマンドを解説します。
本章を読むことで、具体的なデータ加工の手順やテクニックを学び、SQLを用いてデータを自由に操作するスキルを身につけることができるでしょう。

SQLの実行環境を構築したい方は、以下の章をご参照ください。
https://zenn.dev/umi_mori/books/331c0c9ef9e5f0/viewer/8f8274

コマンド一覧

この章で紹介するコマンドは、11個です。
それぞれの概要を先に表としてお見せします。この段階でそれぞれを完璧に理解できなくても問題ありません。概要だけを掴めればOKです。ひととおり理解できた後、こちらを読み返すとより理解が深まります。

コマンド 意味 例文
DISTINCT 重複行を削除 SELECT DISTINCT author FROM book;
ORDER BY レコードを並び替え SELECT * FROM book ORDER BY age DESC;
LIMIT 取得行数を制限 SELECT * FROM book ORDER BY age DESC LIMIT 3;
OFFSET 指定した位置から取得 SELECT * FROM book ORDER BY age DESC LIMIT 3 OFFSET 1;
CASE 条件に応じて分類した新しい列を作成 SELECT *, CASE WHEN age<30 THEN '30歳より若い' ELSE '30歳以上' END AS age_status FROM book;
LENGTH 文字列の長さを算出 SELECT author, LENGTH(author) AS author_len FROM book;
REPLACE 文字列を置換 SELECT name, REPLACE(name, '入門', '初級') AS name_new FROM book;
SUBSTRING 文字列を抽出 SELECT name, SUBSTRING(name, 1, 3) AS name_extract FROM book;
ROUND 四捨五入 SELECT age, ROUND(age, -1) AS age_round FROM book;
POWER べき乗を計算 SELECT age, POWER(age, 2) AS age_power FROM book;
CAST 型を変換 SELECT age, CAST(age AS FLOAT(3)) AS age_float FROM book;

サンプルデータの作成

まず、これより先のデータ加工をわかりやすく理解するため、サンプルデータを格納したテーブルを用意します。以下のSQLを実行して、サンプルデータが格納されたテーブルを作成し、すべての列を抽出しましょう。

create_table.sql
CREATE TABLE book(
    id INT(10) AUTO_INCREMENT NOT NULL,
    name VARCHAR(30) NOT NULL,
    author VARCHAR(30) NOT NULL,
    age INT(3),
    PRIMARY KEY (id)
);

INSERT INTO book(name, author, age) VALUES ('SQL入門', 'Masumi', 25);
INSERT INTO book(name, author, age) VALUES ('Flutter入門', 'Masumi', 25);
INSERT INTO book(name, author) VALUES ('HTML入門', 'Hiro');
INSERT INTO book(name, author, age) VALUES ('GitHub入門2', 'Emma', 22);
INSERT INTO book(name, author, age) VALUES ('Flutter上級', 'Oliva', 45);

SELECT * FROM book;

上記のコマンドを実行すると、以下のようなテーブルが生成されます。

id name author age
1 SQL入門 Masumi 25
2 Flutter入門 Masumi 25
3 HTML入門 Hiro NULL
4 GitHub入門2 Emma 22
5 Flutter上級 Oliva 45

1. DISTINCTとは?

DISTINCT句は、「重複行を削除するコマンド」です。
以下の例では、bookというテーブルにおいて、author列の重複を削除しています。

distinct.sql
SELECT DISTINCT author FROM book;
author
Masumi
Hiro
Emma
Oliva

SELECTの後ろにDISTINCTを記述する簡単な構文です。

2. ORDER BYとは?

ORDER BY句は、「レコードを並び替えるコマンド」です。
以下の例では、bookというテーブルにおいて、age列の基準に降順(DESC)に並び替えをしています。また、昇順に並べ替えたい場合は、ASCと記述しましょう。

order_by.sql
SELECT * FROM book ORDER BY age DESC;
id name author age
5 Flutter上級 Oliva 45
1 SQL入門 Masumi 25
2 Flutter入門 Masumi 25
4 GitHub入門2 Emma 22
3 HTML入門 Hiro NULL

こちらもSELECT句に続けて、ORDER BY A DESC(またはASK)と記述する簡単な構文です。

3. LIMITとは?

LIMIT句は、「取得行数を制限するコマンド」です。必要な行数のみを抽出できます。
以下の例では、bookというテーブルにおいて、age列の基準に降順(DESC)に並び替えをした後に先頭から3レコードのみを抽出しています。

limit.sql
SELECT * FROM book ORDER BY age DESC LIMIT 3;
id name author age
5 Flutter上級 Oliva 45
1 SQL入門 Masumi 25
2 Flutter入門 Masumi 25

SELECT句、ORDER BY句に続いて、LIMITと抽出したいデータの数を記します。

4. OFFSETとは?

OFFSET句は、「指定した位置から取得するコマンド」です。どの位置からデータを取得するかを指定できます。
以下の例では、bookというテーブルにおいて、age列の基準に降順(DESC)に並び替えをした後に先頭から1レコード空けて、3レコード分抽出しています。

offset.sql
SELECT * FROM book ORDER BY age DESC LIMIT 3 OFFSET 1;
id name author age
1 SQL入門 Masumi 25
2 Flutter入門 Masumi 25
4 GitHub入門2 Emma 22

SELECT句、LIMIT句に続けて、OFFSET句の後ろにデータを取得する開始位置を指定します。

5. CASEとは?

CASE句は、「条件に応じて分類した新しい列を作成するコマンド」です。
以下の例では、bookというテーブルにおいて、ageが30よりも小さい場合は「30歳より若い」と出力し、それ以外の場合は「30歳以上」と出力するage_statusという列を作成しています。

case.sql
SELECT *, CASE WHEN age<30 THEN '30歳より若い' ELSE '30歳以上' END AS age_status FROM book;
id name author age age_status
1 SQL入門 Masumi 25 30歳より若い
2 Flutter入門 Masumi 25 30歳より若い
3 HTML入門 Hiro NULL 30歳以上
4 GitHub入門2 Emma 22 30歳より若い
5 Flutter上級 Oliva 45 30歳以上

ここで、加工したデータをただ表示しているだけであり、データの更新(UPDATE)はしていないため、元テーブルには何も変化は起きません。また、ここではIS NULLのような条件を入れていないため、NULLのレコードも「30歳以上」と判定されています。そのため、NULLのレコードを「30歳以上」と判定されないようにしたい場合は、別途条件設定が必要となります。

6. LENGTHとは?

LENGTH句は、「文字列の長さを算出するコマンド」です。文字列の長さとは、文字数を指します。
以下の例では、bookというテーブルにおいて、authorの文字列の長さを出力したauthor_lenという列を作成しています。

length.sql
SELECT author, LENGTH(author) AS author_len FROM book;
author author_len
Masumi 6
Masumi 6
Hiro 4
Emma 4
Oliva 5

7. REPLACEとは?

REPLACE句は、「文字列を別の文字列に置換するコマンド」です。ちなみに、元テーブルには何も変化は起きません。
以下の例では、bookというテーブルにおいて、nameの中で「入門」という文字を「初級」という文字に置き換えたname_newという列を作成しています。

SELECT name, REPLACE(name, '入門', '初級') AS name_new FROM book;
name name_new
SQL入門 SQL初級
Flutter入門 Flutter初級
HTML入門 HTML初級
GitHub入門2 GitHub初級2
Flutter上級 Flutter上級

8. SUBSTRINGとは?

SUBSTRING句は、「文字列を抽出する、つまり開始位置と文字数を指定して、一部文を切り出すコマンド」です。
以下の例では、bookというテーブルにおいて、nameの文字列の1番目から3番目の文字を出力するname_extractという列を作成しています。

substring.sql
SELECT name, SUBSTRING(name, 1, 3) AS name_extract FROM book;
name name_extract
SQL入門 SQL
Flutter入門 Flu
HTML入門 HTM
GitHub入門2 Git
Flutter上級 Flu

SELECT句に続けて、「SUBSTRING(文字列,開始桁,切り取り文字数)」と記述します。

9. ROUNDとは?

ROUND句は、「四捨五入するコマンド」です。
以下の例では、bookというテーブルにおいて、ageを四捨五入したage_roundという列を作成しています。

round.sql
SELECT age, ROUND(age, -1) AS age_round FROM book;
age age_round
25 30
25 30
NULL NULL
22 20
45 50

もし四捨五入する際に小数点桁を指定したい場合は、このように第二引数に小数桁を記述します。
SELECT ROUND(数値, 小数桁);

10. POWERとは?

POWER句は、「べき乗を計算するコマンド」です。
以下の例では、bookというテーブルにおいて、ageを2乗したage_powerという列を作成しています。

power.sql
SELECT age, POWER(age, 2) AS age_power FROM book;
age age_power
25 625
25 625
NULL NULL
22 484
45 2025

このように、引数で指定した「number1(age)」を「number2(2)」乗した、べき乗を求められます。

11. CASTとは?

CAST句は、「型を変換するコマンド」です。
以下の例では、bookというテーブルにおいて、ageをINTからFLOATに変換したage_floatという列を作成しています。

cast.sql
SELECT age, CAST(age AS FLOAT(3)) AS age_float FROM book;
age age_float
25 25
25 25
NULL NULL
22 22
45 45

このように、SELECT句の後ろに「CAST(expression AS data_type)」と記述することで、引数「expression」で指定したデータを、引数「data_type」で指定したデータ型に変換できます。

参考文献

https://qiita.com/tatsuya4150/items/69c2c9d318e5b93e6ccd
https://www.amazon.co.jp/dp/B09WTJ4DKR/

宣伝:もしもよかったらご覧ください^^

AIとコミュニケーションする技術(インプレス出版)』という書籍を出版しました🎉

これからの未来において「変わらない知識」を見極めて、生成AIの業界において、読まれ続ける「バイブル」となる本をまとめ上げました。

かなり自信のある一冊なため、もしもよろしければ、ご一読いただけますと幸いです^^