SQL SERVER-6-join連線查詢
連線join --1.內連線 --2.外連線:1>左外聯接 2>右外連線 3>完全外連線 --3.自連線
create table TestJoin1Emp ( EmpId int identity(1,1) primary key, EmpName varchar(50), EmpDeptid int ) insert into TestJoin1Emp values('長孫娜',1) insert into TestJoin1Emp values('李四',2) insert into TestJoin1Emp values('八戒',3) insert into TestJoin1Emp values('悟空',2) insert into TestJoin1Emp values('玄奘',1)
create table TestJoin2Dept ( DeptId int identity(1,1) primary key, DeptName varchar(50) ) select * from TestJoin2Dept insert into TestJoin2Dept values('市場部') insert into TestJoin2Dept values('研發部') insert into TestJoin2Dept values('行政部')
select * from TestJoin1Emp
select * from TestJoin2Dept
--兩張表進行連線的第一步,表進行交叉,生成一個大的結果集,叫做:笛卡爾積 select * from TestJoin1Emp,TestJoin2Dept
--下面的查詢方式獲取的就是兩張表的笛卡爾積,然後根據條件篩選出符合條件的記錄 select 員工編號=emp.EmpId, 姓名=emp.EmpName, 部門名稱=dept.DeptName from TestJoin1Emp emp,TestJoin2Dept dept where emp.EmpDeptid=dept.DeptId
--【內連線】,內連線,僅僅篩選那些兩張表中都能夠匹配的那些記錄 --把上面的這種寫法替換成下面的這種寫法,下面的這種寫法使用的就是【內連線】inner join select 員工編號=emp.EmpId, 姓名=emp.EmpName, 部門名稱=dept.DeptName from TestJoin1Emp emp inner join TestJoin2Dept dept on emp.EmpDeptid=dept.DeptId
--練習 --案例1:查詢所有學生的姓名、年齡及所在班級 select * from TblClass select * from TblStudent select TblStudent.tsname, TblStudent.tsage, TblClass.TclassName from TblStudent inner join TblClass on TblStudent.tsclassid=TblClass.tclassId
--案例2:查詢年齡超過20歲的學生的姓名、年齡及所在班級 select TblStudent.tsname, TblStudent.tsage, TblClass.TclassName from TblStudent inner join TblClass on TblStudent.tsclassid=TblClass.tclassId where tblstudent.tsage>20
--案例3:查詢學生姓名、年齡、班級及成績 select TblStudent.tsname, TblStudent.tsage, TblClass.TclassName, tblscore.tenglish, tblscore.tmath from TblStudent inner join TblClass on TblStudent.tsclassid=TblClass.tclassId inner join TblScore on TblStudent.tsid=TblScore.tsid
--案例4:查詢所有學生(參加及未參加考試的都算)及成績 --這裡不能用內連線,內連線只是篩選那些在兩個表中可以匹配的記錄 --無法篩選那些沒有匹配到的記錄 --查詢的是所有的學生,所以必須將所有學生的資料都顯示出來
--這裡需要使用左外聯或者是右外聯 --左外聯表示顯示左表中的全部資料,以及右表中的那些匹配的資料,對於左表中有,但是右表中沒有匹配的那些資料顯示為null --left join 表示式左邊的表就叫做“左表”,右邊的就叫做“右表” select * from TblScore select * from TblStudent
--下面的兩個查詢結果一致,上面使用左連線,下面使用右連線 --這兩個查詢的主表都是TblStudent(學生表) --左連線 select stu.tsname, stu.tsage, 英語=score.tenglish, 數學=score.tmath from TblStudent as stu left outer join TblScore as score on stu.tsid=score.tsid
--右連線 select stu.tsname, stu.tsage, 英語=score.tenglish, 數學=score.tmath from TblScore as score right outer join TblStudent as stu on stu.tsid=score.tsid
--外連線是通過3步,執行完畢的。 --1.笛卡爾積2.根據篩選條件進行內連線3.新增外部行
--案例5:請查詢出所有沒有參加考試(在成績表中不存在的學生)的學生的姓名 --下面的查詢結果是所有與參加考試的學生的姓名和成績 select ts.tsid, ts.tsname, score.tenglish, score.tmath from TblStudent as ts inner join TblScore as score on ts.tsid=score.tsid
--要篩選那些沒有參加考試的同學,不能用<>來進行內聯接,那樣會返回很多的資料 --這是應為他們第一步是查詢出來的笛卡爾積,然後從笛卡爾積裡面進行條件篩選 --所以直接使用<>會把很多我們認為的廢資料給篩選出來 select ts.tsid, ts.tsname, score.tenglish, score.tmath from TblStudent as ts inner join TblScore as score on ts.tsid<>score.tsid
--要篩選那些沒有參加考試的學生的資訊,其實就是要篩選那些在考試表中沒有出現過的那些學生資訊 --思路:可以先通過外連線查詢出所有學生的資訊,然後找那些成績為null的,這些就是沒有參加考試的學生的資訊
--1.左連線實現 select * from TblStudent as stu left join TblScore as score on stu.tsid=score.tsid where score.tscoreId is null
--2.右連線實現 select * from TblScore as stu right join TblStudent as score on stu.tsid=score.tsid where score.tscoreId is null
--下面的兩個查詢方式中,在資料量不大的時候使用連線效率稍微高點 --資料量大的時候沒有哪個效率更高...
--子查詢 select 員工編號=emp.empId, 員工姓名=emp.EmpName, 部門名稱=(select DeptName from TestJoin2Dept as dept where dept.deptId=emp.empDeptid) from TestJoin1Emp as emp --連線 select emp.empid, emp.empName, dept.DeptName from TestJoin1Emp as emp inner join TestJoin2Dept as dept on dept.deptId=emp.empDeptid
--自連線
--選單資訊,主鍵和父級序號,這裡顯示的是父級序號的ID --如果我們想要直接顯示上級選單的名稱而不是名稱,則可以使用子查詢或者自連線來查詢 select * from NIS_ADDINS
select ID,ZYMC,PARENT_ID from NIS_ADDINS --使用內連線,但是這種時候如果某個選單沒有父級選單則無法返回資料 select e1.ID, e1.ZYMC, e1.PARENT_ID, e2.ZYMC from NIS_ADDINS as e1 inner join NIS_ADDINS as e2 on e1.PARENT_ID=e2.ID
--使用外連結,如果沒有父級選單也會查詢出來 select e1.ID, e1.ZYMC, e1.PARENT_ID, e2.ZYMC from NIS_ADDINS as e1 left outer join NIS_ADDINS as e2 on e1.PARENT_ID=e2.ID