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
)