SQLメモ – よく使うSELECT文を集めてみた

/web/server-side

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

読んで字のごとく。突っ込み歓迎! ちなみにMySQLです。

  • 複数のテーブルからレコードを取り出す
  • 複数の値と一致するレコードを取得する
  • 副問合せ
  • レコード件数を返す
  • 取得したレコード、の値の合計
  • 平均値を求める
  • 値がNULLのもの
複数のテーブルからレコードを取り出す
  1. SELECT table1.*
  2. FROM table1,table2
  3. WHERE table1.key1 = table2.key1
  4. AND table1.field2 = 'value'
  5. AND table2.field2 = 'value';

memo: これは等価結合の場合。どちらかのデータが存在しない場合は結果に含まれない。

複数の値と一致するレコードを取得する
  1. SELECT *
  2. FROM table
  3. WHERE field IN (value1,value2,value3);
副問合せ(サブクエリ)
  1. SELECT *
  2. FROM table1
  3. WHERE key2 IN (SELECT key1 FROM table2 WHERE field1 = 'value');
取得したレコード件数を返す
  1. SELECT field1,COUNT(field1) AS cnt_title
  2. FROM table
  3. GROUP BY field1
  4. ORDER BY cnt DESC;

memo: NULL値もカウントする場合は COUNT(*)

memo: 純粋に一致した行数をカウントするだけなら COUNT(*) のみの指定が最も速い。

合計値を返す
  1. SELECT SUM(field1) AS sum_title
  2. FROM table1
  3. WHERE key2 IN (SELECT key1 FROM table2 WHERE field1 = 'value');
平均値を求める
  1. SELECT AVG(field1)
  2. FROM table1
  3. WHERE field2 <= 80;
値がNULLのもの
  1. SELECT key1,field1
  2. FROM table
  3. WHERE field2 IS NULL;

パフォーマンス・チェック

mytop -dtest -s1
  • -d: データベース
  • -u: ユーザ
  • -p: パスワード
  • -s: 更新時間(秒)

シェルから top コマンド風に MySQL の状態が確認できます(ドキュメント)。遅いクエリがあれば EXPLAIN 等からチェックすると良い。

Update

2008.05.29 : COUNT()にNULL値の場合を追加。いつも PRIMARY KEY を入れてたので意識外でした^^;

2008.05.29 : 平均と合計のサンプルが同じものになっていた所を修正。id:ramsに感謝!

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。