目次
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 グレイヴヤード・シフト  
 - 
        
  
    
      
        
          
            「game」テーブルに、idが5でtitleがグレイヴヤード・シフトのデータを追加
          
        
      
    
  
        
 - 
        
  
    
      
        
          
            UPDATE(データの更新)
          
        
      
    
  
        
UPDATE game SET id = 5 , title = ‘アストラル2’ WHERE id = 1;- 
        
  
    
      
        
          
            idが1のデータを、idが5・titleがアストラル2のデータに更新
          
        
      
    
  
        
id title 5 アストラル2 2 ゼノン 3 レムナント 4 ブレイク・オブ・ドーン  
 - 
        
  
    
      
        
          
            idが1のデータを、idが5・titleがアストラル2のデータに更新
          
        
      
    
  
        
 - 
        
  
    
      
        
          
            DELETE(データの削除)
          
        
      
    
  
        
DELETE FROM game WHERE id = 2;- 
        
  
    
      
        
          
            idが2のデータを削除
          
        
      
    
  
        
id title 1 アストラル 3 レムナント 4 ブレイク・オブ・ドーン  
 - 
        
  
    
      
        
          
            idが2のデータを削除
          
        
      
    
  
        
 
② データ定義言語(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 ブレイク・オブ・ドーン  
 - 
        
  
    
      
        
          
            id(int)とtitle(varchar)を持つ「game」テーブルを「mydb」データベースの中に作成
          
        
      
    
  
        
 - 
        
  
    
      
        
          
            ALTER(テーブルの設定変更)
          
        
      
    
  
        
ALTER TABLE game ADD device int;- 
        
  
    
      
        
          
            「game」テーブルにint型でdeviceというカラムを追加
          
        
      
    
  
        
id title device 1 アストラル 2 ゼノン 3 レムナント 4 ブレイク・オブ・ドーン  
 - 
        
  
    
      
        
          
            「game」テーブルにint型でdeviceというカラムを追加
          
        
      
    
  
        
 - 
        
  
    
      
        
          
            DROP(テーブルの削除)
          
        
      
    
  
        
DROP TABLE game;- 「game」テーブルを削除
 
 - 
        
  
    
      
        
          
            TRUNCATE(テーブルデータの削除)
          
        
      
    
  
        
- 
        
  
    
      
        
          
            「game」テーブルのデータをすべて削除
          
        
      
    
  
        
id title  
 - 
        
  
    
      
        
          
            「game」テーブルのデータをすべて削除
          
        
      
    
  
        
 
    ℹ️
  
  
    
  
    
      
        
          
            些細な違いに気をつけよう!
          
        
      
    
  
    
- 
        
  
    
      
        
          
            他の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;
        
  
        
          
            
  
    
      
        
          
            読みやすく書くためのポイント
          
        
      
    
  
          
        
      
      - インデント を入れる
 - キーワード(SELECTやWHEREなど)は 大文字 にする
 - それ以外(カラム名や値)は 小文字 にする
 - 
        
  
    
      
        
          
            それでもわかりにくい部分には
          
        
      
    
  
  
    
      
        
          
            コメント
          
        
      
    
  
  
    
      
        
          
            を入れる
          
        
      
    
  
        
- 
        
  
    
      
        
          
            -- でコメントアウト
          
        
      
    
  
        
- 例「-- ほげほげ」
 
 
 - 
        
  
    
      
        
          
            -- でコメントアウト
          
        
      
    
  
        
 
読みやすくしてみる
-- 年齢が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を使用した方が効率的な場合もあるため、適切な方法を選択する必要がある