🚀 ニフティ’s Notion

【DB2025 #4】SQL

目次

SQLとは

  • RDBMSを操作するための言語のことを SQL と呼ぶ
    • SQLを用いて書かれたDBを操作する命令のことを クエリ や、 SQL文 と呼ぶ
  • DBの中にある数万・数百万もの膨大なデータを効率的に操作することが可能
  • 国際標準化されているため様々なDBで利用できる
    • 先程紹介したOracle、MySQL、PostgreSQL、Microsoft SQL Serverでも使える
    • RDBMSによって 文法の違いサポートされていない演算子 があるため、公式ドキュメントを読んで何が使えるのか確認することが大切

SQL文の種類

  • 以下、例文がありますが、演習で使うMySQLの構文で書かれています
  • 参考として他のRDBMSも交えつつ紹介します
①データ操作言語(Data Manipulation Language, DML)

  • 「game」テーブルを例に使い方を見てみよう

    「game」テーブル

    id title
    1 アストラル
    2 ゼノン
    3 レムナント
    4 ブレイク・オブ・ドーン
  • SELECT(データの検索)
    SELECT *
    FROM
      game
    WHERE
      id = 2;
    • 「game」テーブルから、idが2のレコードを全て表示
    id title
    2 ゼノン
  • INSERT(データの追加)
    INSERT INTO
      game (id, title)
    VALUES
      (5, ‘グレイヴヤード・シフト’);
    • 「game」テーブルに、idが5でtitleがグレイヴヤード・シフトのデータを追加
      id title
      1 アストラル
      2 ゼノン
      3 レムナント
      4 ブレイク・オブ・ドーン
      5 グレイヴヤード・シフト
  • UPDATE(データの更新)
    UPDATE game
      SET id = 5
        , title = ‘アストラル2WHERE
      id = 1;
    • idが1のデータを、idが5・titleがアストラル2のデータに更新
      id title
      5 アストラル2
      2 ゼノン
      3 レムナント
      4 ブレイク・オブ・ドーン
  • DELETE(データの削除)
    DELETE FROM
      game
    WHERE
      id = 2;
    • idが2のデータを削除
      id title
      1 アストラル
      3 レムナント
      4 ブレイク・オブ・ドーン
データ定義言語(Data Definition Language, DDL)

  • CREATE(テーブルの作成)
    CREATE TABLE mydb.game (
      id INT
      , title VARCHAR(128)
    );
    • id(int)とtitle(varchar)を持つ「game」テーブルを「mydb」データベースの中に作成
      id title
      1 アストラル
      2 ゼノン
      3 レムナント
      4 ブレイク・オブ・ドーン
  • ALTER(テーブルの設定変更)
    ALTER TABLE
      game
    ADD
      device int;
    • 「game」テーブルにint型でdeviceというカラムを追加
      id title device
      1 アストラル
      2 ゼノン
      3 レムナント
      4 ブレイク・オブ・ドーン
  • DROP(テーブルの削除)
    DROP TABLE
      game;
    • 「game」テーブルを削除
  • TRUNCATE(テーブルデータの削除)
    • 「game」テーブルのデータをすべて削除
      id title
ℹ️
些細な違いに気をつけよう!
  • 他のRDBMSを使っていて 「同じだろう」と思っていると微妙に違ったりする
    Oracle PostgreSQL
    NULLと空文字の扱い 同一として扱う 別物として扱う
    抽出行数指定 WHERE句でROWNUM擬似列を使用して指定
    ※12c以降はFETCH FIRST ROWS ONLYなどで代替
    LIMIT句で指定
SQL文のお作法

読みづら~いSQL

select id, name, age, gender, country from users where age>=18 and country='Japan'or country='USA' and gender='Female' order by age desc limit 10;
読みやすく書くためのポイント
  1. インデント を入れる
  2. キーワード(SELECTやWHEREなど)は 大文字 にする
  3. それ以外(カラム名や値)は 小文字 にする
  4. それでもわかりにくい部分には コメント を入れる
    1. -- でコメントアウト
      1. 例「-- ほげほげ」

読みやすくしてみる
-- 年齢が18歳以上の女性ユーザーを国で絞り込み、年齢の降順で上位10件を取得する
SELECT
  id,
  name,
  age,
  gender,
  country
FROM
  users
WHERE
  age >= 18
  AND (
    country = 'Japan'
    OR country = 'USA'
  )
  AND gender = 'Female'
ORDER BY
  age DESC
LIMIT
  10;

※書き方に100点の正解はないのでいろいろ模索してみよう

サブクエリとは

  • サブクエリとは、SQL文の中に含まれる別のSQL文。
    • クエリの中でさらに別のクエリを実行することで、より複雑な条件での検索や集計が可能。
  • 「game」テーブル
id title
1 アストラル
2 ゼノン
3 レムナント
4 ブレイク・オブ・ドーン
  • 「sales」テーブル
game_id units_sold sales_date
1 2000000 2024-01-01
2 1500000 2024-02-15
3 800000 2024-03-20
SELECT title
FROM game
WHERE id IN (
    SELECT game_id 
    FROM sales 
    WHERE units_sold > 1000000
);
  • このような例では、サブクエリを使って売上数が100万本を超えているゲームのタイトルを取得している。
  • 外側のクエリ(メインクエリ)はゲームテーブルからタイトルを選択し、内側のクエリ(サブクエリ)は売上テーブルから条件を満たすゲームIDを取得する。
サブクエリのメリット:
  • 複数のテーブルからデータを効率的に取得できる
  • 条件に基づいた動的なフィルタリングが可能
  • 集計結果を基にした更なる検索や絞り込みができる
サブクエリのデメリット:
  • 過度に複雑なサブクエリは可読性を低下させる可能性がある
  • 多重のサブクエリはパフォーマンスに影響を与える可能性があるため、必要な場合のみ使用する
  • JOINを使用した方が効率的な場合もあるため、適切な方法を選択する必要がある

次: 【DB2025 #5】チューニング