T-SQL连接查询,基础连接理解
图形说明:
除运算
详细说明:
使用连接查询时,必须使用from子句中指定两个或两个以上的表。连接查询又称多表查询。
使用连接查询时应该在列名前加表名作为前缀。如果不同表之间列名不同,可以不加表名前缀,如果不同表名存在相同的列名,则必须加前缀。
- 笛卡尔积
当连接条件无效或被忽略,以及第一个表中所有行和第二个表中所有行都发生连接时,所有行的组合都出现,这种结果称为笛卡尔积。其实就是A X B的组合数。非常庞大不建议使用
(1) patient_queue表中总数为2700
sql》select count(*) from patient_queue
count(*)
2700
(2) doctor表中总数为519
sql》select count(*) from doctor
count(*)
519
(3) 笛卡尔积patient_queue X doctor记录总数为2700*519=1401300
Sql * from patient_queue,doctor
2.等值连接
两张表中必须有相等的列值,一般作为where子句的条件,连接运算符为“=”,通常这样的条件包含一个主键和一个外键
语法:
Select table1.column,table2.column
From table1,table2
Where table1.column1=table2.cloumn2
使用相等连接执行主从查询
3.不等值连接(一般连接)
等值连接运算符为“=”,如果采用其他运算符则称非等值连接
4.自连接
把某个表和其自身相连接(树形结构用的比较多)
5.内连接和外连接
内连接返回满足条件的记录,外连接返回满足和不满足条件的记录,等值连接是内连接,外连接包含左外连接、右外连接和完全外连接。
语法
Select table1.column,table2.column
From table1 [inner | left | right | full ] join table2
On table1.column1=table2.column2
5.1内连接
显示table1和table2表中满足列相等条件的共同记录(table1∩table2)
例:查询部门编号为10的雇员姓名和部门名称
Sql》select emp.ename,dept.dname,dept.deptno
From dept inner join emp
On dept.deptno=emp.deptno and dept.deptno=10
5.2 左外连接
显示table1表和table2表满足列相等条件的共同记录,以及左边表的其他记录(table1 以table1表为主列数)
例:显示部门编号为10的部门名称、雇员名称,以及其他部门名称
SQL》select dname,ename
From dept left join emp
On dept.deptno=emp.deptno and dept.deptno=10
例2:使用(+)操作符执行左外连接。
(+)操作符要放在行数较少的一端。本例中部门多 雇员少,(+)放在雇员一边
SQL》select dname,ename
From dept,emp
Where dept.deptno=emp.deptno(+) and emp.deptno(+)=10
5.3 右外连接
显示table1表和table2表满足列相等条件的共同记录,以及右边table2表的其他记录。(table2 以table2表为主列数)
例1:显示部门编号为10的部门名称、雇员名称,以及其他雇员姓名
SQL》select dname,ename
From dept right join emp
On dept.deptno=emp.deptno and deptno=10
例2:使用(+)操作符执行右外连接
(+)操作符要放在行数较少的一端,本例中雇员多 部门少,(+)放在部门一边。
SQL》select dname,ename
From dept,emp
Where dept.deptno(+)=emp.deptno and dept.deptno(+)=10
5.4 完全外连接
显示table1表和table2表满足列相等条件的共同记录,以及table1表和table2表的其他记录(table1∪table2)
例:显示部门编号为10的部门名称、雇员名称,以及其他部门名称和其他雇员名称
SQL》select dname,ename
From dept full join emp
On dept.deptno=emp.deptno and deptno=10