プロが教える店舗&オフィスのセキュリティ対策術

リストを出力する際にSQLでデータの取得をする際に全く分からないことがあります。

2つのテーブルと1つのマスタがあり、リストを出力するときの項目となる部分に

ssql = A_TB.○○
ssql= A_TB.××
ssql= B_TB.**
ssql= B_TB.☆☆
ssql= A_TB.♪♪
ssql= C_MT.〒〒
ssql= A_TB.々々

のようにselectで各項目となる各テーブル、マスタのカラムを代入しています。

このときのformはどうなりますか?

A 回答 (2件)

こんばんは。


僕の知識が足らなくて、全く知らなかったことなのかも知れませんが、
おそらく、SQLでそういう書き方はしません。

実際に実行するのは、何らかのプログラムでSQL文を実行させるわけですよね??
基本的には、一つの変数に、全ての句のSQL文をつなげて文字列として代入し、これを引数として受け取る何らかの関数で実行します。
SQL文は、

"SELECT * FROM A_TB"

と書けば、A_TBのデータが全て取り出せます。
例えば、A_TBが請求書のデータを格納しているテーブルで、C_MTが顧客データを格納しているテーブルなら、
請求書の顧客IDと、顧客データの顧客IDが、紐づけられているハズです。

"SELECT * FROM A_TB LEFT JOIN C_MT ON A_TB.顧客ID = C_MT.顧客ID"

と書けば、各請求書に各顧客データを紐づけて、請求書のデータが全て取り出せます。

ちなみにSELECT文の*の部分は、テーブルのカラム名をカンマ区切りで指定できますが、
*を書けば全てのカラムが対象になります。

SELECT文で指定したカラムのテーブルは、
基本的には、FROM句で結合方法を決めて、全て指定しなくてはなりません。

…この辺までが、SQLのハローワールドでしょうか。

******

別のご質問の補足となりますが、SQLを学ばれるのであれば、SQLiteがオススメです。
1ファイルで完結し、容易にバックアップをとったり、持ち運びできるからです。
データベースブラウザには、DB Browser for SQLiteという、下記のURLからダウンロードして使えるものがオススメです。
http://sqlitebrowser.org/
    • good
    • 0
この回答へのお礼

ご丁寧な質問ありがとうございます!
ひとつ疑問があるのですが、selectで指定したカラムのテーブルをいくつか取り出す場合にもjoinで結合するというのはなぜでしょうか?
なんのテーブルのどこのカラムかというのを指定してひとつの変数に各カラムを代入してもそれだけでは無意味ということでしょうか?

お礼日時:2017/05/27 08:39

No.1ですが、回答に対していただきましたご質問にお答えします。



>> selectで指定したカラムのテーブルをいくつか取り出す場合

取り出されるデータは、レコードごとの行、カラムごとの列で形成される二次元の表形式ですから、
これは、取り出したデータがどのような表になるか、具体的に想像すれば、お判りでしょう。

仮にA_TBに、
商品名、顧客名, 数量、金額を表すカラムがあり、
商品A, Aさん, 10, 1000
商品B, Bさん, 20, 2000
商品C, Aさん, 30, 3000
とデータが格納されていて、

C_MTに、
顧客名、顧客住所を表すカラムがあり、
Aさん, 東京都
Bさん, 埼玉県
とデータが格納されているとします。

"SELECT * FROM A_TB, C_MT"
と、JOINを用いなければ、
A_TBの各レコードに対して、C_MTの全てのレコードが結合された、異常に膨大なデータ(直積)が取り出されます。
これを交差結合(Cross Join)と言います。

結果
商品A, Aさん, 10, 1000, Aさん, 東京都
商品A, Aさん, 10, 1000, Bさん, 埼玉県
商品B, Bさん, 20, 2000, Aさん, 東京都
商品B, Bさん, 20, 2000, Bさん, 埼玉県
商品C, Aさん, 30, 3000, Aさん, 東京都
商品C, Aさん, 30, 3000, Bさん, 埼玉県

これに対し、SQLのきちんとした文法を用いて、
SELECT * FROM A_TB INNER JOIN C_MT ON A_TB.顧客氏名 = C_MT.顧客氏名
と書けば、
上記の交差結合の結果のうち、A_TB.顧客氏名 = C_MT.顧客氏名の部分だけ取り出されます。

結果
商品A, Aさん, 10, 1000, Aさん, 東京都
商品B, Bさん, 20, 2000, Bさん, 埼玉県
商品C, Aさん, 30, 3000, Aさん, 東京都

>> なんのテーブルのどこのカラムかというのを指定してひとつの変数に各カラムを代入してもそれだけでは無意味

おっしゃる通り、無意味です。
前の回答にも書きましたが、基本的には、
一つの変数に、全ての句のSQL文をつなげて文字列として代入し、これを引数として受け取る何らかの関数で実行します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!