● 用語:「SQL」とは?
※まえがき
「SQL」は、Excelの「Microsoft Query/QueryTableオブジェクト/ピボットテーブル(PivotCacheオブジェクト)ADO/DAO/Power Query/PowerPivotも?かな?(未調査です)」、Accessの「クエリ/ADO/DAO/フォームやレポート等の部品の随所」、SQL Server、SQL Server Express、MSDE、オラクル、MySQL、PostgreSQL、その他(多分Googleスプレッドシートも?)などなど、(データ管理系・計算系のソフトだけですけど)ソフトの垣根を越えて使えるもの(=理論であり、機能であり、ある意味プログラム言語)です。
そこそこ複雑な複数の条件でのデータの読み込み・書き換え・集計・リストアップなどに使います。
そして、それが「面倒くさいループ処理なし」で「ExcelVBAよりも短い命令文で」「セル番地単位ではなく列名単位の読み直しがしやすい命令文で」やれます。
例えばExcelの場合ならその分野において「だけ」は、「ExcelのVBAやワークシート関数なんかよりもよっぽど役に立つ・2~10倍は役に立つ」、そういっても過言ではないくらい、そして、VBAと併用すれば「便利かつ、2~10倍は高コスパを実現できるもの」です。(「VBAやワークシート関数なんかより」とは言いすぎでした。すみません。でもSQLがあると、無駄なVBA:特に無駄なループ処理や無駄なワークシート関数がかなり減るのも事実です。)
また、Googleやその他大企業の社内システム、世界中のWebカートシステムの多く、弥生シリーズや奉行シリーズといった市販のビジネスソフトのシステム、それ以外の会計システムや顧客管理システム、売り上げ管理システム、在庫管理システム、人事用システム、等々、世界中の本当に多くのシステムが「SQL」を土台とした、「データベースシステム」でできています。
SQLは、例えば Excelで使う場合、「機能としての面」から見ますと、以下のようなことが、「1回の処理で」、「すべて・1発で・全部同時に」行える、「ちょっとハイブリッドな機能(超高機能な、出来合い自動計算器)」です。
・VLOOKUP関数などの、関数を使っての表と表との紐付け
(横も縦もできます。もちろん、2枚だけでなく、3枚・4枚とできます。)
・オートフィルタ機能のような絞り込み(もちろん複数条件での。)
・並べ替え機能のような並べ替え
(もちろん複数の列でいくつでも・列ごとに昇順・降順で。)
・「集計」の機能やピボットのような集計関数を使ったようなグループ化集計
(グループ化しての、四則演算、個数カウント、平均出し、最大・最小値出し、など)
・命令文のネスト(入れ子構造)的な処置ができます。(副問い合わせ、といいます)
・その集計・リストアップの結果を、常に、ピボットテーブルのソースにできて、集計等の内容変更が常にピボットに反映できる。
これらを「すべて・1回の処理で・1発で・全部同時に」行えます。
また、「基本ループプログラム(繰り返し処理のプログラム)を書かなくてもそれらが一発で同時に処理できる」ので、ExcelVBAよりも高速に処理が終わることもあります。(もちろん、いつも絶対、ではありませんが。)
というわけで、「集計やリストアップに関して ” だけ ” 」言えば、「例えば ” ExcelVBAごとき ” なんか、まったくもってSQLの比ではなく(?あれ?逆かな?日本語難しい)、足元にも及びません。」・・・と言っていいものかどうかわかりませんが、事実、そう言いたくもなるくらい、ExcelVBAよりも「コスパが5~10倍以上に跳ね上がる場面」が増え、かつ、便利に使える場面が少なくありません。
Excel2000以前から実装されていますが、2000からが扱いやすいです。(高校の商業科では教えているところもあるのに=基礎なら高校生でもわかるのに、なぜかVBA講師たちやほとんどのパソコン教室は教えてくれません。Excelの大きな使用目的のひとつは計算・集計・リストアップ、なのに。)
(Excelでは閉じたExcelファイルのデータの「書き込み」にも使えます。)
これにより、Excelでは、場合によっては「大幅・かつ・ムダなVBAプログラムやワークシート関数を激減」させることができます。
また、VBAができるよりもお給料がよくなるケースも多いものです。
理由は、SQLは「Excel」の基礎「ではなく」、「データ管理」の基礎だからです。
それゆえ色んなソフトで応用が利きますから、特に「お若い方々」は、VBAを習うより、SQLを深く習うほうをおすすめします。(あと、ぶっちゃけ、Excelのワークシート関数における、「よく使われる関数」には、再度ぶっちゃけ『SQLを使わないとしたらどうしたらいいか?という穴埋めのために作られたのでは?』と思わせられるものが結構多いです。って僕はほとんど使ったことないですけど・・・。)
ちなみにですが、僕はVBAの下の下しかやれない・・・そんなレベルの頭しかもっていませんで、でもって「SQL」は奥が深いもんですからぜんぜんちゃんとやれていません。
簡単な部分しかできません。ただ、でもそれでも重宝しています。
SQLは、「僕みたいなバカ・カスでも、扱える部分がちゃんとある」のです。
なので、「中高生でも扱える」部分も多々あります。
なので、高校の商業科でも教えられています。
習得についても、ある本によると(かいつまんでの僕の勝手な要約ですが)、
『 (ExcelVBAも含め)C#やJava、Ruby、Pythonなどの手続き型の言語でゴリゴリにプログラムを書いてきた人たちは、そのやり方(特にループ処理)から抜け出せなくてSQLを理解できない・敬遠する・面倒がる・ちゃんとしたSQLの基礎をやろうとしない人が多いですよ。理解できる人が上に居ないために社内ルールで逆に制限かけてしまうこともありますし。それでわざわざループを2重3重に入れて低速にしてしまうこともある・・・。
(僕の感想→ある意味バックエンドに高速なデータベースエンジンを使っている意味が無い・・・みたいなこと?)
逆に、ExcelワークシートでLOOKUP関数やIF関数などを使えるだけくらいの派遣の方のほうが、ゴリゴリのC#やJavaを書く人よりも習得が早いです。
そういう風に、派遣の方のほうがあっという間にSQLを習得してしまうという現場を、私は何度も目にしています。
あるExcelシート処理(だけ)に慣れた事務職の方は、私のSQL講座に参加して、2日目でDMLについて私と同じレベルになった人もいました。 』
みたいな感じことが書いてあります。
(※DML・・・データの取得/追加/編集(更新)/削除などのテーブル操作する命令こと?)
※・・・結果、派遣の事務職の方のほうが、「SQLを敬遠しているゴリゴリのプログラマ達」が書くよりも「高速な処理」が、「SQLを敬遠しているゴリゴリのプログラマ達」よりも素早く書ける・・・ということなんでしょうか???わかりませんけど・・・。
僕はバカなのでSQLは少ししか扱えず、そんなこと想像もできませんが・・・・。
また、例えばExcelの場合では、セルアドレスベースのわかりづらいプログラム(読みづらいプログラム)を書く量がぐっと減ってわかりやすくなりますし、「無駄」な「VBAプログラムの多用やワークシート関数の多用」も減ります。特に、「複数の複雑な条件でのデータ抽出(=仮想表の作成)のプログラム」でそれが顕著です。
あと、Accessが無くてもAccessのMDBファイルやSQL Server、オラクル、などのデータベースのデータも読み書きできます(odbcドライバ経由で)。
さらには、閉じたExcelファイルのデータを「そのExcelファイルを閉じたまま」、読み込むことはもちろん、書き換えたりすることもできてしまうので、とても便利です。
つまり、VBAだけでは実現できないことが実現できたりもしますし・・・、ということになります。
プログラム作成が、難易度が上がって自分の手に負えなくなってシステム業者に外注するときも、システム業者はVBAよりもSQLのほうがスラスラに理解しやすいので、外注費を少しでも安くできます。小規模な基幹システム構築の場合、Accessで作ったほうがいい理由もここにあります。こちらにも書きましたが、AccessはSQLを使うことが前提のソフトで、かつ、内部構造もSQLの理論上に成り立っているからです。(これが「理由のすべて」、ではないですが。)
また、「表の読み書きに関してだけ」は、『クラスモジュールを使って ”オブジェクト/プロパティ/メソッド” などを自作する』・・・といった必要性・面倒・手間もけっこう減ると思います。
(クラスモジュールのことを説明するときに、Excelでの場合、「表をオブジェクト化する例」を使って説明されるケースが多いのですけど、実際には、『 この程度のことならいちいちクラスモジュールを使う必要もなく、ADO・DAOのそれぞれの「オブジェクト」と「SQL」でやったほうが高機能だし・早いし・メンテも引き継ぎも楽かな・・・』と感じてしまう内容が多いです。ただ、Excel以外ではどうなのかわかりませんし、もちろん、表を扱う以外のことや、表を扱うのでも特殊なことをしたい場合ならクラスモジュールを使う意味は大きいのでしょうけど・・・。)
特にExcelでは、すべてを「SQL」でやるのではなく、「Microsoft Query」や「VBA」の中で「部分的に」使うと、かなりコスパアップに結び付きますので、ぜひ、SQLを(僕ができるくらいの簡単なレベルからでも十分VBAの中で使えるので)、学んでみることをお勧めします。
=============
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
目次
★ はじめに(「SQL」の概要・難易度など)
★ SQLの有名度
★ SQLでできることや使用できるようになるための前条件(Excel目線)
★ SQLの基本的・代表的な書式(構造・構文)
★ EXCELでSQLを使う方法4つ
(01)「Microsoft Query」という機能を使う。
(02)VBAの「QueryTableオブジェクト」+SQL・・・・((01)を「マクロの記録」で作るとできるプログラム)
(03)ADO接続+VBA+SQL
(04)DAO接続+VBA+SQL
(05)補足(ExcelでのSQLがらみの学習について)
(06)ExcelのSQLでは「削除」だけができない
★ Excelの「MicrosoftQuery」でSQL文を扱う場合の注意事項
★ SQL文の書き方事例(VBAと比較した難易度の参考。ExcelのMicrosoftQueryを使用した場合。)
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
=============
以下、本文です。
★ はじめに(「SQL」の概要・難易度など)
「SQL」とは、VBAや他のプログラミング言語、あるいは多段的な面倒くさいExcelワークシート関数を使わずとも、できるだけ簡単に(少なくともVBAや多段関数の10倍は手間をかけずに)、こちらに示したようなデータやリストを自由自在に取り出すことができるようにした・・・、データ管理専用の言語というか機能というか理論というか、そんな感じのものです。(Excelのフィルタ機能と集計機能をかけ合わせて・・・、ハイブリッドといいますか、高性能にした感じのモノです。)
具体的には、「問題の数値化」、「選択の集中」、「仮説と検証」、「PDCAサイクル回し」、等々、といったことに十分使えるデータ(表)が、SEやプログラマでなくとも(=VBAや他のプログラミング言語を使わずとも)、私たち素人でも十分、例えば基幹システムから自主的に比較的早く取り出すことができるものです。
基本的には、データの集計や抽出に関しては、VBAやワークシート関数の無駄な多用と比べると、「多分10倍は簡単」で、かつ、「10倍は複雑なデータの取り出し」を、2~10倍「短時間に」可能かと思います。ピボットほど簡単ではありませんが、でも私たちド素人にも扱えるレベルの操作方法の場合、「イメージ的にはピボットに近い感じ」です。
もしかしたら、中高生か小学生の高学年の子でも、簡単なものなら触れるかもしれません。
是非お子様にもチャレンジしてほしいです。(ゲームプログラミングばかりではなく。)
もちろん、「簡単に」とはいっても、SQLはとても奥が深くて、私たち素人では、「簡単に」の部分しか最初から扱えません。
実際にはプロの人しか理解できない「とてもじゃないけど理解できない難解」な「SQL文(SQL命令文)」も多いですが、でもそれは、SQLをかけたものにさらにSQLをかけ、またさらにSQLをかけて・・・と何段階にも「多段的に」SQLをかけることで、私たち素人でもなんとか大体のところはカバーしていけます。(比較的短時間に。少なくともExcelVBAよりは速く・早く・安く。)
大抵は「簡単に」の部分だけで、「問題の数値化」、「選択の集中」、「仮説と検証」、「PDCAサイクル回し」、等々には十分使えるデータが取り出しできますので、ご安心ください。(それらにはもともと、複雑な数値集計は必要ないことのほうが多いので)
★ SQLの有名度
なお、「SQL」は、有名度に関して言うと、「データ管理の世界標準」と言っても過言でないもので、その世界では「複式簿記」と同じか、あるいはそれ以上に有名です。
(またExcelに依存しないので他の表計算ソフトやデータベースソフトでも使えます)
そして、Excelでも使えます。
しかし、そんなにも有名なのに、かつ、データ管理のムリ・ムダ・ムラの削減に大きく貢献してくれるのに(集計やリストアップについてだけいえば、ExcelVBAよりもはるかに効率的なのに)、ExcelVBAのレジェンドさんも、どのパソコン教室も、どのExcelサイトも、詳しく教えてくれません。
「データ管理の基礎」と言っても過言ではないのに、教えてくれないのです。(高校の商業化の情報処理では基礎が教えられているようです。)
Excelが出て20年も経ったのに放置されたままです。
SQLはExcelでも20年も前から使えるのに、放置されたままです。
そして、高校生でも教えてもらえるのに。
ExcelVBA講師たちは教えてくれません。
それが、Excelにおいての無駄な関数の多段化や無駄なVBAプログラム・ひいては無駄なメンテも引き起こしている諸悪の根源だと思います。
20年も放置してきてしまったので、ExcelVBAの書籍やサイトでは、基礎の初級の部分の教習が終わったあとでも、「そもそも無駄の多すぎるデータの持ち方をしていること」に疑問を持たせることすらせず、「無駄の多いデータの持ち方」のまま、それに対する処理のことことばっかり教えています。より効率の良い集計方法などを教えません。
ひどいと、VBAでフォルダを1000個も作ってデータを保管させるようなことをさも効率がいいかのように説明したりして騙しています。
誤解をすごく恐れながら言うと、それは、お医者さんが患者さんに薬ばっかりあたえて薬漬けにし、食事の指導をまったくしない・・・、みたいな感じです。
「そもそも無駄の多すぎるデータの持ち方ばっかりしている」を、20年間ものあいだ、まったく正そうとぜず、放置してきました。
「高校生でも理解できて活用できる」ことがある、のに、なぜ社会人に教えないのでしょうか???さっぱりわかりません。
さらに誤解をすごく恐れてビクビクしながら言うと、「日本の集計とリストアップをダメにしたのは、ExcelVBAとワークシート関数の使いすぎ」ではないかと思っています。
特に、ExcelVBAは、グラフ化・見える化・シュミレーションなどの自動化のためにあるものだと思っていて、2次的にピボットとMicrosoft Query(QueryTableオブジェクト)の操作が必須で、20年も経った今は、それが「初級クラス」の内容になっていてそれがどこのサイトも書籍も教室も「あたりまえ」になってないといけないと思います。
「集計やリストアップ」が目的の場合、SQLはExcelでも使えて、かつ、VBAよりも重要・かつ・入り口は難易度も低いのに、なぜ教えないのでしょう?
「入り口は難易度も低い部分」を学ぶだけでも、VBAよりも10倍簡単なのにVBAよりも効率が良くなって・プログラマやSEじゃなくても、普通の営業さんや事務の方、でも十分に理解できる部分だってけっこうあるのに・・・。
僕だって(今更ようやくですが)Excelの勉強をし始めた身としては、もっと教えてほしいです。今でも、ぜんぜん勉強できてないので・・・。
余談ですが(どっちが偉いということは無いのですが)、「一部の業界」の就職や転職に関して言えば、VBAプログラムがすらすら書けるよりは、SQLの知識が深くてSQLでの命令語句がすらすら書けるほうが、早く就職・転職できることはできます。(幸せな就職・転職になるかどうかは別として・・・。特に派遣では段違いとなります。VBAよりもSQLを深く覚えたほうが有利なのは事実です。)
そのくらいの有名度です。
ちなみにですが、Googleやその他大企業の社内システム、世界中のWebカートシステムの多く、弥生シリーズや奉行シリーズといった市販のビジネスソフトのシステム、それ以外の会計システムや顧客管理システム、売り上げ管理システム、在庫管理システム、人事用システム、等々、世界中の本当に多くのシステムが「SQL」を土台とした、「データベースシステム」でできています。
★ SQLでできることや使用できるようになるための前条件(Excel目線)
「SQL」は、手入力した「実表」から、いろんな条件を指定して、「仮想表」を作り出す機能です。
「実表」から、いろんな条件を複数 指定して、「必要なデータのみに絞り込んだ表(Excelのフィルタとも似ている)」を作り出す機能・・・、とも言えるかもしれません。
また、言ってはいけないことかもしれませんが & 誤解を恐れがら こわごわ言うと・・・、『 例えばExcelの場合、売上表を月ごとに複数のシートに別々に記録して、それをモトにして「串刺し集計したり・VBAプログラム(例えばループ=繰り返し処理)で集計したり」・・・、という、 ”超” 無駄・かつ非効率なこと 』を回避できる、「集計コスパ・データ抽出コスパ」をできうる限り、向上させることができるものです。
(少なくとも「串刺し集計をVBA化」するような ”非効率・データ管理の無駄” と比べれば、2~10倍以上は、「コス ”パ” 」、が、アップできると思います。)
もちろん、「すべてをSQLで賄うべき!」という無理強いではなくて、選択肢のひとつとして考えてほしいのですが、ただ、「絶対に(どこか1か所で、くらいは)SQLを試してほしい!!適材適所で使えば、無駄な集計やリストアップや関連する無駄なVBAプログラム・無駄な関数の多用が激減します!」とおススメができるものです。
そのほか、Accessをまだ買えない場合に、とりあえず「Excelにて」、Accessの「クエリ」を操作する練習や「リレーション」を組む練習、あるいは、ADOやDAOを使う練習、等々も、SQLを使うことでおこなえます。
なお、ここで言う「リレーション」とは、2013や2016の「リレーションシップ」機能とは異なる、純然たるシステム構築業界標準・データ管理の基礎標準のほうの「リレーション」です。
また、リレーションシップ機能を使うと、「ピボットテーブルの集計フィールドやグループ化が使えなくなる」そうですが、SQLを使うとリレーションを組んでもそういうことは起こりません。例えばSQLを使って、Microsoft Query(QueryTableオブジェクト)などにてリレーションを組んだ表の場合、それをソースにしたピボットテーブルでは、ピボットの「全機能」が使えます。もちろん、「リレーションを組んだ表」を表示する段階で、同時に、グループ化集計・リストアップなどもできてしまいます。そして、それをピボットにかけることもできます。
「SQL」は、前述したとおり(データ管理系のソフトに限りますが)、ソフトウェアの垣根を越えて、多くのソフトで利用できますが、例えばExcel目線で言うと、
Excelの・・・
・「オートフィルタやフィルタオプション」の機能と、
・「集計」の機能(あるいは「ピボットテーブル」の一部の集計機能)、プラス、
・「VLOOKUP関数」(or 2013・2016のリレーションシップ)の機能と
・「テーブル」の機能、を、
・「合体」させたような「自動集計」「自動リストアップ」の機能
・そして以上が「すべて同時に ”1回で” 処理できる」機能
・・・ということになります。
そんな風に言ったら、なんとなくイメージができますでしょうか?
かつ、「VLOOKUP関数」の機能に相当する部分については、「最初からそれありき」です。
つまり、「最初から、複数枚数の表を紐付けしあうことを ”前提” として機能がかたちづくられている」ので、「VLOOKUP関数よりも柔軟な紐付け処理ができる」という利点を持ちます。
(もちろん、TPOによってはVLOOKUP関数のほうが便利な場面も少なくないです。ただ、VLOOKUP関数にありがちな「弱点をカバーするような余計な処理」をする必要がなく、シンプルはシンプルだと思います。MicrosoftQueryの画面ではドラッグ一発をやるだけで、VLOOKUPのような紐付け作業が全行・一瞬で終わってしまいます。2013・2016のリレーションシップ機能と同じ処理です。おまけに、紐付け対象外、のデータまで求めることができてしまいます。言い方を変えると「ベン図の2つの円が重なり合わないところ」のデータ抽出も、比較的、やりやすくなっています。=つまり、「除外処理」ができます。)
かつ、「面倒なループ処理のプログラミング」をすることなく、一括でのデータ処理(集計、書き換え、リストアップ、等々)が色々と行えるので、複雑な条件の集計では、ExcelVBAのループを駆使した集計よりも、最低で2倍、普通で10倍・20倍のデータ管理の効率化を図ることができると思います。(無駄なVBAが減らせるので)
そして特に、「〇×別▲□別集計」「〇×別▲□別~★別リストアップ」といったものが得意です。
「動的な表(リスト形式の表)」から「静的な表(クロス集計表)」のも得意です。
言ってみれば、ビジネス定型集計が、すごく得意で、それがVBAプログラムや関数無しに「自動で」やりやすいです。
(実はExcel・・・というかMSOfficeには20年も前から実装されています。)
Excelの通常のフィルタ機能やテーブル機能はフィルタができるだけで、「同時に集計」ってできないのですけど、「SQL」は、フィルタをかけながらその結果から更にグループ化も集計も同時にやってしまえます。
また、繰り返しになりますが、その「フィルタ実行+同時グループ化+同時集計」も、単一の表からだけではなく、2枚、3枚と、複数の表を紐付けしあった上ででもできてしまいます。
そして「SQL」でのフィルタ結果(=「仮想表」)は、そのままピボットテーブルのソースにでき、フィルタ側で条件を変えてソースの絞込結果が変われば、それがピボット側にも反映されます。それがバージョン2000でも、です。(『通常のフィルタ機能』や『「テーブル機能」の上で実行したフィルタ』では、バージョン2007以降でもそれができません)
必要性が無ければピボット側でフィルタをかけなくてもOKですし、もともとピボット側でかけるフィルタよりも複雑で柔軟・高度なフィルタがかけられます。
もちろん、そのピボットソースにOffset関数を使って名前の定義をすれば行も列も可変です。(もちろん、これも全バージョンで。)
***
以下、若干の詳細です。
「仮想表」を作り出すのには、全部、「文字」で指定して作り出すことができます。(つまりは「命令文」。)
そしてその命令文を「SQL文」と呼びます。
「SQL文」を使ってExcelのフィルタオプションと同じようなことができるのですが、そのとき、「複数の表を同時に紐付けしあって扱ったり、さらに同時に、簡易的なグループ化集計等々もしながら」ピボットテーブルのソースにしたり、仮想表を出力したりができます。(複数の表を同時に扱う際は「リレーション」と呼ばれる、Excelで言うところのVLOOKUP関数のような仕組みを使います。Excel 2016や2013の「リレーションシップ」とは仕組み的には同じ仕組みです。といいますか、「Accessのクエリ」や「SQL Serverのビュー」と基本的には同じ、といったほうが良いかもしれません。)
基本、「SQL」は、事前に「動的な表」が作成されてないと使えませんが、「動的な表」さえ作られていれば使うことができます(この点はピボットテーブルと同じです)。
例えば、ピボットと同じように「動的な表」から「静的な表(クロス集計表)」を作ることもできます。また、ピボットテーブルのソースにもできます。
Excelの場合に限っては、その「動的な表」を「システムテーブル」の形を取って作成すれば、「Microsoft Query」や「DAOやADOなどのミドルウェア」から扱うことができ、また、処理を「自動化」できます。(「システムテーブル」は小学生でもわかる作表ルールをちょっと守るだけで作れます。ただしExcelは、最初の数行に入力されたデータでその列のデータ型を自動判別しますので、最初の数行の入力値には注意が必要です。必ず「入力規則」の機能にて列丸ごとにIMEモードの設定やその他の制限をしておくほうがいいです。もしそれが原因でエラーになったら、詳しくは→こちら。)
例えば、それら「Microsoft Query」や「DAOやADOなどのミドルウェア」をVBAで操作するときに、プログラムのなかでSQL文を直接書いて・いじって、仮想表の結果を自在にコントロール・自動更新などをすることができるのです。つまり、仮想表の作成を「クリック操作を使わずに、全部文字操作だけで自動化できる」ということです。
また、SQLを「Microsoft Query」や「DAOやADOなどのミドルウェア」で使うと、閉じたExcelのファイルからのデータも(今開いているExcelファイルにインポートすることなく)、扱うことができます。例えば読むだけなく、書き換えもできます。(もちろん相手ファイルを閉じたまま)
そのSQLの結果表をソースにしたピボットテーブルももちろん、VBAで自動更新できますので、色々なデータのピックアップを全部、命令の文字列で自動化できることになります。
最終的にはExcelを「ちょとしたリレーショナルデータベースMiniシステム」として使えるようになります。なので、なおさら、無駄なVBAプログラムや無駄な関数の多用が減ります。(バージョン2000であっても。)
★ SQLの基本的・代表的な書式(構造・構文)
SQLの基本的・代表的な書式(構造・構文)は以降に書いたような感じです。
まず、次のように、横に一文で書くことができます。
(文が短いときはこの形式で書いたほうがわかりやすい場合もあります。)
SELECT 取り出したい列名 FROM テーブル名(表) WHERE 取り出したい行の抽出条件;
(列名などは複数指定可)
文の最後には「;」(セミコロン)が要ります。ExcelVBA+DAOなどでSQL文を操作する場合は要らないみたいですが、一応、その場合でもちゃんと付けます。
基本、最後の「;」を忘れると、どのデータベースシステムでもエラーになります。
また、以下のように、意味毎に、縦に分けて、書くこともできます。
(文が長くなったときはこの形式で書いたほうがわかりやすいです。)
少し、補足説明を足します。
SELECT
取り出したい列名
複数の列名をカンマと半角スペースで区切って指定できます。
(半角スペースを忘れるとエラーになります。)
※FROM句のテーブルが複数あってリレーションされている場合に、
もし同じ列名があれば、「テーブル名+列名」の形で特定できます。
また、列名に別名(エイリアス)を付けることもできます。
たとえば「性別」や「年齢」「住所01」といった列は、
「顧客マスタ」や「従業員マスタ」といった複数のテーブル
に出てきますが、例えばもし両方の「性別」列を表示させたい場合には、
「顧客マスタ.性別,」「従業員マスタ.性別,」のようにして特定できる、
ということです。
また、カンマと半角スペースごと、あるいはカンマごとに改行して、
列名を縦方向に列挙すると見やすいです。
(カンマで区切ると半角スペースが先頭に来るので確実です。)
なお、ここのSELECT句の中で複数の列を列挙する場合は、
各列名ごとにカンマを入れますが、一番最後だけはカンマ無しでOKです。
(半角スペースは必要です。)
スペースや記号は全部半角です。全角を打つとエラーになります。
また、半角スペースは複数がつながって入力されていてもOKです。
1個以上、しかるべき場所に入っていれば。
FROM
テーブル名(表) あるいは、テーブルの状態。
表は1枚だけでも指定できますが、もちろん、1枚だけとは限りません。
「リレーション」という仕組みを使うことで、複数の表を同時に扱えます。
Excelで言うところの「VLOOKUP関数」や
「2016のリレーションシップ」のような結合、
つまり、ベン図における円の重なった部分(ラグビーボールを縦にした)の
イメージの横結合、
あるいは、そこの部分+重なってない部分の横結合、など、
いろんなタイプの「表の状態(横結合の状態)」を指定できます。
表は、2枚だけでなく、3枚、4枚、それ以上、と同時に扱えます。
また、リレーションは、例えば2枚の表のあいだで、
1本だけでなく、2本、3本と使えます。(推奨ではないですが)
各キーワードの間と最後には半角スペースが必要です。
WHERE
取り出したい行の抽出条件;
ANDやORを使って、複数の条件を指定できます。
期間や金額など、テーブル内(表内)にある列のあらゆる条件・範囲を、
一度に、複数、指定できます。
各キーワードの間には半角スペースが必要です。
※ここでも文の最後には「;」(セミコロン)が必要です。
※「WHERE」のあとには、「ORDER BY」(並べ替え)や「GROUP BY」(グループ化)などの条件も指定できます。また、「UNION」を使うことで縦の結合の表を作ることもできます。
・・・というわけで、この「書式・構文・構造」のポイントとしては・・・
順序的に前後はしますが、
(01)「FROM(直訳:~から)」のところに書いた「テーブル・または・テーブルの状態」から、
(02)「WHERE(直訳:~どこ?~)」のところに書いた条件で「取り出す行」を特定し、
(03)「SELECT(直訳:選択)」のところに書いた列名で「取り出す列」を特定したうえで、
(04)「仮想表」を作成・あるいは出力する、
そういう形で、データを、VBAなどのプログラム言語を使わずに簡単に取り出すのが「SQL」「SQL文」・・・
・・・というところがポイントです。
(「WHERE」が無い場合は「全ての行」が取り出されます。)
Excelのセルアドレスベースのプログラムは、シートを見ないと意味不明ですが、SQLは「列名と行の抽出条件ベース」なので、シートを見なくても意味がわかりやすいです。
また、ここではやっていませんが、「さらに別の命令を追加で使うと」、上記のようにリストアップしたものを更に「同時に(一発で)」、集計したり並べ替えしたりすることもできます。
なお、このSQL文は、Excelの「Microsoft Query」やAccessの「クエリ」の機能(画面)にて、ドラッグやクリック操作中心(あとは簡単な条件入力等)で、自動生成することができます。(それぞれ「方言」のような微妙な違いがありますが、でも、基本的にはちゃんと作成できます。)
ちなみにですが、話を逸らしてすみませんが(急に、少しの間、言葉づかいが悪くなることをどうかお許しください!)、人によっては、このExcelの「Microsoft Query」やAccessの「クエリ」の機能が自動生成するSQL文を「わかりにくいとか、見にくい!クソだ!」とか馬鹿にする人がいますけど、そんなのは自動整形プログラムを自分で作れば一発で見やすくなるので、無能な人しかそういうことを言いません。
SQL文をテキストファイルに残しておけば、いつでも「GUIでの設定状態」「データ抽出条件」も復元できますし、使い道は色々とあります。
「わかりにくいとか、見にくい!クソだ!」とかヒステリックに言い出して「Microsoft Query」やAccessの「クエリ」をバカにする人は、「使える機能を使えるようにしようとしない」、「超無能」な人です。(・・・って、僕もヒステリックなバカ・クズでした。すみません。)
「使えそうもないものを使えるように工夫して使う」ということができてはじめて「人間」・・・、ですから、「”そもそも使えるもの”を使えるように使わない」のは「人間ではない・サル以下・というか僕と同じゾウリムシ以下」ということになります。
是非、そういった「無能」な人にならないように、また、そういった「無能」な人の言葉に騙されないように、どうかご注意ください。(・・・って、ほんと、僕もヒステリックなバカ・クズでした。すみません。恥)
でも、ほんと、そういうバカにならないように、特にお若い方々はお気を付けください。
好運や良い出会いが逃げちゃいますから・・・。
EXCELでSQLを使うには、以降の(01)~(04)などの方法があります。
(以降の(02)より下の方法は、自動でSQL文を生成できないので、勉強して手作業で書く必要があります。)
(01)はSQLの学習に利用できますし、ちょとしたことにすごく使えます。また、Accessの「クエリ」という機能に酷似していますので、Accessのクエリの勉強がExcelでもできてしまう、ということになります。
(02)、(03)は、VBAとの相性がいいです。
(01)~(03)ができると、相当なことができます。システム業者さんとほぼ同じようなことができます。
では以下、SQLをExcelで扱う方法の概要です。(01~04)
(01)「Microsoft Query」という機能を使う。
Accessというソフトの「クエリ」という機能と酷似しています。
なので、Accessクエリの勉強がExcelでもできる・・・、ということになります。
Accessにも入りやすくなるでしょう。
「Microsoft Query」や「Accessクエリ」を使うと、「SQLを知らなくても」、ドラッグやクリック部分的な条件入力だけで、自動的にSQLが生成され、かつ、リストアップや集計、並べ替え等々が全部一括で同時に実行できます。
なので、「SQLの学習」にとても役に立ちます。
手動でSQLを書くこともでき、SQL命令文の「ネスト的なこと」もやれます。(「副問い合わせ」といいます。ただ、SQL命令文の書き方については、少し、「EXCELの方言」的な独自ルールがあります。
もちろん、リレーション(VLOOKUP関数での紐つけのようなこと)を複数本、2つの表や3つの表などのあいだで作成することもできます。
手動でのSQLを使うことで、他の「閉じたExcelファイル」の「読み込み」はもちろん、「閉じたままの書き込み」も一応はできます。
基本、結果の表には数式は埋め込まれず、(SQLの側で各種の計算がなされるので)結果の表は「値」だけです。そのため、速度もVBAのループを使うよりも処理が高速になる場合が少なくないです。
ファイルを閉じて開く場合も(開くと同時に更新する設定にしなければ)、ワークシート関数を使いまくったシートよりは速く開くと思います。
重複調査などにも使えます(以降の(02)~(04)も全部そうです。)
例えばAとBの2つの表において、1つの列で重複を調べたいときは、両方の表の中で、重複を調べたい列と列をドラッグで結ぶだけです。さらに、2つ、3つ、4つ、と、複数の列で同時に重複を調べたいときは、2つ、3つ、4つ、とドラグすれば終わりです。
※表と表の紐付けを「リレーション」といいますが、表の数は2枚だけでなく、3枚、4枚と、紐付け可能です。UNION ALL という命令を使うと、すべての表や任意の複数の表の特定の列を、縦に結合することも可能です。
なお、Microsoft Queryの結果の表をソースにしたピボットテーブルを作成すると、2010以降のPowerQueryやピボットのフィルタ機能、リレーションシップ機能などを使うよりも、より柔軟で強力な「条件つきリストアップ or 集計」ができると思います。それは全バージョンで使えるやり方です。
さらに、「名前の定義の機能」で行と列が増減しても大丈夫なようにソースの表を「可変」にすると、さらに便利になります。これも全バージョンで使えるやり方です。
その「可変」にするための公式↓
=OFFSET($A$1,0,0,COUNTA($A:$A),COUNTA($1:$1))
※これは、A1の行が列名であることが前提です。貼り付け後、Excelが自動的にシート名だけを挿入してくれます。式の使い方など、詳しくは、名前の定義の方法をWebなどで調べてみてください。
※あと、2007以降は、Microsoft Queryを使うと、ListObjectオブジェクト(テーブル機能)の中に、QueryTableオブジェクトが埋め込まれる形になります。
そのためかよくわかりませんが、自ファイルに集計やリストアップするファイルがあると、エラーになったり、正常動作しません。(僕のExcelだけかもしれませんが・・・)
なので、別ファイルから、目的のファイルを覗きにいって、Microsoft Queryを使う必要があります。
速度も自ファイルを扱うよりは断然速いです。
2003以前は、Microsoft Queryを使うと(02)の「QueryTableオブジェクト」だけがシート上に生成されるので、そういうことはありません。(ただ、自ファイルのデータをMicrosoft Queryで覗きに行くと、Excelに結果を返すときの速度がすごく遅いです。なのでやむをえない時以外はあまり使いません。なお、Microsoft Queryではなくて、(02)のように「QueryTableオブジェクト」だけを使うと、速度は自ファイルでも高速です。)
※参考記事
『ExcelでのGUIでの簡易SQL機能「Microsoft Query」の使い方(Excel2010でもほぼ同じ操作です) ~ ビジネスデータ管理(コスト減等含む)を2~100倍効率化するツールその1』
『Excel2000で30分で作るバーコードPOSレジのコア部分(定型集計効率化サンプル)ダウンロード』
『「Microsoft Query」 で私たち素人のエンドユーザーでもできること いろいろ』
************
(02)VBAの「QueryTableオブジェクト」+SQL・・・・((01)を「マクロの記録」で作るとできるプログラム)
(ODBC接続:Microsoft Query既定の接続機能です。)
SQLを使って重複調査やリストアップ、集計した結果を、「QueryTableオブジェクト」としてシート上に表示できます。VBAにてシート上に結果表示します。
「QueryTableオブジェクト」自体が、「データ操作をした結果を表示できるオブジェクト(=ミニミニロボット)」のため、(03)や(04)のように、CopyFromRecordSetメソッドなどを使う必要がなく、大変らくちんです。
ソースの表が、レコードが増えれば、シート上に在る「QueryTableオブジェクト」を右クリックして「更新」するだけです。
実は「マクロの記録」にて、「Microsoft Query」でSQLを使う操作を記録すると、この『 VBAの「QueryTableオブジェクト」+SQL 』という状態のものが自動記録されます。
なので、あとはそれを少し加工するだけです。(SQL内の改行コード部分を消す、とか、SQL内容を書き換える、とか。)
これを使うと、テキストファイルを読み込むときにも、SQLを使って様々なかたちで表を取り込むことができます。
例えばテキストファイルのインポートのメニューだと(2010だと「データ」タブの「テキストファイル」のメニューです)、表全体を取り込むことしかできませんが、この「マクロの記録で生成されたVBA」を流用すると、テキストファイルでも、「絞り込みや集計をしながら」吸い込めます。(ただし、今のところのテストでは、カンマ区切りのテキストファイルだけしか吸い込めませんでしたが。でもそれでも有用だと思います。)
(参考記事:『★★★ Access2000VBA・Excel2000VBA独学~Excelに、テキストファイルの内容を、「SQLを使いながら」・かつ・「絞り込みながら読み込む」方法(QueryTableオブジェクトにてODBC接続利用)~』)
この(02)も、基本、結果の表には数式は埋め込まれず、(SQLの側で各種の計算がなされるので)結果の表は「値」だけです。そのため、速度もVBAのループを使うよりも処理が高速になる場合が少なくないです。
ファイルを閉じて開く場合も(開くと同時に更新する設定にしなければ)、ワークシート関数を使いまくったシートよりは速く開くと思います。
なお、「シート上に表にする前に」、なんらかのループ処理をしたい場合は、事項の(03)のほうが便利かもしれません。(やれないことはないかもしれませんが)
※「QueryTableオブジェクト」を使う場合は、2007以降であっても、Microsoft Queryのときのように、ListObjectオブジェクト(テーブル機能)は関係なく、「QueryTableオブジェクト」だけがシート上に生成されるので、自ファイルの表が操作対象でもOKです。速いし、処理がラクです。
※基本、「QueryTableオブジェクト」や(01)のMicrosoft Queryでは、リストアップや集計の動作速度が、VBAのループ処理などを使う場合と比べて、5~10倍以上、と言われています。
また、なんとなくですが、2010以降のPowerQuery?やリレーションシップ機能などよりも速い気がします。
※ピボットとの連携は(01)と同じで超便利です。
※ (01) で自動生成されたSQLがまんまで使えます。
************
2007以降は特に。2000~2003でも使えます。
32bit版EXCEL・64bit版EXCEL両方ともで使えたと思います。忘れましたが、、、
リストアップや集計の結果を、「CopyFromRecordSet」という名前のVBA命令で、シートにばんっと一発表示とかもできるし、逆に「レコードセットオブジェクト」を使ってのループ処理、列名処理、も可能です。
もちろんSQLによってのループを使わない列名の別名付加や色んなデータ操作もできます。
なお、プログラム内でレコードセットの中にリストアップ等々をした結果を、「CopyFromRecordSet」にてシートに一括表示する前に、更に色々にいじりたい・・・というようなご要望があるときは、(02)よりもこの方法のほうがやりやすいです。
オススメです。
ちなみにですが、「CopyFromRecordSet」命令は、次項の(04)でも使えます。
※ピボットとの連携は(01)と同じで超便利です。
※ (01) で自動生成されたSQLがまんまで使えます。
※この(03)も、基本、数式は埋め込まれず、SQL側で各種の計算がなされるので、結果の表は「値」だけです。「CopyFromRecordSet」を使ったとしても。
そのため、多分ですが、速度もVBAのループを使うよりも処理が高速になる場合が少なくない気がします。
ファイルを閉じて開く場合も、数式を使いまくったシートよりは速く開くと思います。
************
2003以前用と思ったほうがよいです。
※2007以降だと色々と面倒くさいので(03)のADOを使うほうが絶対にいいです。
本当は2003以前もADO接続のほうでやった方がいいそうです。
32bit版EXCELしかダメっぽいですが、裏技があるかも?です。
DAO接続では、xlsxやxlsmの処理がやりづらいので、xls専用、くらいに思っておいたほうがいいかもしれません。
Accessのmdbではこの方法のほうがめんどくさくない場合もありますが(特にDAOでのテーブル作成やクエリ作成の場合)、Excelの場合は(特に、xlslxやxlsmは)、この方法よりも(03)の「ADO接続+VBA+SQL」のほうがいいと思います。
※ピボットとの連携は(01)と同じで超便利です。
※ (01) で自動生成されたSQLがまんまで使えます。
とりあえず、機能の概要としては以上なのですが、すきな方法のことを調べて、それぞれ細かく別質問をたててみるとよいと思います。
「自ファイルの表のこと手軽に処理したい」場合は(02)か(03)を使うといいかもです。
でも、SQLの書き方を学ぶには、(01)の自動生成されたSQL文を見るとすごく勉強になります。
(01)はVBAと連携させるときに「テストSQL作成用」としても利用できますし、実務にもすごく便利です。
結局、(01)~(03)のすべて、が、「それぞれの良さ」があるので、等しく重要です。
強いて、言うと、SQLの入門として(01)、VBA連携の実務として(03)から入るとラクかもしれません。
ただ、(02)が便利な場面もあるので、(02)も一応、必須です。
※この(04)も、基本、数式は埋め込まれず、SQL側で各種の計算がなされるので、結果の表は「値」だけです。「CopyFromRecordSet」を使ったとしても。
そのため、多分ですが、速度もVBAのループを使うよりも処理が高速になる場合が少なくない気がします。
ファイルを閉じて開く場合も、数式を使いまくったシートよりは速く開くと思います。
**********
学習時間が必要なので即効性は出ないかもしれませんが、でも、「現状、VBAでの複雑な条件でのリストアップや集計」などが多いなら、その代替方法として、かなりラクになると思います。
ちゃんと学習するか、講師などに教えてもらえば、1、2年後には、VBAのループだけでやるよりは、多くのシーンで、10倍以上のコスパアップを実現できるのではなかろうかと思います。
『 他のファイルや自ファイルの表を覗きに行って、シートに吸い込む処理自体』は、「ほぼワンパターン」なので、1回作ったものを使い回しするだけです。
例えば、関数化などをしてしまえば、その後の調整はほとんど要りません。
なので、
・SQL命令文を作ることと、
・ExcelのSQL命令文の「方言」を覚えることとと、
・作ったSQLをVBAにはめ込んだ時にエラーが出ないようにする、
この3つの作業中心となると思います。
逆に、「あんまし条件付リストアップはしない」という場合は、ちょっと良い効果が出ないかもしれません。
**********
※ExcelのSQLでは「削除」だけができないので、「論理削除(削除フラグを立てる)」という形にする必要があります。以下参考記事です。
『★★★ Access2000VBA・Excel2000VBA独学~(多分、全バージョン共通・・・だと思います。)DAO、ADO、SQL、Microsoft Query、QueryTableオブジェクト、といった、「真のExcelデータベース(?)」で、でき「ない」こと・逆に20年前もからでき「る」こと。~』
★ Excelの「MicrosoftQuery」でSQL文を扱う場合の注意事項
※「MicrosoftQuery」もそうですが、Excelでは、前項の(01)~(04)のすべての方法で「削除(Delete命令)」ができません。なので、「論理削除(削除フラグを立てる)」というかたちを取る必要があります。
※参考記事
『★★★Access2000VBA・Excel2000VBA独学~「QueryTableオブジェクト」~~「VBAプログラム」からも、「MicrosoftQueryの画面」からも操作が可能となる、そのための「VBAからのSQLの書き方」や「前提条件」など(概要説明のみ)~』
『★★★ Access2000VBA・Excel2000VBA独学~(多分、全バージョン共通・・・だと思います。)DAO、ADO、SQL、Microsoft Query、QueryTableオブジェクト、といった、「真のExcelデータベース(?)」で、でき「ない」こと・逆に20年前もからでき「る」こと。~』
ExcelのMicrosoftQueryでは、いったん実行すると、MicrosoftQueryが(?)勝手にすべての列名に「`テーブル名`. 」という感じで、表を特定するための語句がくっついて、かつ、列名や各条件等が横長に連結・変形されてしまいます。(下図参照)
が、それを取って改行し、次項のグリーンの構文例のように縦方向に構造的に書き直しても実行できます。(複数の表に同じ列名があるときは表の名前も必要ですが。)
また、SQL文があるとMicrosoftQueryでのGUIのデザイン画面の状態が即座に復元できます。「SQLボタン」を押すことで出てくる画面にSQL文をコピペするだけで実現可能です。
逆に言うと「SQL文を使って」じゃないと復元できない場合もあるので、念のために、Excelに抽出結果を表示する前に必ず、MicrosoftQueryの画面の「SQL」ボタンから、SQL内容をテキストファイルやExcelファイルのテキストボックスなどにバックアップしておきます。
Accessの「クエリ」と呼ばれる機能でもまったく同じことができますが、Accessの場合はSQLのバックアップまでは必要ありません。(SQL文の操作がおかしくなるようなことはないので。)
なお、「SQL」を、ExcelやAccess、WordなどでVBAプログラムの中・・・、例えば「DAOやADO」と呼ばれる機能を動かすプログラムの中で使う場合は、このことは考える必要はありません。
また(繰り返しになりますが)、SQL文をカンマと半角スペースごと、あるいはカンマごとに改行して、列名を縦方向に列挙する場合は、カンマで区切るほうが、半角スペースが先頭に来るのでエラーが出にくく、無難です。
なお、SELECT句の中で複数の列を列挙する場合は、各列名ごとにカンマを入れますが、一番最後だけはカンマ無しでOKです。(半角スペースは必要です。)
スペースや記号は全部半角です。全角を打つとエラーになります。
また、半角スペースは複数がつながって入力されていてもOKです。
1個以上、しかるべき場所に入っていれば。
★ SQL文の書き方事例(VBAと比較した難易度の参考。ExcelのMicrosoftQueryを使用した場合。)
簡単な例ですけど、次の(ア)(イ)の2つの表をExcelに作成した場合です。
表を以下の(ア)(イ)のように、表の名前をタブで付け、A1セルとその横一列を全部「列名」にするとExcelでは「システムテーブル」として扱え、「ExcelVBA(+DAOやADO)」や、「Microsoft Query」にて(多少の方言はあるものの)例えば、以降に示すようなSQL文で表の絞り込みができます。(※注意!!:ExcelのSQLでは、テーブル名については、半角の「$」を末尾に付けたのち、「 `(バッククォート)」で囲むか、あるいは、 [ ](角カッコ)で囲みます。ここでは、見づらくなるのであえてつけていません。これはMicrosoftQuery(QueryTableオブジェクト)でのSQL、DAOでのSQL、ADOでのSQL、すべて共通です。)
(ア)「Sheet1」のタブの名前を「氏名表」にリネームして、以下のようなデータを入力します。
(リネーム→名前の変更をするという意味です。)
(イ)「Sheet2」のタブの名前を、「電話番号表」にリネームして、以下のようなデータを入力します。
(01)「氏名表」から「姓」の列と「名」の列を取り出したい場合
以下のようなSQL文になります。
(下記の命令文の事例はそのままコピペして使わないでください。全角スペースが使われてしまっているのでエラーになります。ただ、ExcelのMicrosoftQueryの場合は、「FROM」や「WHERE」の前、あるいはカンマのうしろなどにスペースが無くても勝手に付加してくれるようです。)
SELECT
姓,
名
FROM
氏名表;
「WHERE」を書かなければ、すべての行が表示されます。
複数の列を取り出す場合は、最後の列名のあとはカンマ無しでOKです。
(02)「氏名表」から「姓」の列と「名」の列を取り出し、「田中」さんの行だけを顧客IDの値を条件にして取り出したい場合
SELECT
姓,
名
FROM
氏名表
WHERE
顧客ID=3;
「顧客ID=3」の部分(WHEREの部分)には、例えば、もっとデータがたくさんあって、日付の列などもあれば、「顧客ID=何番から何番まで AND いつからいつまで OR 2つめのいつからいつまで」みたいなイメージで複数の条件を設定できます。
VBAよりも簡単に、データを抽出することができます。
基本的には、データの抽出に関しては、VBAの10倍は簡単で、10倍は複雑な取り出しが可能かと思います。
しかも、VBAはMicrosoft Office だけにしか使えませんが、SQLは、Excel、Access、SQL Server、オラクル、MySQL、PostgreSQL、といった、いろんなデータベースシステムで使えます。(この場合も多少の方言はありますが、でも、おおむね同じです。)
VBAだとRengeオブジェクトでA1セルがどうのこうの・B1セルがどうのこの・・・と面倒くさくて読みづらいプログラムをたくさん書かないといけません。(僕みたいなExcel音痴はの場合は特に・・・。かといって、SQLも大して知らないんですけど・・・)
(03)「氏名表」から「姓」の列と「名」の列を取り出し、「田中」さんの行だけを「姓」の列の値を条件にして取り出したい場合
SELECT
姓,
名
FROM
氏名表
WHERE
姓='田中';
数字ではなく、文字列を条件にする場合は「'」(シングルクォーテーション)で囲みます。
「=」を使うと「完全一致」での絞り込みとなります。
基本、「=」を使った「完全一致」は、検索・抽出においてどのデータベースソフトでも一番高速です。(次項の前方一致は2番目に高速です。一番遅いのは部分一致です。部分一致は、他の条件も合同で存在する場合は、死ぬほど遅くなる場合もあります。SQL ServerでもAccessと同等に遅いです。多分、ストアドプロシージャでも遅いです。基本、SQL ServerはローカルPC内限定の使用ならAccessのJETエンジンよりも特に速くないです。むしろ遅いかも・・・。SQL Serverなどのストアドプロシージャが真価を発揮するのは、街や国単位の離れた拠点同士でのVPN接続などでのデータベース利用のケースではないかと思われます。ローカルPC内やデータ量の少ないクライアントサーバもどき(ネットワーク共有)に限ってはSQLでのデータ抽出速度に関してはAccessのJETエンジンのほうが速いケースも少なくありません。バージョン2000や97の頃からのセオリー1とセオリー2を守れば。もちろん、速度だけで、その他の堅牢性やバックアップやメンテ、特にユーザー別の高度なセキュリティはSQL Serverのほうがはるかに上なので、そういう意味ででしたら「ローカルPC内やデータ量が少ないケース」でもSQL Serverを使うほうがはるかにいいです。)
(04)「氏名表」から「姓」の列と「名」の列を取り出し、「田」で始まる人の行だけを「姓」の列の値を条件にして取り出したい場合
SELECT
姓,
名
FROM
氏名表
WHERE
姓 Like '田%';
(※ワイルドカードについては、Accessの場合は「姓 Like '田*';」と、「%」ではなくて「*(アスタリスク)」を使います。Excelは「%」を使います。)
文字列の一部を条件にする場合は「=」ではなく、「Like」を使います。
「'」(シングルクォーテーション)で囲むのは同じです。
「田で始まる」を表現するには「田%」と「%(パーセント)」を使います。
(※ワイルドカードについては、Accessの場合は「姓 Like '田*';」と、「%」ではなくて「*(アスタリスク)」を使います。でも多くのデータベースシステムでは%が使われると思います。Excelは「%」を使います。)
「%」を文字列の次に打ち込むと「前方一致」での絞り込みとなります。
基本、「前方一致」は、「%田%」という「部分一致」よりはかなり高速に(完全一致に近いくらいの速さで)データ抽出ができます。(どのデータベースソフトでも)
(05)「氏名表」から「姓」の列と「名」の列を取り出し、「田」を含む人の行だけを「姓」の列の値を条件にして取り出したい場合
SELECT
姓,
名
FROM
氏名表
WHERE
姓 Like '%田%';
(※ワイルドカードについては、Accessの場合は「姓 Like '*田*';」と、「%」ではなくて「*(アスタリスク)」を使います。Excelは「%」を使います。)
文字列の一部を条件にする場合は「=」ではなく、「Like」を使います。(前項と同じ)
「'」(シングルクォーテーション)で囲むのも同じです。
「田を含む」を表現するには「%田%」と「%(パーセント)」を検索語句の前後に使います。
(Accessの場合は「*(アスタリスク)」を使い、Excelは「%」を使います。)
「%」を文字列の前後に打ち込むと「部分一致」での絞り込みとなります。
「田%」という「前方一致」よりは遅いですが、あいまいなデータ抽出ができます。
「~田」で終わる人も「田~」で始まる人も、「~田~」を含む人も全部抽出できるのでそういうことを知りたいときに大変便利です。
(06)顧客IDをキーに紐付けした「氏名表」と「電話番号表」から、「電話番号」の列を取り出し、「田」を含む人の行だけを「姓」の列の値を条件にして取り出したい場合
(Excelの場合の「VLOOKUP関数で紐付けしながら、同時に、フィルタで絞り込む・・・」みたいな処理です。)
SELECT
電話番号
FROM
氏名表 INNER JOIN 電話番号表 ON 氏名表.顧客ID = 電話番号表.顧客ID
WHERE
姓 Like '%田%';
INNER JOIN にて、「顧客ID」列の値同士で横結合すると下図のようになりますが、ここではそこから、姓に「田」を含む「電話番号」列だけが取り出されます。
(武田さんと田中さんの、「電話番号」の列だけが取り出されます。※ここでは条件が1つだけですが、もちろん、3つでも4つでも条件を加えることができます。グループ化もできます。)
「FROM」のところの「INNER JOIN」でどの表とどの表を紐付けするかを指定して、「ON」以降で、それぞれの表のどの列で結びつけるかを指定しています。
「FROM」のところやSELECTなどで、[氏名表$] のように書くのはExcelでSQLを扱う場合の方言で、他のデータベースソフトでは記号は要らず、名前だけでOKです。ちなみに「$」はExcelシートを対象としたSQLの場合だけに用いる記号です(Excel固有の方言のようなものです)。
「システムテーブル」を意味します。
これはExcelの場合、MicrosoftQuery(QueryTableオブジェクト)、DAOでのSQL、ADOでのSQL、すべて共通です。なお、Accessからでも、Excelのシートを読みに行くときには「$」を使うことがあります。
- 投稿タグ
- AccessVBA, Accessの独学, Access操作の基礎, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, パソコンでの自動化, ビジネスパソコンの基礎, ピボットテーブル関連, マクロ, モジュールVBA, 効率化, 就活, 独学, 用語, 簿記, 自動化