【DS検定対策17】SQLとRDBMSをやさしく整理

データサイエンス

SQLはおそらく実践で使っていくのが一番身につくと思います。しかし、DS検定を受ける人は実際にコーディングなどはせずリテラシのみ学習という方も多いと思います。(私もそうです^^)
とりあえずDS検定対策として、覚えておくべきところを単なる暗記ではなく(こじつけでも)
頭に残るように整理していきます。
たくさんありますが、リテラシレベルということで、あまり深堀はせずにまとめていきます。

RDBMSとは?代表的な種類と覚え方

名前特徴語感で覚えるコツ
MySQL軽くて速い。Web開発で定番「マイ・スクール」=初心者にやさしい
PostgreSQL高機能で厳密。業務系に強いポスト(次世代)+グレード」=高性能
SQLiteファイル1つで動く。アプリ向けライト=軽い」=持ち運びできるDB

※HeidiSQLはRDBMSではなく、これらを操作するためのツール(GUI)です。

🧾 SQLの基本構文と読み方

SELECT:選ん取り出す(射影)

SELECT 名前 FROM 顧客;

→ 顧客テーブルから「名前」カラムだけを選んで取り出す。

SELECT * FROM 顧客;

→ 顧客テーブルからすべてのカラムを取り出す。

WHERE:条件で絞る

SELECT * FROM 顧客 WHERE 年齢 > 60;

→ 年齢が60より大きい人だけを取り出す。

GROUP BY:グループにまとめる

SELECT 地域, COUNT(*) FROM 顧客 GROUP BY 地域;

→ 地域ごとにまとめて人数を数える。

HAVING:まとめた後に絞る(~の性質を持つグループを対象に)

SELECT 地域, COUNT(*) FROM 顧客 GROUP BY 地域 HAVING COUNT(*) > 10;

→ 人数が10人より多い地域だけを取り出す。

ORDER BY:並び替え

SELECT 名前 FROM 顧客 ORDER BY 年齢 ASC;

→ 年齢が若い順に並び替えて名前を取り出す。

SELECT * FROM 顧客 ORDER BY 年齢 DESC;

→ 年齢が高い順に並び替えてすべてのカラムを取り出す。 DESCは逆

SELECT * FROM 顧客 ORDER BY RAND() LIMIT 3;

→ ランダムに並び替えて上位3件だけを取り出す。

LIMIT:上限を決める

SELECT * FROM 商品 LIMIT 5;

→ 商品テーブルから上位5件だけを取り出す。

CAST:型にキャスティングする(役割を与える)

SELECT CAST(年齢 AS CHAR) FROM 顧客;

→ 年齢を文字列に変換して取り出す。

PostgreSQLでは 年齢::CHAR と書くこともできる。

CASE:条件に応じて(~の場合)値を切り替える

SQLでは IF 文は使えません。代わりに CASE 文を使います。

  • 単純CASE:1つのカラムの値に応じて分岐
SELECT 
  名前,
  CASE 性別コード
    WHEN 'M' THEN '男性'
    WHEN 'F' THEN '女性'
    ELSE '不明'
  END AS 性別
FROM 顧客;
  • 検索CASE:条件式に応じて分岐
SELECT 
  名前,
  年齢,
  CASE 
    WHEN 年齢 < 13 THEN '子ども'
    WHEN 年齢 >= 65 THEN 'シニア'
    ELSE '大人'
  END AS 年齢区分
FROM 顧客;

EXISTS:データのイグジスト(存在)確認

WHERE EXISTS (
  SELECT *
  FROM 注文
  WHERE 注文.顧客ID = 顧客.ID
)

 → 副問い合わせの結果が1件でもあれば、条件を満たす
   ※「そのデータがあるか?」を確認する命令

JOIN(テーブルをつなぐ

種類説明
LEFT OUTER JOIN左側のテーブルの全データ+右側の一致する部分
FULL OUTER JOIN両方のテーブルの全データ(重なりも含む)
INNER JOIN両方に共通するデータだけを取り出す
UNION複数のSELECT結果を縦に結合(重複は除外)

集計関数

関数説明記入例
COUNT件数を数えるSELECT COUNT(*) FROM 顧客;
SUM合計を出すSELECT SUM(売上) FROM 注文;
AVG平均を出すSELECT AVG(年齢) FROM 顧客;
MAX最大値を出すSELECT MAX(価格) FROM 商品;
MIN最小値を出すSELECT MIN(価格) FROM 商品;

演算子

演算子説明記入例
AND両方の条件を満たすWHERE 年齢 > 20 AND 地域 = ‘東京’
ORどちらかの条件を満たすWHERE 地域 = ‘東京’ OR 地域 = ‘大阪’
IN候補の中に含まれるWHERE 地域 IN (‘東京’,’大阪’)
BETWEEN範囲に含まれるWHERE 年齢 BETWEEN 20 AND 29

テーブル作成時のオプション

テーブル作成は CREATE

CREATE TABLE IF NOT EXISTS 顧客 (
  ID INT NOT NULL AUTO_INCREMENT,
  名前 CHAR(50) DEFAULT '未登録'
);
オプション説明
IF NOT EXISTSすでに存在していたら作らない
NOT NULL空欄を許さない
AUTO_INCREMENT自動で番号を振る(MySQL)
DEFAULT値が入っていないときの初期値

データ操作(DML):追加・変更・削除

命令説明記入例
INSERTデータを追加するINSERT INTO 顧客 (名前, 年齢) VALUES (‘佐藤’, 45);
UPDATEデータを変更するUPDATE 顧客 SET 年齢 = 50 WHERE 名前 = ‘佐藤’;
DELETEデータを削除するDELETE FROM 顧客 WHERE 名前 = ‘佐藤’;

RANDOM():ランダムな数値を生成する

SELECT RAND();

→ ORDER BY RAND()でランダム抽出できる、0以上1未満のランダムな小数を生成する。

並び替えに使うと、データをランダムに抽出できる。

SELECT * FROM 顧客 ORDER BY RAND() LIMIT 3;

LIKE演算子:あいまい検索をする

SELECT * FROM 顧客 WHERE 名前 LIKE '佐%';

→ 名前が「佐」で始まる人を検索する。

  • %:任意の文字列(0文字以上)
  • _:任意の1文字

データ型

データ型分類説明・用途語感・覚え方
BOOLEAN論理値型true / false の真偽値フール = 嘘?
BOOLBOOLEANの別名↓(MYSQL)
BIT(M)ビット列:最大64桁ビット列
TINYINT数値型(整数)極小 整数1byteタイニー(極小)
SMALLINT小 整数2byteスモール(小)
MEDIUMINT中 整数約3byteミディアム(中)
BIGINT大 整数8バイトビッグ(大)
INTEGER普通 整数4バイトインテジャ=整数
FLOAT(M,D)↓(浮動小数点)単精度の浮動小数点数フロートな小数
REAL(M,D)↓  ↓倍精度の浮動小数点数リアルな小数
DECIMAL(M,D)↓(固定小数点)固定小数点数
(精度指定可能)
デシマル
小数点を固定
NUMERIC(M,D)↓  ↓DECIMALと同等
(標準SQL)
ナン(バー)
数値そのもの

まとめ:SQLは「構文」ではなく「会話」で

SQLは、データベースに「何をしたいか」を伝える言語として、構文を丸暗記するのではなく、言葉の意味と目的を理解したいですね。

コメント