1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け/SQL】読書管理テーブルを用いた基本の関数まとめ

Posted at

概要

SQLを一から学習するに当たり、自分用の学習ノートとして基本的な関数をまとめたものを公開することにしました。
個人的に作成した「読書管理テーブル」を例に、結果表も含めて載せています。
大変長く、わかりづらい箇所や誤りがあるかもしれませんが、SQLを学習中の方にとって少しでもご参考になれば幸いです。

なお、私はMySQLを使用していますが、MySQL以外のRDBMSを使用する場合の構文も一部記載しています。

読書管理テーブル

本は私が読んだものです。
お気に入り度はあくまでも個人的な好みで、図書館で借りて読んだものは金額を0としています。

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/13 2 0 9784065281499
3 失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト フランス文学 2025/07/18 2 0 9784003751121
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 2 1650 9784892571299
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 978-4-89257-129-9

全ての列を取得する

基本構文

SELECT 列名1, 列名2, ...
FROM テーブル名

もしくは

SELECT * FROM テーブル名

読書管理テーブルのデータを全て抽出する

SELECT ID , タイトル , 著者名 , ジャンル , 読了日 , お気に入り度 , 金額 ,ISBN
 FROM 読書管理;

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/13 2 0 9784065281499
3 失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト フランス文学 2025/07/18 2 0 9784003751121
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 2 1650 9784892571299
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 978-4-89257-129-9

条件を指定して特定の行のみ抽出する場合

読書管理テーブルからお気に入り度が「3」のものだけを抽出する

SELECT ID , タイトル , 著者名 , ジャンル , 読了日 , お気に入り度 , 金額 ,ISBN
FROM 読書記録
WHERE お気に入り度 = 3;

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 9784892571299

データを追加する

基本構文

INSERT INTO テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...);

読書管理テーブルに「ロゴスと巻貝」を追加する

INSERT INTO 読書管理
VALUES ('ロゴスと巻貝' , '小津夜景' , 'エッセイ' , '2025/08/19' , 3 , 1980 , 9784877588557);

()内のデータは列名の順番通りに記載します。

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/13 2 0 9784065281499
3 失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト フランス文学 2025/07/18 2 0 9784003751121
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 2 1650 9784892571299
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 978-4-89257-129-9
9 ロゴスと巻貝 小津夜景 エッセイ 2025/08/19 3 1980 9784877588557

データを更新する(上書きする)

基本構文

UPDATE テーブル名
SET 列名1 = 値1, 列名2 = 値2, ...
WHERE 条件;

「素粒子」のお気に入り度を「3」に上書きする

UPDATE 読書管理
SET お気に入り度 = 3
WHERE ID = 7;

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/13 2 0 9784065281499
3 失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト フランス文学 2025/07/18 2 0 9784003751121
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 3 1650 9784480421777
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 9784892571299
9 ロゴスと巻貝 小津夜景 エッセイ 2025/08/19 3 1980 9784877588557

データを削除する

基本構文

DELETE FROM テーブル名
WHERE 条件;

読書管理テーブルから「ロゴスと巻貝」を削除する

DELETE FROM 読書管理
WHERE ID = 9;

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/13 2 0 9784065281499
3 失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト フランス文学 2025/07/18 2 0 9784003751121
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 3 1650 9784480421777
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 9784892571299

別名で検索結果を表示する

基本構文

SELECT 列名 AS 別名
FROM テーブル名;

「タイトル」を「title」にして読書管理テーブルから全てのデータを抽出する

SELECT ID , タイトル AS 'title' , 著者名 , ジャンル , 読了日 , お気に入り度 , 金額 ,ISBN
FROM 読書管理;

結果表

ID title 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/13 2 0 9784065281499
3 失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト フランス文学 2025/07/18 2 0 9784003751121
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
5 ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟 ライトノベル 2025/07/27 3 814 9784046849762
6 ナチュラルボーンチキン 金原ひとみ 国内文学 2025/08/09 3 1760 9784309039169
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 3 1650 9784480421777
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 9784892571299

NULLを抽出する

基本構文

SELECT 列名
FROM テーブル名
WHERE 列名 IS NULL;

「読了日」がNULL(空)の行を抽出する

SELECT *
  FROM 読書記録
 WHERE 読了日 IS NULL

特定の文字列を含むレコードを抽出する

基本構文

SELECT 列名
FROM テーブル名
WHERE 列名 LIKE '%文字列%';

著者名に「ミシェル」を含むレコードを抽出する

SELECT * FROM 読書管理
WHERE 著者名 LIKE '%ミシェル%';

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
7 素粒子 ミシェル・ウェルベック フランス文学 2025/08/13 3 1650 9784480421777

特定の文字で終わるレコードを抽出する

基本構文

SELECT 列名
FROM テーブル名
WHERE 列名 LIKE '%特定の文字';

著者名が「カヴァン」で終わるレコードを抽出する

SELECT * FROM 読書管理
WHERE 著者名 LIKE '%カヴァン';

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
4 アサイラム・ピース アンナ・カヴァン イギリス文学 2025/07/21 3 946 9784480436030
8 草地は緑に輝いて アンナ・カヴァン イギリス文学 2025/08/17 3 2750 9784892571299

特定の文字から始まるレコードを抽出する

基本構文

SELECT 列名
FROM テーブル名
WHERE 列名 LIKE '特定の文字%';

著者名が「イリナ」から始まるレコードを抽出する

SELECT *
FROM 読書管理
WHERE 著者名 LIKE 'イリナ%';

結果表

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 優しい地獄 イリナ・グリゴレ 国内文学 2025/07/10 3 0 9784750517513

BETWEEN

基本構文

BETWEEN演算子で、ある範囲内に収まっているかを判定できます。

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 列名 BETWEEN 下限値 AND 上限値;

読書管理テーブルから、金額が1000円以上2000円未満の本のタイトルと金額を抽出する

SELECT タイトル, 金額
FROM 読書管理
WHERE 金額 BETWEEN 1000 AND 2000;

結果表

タイトル 金額
ナチュラルボーンチキン 1760
素粒子 1650

DISTINDT

抽出結果に内容が重複している行があれば、その重複を取り除きます。

基本構文

SELECT DISTINCT 列名 …
FROM テーブル名

読書管理テーブルから、ジャンルの種類だけを抽出する

SELECT DISTINCT ジャンル
FROM 読書管理;

結果表

ジャンル
国内文学
フランス文学
イギリス文学
ライトノベル
エッセイ
ドイツ文学
アメリカ文学

ORDER BY

SELECT文の最後にORDER BY句を記述することで、指定した列の値を基準として並び替えた検索結果を取得できます。

基本構文

SELECT 列名1, 列名2, ...
FROM テーブル名
ORDER BY 列名 [ASC|DESC];

昇順にする場合は「ASC」、降順にする場合は「DESC」を指定します。
ただし、何も記述しない場合は昇順になっています。
ORDER BY句では、列名ではなく列番号で指定することも可能です。

読書管理テーブルから、金額が安い順で抽出する

SELECT タイトル, 金額
FROM 読書管理
ORDER BY 金額 ASC;

結果表

タイトル 金額
優しい地獄 0
汝、星のごとく 0
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ 0
ようこそ実力至上主義の教室へ3年生編2 814
アサイラム・ピース 946
素粒子 1650
ナチュラルボーンチキン 1760
草地は緑に輝いて 2750

OFFSET - FETCH

検索結果の一部の行のみを取得できます。

基本構文

SQL Server, PostgreSQL, Oracleの場合は以下のように書きます。

SELECT 列名1, 列名2, ...
FROM テーブル名
ORDER BY 列名
OFFSET n ROWS FETCH NEXT m ROWS ONLY;

MySQL, PostgreSQL, SQLiteの場合は以下のように書きます。

SELECT 列名1, 列名2, ...
FROM テーブル名
ORDER BY 列名
LIMIT オフセット, 取得件数;

OFFSET句には、先頭から除外したい行数を指定します。
除外せずに1行目から取得したい場合は「0」を指定します。(DBMSによってはOFFSET句自体を省略できる)

FETCH句には取得したい行数を指定する。FETCH句を省略すると、該当する全ての行が抽出されます。

読書管理テーブルから、読了日の降順(直近に読んだ順)に、上位2件の本のタイトルと著者名だけを表示する

↓SQL Server, PostgreSQL, Oracleの場合

SELECT タイトル, 著者名
FROM 読書管理
ORDER BY 読了日 DESC
OFFSET 0 ROWS FETCH NEXT 2 ROWS ONLY;

↓MySQL, PostgreSQL, SQLiteの場合

SELECT タイトル, 著者名
FROM 読書管理
ORDER BY 読了日 DESC
LIMIT 0, 2;

「0」は先頭からスキップする件数(ここではスキップなし)で、「2」は2件だけ取得するという意味です。

結果表

タイトル 著者名
草地は緑に輝いて アンナ・カヴァン
素粒子 ミシェル・ウェルベック

UNION

集合演算子の一つで、異なるテーブルの検索結果を足し合わせた結果(和集合)が取得できます。

基本構文

SELECT 文1
UNION (ALL)
SELECT 文2

集合演算子は、複数の検索結果を1つの結果表として返してくれるものですが、それぞれの検索結果の列数が異なったり、データ型がバラバラだったりすると、DBMSは1つの結果表にまとめることができません。
そのため、それぞれのテーブルの列数とデータ型をぴったりと一致させておく必要があります。

お気に入り度が3の本と金額が0の本をまとめて取得する

SELECT タイトル, 著者名
FROM 読書管理
WHERE お気に入り度 = 3
UNION
SELECT タイトル, 著者名
FROM 読書管理
WHERE 金額 = 0;

結果表

タイトル 著者名
優しい地獄 イリナ・グリゴレ
アサイラム・ピース アンナ・カヴァン
ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟
ナチュラルボーンチキン 金原ひとみ
素粒子 ミシェル・ウェルベック
草地は緑に輝いて アンナ・カヴァン
汝、星のごとく 凪良ゆう
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ プルースト

EXCEPT / MINUS

集合演算子の一つで、あるSELECT文の検索結果に存在する行から、別のSELECT文の検索結果に存在する行を差し引いた集合(差集合)を求めます。

PostgreSQL、SQL Serverの場合は、EXCEPTを使います。

SELECT 文1
EXCEPT (ALL)
SELECT 文2

Oracle、DB2では、MINUSを使うことが推奨されています。

SELECT 文1
MINUS (ALL)
SELECT 文2

MySQLではEXCEPT / MINUSがサポートされていない為、代わりにNOT INを使います。

お気に入り度3の本から、金額0の本を除く

↓PostgreSQL、SQL Server、Oracle、DB2の場合

SELECT タイトル, 著者名
FROM 読書管理
WHERE お気に入り度 = 3
EXCEPT(MINUS)
SELECT タイトル, 著者名
FROM 読書管理
WHERE 金額 = 0;

↓MySQLの場合

SELECT タイトル, 著者名
FROM 読書管理
WHERE お気に入り度 = 3
AND タイトル NOT IN (
    SELECT タイトル
    FROM 読書管理
    WHERE 金額 = 0
);

結果表

タイトル 著者名
アサイラム・ピース アンナ・カヴァン
ようこそ実力至上主義の教室へ3年生編2 衣笠彰悟
ナチュラルボーンチキン 金原ひとみ
素粒子 ミシェル・ウェルベック
草地は緑に輝いて アンナ・カヴァン

INTERSECT

2つのテーブルに共通する行(積集合)を求めます。

基本構文

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件1
INTERSECT
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件2;

INTERSECTはPostgreSQL、SQL Server、Oracleなどで対応しています。
MySQLでは、代わりにINNER JOIN を使います。

SELECT r.タイトル
FROM 読書記録 r
INNER JOIN 読書管理 m
    ON r.タイトル = m.タイトル;

以下のような、私の友人の読書記録テーブルがあったとします。

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
1 木曜日にはココアを 青山美智子 国内文学 2025/07/3 3 0 9784800297129
2 汝、星のごとく 凪良ゆう 国内文学 2025/07/12 3 0 9784065281499
3 うたかたサンクチュアリ 吉本ばなな 国内文学 2025/07/25 3 0 9784101359168
4 流浪の月 凪良ゆう 国内文学 2025/07/30 3 0 9784488803018

読書記録テーブルと読書管理テーブルで共通のタイトルを取得する

↓PostgreSQL、SQL Server、Oracleの場合

SELECT タイトル FROM 読書記録
INTERSECT
SELECT タイトル FROM 読書管理;

↓MySQLの場合

SELECT DISTINCT r.タイトル
FROM 読書記録 r
INNER JOIN 読書管理 m
    ON r.タイトル = m.タイトル;

結果表

タイトル
汝、星のごとく

また、INTERSETCTALLを付けると、重複した行をまとめずにそのまま返します。

SELECT タイトル FROM A
INTERSECT ALL
SELECT タイトル FROM B;

結果表

タイトル
汝、星のごとく
汝、星のごとく

CASE

列の値や条件式を評価し、その結果に応じて値を自由に変換します。

基本構文

CASE
    WHEN 条件1 THEN 値1
    WHEN 条件2 THEN 値2
    ...
    ELSE 値N
END

また、CASE文は以下のような書き方も出来ます

CASE WHEN 条件1 THEN 条件1のときに返す値
    (WHEN 条件2 THEN 条件2のときに返す値)…
    (ELSE デフォルト値)
END

お気に入り度ごとに評価コメントを付ける

SELECT タイトル,
       お気に入り度,
       CASE
           WHEN お気に入り度 = 3 THEN 'とても好き'
           WHEN お気に入り度 = 2 THEN '好き'
           WHEN お気に入り度 = 1 THEN '普通'
           ELSE '未評価'
       END AS 評価コメント
FROM 読書管理;

結果表

タイトル お気に入り度 評価コメント
優しい地獄 3 とても好き
汝、星のごとく 2 好き
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ 2 好き
アサイラム・ピース 3 とても好き
ようこそ実力至上主義の教室へ3年生編2 3 とても好き
ナチュラルボーンチキン 3 とても好き
素粒子 3 とても好き
草地は緑に輝いて 3 とても好き

LENGTH

文字列の長さを調べます。

LENGTH(文字列)

LENGTH関数の注意点

・PostgreSQL・Oracle・SQL Serverでは文字数を返します。

・MySQLでは、LENGTH() はバイト数を返すため、日本語(UTF-8)は1文字で3バイト扱いとなります。
その為、MySQLで文字数を知りたい場合は CHAR_LENGTH() またはCHARACTER_LENGTH() を使います。

・SQLServerでは、LENGTHではなくLEN関数を用います。

タイトルの文字数を表示する

↓PostgreSQL・Oracle・SQL Serverの場合

SELECT タイトル,LENGTH(タイトル) AS タイトルの文字数
FROM 読書管理;

↓MySQLの場合

SELECT タイトル, CHAR_LENGTH(タイトル) AS タイトルの文字数
FROM 読書管理;

結果表

タイトル タイトルの文字数
優しい地獄 4
汝、星のごとく 6
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ 31

TRIM

指定された文字の前後の空白を取り除きます。
LTRIMは左側の空白を除去、RTRIMは右側の空白を除去します。

基本構文

TRIM([[LEADING | TRAILING | BOTH] '文字' FROM] 文字列)

LEADING : 先頭から削除
TRAILING : 末尾から削除
BOTH(デフォルト): 両端から削除/省略可能
'文字' を省略した場合、スペースが対象となります。

読書管理テーブルに、タイトルの両端に1文字分の空白が入った「1Q84」というレコードがあったとします。

ID タイトル 著者名 ジャンル 読了日 お気に入り度 金額 ISBN
9 1Q84 村上春樹 国内文学 2025/08/31 3 0 9784101253435

「1Q84」の両端の空白を取り除く

SELECT id, TRIM(タイトル) AS 空白除去したタイトル
FROM 読書管理
WHERE ID = 9;

結果表

ID 空白除去したタイトル
9 1Q84

わかりづらいですが、「1Q84」の両端にあった空白が除去されています。

REPLACE

TRIM関数は前後の空白のみしか取り除かないため、指定した文字列に含まれる空白を全て取り除きたい場合は、REPLACE関数を使います。

基本構文

REPLACE(文字列, 検索文字列, 置換文字列)

著者名の姓と名の間に空白が入った、以下のレコードがあったとします。
なお、表を見やすくする為にお気に入り度、金額、ISBNは省略しました。

ID タイトル 著者名   ジャンル 読了日
10 家守綺譚 梨木  香歩 国内文学 2025/08/31

著者名「梨木  香歩」の空白を除去する

REPLACE('梨木  香歩','  ','')

結果表

タイトル 空白除去した著者名
家守綺譚 梨木香歩

SUBSTRING

文字列の一部分だけを取り出します。
DBMS製品によっては、SUBSTRINGではなくSUBSTRを用います。

基本構文

SUBSTRING(文字列を表す列,抽出を開始する位置,抽出する文字の数)

タイトルと、著者名「梨木香歩」の姓のみを取得する

SELECT タイトル, SUBSTRING(著者名, 1, 2) AS `著者名(姓)`
FROM 読書管理
WHERE ID = 10;

結果表

タイトル 著者名(姓)
家守綺譚 梨木

CONCAT

文字列を連結します

基本構文

CONCAT(文字列,文字列[, 文字列)

タイトルと著者名を結合して「タイトル(著者名)」形式で表示する

SELECT CONCAT(タイトル, '(', 著者名, ')') AS 本の情報
FROM 読書管理;

結果表

本の情報
優しい地獄(イリナ・グリゴレ)
汝、星のごとく(凪良ゆう)
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ(プルースト)
アサイラム・ピース(アンナ・カヴァン)
ようこそ実力至上主義の教室へ3年生編2(衣笠彰悟)
ナチュラルボーンチキン(金原ひとみ)
素粒子(ミシェル・ウェルベック)
草地は緑に輝いて(アンナ・カヴァン)

ROUND

指定桁で四捨五入します。

基本構文

ROUND(数値を表す列,有効とする桁数)

金額を100円単位で丸める

SELECT タイトル, 金額, ROUND(金額, -2) AS 100円単位の金額
FROM 読書管理;

結果表

タイトル 金額 100円単位の金額
優しい地獄 0 0
アサイラム・ピース 946 900
ようこそ実力至上主義の教室へ3年生編2 814 800
ナチュラルボーンチキン 1760 1800
草地は緑に輝いて 2750 2800

TRUNC

四捨五入ではなく切り捨てをします。

基本構文

TRUNC(数値を表す列,有効とする桁数)

金額を100円単位で切り捨てる

SELECT タイトル, 金額, TRUNCATE(金額, -2) AS 100円単位の金額
FROM 読書管理;

結果表

タイトル 金額 100円単位の金額
優しい地獄 0 0
アサイラム・ピース 946 900
ようこそ実力至上主義の教室へ3年生編2 814 800
ナチュラルボーンチキン 1760 1700
草地は緑に輝いて 2750 2700

POWER

ある値のべき乗を計算します。

基本構文

POWER(数値を表す列,何乗するかを指定する数値)

金額を2乗する

SELECT タイトル, 金額, POWER(金額, 2) AS 二乗した金額
FROM 読書管理;

結果表

タイトル 金額 二乗した金額
優しい地獄 0 0
アサイラム・ピース 946 894916
ようこそ実力至上主義の教室へ3年生編2 814 662596
ナチュラルボーンチキン 1760 3097600
草地は緑に輝いて 2750 7562500

日付にまつわる関数

関数 説明 形式(MySQL)
CURRENT_TIMESTAMP 現在の 日付と時刻 を取得 YYYY-MM-DD HH:MM:SS
CURRENT_DATE 現在の 日付 を取得 YYYY-MM-DD
CURRENT_TIME 現在の 時刻 を取得 HH:MM:SS

CURRENT_TIMESTAMPCURRENT_DATECURRENT_TIME は SQL標準で定義されている関数なので、多くのRDBMSでサポートされていますが、若干の書き方や戻り値形式が違います。
ここではMySQLでの書き方を記載します。

レコード挿入時に「読了日」を自動で記録する

INSERT INTO 読書管理 (タイトル, 著者名, 読了日)
VALUES ('新しい本', '著者A', CURRENT_DATE);

CAST

ある型のデータを別の型として扱います。

基本構文

CAST(変換する値 AS 変換する型)

金額を文字列に変換する

SELECT タイトル, 金額, CAST(金額 AS CHAR) AS 金額_CHAR
FROM 読書管理;

結果表

タイトル 金額 金額_CHAR
優しい地獄 0 '0'
汝、星のごとく 0 '0'
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ 0 '0'
アサイラム・ピース 946 '946'
ようこそ実力至上主義の教室へ3年生編2 814 '814'
ナチュラルボーンチキン 1760 '1760'
素粒子 1650 '1650'
草地は緑に輝いて 2750 '2750'

COALESCE

NULL 値を別の値に置き換えます。
全てNULLの場合はNULLを返します。

基本構文

COALESCE(列や式1,列や式2,列や式3…)

以下のように、「優しい地獄」の金額が空白だったとします。

タイトル 金額
優しい地獄  
汝、星のごとく 0
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ
アサイラム・ピース 946
ようこそ実力至上主義の教室へ3年生編2 814
ナチュラルボーンチキン 1760
素粒子 1650
草地は緑に輝いて 2750

金額がNULLの場合、0に置き換える

SELECT タイトル, 金額, COALESCE(金額, 0) AS 金額_表示
FROM 読書管理;

結果表

タイトル 金額 金額_表示
優しい地獄 NULL 0
汝、星のごとく 0 0
失われた時を求めて(3)──花咲く乙女たちのかげにⅠ 0 0
アサイラム・ピース 946 946
ようこそ実力至上主義の教室へ3年生編2 814 814
ナチュラルボーンチキン 1760 1760
素粒子 1650 1650
草地は緑に輝いて 2750 2750

集計関数

基本構文

SELECT
   SUM(列)  #合計
   MAX(列)  #最大値
   MIN(列) #最小値
   AVG(列) #平均値
   COUNT(列) #レコード数

金額の合計を求める

(COALESCEでNULLを0に置き換えてから合計)

SELECT SUM(COALESCE(金額,0)) AS 合計金額
FROM 読書管理;

結果表

合計金額
7920

最高金額と最低金額を求める

SELECT MAX(金額) AS 最高金額, MIN(COALESCE(金額,0)) AS 最低金額
FROM 読書管理;

結果表

最高金額 最低金額
2750 0

平均金額を求める

SELECT AVG(COALESCE(金額,0)) AS 平均金額
FROM 読書管理;

結果表

平均金額
990.0000

レコード数を数える

SELECT COUNT(*) AS 読んだ本の数
FROM 読書管理;

結果表

読んだ本の数
8

GROUP BY

指定した列ごとにレコードをグループ化して集計を行います。

基本構文

SELECT 列名1, 集計関数(列名2)
FROM テーブル名
GROUP BY 列名1;

ジャンルごとの読んだ本の数を取得する

SELECT ジャンル, COUNT(*) AS 本の数
FROM 読書管理
GROUP BY ジャンル;

結果表

ジャンル 本の数
国内文学 3
フランス文学 2
イギリス文学 2
ライトノベル 1

HAVING

GROUP BY でグループ化した結果に条件を付けます。
WHERE は行単位に条件を付けますが、HAVING はグループ単位に条件を付けます。

基本構文

SELECT 列名1, 集計関数(列名2)
FROM テーブル名
GROUP BY 列名1
HAVING 集計関数(列名2) 条件;

ジャンルごとの読んだ本の数が2冊以上のジャンルを表示する

SELECT ジャンル, COUNT(*) AS 本の数
FROM 読書管理
GROUP BY ジャンル
HAVING COUNT(*) >= 2;

結果表

ジャンル 本の数
国内文学 3
フランス文学 2
イギリス文学 2

まとめ

SQLに限った話ではないですが、構文を覚えては忘れることを繰り返しているので自分用のマニュアル的なものを作ってみました。
振り返り等にご活用いただけますと幸いです。

参考書籍

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?