忙しいあなたのためのSQL入門 第3回(2)
SELECT文を制する者はSQLを制す(2)
---論理演算子AND,OR,NOT
矢沢久雄 グレープシティ アドバイザリースタッフ
今回のキーワード
・論理演算子AND,OR,NOT
・データの並べ替え
|
図6●東京都に住み年齢が40歳以上の人たち |
|
図7●「東京都に住み年齢が40歳以上」ではない人たち |
論理演算子AND,OR,NOT
「東京都に住み・かつ・年齢が40歳以上の人」のように,複数の検索条件を指定する場合は,WHERE以降で複数の条件式をAND(かつ),OR(または)で組み合せます。前回説明した「ヌルでない」のように否定条件を表す場合には,NOT(~でない)演算子を使います。以下のSQL文を実行して結果を確認してみましょう(
図6[
拡大表示],
図7[
拡大表示])。複数の条件式全体をNOTで否定する場合には,条件式の部分全体をカッコで囲み,その前にNOTを置きます。
SELECT * FROM MeisiTbl WHERE Jusho = '東京都' AND Nenrei >= 40;
|
|
SELECT * FROM MeisiTbl WHERE NOT(Jusho = '東京都' AND Nenrei >= 40);
|
|
範囲を指定する方法
「20歳以上40歳未満」のようなデータの範囲を指定する場合には,WHERE Nenrei >= 30 AND Nenrei < 40とすることもできますが,Nereiという列名が2回も使われるので,SQL文に美しさ(簡潔さ)が感じられません。このような場合には,BETWEENを使うとより美しくなります。以下のSQL文は,Neireiが「20歳以上40歳未満」のデータを取得するものです。
SELECT * FROM MeisiTbl WHERE Nenrei BETWEEN 20 AND 39;
|
|
図8●20歳以上40歳未満の人たち |
BETWEENではANDの前後に下限値と上限値を指定するので,「20歳以上39歳以下」という表現になっていることに注意してください(
図8[
拡大表示])。
「20歳,25歳,30歳,35歳,40歳,45歳のいずれか」のような検索条件で,OR演算子を6個並べるのは美しくありません。このような場合は,以下のSQL文のようにINに続けてカッコの中に値のリストをカンマで区切って指定します。これなら美しいですね。もちろん実行結果は,45歳の「日経太郎」だけとなります。
SELECT * FROM MeisiTbl WHERE Nenrei IN(20,25,30,35,40,45);
|
同じ結果が得られるなら,どのようなSQL文であっても構わないのですが,見た目に短くてわかりやすく,かつ実行速度(SQL文を実行してから,結果が得られるまでの時間)が短いほどよいSQL文だと言えます。そのためには,経験を積んで行くしかありません。
|
図9●列の並び替え |
データの並べ替え
SQL文の実行によって得られるデータは,実際のデータベースではなくてビューなのですから,データベース本体に影響を与えることなく,ビューのデータを自由に並び替えることができます。
まず,列の並び替えです。これは,SELECTの後ろに指定された列名の順序通りになります。以下のSQL文を実行してみましょう。データベース本体では,列がShimei,Jusho,Nenreiの順に並んでいますが,取得されたデータの列は,Nenrei,Shimei,Jushoの順になります(図9[拡大表示])。
SELECT Nenrei,Shimei,Jusho FROM MeisiTbl;
|
|
図10●行の並び替え |
今度は,行の並び替えです。これは,修飾語にORDER BY Nenreiのように指定します(WHERE節がある場合は,その後にORDER BY節を置きます)。これによって,取得されたデータは,Nenreiの昇順(小さい順)で並び替えられます。降順(大きい順)にしたい場合は,終わりに降順を示す「DESC」を指定し,ORDER BY Nenrei DESCとします。ちなみに昇順(小さい順)ならASCを指定します。以下のSQL文を実行してみましょう。一番年下の「日経花子」が先頭になるのがわかります(
図10[
拡大表示])。
SELECT * FROM MeisiTbl ORDER BY Nenrei;
|
|
図11●Accessのエラーメッセージ |
|
図12●該当データなしの場合 |
SQL文のエラー
最後にSQL文がエラーになったら,どうなるかを説明しておきましょう。SELECT * FROM MeisiTbl WHERE; のように,わざと間違った(ここでは,WHERE以降の検索条件がありません)SQL文を実行してみましょう。Accessの場合は,
図11[
拡大表示]のようなエラーメッセージが表示されます。つまり,「あなたなのSQL文を解釈できません!」ということをDBMSが知らせて来たのです。
SELECT * FROM MeisiTbl WHERE Nenrei = 100; というSQL文を実行したら,検索条件に該当するデータはありません。これは,エラーではありませんが,DBMSが何も返事をしないのではなく,「該当データなし」を知らせてきます。Accessの場合は,図12[拡大表示]のような空のビューが表示されます。
前回と今回は,SQLの命令の中で最も頻繁使われるSELECT文の使い方にテーマを絞って説明しました。Accessを使って直接SQL文を実行する方法も分かりましたね。皆さんが入力したSQL文の命令をAccessが解釈して結果を返してくれるので,DBMSを思い通りに操作できるような嬉しい気持ちになったことと思います。事実,その通りなのです。SQLをマスターすれば,Accessだけでなく,あらゆるDBMSを自由自在に操れます。
次回は,残りの3つの命令であるINSERT,UPDATE,DELETEの使い方,及びSQLで提供されている関数を説明します。お楽しみに!
◎今回の復習
・SELECT文のWHERE節では「WHERE 列名 演算子 値」という書式で検索条件を指定する
・複数の検索条件を指定する場合は,WHERE以降で複数の条件式をAND(かつ),OR(または)で組み合せる
・否定条件を表す場合には,NOT(~でない)演算子を使う
・データの範囲を指定する場合には,BETWEENを使う