1. 程式人生 > >SQL SERVER-6-join連線查詢

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