SQL Server 2012 數據查詢二 多表查詢(連接查詢、嵌套查詢)

SQL語法格式

SELECT [all | DISTINCT] <目標列表達式> [別名] [,<目標列表達式> [別名]]...
FROM <表名或視圖名> [別名] [,<表名或視圖名> [別名]]... | (<SELECT語句>) [AS] <別名>
[WHERE <條件表達式>]
[GROUP BY <列名1> [HAVING <條件表達式>]]
[ORDER BY <列名2> [AES|DESC]]

連接查詢

1.交叉連接查詢

簡要說明:
    交叉連接是連接查詢裏最簡單的連接方式,原理是對兩個表進行連接查詢操作時,生成兩者的笛卡爾積。例如:一個m行的數據表與一個n行的數據表進行交叉連接,則會生成一個m*n的結果集。交叉連接查詢由於會生成大量不符合業務的數據,因此基本沒有實際應用。

語法格式:

	語法一:
	SELECT <目標列表達式> 
	FROM <表名或視圖名> CROSS JOIN <表名或視圖名>
	語法二:
	SELECT <目標列表達式> 
	FROM <表名或視圖名> , <表名或視圖名>

使用示例:對student表和class表進行交叉連接查詢

	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student cross join class
	或者
	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student , class

2.內連接查詢

簡要說明:
    內連接是在交叉連接生成結果集的基礎上,按照指定條件對結果集進行過濾。內連接查詢的結果符合實際業務邏輯,在實際應用中用的最多。

語法格式:

	語法一:
	SELECT <目標列表達式> 
	FROM <表名或視圖名> INNER JOIN <表名或視圖名>
	ON <過濾條件表達式>
	語法二:
	SELECT <目標列表達式> 
	FROM <表名或視圖名> , <表名或視圖名>
	WHERE <過濾條件表達式>

使用示例:對student表和class表進行交叉查詢

	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student inner join class
	on student.ClassID=class.ClassID  --過濾出學生所在班級編號與class表班級編號一致的數據
	或者
	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student , class
	where student.ClassID=class.ClassID  --過濾出學生所在班級編號與class表班級編號一致的數據

3.左外連接查詢

簡要說明:
    左外連接的左表爲主表,右表爲從表,使用左外連接進行查詢時,如果左表有記錄但是右表沒有與之匹配的記錄時。則將右表相應的列值設爲null。
    例如:A表: a,null,c,d
      對應B表:1 ,2,null ,3
    使用左外連接後的結果集爲(假設同一列數據相匹配):a1,cnull,d3
    因此可以看出,當左表沒有記錄而右表有記錄時(如A中的第二列與B中的第二列),去掉該記錄;當左表有記錄而右表沒有記錄時,將右表對應列值設null(如A表第三列與B表第三列形成cnull)。

語法格式:

	SELECT <目標列表達式> 
	FROM <表名或視圖名> LEFT OUTER JOIN <表名或視圖名>  --OUTER關鍵字可省略
	ON <過濾條件表達式>

使用示例:對student表和class表進行左外連接查詢

	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student left outer join class
	on student.ClassID=class.ClassID

4.右外連接查詢

簡要說明:
    右外連接的右表爲主表,左表爲從表,使用右外連接進行查詢時,如果右表有記錄但是左表沒有與之匹配的記錄時。則將左表相應的列值設爲null。
    例如:A表: a,null,c,d
      對應B表:1 ,2,null ,3
    使用右外連接後的結果集爲(假設同一列數據相匹配):a1,null2,d3
    因此可以看出,當右表沒有記錄而左表有記錄時(如B中的第三列與A中的第三列),去掉該記錄;當右表有記錄而左表沒有記錄時,將左表對應列值設null(如B表第二列與A表第二列形成null2)。

語法格式:

	SELECT <目標列表達式> 
	FROM <表名或視圖名> RIGHT OUTER JOIN <表名或視圖名>  --OUTER關鍵字可省略
	ON <過濾條件表達式>

使用示例:對student表和class表進行右外連接查詢

	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student right outer join class
	on student.ClassID=class.ClassID

5.全外連接查詢

簡要說明:
    全外連接左表右表的所有記錄都需要保留。當一個表中的記錄另一個表沒有相應的記錄與之匹配值,則將另一個表的相應列值設爲NULL。
    例如:A表: a,null,c,d
      對應B表:1 ,2,null ,3
    使用全外連接後的結果集爲:a1,null2,cnull,d3
    因此可以看出,當左表沒有記錄而右表有記錄時,將左表對應列值設null(如B表第二列與A表第二列形成null2);當左表有記錄而右表沒有記錄時,將右表對應列值設null(如A表第三列與B表第三列形成cnull)。

語法格式:

	SELECT <目標列表達式> 
	FROM <表名或視圖名> FULL OUTER JOIN <表名或視圖名>  --OUTER關鍵字可省略
	ON <過濾條件表達式>

使用示例:對student表和class表進行右外連接查詢

	select StuNo 學號,StuName 姓名,ClassName 所在班級 
	from student full outer join class
	on student.ClassID=class.ClassID

嵌套查詢

1.獨立單值子查詢

簡單說明:獨立單值子查詢中,內查詢與外查詢沒有依賴關係,返回的值只有一個
語法格式:

	SELECT <目標列表達式> 
	FROM <表名或視圖名>
	WHERE <含有獨立單值子查詢的條件表達式>

使用示例:查詢student表中所在班級爲19軟件3班的學生

	select *
	from student
	where ClassID=(
		select ClassID
		from class
		where ClassName='19軟件3班'
	)

2.獨立多值子查詢

簡單說明:獨立多值子查詢中,內查詢與外查詢沒有依賴關係,返回的值有多個
語法格式:

	SELECT <目標列表達式> 
	FROM <表名或視圖名>
	WHERE <含有獨立多值子查詢的條件表達式>

使用示例:查詢student表中軟件專業的學生

	select *
	from student
	where ClassID in(
		select ClassID
		from class
		where ClassName like '%軟件%'
	)

3.相關子查詢

簡單說明:相關子查詢中,內查詢與外查詢有依賴關係
語法格式:

	SELECT <目標列表達式> 
	FROM <表名或視圖名>
	WHERE <含有相關子查詢的條件表達式>

使用示例:查詢所有班級的學生信息

	select *
	from student
	where exists(
		select * from class
		where class.ClassID=student.ClassID
	)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章