ExcelでSQLを使う-009: SQL SELECT文 ー SELECT節とINTO節
動物のお医者さん 第1章 |
H大学受験前、その構内に足を踏み入れた時から、ハムテルの運命は決まっていたー。怒った顔でも実は心優しいシベリアン・ハスキーのチョビ、関西弁姉御肌の猫のミケ、傍若無人・暴れん坊鶏のヒヨちゃん、小さな幸せが嬉しいスナネズミ、そして西根家を取り仕切る祖母。片や、ネズミ大嫌いの友人二階堂、アフリカ狂いの漆原教授に低血圧変温人間の菱沼聖子ら超個性派勢ぞろいの面々に囲まれて獣医師への門は開かれた。(同書の帯より)
◇◇◇◇◇
ここからは、{ハスキー流SQLリファレンス}の案内です。文体も、ですます調に変えます。SQLツールのメリットを理解し納得してもらうには、SQLのSELECT文を知ってもらわねばなりません。ツールは、その機能と使い方を知ってなんぼです。宜しく、お付き合い願います。
表から列の選択…SELECT文
データベースの情報を検索するには、SELECT文を使います。SELECT文は次の7つの節を持っています。
SELECT節
INTO節
FROM節
WHERE節
GROUP BY節
HAVING節
ORDER BY節
単一SELECT文
SELECT <選択対象の並び>
INTO <変数の並び>
FROM <表名の並び>
WHERE <検索条件>
SQLツールでは、DLookup関数で一つのエクセルの表から一つの列を検索することができます。
DLookup(SELECT文)/DBLookup(SELECT文) ※青:Excelを更新する関数 茶:Accessを更新する関数
? DLookup("SELECT 曜日 FROM [Sheet3$A1:E100]")
月
? DLookup("SELECT 曜日 FROM [Sheet3$A1:E100]", 3)
水
? DLookup("SELECT 曜日 FROM [Sheet3$A1:E100]", -1)
金
DLookup関数では、《先頭から何番目の列を取得するのか》を指定できます。指定しない場合は、《最初に見つかった列の値》を戻します。マイナス値を指定すると、《最後から検索した列の値》を戻します。複数の表から一つの列を検索することもできます。
複数の表から複数の列を検索するには DSelect関数を使います。DSelect関数は、検索条件に合致する複数の行を検索することができます。
DSelect(SELECT文)/DBSelect(SELECT文)
SELECT節
SELECT節には、値を選択する列の名前を指定します。<選択対象の並び>には、列の名前をカンマで区切って指定します。表の中のすべての列を検索するにはアスタリスク(*)を列名の代わりに指定します。
SELECT * FROM [蔵書一覧$A1:G1000]
DSelect関数の3番目の引数に Chr(13) を指定すると、取得したデータは改行されます。
? DSelect("SELECT ID, 書名 FROM [蔵書一覧$A1:G1000]",,chr(13))
1;犬と楽しく暮らそう
3;Siberian Husky WON WON
4;EIGHT BELLOW(南極物語)
5;軽井沢のボーイ
6;紀州犬
? DSelect("SELECT * FROM [蔵書一覧$A1:G1000]",,chr(13))
1;犬と楽しく暮らそう;;NHK;O O夫他;2001/12/31;2010/01/10
2;盲導犬クイールの一生;;文芸春秋;石黒 謙;2002/01/01;
3;Siberian Husky WON WON;;白泉者;新倉万蔵;2002/01/01;
4;EIGHT BELLOW(南極物語);*;ディズニー;F. マーシャル;2019/03/14;
5;軽井沢のボーイ;;牧野出版;海老原 靖芳;2019/03/15;
6;紀州犬;;光文社;甲斐崎 圭;2010/09/10;
INTO節
SELECT INTO を使って Access の<表1>から <表2> を作ることもできます。
SELECT 列1, 列2, 列3
INTO 表2
FROM 表1
WHERE 条件1
? CnnExecute("SELECT ID, 書名, 出版社, 著者名, 購入日, 廃棄日
INTO 蔵書リスト
FROM 蔵書一覧;", "D:\DB1.mdb")
True
なお、SQLExecute関数を使って[蔵書一覧$A1:G100]から[Sheet7$A1:G100] に新しい表を作ることはできません。エクセルでは、新しい表の生成と追加するにはSQLWriter関数を使います。新しいシートを挿入・追加する場合のシート名は、"New"、”NEW" になります。
? SQLWriter("SELECT ID, 書名, 出版社, 著者名, 購入日, 廃棄日
FROM [蔵書一覧$A1:G100];", "Sheet7")
True
? SQLWriter("SELECT ID, 書名, 出版社, 著者名, 購入日, 廃棄日
FROM [蔵書一覧$A1:G100];", "New")
True
表の削除
INTO節で作成した表を削除するには、CnnExecute関数で DROP TABLE文を実行します。
? CnnExecute("DROP TABLE 蔵書リスト")
True
エクセルの場合も、SQLExecute 関数で DROPT TABLE文を実行します。
? SQLExecute("DROP TABLE [蔵書リスト$A1:G100]")
True
FROM節
FROM節には、データを選択する表を指定します。複数の表を指定する時はカンマで区切ります。次の DBSelect関数は、表1と表2の行データのすべての組合せを検索します。しかし、DSelect関数は、満足いく検索結果を戻しません。そのために、EXcel の複数の表を指定する場合には、ユニオンクエリーを作成する必要があります。
? DBSselet("SELECT * FROM TableName1, TableName2")
? DSelect("SELECT * FROM [Sheet2$B1:L100]
UNION
SELECT * FROM [Sheet6$B1:L100]",,Chr(13))
1;wwww;12;6.1;10;20.1;2019/02/11;22:30:00;6.52;6.5;16
2;wwww;12;6.1;10;20.1;2019/02/12;23:30:00;7.52;7.5;17
3;wwww;12;6.1;10;20.1;2019/02/13;1900/01/01 0:30:00;8.52;8.5;18
4;wwww;12;6.1;10;20.1;2019/02/14;1900/01/01 1:30:00;9.52;9.5;19
5;wwww;12;6.1;10;20.1;2019/02/15;1900/01/01 2:30:00;10.52;10.5;20
6;wwww;12;6.1;10;20.1;2019/02/11;22:30:00;6.52;6.5;16
7;wwww;12;6.1;10;20.1;2019/02/12;23:30:00;7.52;7.5;17
8;wwww;12;6.1;10;20.1;2019/02/13;1900/01/01 0:30:00;8.52;8.5;18
9;wwww;12;6.1;10;20.1;2019/02/14;1900/01/01 1:30:00;9.52;9.5;19
10;wwww;12;6.1;10;20.1;2019/02/15;1900/01/01 2:30:00;10.52;10.5;20
WHERE節
WHERE節で検索条件を指定するとデータを選択的に検索することができます。
SELECT * FROM id管理表 WHERE id_name='perform_id' ← Excel
SELECT * FROM id管理表 WHERE id_name='perform_id' ← Access
フーッ。やっとこさ、SELECT文案内の導入部を書き終えることができました。次は、1996年に私が書いた「SQLリファレンス」の目次です。2-2の翻訳が、やっと終わったということです。明日からは、同リファレンスの第3章に踏み込んでSQLツールのテストと修正を続行します。
(告)SQLExecute関数で削除できるのは、式を含まない列のみです。
ですが、今、式を含む列の有無に関わらず自在にSQLのDELETE文を発行すれば、WHERE節に該当する行を削除するバージョンを書いています。
第1章、データベースの作成
1-1、CREATE DATABASE 文
1-2、CREATE TABLE 文
1-3、インデックスの作成
1-4、CREATE INDEX 文
第2章、データベース操作の基本
2-1、表への行の挿入…INSERT 文
2-2、表から列の選択…SELECT 文
2-3、表の行情報の更新…UPDATE 文
2-4、表から行情報の削除…DELETE 文
第3章、複雑なSELECT 文
3-1、SELECT 節の高度な活用
3-2、WHERE 節の高度な活用
3-3、ORDER BY 節
3-4、複数の表からの検索
第4章、補足
4-1、データベース構造の修正
4-2、表構造の修正
1987年1月、ソニーから Unix マシン NEWS が発売されました。私は、早速に付き合いがあったソフトハウスに1台発注。ほどなく、データベース言語 Inoformix と共に Unix マシンが手元に届きました。そうして、たった一人での生産管理システム(C/Sシステム)の開発がスタートしました。ここで紹介している《SQL リファレンス》のネタ本は、Informix のそれを参考に1996年にSQLServer+AccessでのC/Sサーバーシステム構築マニュアルの一環として書いたものです。また、SQLツールとして紹介しているのは、当時開発した関数をリニューアルしたものです。