はじめに
みなさんは、データ加工をする機会はありますでしょうか?
初心者の方で、SQLコマンドの使用に慣れていないかもしれません。
この章では、データを効率的に加工し、活用しやすい形に変形するための重要なSQLコマンドを解説します。
本章を読むことで、具体的なデータ加工の手順やテクニックを学び、SQLを用いてデータを自由に操作するスキルを身につけることができるでしょう。
SQLの実行環境を構築したい方は、以下の章をご参照ください。
コマンド一覧
この章で紹介するコマンドは、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 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列の重複を削除しています。
SELECT DISTINCT author FROM book;
author |
---|
Masumi |
Hiro |
Emma |
Oliva |
SELECTの後ろにDISTINCTを記述する簡単な構文です。
2. ORDER BYとは?
ORDER BY句は、「レコードを並び替えるコマンド」です。
以下の例では、bookというテーブルにおいて、age列の基準に降順(DESC)に並び替えをしています。また、昇順に並べ替えたい場合は、ASCと記述しましょう。
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レコードのみを抽出しています。
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レコード分抽出しています。
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という列を作成しています。
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という列を作成しています。
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という列を作成しています。
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という列を作成しています。
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という列を作成しています。
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という列を作成しています。
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」で指定したデータ型に変換できます。
参考文献
宣伝:もしもよかったらご覧ください^^
『AIとコミュニケーションする技術(インプレス出版)』という書籍を出版しました🎉
これからの未来において「変わらない知識」を見極めて、生成AIの業界において、読まれ続ける「バイブル」となる本をまとめ上げました。
かなり自信のある一冊なため、もしもよろしければ、ご一読いただけますと幸いです^^