多关系连接查询.
前面我们说过数据库中有多个基本表,各个表中存放着不同的数据。我们前面介绍各种查询操作时的例子也是如此,有学生关系表、教师关系表、课程关系表、选课关系表以及授课关系表等等。用户往往有着使用多个表中的数据来组合、提炼出信息的需求。倘若一个查询过程需要对多个表进行操作,就称之为连接查询。连接查询的结果表称为表之间的连接,连接查询实际上是通过各个表之间共同列的关联性来查询数据的,数据表之间的联系是通过表的字段值来体现的,这种字段称为连接字段。连接操作的目的就是通过加在连接字段上的条件将多个表连接起来,以便从多个表中查询数据。
在关系数据库标准语言SQL与关系数据库管理系统SQL Server(三)中涉及的查询都是针对一个表进行的,当查询同时涉及两个及两个以上的表时,称为连接查询。
连接查询结构.
表与表之间的连接方法有以下两种:
- 表之间满足一定条件的行进行连接时,
FROM
子句指明进行连接的表名,WHERE
子句指明连接的列名及其连接条件。 - 利用关键字
JOIN
进行连接,具体的连接方法分为以下几种:
①【INNER JOIN
】内连接显示符合条件的记录,这也是默认的方法;
②【LEFT (OUTER) JOIN
】左外连接用于显示符合条件的数据行以及左边表中不符合条件的数据行,此时右边数据行会以NULL
来显示。
③【RIGHT (OUTER) JOIN
】右外连接用于显示符合条件的数据行以及右边表中不符合条件的数据行,此时左边数据行会以NULL
来显示。
④【FULL (OUTER) JOIN
】显示符合条件的数据行以及左边表和右边表中不符合条件的数据行,此时缺乏数据的数据行会以NULL
来显示。
⑤【CROSS JOIN
】将一个表的每一个记录和另一个表的每个记录匹配成新的数据行。
另外需要注意,将JOIN
关键字放置于FROM
子句中时,应该有关键字ON
与之对应,来引出连接的条件。
内连接查询.
首先我们给出一个例子,使用不同的方法来实现查询功能:
【例】查询刘伟老师所授课程的课程号并且要求列出刘伟老师的教师号和教师姓名。
方法1:
SELECT T.TNo,TN,CNo
FROM T,TC
WHERE T.TNo=TC.TNo AND TN='刘伟'
这里的T.TNo=TC.TNo
是连接条件,其中TNo
是连接字段,引用该字段时必须要加上表前缀,这是由于T
和TC
表中都有TNo
这一字段,需要表示出区别。TN='刘伟'
就是查询条件,上述查询过程中,将T
表和TC
表中TNo
字段相等的行进行连接,而后再选取TN='刘伟'
的行,最后再对于TNo,TN,CNo
进行投影操作,得到结果。
方法2:
SELECT T.TNo,TN,CNo
FROM T INNER JOIN TC
ON T.TNo=TC.TNo
WHERE TN='刘伟'
方法2と方法1の違いは、実際には内部結合クエリを作成する2つの方法のみです。後者FROM
は、WHERE
句で結合するテーブルを指定し、結合条件を句に挿入します。前者はJOIN
キーワードを使用して結合を指定します。テーブル、接続条件はON
キーワードで導き出されます。
方法3(サブクエリを含む):
SELECT R1.TNo,R2.TN,R1.CNo
FROM
(
SELECT TNo,CNo
FROM TC
) AS R1 INNER JOIN
(
SELECT TNo,TN
FROM T
WHERE TN='刘伟'
) AS R2
ON R1.TNo=R2.TNo
正直に言うと、サブクエリを使用するためにサブクエリを使用するよりも少し損失が大きくなります。サブクエリについては、後で紹介します。
[例]学生ID、名前、コース名、およびコースを選択したすべての学生の成績を照会します。
SELECT S.SNo,SN,CN,Score
FROM S,C,SC
WHERE S.SNo=SC.SNo AND SC.CNo=C.CNo
この質問には3つのテーブルの接続がWHERE
含まれ、句には2つの接続条件が含まれています。
【例】各コースのコース番号、コース名、コース数を問い合わせる。
SELECT SC.CNo,CN,COUNT(SC.CNo) AS StudentNumber
FROM SC,C
WHERE SC.CNo=C.CNo
GROUP BY SC.CNo,CN
GROUP BY
句では、CNoとCNの2つのフィールドでグループ化する必要があることに注意してください。そうしないと、システムによってエラーメッセージが表示されます。
選択リストの列「C.CN」は、列が集計関数またはGROUPに含まれていないため無効です。 BY句。詳細については、この記事を参照してください。
外部結合クエリ。
上記の内部結合クエリでは、FROM...WHERE
フォームまたはINNER JOIN...ON
フォームに関係なく、結合条件を満たさないタプルは出力されません。[例] クエリでは、すべての選択的な学生の学生ID、名前、コース名、および成績がクエリされます。 S6 Wu Liはコースをまったく選択しなかったため、彼女に関する情報はありません。(上記の関係表は、「データベースの原則とアプリケーションのチュートリアル」-Chen Zhibo-4th Edition-Page 27に基づいています)。外部接続では、接続に参加しているテーブルがマスターとスレーブに分割され、マスターテーブルのデータの各行を使用してスレーブテーブルのデータ列が照合されます。接続条件を満たすデータは直接結果セットに返され、接続条件を満たさない列はNULLで埋められて結果セットに返されます(ビット型のデータには例外があり、ビットはNULL値を許可しないため、 0で埋められ、結果セットに返されます)。
外部結合は、メインテーブルが配置されている方向によって区別されます。左側のメインテーブルは左側外部結合と呼ばれ、右側のメインテーブルは右側外部結合と呼ばれます。
[例]すべての学生の学生ID、名前、コース名、および成績を照会します。(コース選択情報およびコースを選択していない学生の成績はNULLとして表示されます)
SELECT S.SNo,SN,CN,Score
FROM S
LEFT OUTER JOIN SC
ON S.SNo=SC.SNo
LEFT OUTER JOIN C
ON SC.CNo=C.CNo
前述の内部結合クエリと比較します。
SELECT S.SNo,SN,CN,Score
FROM S,C,SC
WHERE S.SNo=SC.SNo AND SC.CNo=C.CNo
クロスクエリ。
クロスクエリにCROSS JOIN
は、結合されたテーブルの要件はありません。
[例]生徒テーブルSとカリキュラムテーブルCをクロスクエリします。
SELECT *
FROM S CROSS JOIN C
上記のクエリの結果は、studentテーブルSの各レコードとコーステーブルCの各レコードを新しいデータ行に結合することです。結果セットのタプルの数は2つの積であり、列の数は2つの合計です。
自己結合クエリ。
テーブルがそれ自体に接続されている場合、それはテーブルの自己接続と呼ばれます。
[例] Liu Wei先生より給与が高いすべての先生の名前と給与、およびLiu Wei先生の給与を照会します。
方法1:
SELECT X.TN,X.Sal AS Sal_a,Y.Sal AS Sal_b
FROM T AS X, T AS Y
WHERE Y.TN='刘伟' AND X.Sal>Y.Sal
方法2:
SELECT X.TN,X.Sal AS Sal_a,Y.Sal AS Sal_b
FROM T AS X INNER JOIN T AS Y
ON Y.TN='刘伟' AND X.Sal>Y.Sal
方法3:
SELECT R1.TN,R1.Sal,R2.Sal
FROM
(SELECT TN,Sal FROM T) AS R1
INNER JOIN
(SELECT Sal FROM T WHERE TN ='刘伟') AS R2
ON R1.Sal>R2.Sal