「SELECT (SQL)」の版間の差分

削除された内容 追加された内容
m ボット: 言語間リンク 17 件をウィキデータ上の (d:Q1164001 に転記)
TASH (会話 | 投稿記録)
編集の要約なし
63行目:
このFROM句では表別名の指定が可能であるが、一旦表別名を指定した場合、表別名で記述してやらないとエラーになる。
 
;====結合(JOIN句)====
:複数の表から行を参照する場合に用い、JOINを利用することが多い。種類としては以下のものがある。
#;クロス結合
:[[デカルト積]]を生成する。結合条件は指定できない。
#内部結合(等価結合、非等価結合、自然結合、自己結合を含む)
#外部;等価結合
:結合条件として、等価演算子(=)を用いる結合。一般的によく用いる結合方法。結合する共通列にnull値が存在しない場合に用いる。
一方、あるいは双方の値にNULL値を含む場合に使用される。左側外部結合、右側外部結合、完全外部結合の3種類がある。
:等価結合の一般的な書式は以下の通りである。
 
等価結合の一般的な書式は以下の通りである。
 
<source lang="sql">
78 ⟶ 77行目:
:ここで表名は記述の簡便化を図るため別名表示させることが多い。その場合、共通列には必ず表別名で記述しないとエラーになる。また、SELECT句において共通列は必ずどの表のものかを記述しないといけない(これを表修飾という)。その他の共通でない列は、必ずしも表修飾させなくても良いがパフォーマンスが低下するため、表修飾を習慣づけるのが望ましいとされている。
 
:※二つ以上の共通列があり、片方のみを使用したい場合
他にNATURAL JOIN(自然結合)、またUSING句(共通列の限定)を使用する場合がある。これらの場合も、色々と細かい制約が発生する。
::USING句を用いると、結合に用いる共通列を限定することができる。例文は表A、Bに二つ共通列があるが、そのうちAだけを使用する場合の記述。
<source lang="sql">
SELECT 共通列A,任意の表名.共通列B,その他の列名 FROM 表名A [INNER] JOIN 表名B USING(共通列A);
</source>
 
::この場合、共通列Aに対し、表修飾を行うとエラーになる。また、共通列Bにはどちらの表を使用するか表修飾を行わないと、同様にエラーになる。
 
;非等価結合
:結合条件として、等価演算子を用いない場合の結合。例としては>,<,<>(不一致),BETWEENなどがある。
 
<source lang="sql">
SELECT 任意の表名.共通列 FROM 表名A [INNER] JOIN 表名B ON 表名A.共通列 <> 表名B.共通列;
</source>
 
::例文では、共通列から同じ値を持たない行が返されるため、データの漏れなどを確認するときなどに重宝する。
 
;自然結合
:異なる二つ以上の表に用いると、同じ名前の共通列がある場合はそれに基づき結合を行う結合(ない場合でも自動でデカルト積を生成し、その場合はクロス結合と同じになる)。JOIN句ではNATURAL JOINと記述し、共通列を表別名で修飾する必要はない。逆に'''共通列を表名や表別名で修飾するとエラーになる'''。
<br>
:自然結合は、ある表において、行の一部が外部キーとなっていた場合、その主キーが参照する値を表示したい場合などに用いると、SQLの記述が簡易になる。たとえば、企業(企業コード、企業名、業種コード)、業種(業種コード、業種名)という二つの表があり、企業表の業種コードは外部キーになっている。ここから企業名と業種名を抽出したい場合に自然結合を用いると
 
<source lang="sql">
SELECT 企業名,業種名 FROM 企業 NATURAL JOIN 業種;
</source>
 
::このように、SQL文は非常に簡潔となる。しかし、等価結合と比較して無駄な動作が発生するために、パフォーマンスを考慮すると等価結合が望ましい場合が多い。
;自己結合
:同じ表にそれぞれ別名を用いて結合することで、広義の等価結合に属する。使用例としては、一つの表から相関的な値が使用されている時などに用いる。たとえば、表名A(棋士番号、棋士名、師匠番号)という表があり、師匠番号には棋士番号に対し外部キーが与えられている。ここで、各棋士と師匠の関係を一覧表示したい場合、棋士番号と師匠番号を関連づけて自己結合を行うと列の抽出を行える。
 
<source lang="sql">
SELECT K.棋士名, S.棋士名 AS 師匠名 FROM 表名A K [INNER] JOIN 表名A S ON 表名K.門下番号 = 表名S.棋士番号;
</source>
 
::※ここでは、表名Aから Kという棋士一覧表と、Sという師匠一覧表を作りだし、表Kにおける師匠番号と表Sにおける棋士番号を結びつけ、最終的に表Kの棋士名と、表Sの棋士名を師匠名と別名表記して一覧表示している。なお、データベース構築においては、新たに師匠表を作り、その[[主キー]]と棋士表の師匠番号を外部キーとして結びつける方法もある(もし、師匠番号に棋士番号と異なる値が入力された場合は新たに表を作った方が無難である)。
 
;外部結合
:一方、あるいは双方の値にNULL値を含む場合に使用される。左側外部結合、右側外部結合、完全外部結合の3種類がある。書式は以下の通りである。<BR>
:方向には(LEFT,RIGHT,あるいはFULLのいずれかを入れる。なお、DBMSによってはFULLに対応していないものもある)
<source lang="sql">
SELECT 任意の表名.共通列 FROM 表名A (方向) [OUTER] JOIN 表名B ON 表名A.共通列 = 表名B.共通列;
</source>
 
::ここでは、全ての行を抽出したい側にその方向を記述(たとえば、左の表が完全《null値が存在しない》ならば、LEFT、その逆ならばRIGHT、双方にnull値が存在する場合は、FULL)する。
 
=== WHERE句 ===