SQLを使う(4)

LEFT JOIN、RIGHT JOIN - 外部結合

  • リレーションを張れば複数のテーブルからデータを取り出すことができますが、取り出せないデータもあります
  • その場合は、テーブルの結合の方法を変えることで、片方のテーブルには存在しないデータを取り出し表示させることも可能です
値が0のデータは表示されない
SELECT i . item_name , SUM( c . count ) FROM my_items i , carts c WHERE i . id=c . item_id GROUP BY c . item_id;


この時点で、売上のない「ブルーベリー」は表示されません。
このことを表示するために「外部結合」を利用します。

外部結合
  • 一方のテーブルにさえデータがあれば、必ず表示されるというリレーションを作ることができます
SELECT i . item_name , SUM( count ) FROM my_items i LEFT JOIN carts c ON i . id=c . item_id GROUP BY c . item_id;



外部結合の使い方


SELECT … FROM テーブル1 LEFT JOIN テーブル2 ON 結合の条件 WHERE …

内部結合


SELECT … FROM テーブル1 INNER JOIN テーブル2 ON 結合の条件 WHERE …

DISTINCT、BETWEEN、IN、LIMIT - その他の便利なSQL

DISTINCT - 重複をなくす
SELECT item_id FROM carts;


  • 以下のように変更します
SELECT DISTINCT item_id FROM carts;


BETWEEN - 間を示す
SELECT * FROM my_items WHERE price >= 50 AND price < 150;


  • このSQLは、以下のようにも記述できます
SELECT * FROM my_items WHERE price BETWEEN 50 AND 149;
IN - 複数の値を一気に指定する
SELECT * FROM my_items WHERE id=2 OR id=4;


  • このSQLは、以下のようにも記述できます
SELECT * FROM my_items WHERE id IN ( 2, 4 );
LIMIT - 件数を制限する
  • 何万件もあるようなテーブルの場合に、検索結果の表示を制限を加えることができます
SELECT * FROM carts LIMIT 2;



始まりの位置を指定する

SELECT * FROM carts LIMIT 2, 3;




… LIMIT 開始位置 , 件数

AS - フィールドに別名をつける
SELECT i . item_name , SUM( c . count ) FROM my_items i , carts c WHERE i . id=c . item_id GROUP BY c . item_id;


  • 販売数の合計部分のフィールド名は「SUM( c.count )」という名前になります
  • このままでは何の結果なのかがわかりにくい状態なので、別名をつけてわかりやすくします
SELECT i .item_name , SUM( c . count ) AS sales_count FROM my_items i , carts c WHERE i .id=c . item_id GROUP BY c . item_id;


3つのテーブルのリレーション
SELECT m . name , i . item_name , SUM( c . count ) AS sales_count FROM makers m , my_items i LEFT JOIN carts c ON i .id=c . item_id WHERE m . id=i . maker_id GROUP BY c . item_id ORDER BY sales_count DESC;



バックアップとリストア

MySQLのバックアップ
  • エクスポート


  • 「実行」ボタンを押すと「mydb.sql」というファイルが保存されます
リストア
  • なんらかの理由で「mydb」が壊れてしまった場合に、復旧させます
  1. 壊れてしまった「mydb」を削除する
  2. 新規データベース「mydb」を作成する(照合順序:utf8_general_ci)
  3. インポート