MySQLのSQL文です。
TblAのID、Nmがあり、TblBにID、Adrsがあるとします。

次の2つのSQL文の結果は同じになります。
そもそもこの2つの書き方には何か違う意味があるのでしょうか。

CREATE View TblC1 as
SELECT TblA.ID, TblA.Nm, TblB.Adrs
FROM TblA INNER JOIN TblB ON TblA.ID = TblB.ID;

CREATE View TblC2 as
SELECT TblA.ID, TblA.Nm, TblB.Adrs
FROM TblA ,TblB
where TblA.ID = TblB.ID;

また、TblAにはありTblBには含まれないレコードを出すときは
CREATE View TblC3 as
SELECT TblA.ID, TblA.Nm, TblB.Adrs
FROM TblA LEFT JOIN TblB ON TblA.ID = TblB.ID;
逆にTblBにありTblAには含まれないレコードを出すときは
CREATE View TblC4 as
SELECT TblA.ID, TblA.Nm, TblB.Adrs
FROM TblA RIGHT JOIN TblB ON TblA.ID = TblB.ID;
としています。

これをwhereを使った書き方ではできないのでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず、 InnerJoinか where句で 結合指定をするかですが、


基本的にはどちらでもかまいません。

実行計画を見ても違いはないです。

実行計画はselect句の前に”explain”を追加すると確認できます。

参考URL : http://dev.mysql.com/doc/refman/5.1/ja/explain.h …




>また、TblAにはありTblBには含まれないレコードを出すときは
これは、差集合といいます。
mysql での差集合の抽出方法は、
where句に、"not exitst"で出来ます。

頑張ってみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2011/04/12 18:14

MySQLのビュー表は、MySQL 5.0と実装が遅く、「FROM句でのサブクエリ(インラインビュー)」を使えないなどいろいろ制限があるので、初歩のSQLの勉強に使うにはお薦めしません。



内部結合だけの話なら、ONでの結合条件と、WHEREで結合条件を指定するのに差異はありません。
しかし、外部結合の場合は、まったく意味が違ってきます。

ON句で指定するのは結合条件で、どのように表を結合するかを指定します。この結合条件に合致しなかったものは、左側の表、右側の表などを基準にnullで返されます。

一方、WHERE句で書くのは制限条件であり、最終的な結果に影響します。

差分検索する基本的な方法として、

(1)left joinして、結合キーがnullとなるもの
(2)サブクエリの「not exists」
(3)サブクエリの「not in」

を使うといった方法があります。

このうち、not inは、性能を出しにくい構文です。

MySQLでは、サブクエリの実装がMySQL 4.1と遅かったこともあり、サブクエリでなくジョインに書き換える方が性能を出しやすいといったケースがたくさんあります。

以下、ぱっと思いついた構文で、実機確認していませんが、参考まで。

-- t1にあり、t2にない行
-- left join
select t1.c1
from t1
left join t2 on t1.c1=t2.c1
where t2.c1 is null

-- not exists
select c1
from t1
where c1 not exists(select 1 from t2 where t1.c1=t2.c1)


-- not in
select c1
from t1
where c1 not in(select c1 from t2)
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/04/15 09:05

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QViewのカラムの長さが不明?

はじめまして。Viewについての質問です。

とあるViewを作成し、Number型のカラムの長さを調べた所なにも表示されておらず、わからない状態になってしまいました。
元のTableのNumber型のカラムには(10,0)がセットされており同じTableを参照している別のViewには正しく(10,0)と表示されています。

カラムの長さが表示されないViewは分析関数、インラインビュー、UNIONなどを使用しているのでそれらが邪魔をしてカラムが取得できないようになってしまったのでしょうか?

こう言ったケースは初めてなので分かる方いらっしゃいましたら教えてください。

以上です。よろしくお願いします。

Aベストアンサー

NUMBER型のスケール(精度)については、不明になります。

例えば、SCOTT.EMPのEMPNOは、NUMBER(4)ですが、
CREATE VIEW V_EMP(EMPNO) AS SELECT EMPNO+0 FROM EMP;
としただけで、V_EMPのEMPNOは、桁数不明です。
(オラクルの属性追跡の限界なんでしょう)

Q3つのテーブルを結合させたSQL文について

3つのテーブルを結合させたSQL文について作成方法を教えてください。
よろしくお願いいたします。

【テーブル構成】
テーブル名---項目名/項目名・・・です。

tblA---id/del_flg/name
tblB---id/del_flg/add
tblC---id/del_flg/family


各テーブルはidによりリンクされます。

tblAのdel_flgは在籍者=0 退職者=1で、一人1レコードです。


tblBでは住所管理をしています。
旧情報を残したいので、更新時には新たにdel_flg=0でレコードを作成し、既存レコードはdel_flg=1に更新します。

tblCは、既婚者のみ作成されるレコードです。

つまり、tblBとtblCは、レコードが存在しない、あるいはdel_flg=0のみ、del_flg=0とdel_flg=1が混在 のどれかのパターンになります。


【やりたいこと】
いま、これらすべてのテーブルを全部つなげて、在籍している人の情報だけ集めたいのです。

tblAからはdel_flg=0のレコードをすべて取得したうえで、tblBとtblCにdel_flg=0のレコードがあればその情報も取得したい。


【経過】
select *
from
(tblA inner join tblB on tblA.id = tblB.id )
inner join tblC on tblA.id = tblC.id

とりあえずwhere条件をつけなくても、tblCに存在している人しか取得ができないのです。


where条件も含めて、上記条件のもと、希望するようなSQLの組み立て方をご教授ねがいたいのでよろしくお願いいたします。


できれば、早目の回答が希望です。

3つのテーブルを結合させたSQL文について作成方法を教えてください。
よろしくお願いいたします。

【テーブル構成】
テーブル名---項目名/項目名・・・です。

tblA---id/del_flg/name
tblB---id/del_flg/add
tblC---id/del_flg/family


各テーブルはidによりリンクされます。

tblAのdel_flgは在籍者=0 退職者=1で、一人1レコードです。


tblBでは住所管理をしています。
旧情報を残したいので、更新時には新たにdel_flg=0でレコードを作成し、既存レコードはdel_flg=1に更新します。

tblCは、既婚者...続きを読む

Aベストアンサー

仕様が微妙ですが、単純に考えればこんな感じ?

select *
from tblA
left join tblB on tblA.id = tblB.id and tblB.del_flg=0
left join tblC on tblA.id = tblC.id and tblC.del_flg=0
where tblA.del_flg=0

ただし、tblBは複数ある可能性があるため分けるのは妥当かもしれませんが
tblCはtblAの機能の一部の方がよいのでは?
すなわち未婚、既婚、以前既婚の状態は排他関係にあるので、複数にならず
既婚カラムで管理すればすっきりするので・・・

QOracle内で作成したFunction、Viewの紐付け一覧

Oracle内のFunctionから別のFunctionやViewを使用している親子関連を調べたいのですが、
ファイル数が多すぎて全てのソースを解読して調べる時間がありません。

どなたか、親子関係の情報を出力させるコマンドかフリーソフトをご存知ありませんか。

Aベストアンサー

ALL_DEPENDENCIESデータディクショナリビューを使ってみてはどうでしょうか?

select NAME,TYPE,REFERENCED_NAME,REFERENCED_TYPE
from ALL_DEPENDENCIES
order by name

調べたいオブジェクトをnameで条件付けすれば調べたいファンクションの依存を調べられます。

QこちらのテーブルにあってこちらのテーブルにないIDを抽出するSQL

お世話になってます
MySQLでデータを格納しております。
以下のようにUserTable,Userinfoという2つのテーブルがあったとします。

■UserTable
-ID(key)
-username

■Userinfo
-ID(key)
-user_info1
-user_info2

UserTableはユーザID作成時に自動でレコードが生成されます。
登録されたユーザは自分の情報を自分自身で登録することにより
Userinfoテーブルにレコードが生成されます。

ここで、ユーザIDを作成したユーザのうち、自分の情報を登録していない
ユーザIDを抽出したいのですが、この場合、どのようなSQLを書けばよいのでしょうか・・・?
ユーザIDが、UserTableにあって、UserInfoにない、というものを作ればよいのですが・・・
SQLだけじゃ無理でしょうか・・・?

Aベストアンサー

最近これと同じ質問が多いですが、はやっているのでしょうか?

SELECT UT.ID
FROM UserTable AS UT
LEFT JOIN Userinfo IS UI USING(ID)
WHERE UI.ID IS NULL

QHow to import HorizontalGridView in android studio

android開発初心者です。環境は android studio、API 23です。
(Visual StudioでのC#, C++開発経験はある程度あります。)

横方向にスルロールするGridViewを使用したいので、HorizontalGridViewを検討しています。
ですが、Support Library rev23.1.1をチェックしてもHorizontalGridViewの文字列が赤くなり、クラスとして認識されません。
使用するためにはほかに何か設定があるのでしょうか?
ご回答お願いします。

Aベストアンサー

minimum sdk を 17(Android 4.2)以上にして
learnback-v17 をライブラリに加えてください。

後者の手順は [File]→[Project Structure]→[モジュール名(たいていapp)] で [dependencies] タブを選ぶ
右肩の[+]ボタンを押して [Library Dependency] で表示されるダイアログで leanback-v17 を選ぶ。

以上は、Google のリファレンスを引けばわかります。

Qテーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。

下記のような table_a, table_b があり、idフィールドで外部結合させています。

table_a
id|value
-------
1 | 0
2 | 1

table_b
id|name
-------
1 | A
2 | B

SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b;

result
id|value|name
--------------
1 | 0 | A
2 | 1 | B

しかし、下記のクエリでは、このようにidがNULLになってしまいます。

SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1;

result
id |value|name
--------------
NULL| 0 | A

以下のような結果を得たいのですが、どうすれば良いのでしょうか?

result
id|value|name
--------------
1 | 0 | A

MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。

下記のような table_a, table_b があり、idフィールドで外部結合させています。

table_a
id|value
-------
1 | 0
2 | 1

table_b
id|name
-------
1 | A
2 | B

SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b;

result
id|value|name
--------------
1 | 0 | A
2 | 1 | B

しかし、下記のクエリでは、このようにidがNULLになってしまいます。

SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b...続きを読む

Aベストアンサー

素直に。
select table_a.id,value,name from table_a left join table_b on table_a.id = table_b.id where table_a.id = 1;

QViewGroup.LayoutParamsクラス

Androidで「ViewGroup.LayoutParamsクラス」と「ViewGroupクラス」の関係について教えてください

・継承については、下記のような関係になっていると思うのですが、この時、「ViewGroup.LayoutParamsクラス」と「ViewGroupクラス」はどこで繋がっているのでしょうか?

ViewGroup.LayoutParams < Object
・ViewGroup.LayoutParams extends Object

ViewGroup < View < Object
・ViewGroup extends View
・View extends Object

・「ViewGroup.LayoutParamsクラス」は、確か「ViewGroupクラス」でも利用できたかと思うのですが
・「ViewGroup.LayoutParams」この書き方自体に何か特別な意味があるのでしょうか?

Aベストアンサー

http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/ から、
android-4.2.2_r1-sources.jar をダウンロードして、grep
対象はandroid.*以下

>・「A.B」というクラス名だけど、「ネストではない普通のクラス」はあり得る?
命名規則上混乱してしまいます。と言いたいところですが、いくつか検索してみます。

LayoutParamsクラス15クラスに関して言えばありません。
他にもA.Bとなっているクラスはあると思います。いくつか見てみます。一つ一つソースを読んでいるわけではもちろんなく、ソースに検索を掛けているだけなので、厳密に言えるわけではありませんが、参考までになります。

xxx.Engine 2クラス 全てネスト
xxx.Sessionクラス 2クラス 全てネスト
xxx.Callbackクラス 4クラス 全てネスト
xxx.Event 2クラス 全てネスト
リスナを定義するインタフェース(interface XxxxxListener) 約150 ネストでないインタフェースが11個ありますが、名前の重複はありません。

個別に検索する必要があるのでいくつか検索してみましたが、検索した範囲では、ネストでない定義かつ、名前の重複はありませんでした。

>「Hoge」クラスではない他のクラスの「ネストクラス」である可能性はあるでしょうか?
ざっくり言うと、Foo.LayoutParamsクラス、Bar.LayourParamsクラス両方定義される場合があります。この場合、FooクラスのインスタンスからBar.LayoutParamsは利用してはなりません。

しっかり言うと、クラスドキュメントを確認して、クラスの親子関係をしっかり確認する必要があります。

http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/ から、
android-4.2.2_r1-sources.jar をダウンロードして、grep
対象はandroid.*以下

>・「A.B」というクラス名だけど、「ネストではない普通のクラス」はあり得る?
命名規則上混乱してしまいます。と言いたいところですが、いくつか検索してみます。

LayoutParamsクラス15クラスに関して言えばありません。
他にもA.Bとなっているクラスはあると思います。いくつか見てみます。一つ一つソースを読ん...続きを読む

QMySQLテーブルの結合

MySQLテーブルの結合
select フィール名(field1,field2,field3)from xテーブル名 [inner/left/right] join yテーブル名 on 結合条件
解説書には説明されています
現在自分のデータベースは
ahogedb(テーブル名)
no
hoge1
hoge2

bhogedb(テーブル名)
no
ahogeno(ahogedbのnoを登録)
hoge3

ahogedbを表示してbhogedbでの訪問回数を表示させたいのです
bhogedbのahogenoにはahogedbのnoが逐次登録されています
表示はno,hoge1,hoge2に追加したahogenoのカウント数
select文の式の書き方を出来れば1列にして教えてください
ahogenoは別名の変数処理するのでしょうか

Aベストアンサー

訪問回数とは? という説明がないので、想像で書きますが・・

select ahogedb.no,ahogedb.hoge1,ahogedb.hoge2,count(bhogedb.ahogeno) as c
from agogedb join bhogedb on (ahogedb.no=bhogedb.ahogeno)
group by ahogedb.no,ahogedb.hoge1,ahogedb.hoge2

でいいんじゃなかろうかと思いますが。

ahogedb.noのbhogedbでの”出現回数”が数えられます。
出現しないモノも含めて、ahogedbを表示するなら、
left joinを使うことで、可能かと思います。

#どうせなら、質問に使うフィールドやテーブルは
#わかりやすく&簡素な名前の方が良いと思いますよ。

QGridviewとDataGridviewの違い

visual web developer2010を使用して
社内用の簡単なwebアプリケーションを作成しています。

DataGridViewとGridViewの違いは
やっとのことでなんとなく分かったのですが
(GridViewはDataGridViewの進化版?)

自分のやりたいことをネットで検索してコードを探すと
そのほとんどがDataGridViewを使用したものです。

Clipboard.SetDataObject(DataGridView1.GetClipboardContent())

たとえば上記のような感じです。

これをGridViewで使えるようにしたくて
自分なりにコードを書き換えたりしてみるのですが
(DataGridView1をGridView1にしてみたり、
DataGridView1をMe.DataGridView1にしてみたりしています)
すべてエラーになってしまいます。

だったらDataGridViewを設置したいと思うのですが
ツールバー内にDataGridViewはあるものの
色が薄くなっていて(グレーアウトみたいな感じです)選択できない状態です。

GridViewで、DataGridViewのコードを参考にして
少し書き換えれば動くようなことはないのでしょうか?
または
DataGridViewが使える方法を教えてください!

ご教授お願いいたします!

visual web developer2010を使用して
社内用の簡単なwebアプリケーションを作成しています。

DataGridViewとGridViewの違いは
やっとのことでなんとなく分かったのですが
(GridViewはDataGridViewの進化版?)

自分のやりたいことをネットで検索してコードを探すと
そのほとんどがDataGridViewを使用したものです。

Clipboard.SetDataObject(DataGridView1.GetClipboardContent())

たとえば上記のような感じです。

これをGridViewで使えるようにしたくて
自分なりにコードを書き換えたりしてみるのですが
(...続きを読む

Aベストアンサー

> DataGridViewとGridViewの違いは
> やっとのことでなんとなく分かったのですが

いや、この書き込みをみる限りではわかってないと思いますよ。

DataGridView:
 Windowsアプリケーション用のGridコントロール。
 Webでは使えません。

GridView:
 Webアプリケーション用のGridコントロール。
 Webなので、最終的にはHTMLに変換されます。

この一番基本的な違いがわかってないと思います。

> 自分のやりたいことをネットで検索してコードを探すと
> そのほとんどがDataGridViewを使用したものです。

Webアプリケーションの場合、すべてHTMLに変換されますから、
システムの動作はHTMLをベースに考える必要があります。
やりたいことを考えるうえで、HTMLだとどう動かせばよいか、
というところから学習するのがよいかと思います。

QMySQL テーブルの結合

顧客ごとにテーブルを作る香ばしいプログラムのSQL文を書くことになりました。
user_0001
user_0002
user_0003
user_0004
user_0005
といった具合にどんどん増えていきます。
カラムは仮に id, name, tel が入っているとします。
プログラムの修正は行えません。
通常JOIN句でテーブルの結合を行うと思うのですが、「user_」という文字列を含んでいるテーブルを全て結合せよ!みたいな命令文はSQLで書けるのでしょうか?
無理、無駄、素直にプログラムで出せ、というアドバイスでも構いませんのでよろしくお願いします。

Aベストアンサー

無理、無駄

というか、顧客ごとにテーブルを作っているなら横断的に検索させたら
わける意味がなくない?
そんなことするならtableid的なカラムつくるだけで全て解決するし
(プログラムの修正が行えないという時点でそういう選択肢はないのでしょうけど)


人気Q&Aランキング

おすすめ情報