SQL Sever联接查询
聯(lián)接查詢:是有一個笛卡爾乘積運算再加一個選取運算構(gòu)成的查詢。
首先用笛卡爾乘積完成對兩個數(shù)據(jù)集合的乘運算,然后對生成的結(jié)果集合進行選取運算,確保只把分別來自兩個數(shù)據(jù)集合并且具有重疊部分的行合并在一起。
聯(lián)接的全部意義在于水平方向上合并兩個數(shù)據(jù)集合,并產(chǎn)生一盒新的結(jié)果集合。
聯(lián)接可分為以下幾類:內(nèi)部聯(lián)接、外部聯(lián)接、交叉聯(lián)接
表
1. 內(nèi)部聯(lián)接
內(nèi)部聯(lián)接是使用比較運算符比較要聯(lián)接列中的值得聯(lián)接。內(nèi)連接也叫聯(lián)接,最早被稱為普通聯(lián)接或自然聯(lián)接。
內(nèi)聯(lián)接是從結(jié)果中刪除其他被聯(lián)接表中沒有匹配行的所有行,所以內(nèi)聯(lián)接可能會丟失信息。
2. 外部聯(lián)接
外部聯(lián)接則擴充了內(nèi)聯(lián)接的功能,會吧內(nèi)聯(lián)接中刪除表源中的一些保留下來,由于保留下來的行不同,可將外部聯(lián)接分為 左向外部聯(lián)接、右向外部聯(lián)接或完整外部聯(lián)接。
2.1 左向外聯(lián)接
語法
select fieidlist from table1 left join table2 on table1.comlumnn=table2.column參數(shù)說明:
| fieldlist | 搜索條件 |
| table1 [inner] join table2 | 將table1表與table2表進行外部聯(lián)接 |
| table1.column=table2.column | table1表中與table2表中相同的列 |
eg. 把Studnet表和SC表左外連接,第二個表SC有不滿足聯(lián)接條件的行,則用NULL表示 。
select * from Student left join SC on Student.Sno=SC.Sno
解析:這里出現(xiàn)NULL說明SC表中沒有Sno等于4和6的
2.2 右向外聯(lián)接
右外向聯(lián)接使用 right jion 進行聯(lián)接,是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某一行在左表中沒有匹配行,則將為坐標返回空值。
語法:
select fieldlist from table1 right join table2 on table1.column=table2.columneg. 把SC表和Course表右外聯(lián)接,第一個表SC有不滿足聯(lián)接條件的行,則用NULL表示。
select * from SC right join Course on Course.Cno=SC.Cno這里右外聯(lián)接的是Course表,所以Course表的數(shù)據(jù)完整
2.3 完整外聯(lián)接
完整外連接使用 full join 進行聯(lián)接,將返回左表和右表中的所有行。當某一行在另一個表中沒有匹配時,另一個表的選擇列表將包含空值。如果表之間有匹配行,則將整個結(jié)果集行包含基表的數(shù)據(jù)值。
語法:
select fieldlistfrom table1 full join table2 on table1.column=table2.columneg. 把SC表和Course表完整外部聯(lián)接,顯示兩個表中所有的行。
select * from SC full join Course on Course.Cno=SC.Cno3. 交叉聯(lián)接
交叉聯(lián)接使用 cross join 進行聯(lián)接,沒有where子句的交叉聯(lián)接將產(chǎn)生聯(lián)接所涉及的表的笛卡爾積。第一個表的行數(shù)乘以第二個表的行數(shù)等于笛卡爾積結(jié)果集得大小。
交叉聯(lián)接中列和行的數(shù)量是這樣計算的:
- 交叉聯(lián)接中的列=原表中列的數(shù)量總和(想加)。
- 交叉聯(lián)接中的行=原表中行數(shù)的積(相乘)。
語法:
select fieldlist from table1 cross join table2其中,忽略 on 方法來創(chuàng)建交叉聯(lián)接。
eg. 把 Student 表和 Course 表進行交叉聯(lián)接。
select * from Student cross join Course4. 聯(lián)接多表
4.1 在where子句中聯(lián)接多表
在 from 子句中寫聯(lián)接多個表的名稱,然后將任意兩個表的聯(lián)接條件分別寫在 where 子句后。
語法:
select fieldlist from table1, table2, table3 ... where table1.column=table2.column and table2.column=table3.column and ...eg. 把 Student 表、Course 表和 SC 表,這3個表在 where 子句中聯(lián)接。
select * from Student,Course,SC where Student.Sno=SC.Sno and SC.Cno=Course.Cno4.2 在 from 子句中聯(lián)接多表
在 from 子句中聯(lián)接多個表示內(nèi)部聯(lián)接的擴展。
語法:
eg. 把 Student表、Course表 和 SC表,這3個表在from子句中聯(lián)接。
select * from Student join SC join Course on SC.Sno=Course.Cno on Student.Sno=SC.Sno5. 使用 case 函數(shù)進行查詢
case 函數(shù)用于計算條件列表并返回多個可能結(jié)果表達式之一。
case函數(shù)具有以下兩種格式:
- 簡單case函數(shù)將某個表達式與一組簡單表達式進行比較以確定結(jié)果。
- case搜索函數(shù)計算一組不二表達式以確定結(jié)果。
簡單 case 函數(shù)的語法如下:
case input_expressionwhen when_expression then result_expression[...n][else else_result_expression] endcase 搜索函數(shù)的語法如下:
casewhen Boolean_expression then result_expression[...n][else else_result_expression] end在 select 語句中,簡單 case 函數(shù)僅檢查是否相等,而不進行其他比較。本實例使用 case 函數(shù)更改產(chǎn)品系列類別的顯示,以使這些類別更容易理解。
select ProductNumber, Category = case productLinewhen 'R' then 'Rpad'when 'M' then 'Mountain'when 'T' then 'Touring'when 'S' then 'Other sale items'else 'Not for sale'endName from Production.Product order by ProductNumbereg. 查詢SC表中的Sno和Cno,如果分數(shù) >=90為優(yōu)秀,>=80為良好
select Sno,Cno,等級=case when Grade >=90 then '優(yōu)秀' when Grade >=80 then '良好' else '不及格' end from SC使用 case 語句更新
使用 case 語句更新學生信息,使所有男生年齡減 1 ,所有女生年齡加 1 ,
update Student set Sage= case when Sex='男' then Sage-1 when Sex = '女' then Sage+1 end
官方地址:
https://www.920vip.net/article/87
總結(jié)
以上是生活随笔為你收集整理的SQL Sever联接查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Sever 子查询与嵌套查询
- 下一篇: SQLalchemy 字段类型