実践 mSQL その 2
実践 mSQL その 2
ちょっと複雑な SQL
ちょっとだけ複雑な SQL の使い方です。
といっても、自由に mSQL を操作する基本です。
複数のテーブルを結び付けた SELECT
さて、部門名のテーブルと、 社員情報のテーブルを別テーブルにしてしまいしたが、 社員名と部門名の対応表を得たい場合もあるでしょう。 関係づけられた複数のテーブルを結びつけて扱うことこそ、 リレーショナル(関係)データベースの基本です。 社員テーブルには部門 ID しか入っていませんが、 部門テーブルからその ID に対応した部門名を取り出して、 社員名との対応表を作るには、以下のようにします。
select EmpTbl.name, DivTbl.val
from EmpTbl, DivTbl
where EmpTbl.div = DivTbl.id
name val 宮前 竜也 開発部 鈴木 陽二朗 営業部 畠山 めぐみ 企画部 菊地 直人 開発部
このように、カラム名を指定する際に、「どのテーブルのカラムか」
指定することができます。これで複数テーブルにまたがった SELECT が可能です。
日本語の扱い
私が確認した範囲では、
EUC または SJIS のデータなら問題なく格納できるようです。
JIS はうまくいきませんでした。
とりあえず無難なところで、EUC を使うことをお勧めします。
また、日本語では like または clike 演算子が使えないようです。
しかし、より強力な rlike は使えるようですので、困ることはないでしょう。
これらの正規表現演算子については、次節を参照してください。
比較演算子について(WHERE 句の書き方)
数値の比較
ここまでは、WHERE 句での検索条件の表現には、 =(イコール)演算子しか使用していませんでしたが、 それ以外に、数値であれば、<, >, <=, >= などの比較演算子も当然使えます。 例えば、price の値が 500 以上のレコードを取り出したい時の WHERE 句は、 以下のようになるでしょう。
where price >= 500
複合条件
もちろん and や or を使った複合条件指定もできます。 この辺は説明するまでもないでしょう。 price が 500 〜 1000 の範囲のレコードを取り出したければこうなります。 優先順位を明示するために、このように括弧を付けることもできます。
where (price >= 500) and (price <= 1000)
文字列の比較
文字列を比較する場合は、このような「完全一致」より、 「部分一致」等の方が使う頻度が高いでしょう。 like ファミリーを使うと、部分一致だけでなく、 正規表現を用いた、より複雑な文字列比較ができます。
LIKE
これは SQL 標準の文字列比較演算子です。 正規表現キャラクタは 2 つしかなく、_ が任意の 1 文字、 % が 0 文字以上または複数の文字にマッチします。 つまり、以下のようにすることで、部分一致の検索ができます。 ただし、日本語は扱えません。
where name like '%Miyamae%'CLIKE
これは SQL 標準の文字列比較演算子ではありません。 使い方は LIKE と同じですが、英大文字と小文字を区別しません。 ただし、日本語は扱えません。
RLIKE
これは SQL 標準の文字列比較演算子ではありません。 RLIKE の正規表現は、UNIX の標準的な正規表現と同じ構文です (. ^ $ [] * をサポートしています)。 非常に柔軟に条件指定ができます。 日本語を扱うこともできますが、[] のグルーピングには対応しません。 以下は、name フィールドが Miyamae で始まるレコードを指定します。
where name rlike '^Miyamae'
その他の SELECT の機能
ORDER BY 句
結果を指定カラムでソートしてから取り出します。 デフォルトは昇順で、desc を付けると降順になります。 ソートキーとして指定するカラムは、 SELECT で選ばれているカラムでなければなりません。
order by カラム名 [desc]
EmpTbl の内容を name で降順にソートして取り出すには以下のようにします。
select * from EmpTbl
order by name desc
DISTINCT
distinct を指定すると、重複行が消去されて取り出されます。
select distinct name from EmpTbl
[ 目次 ]