PostgreSQL(や他の大多数のDBMS)で、次のようにWHERE句でエイリアスを使うとエラーになってしまいます。
SELECT name, AVG(income) AS a FROM employee WHERE a>100 GROUP BY name;
WHERE句でエイリアスを使うにはどうすればいいか聞いたのでメモ。
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| « 5月 | ||||||
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | |||
PostgreSQL(や他の大多数のDBMS)で、次のようにWHERE句でエイリアスを使うとエラーになってしまいます。
SELECT name, AVG(income) AS a FROM employee WHERE a>100 GROUP BY name;
WHERE句でエイリアスを使うにはどうすればいいか聞いたのでメモ。
履歴用テーブルとマスタ用テーブルなど、カラム構成が同じテーブル同士でレコードをコピーしたい場合があります。
このような時は下記のようなSQLを使います。
INSERT INTO table1 SELECT * FROM table2;
他のテーブルと関連した検索条件で抽出した複数のレコードを、
DELETEしたりUPDATEしたりするには下記のようにサブクエリ(副問い合わせ)を使います。
(例)
DELETE FROM table1 WHERE column1 IN (SELECT column1 FROM table2 WHERE …);
複数のカラムでプライマリーキーになっているテーブルがあると、複数のカラムで比較する必要がでてくると思います。
複数のカラムで比較したい場合は、下記のように複数のカラム名をカッコで囲んで書きます。
(例)
DELETE FROM table1 WHERE (column1, column2) IN (SELECT column1, column2 FROM table2 WHERE …);
リレーショナルデータベースのテーブル設計を行っていると、どのカラムにインデックスをつければよいかがよくわからなくなってしまうのは私だけではないと思います。
DBMSがMySQLやPostgreSQLの場合、私はEXPLAIN句を使ってインデックスのつけ忘れがないかをチェックするようにしています。
EXPLAIN句を使うとSELECTクエリの実行計画が表示されるようになり、この情報を元にテーブルのインデックスを設定していきます。
MySQLの場合
EXPLAIN SELECT …
を実行すると表示されるテーブルのうち、チェックすべきカラムは「type」です。
このtypeカラムに「ALL」と表示されているレコードがあれば、そのテーブルのインデックスを見直す必要があるかもしれません。
PostgreSQLの場合
EXPLAIN SELECT …
を実行すると表示される「QUERY PLAN」に「Seq Scan on」から始まる行がある場合、onの後に続くテーブルのインデックスを見直す必要があるかもしれません。
(注意)
テーブルのインデックスは万能ではないので、何でもつけていればよいというわけではありません。
インデックスをつけすぎると更新性能が低下してしまいます。
またデータの種類によってはインデックスをつけても検索速度の向上が見込めない場合があります。
その最たる例はブーリアン値や性別のような限られた少ない種類のデータしか格納されないカラムです。
DBMSによっては、こういったデータ用のインデックス技術が実装されているようですが…。