SQL中----SELECT语句中内连接,左连接,右连接,⾃连接和全连接-
--转
Sql代码
1. create table department( id number primary key, name varchar2(30));
2. create table employee( id number primary key, name varchar2(30) not null, salary
number(6,2), title varchar2(30), manager number, deptid number);
3. insert into department values(1,'⼈⼒资源');
4. insert into department values(2,'开发中⼼');
5. insert into department values(3,'总裁室');
6. insert into employee values(4,'赵六',9000,'项⽬经理',null,2);
7. insert into employee values(3,'王五',7000,'项⽬组长',4,2);
8. insert into employee values(1,'张三',6000,'程序员',3,2);
9. insert into employee values(2,'李四',7000,'HR',4,1);
不同的 SQL JOIN
* JOIN: 如果表中有⾄少⼀个匹配,则返回⾏
* LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的⾏
* RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的⾏
* FULL JOIN: 只要其中⼀个表中存在匹配,就返回⾏
INNER JOIN 关键字在表中存在⾄少⼀个匹配时返回⾏。如果 "employee" 中的⾏在
"department" 中没有匹配,就不会列出这些⾏。
LEFT JOIN 关键字会从左表 (employee) 那⾥返回所有的⾏,即使在右表 (department) 中没有匹
配的⾏。
RIGHT JOIN 关键字会从右表 (department) 那⾥返回所有的⾏,即使在左表 (employee) 中没有
匹配的⾏。
FULL JOIN 关键字会从左表 (employee) 和右表 (department) 那⾥返回所有的⾏。如果
"employee" 中的⾏在表 "department" 中没有匹配,或者如果 "department" 中的⾏在表
"employee" 中没有匹配,这些⾏同样会列出。
注释:INNER JOIN 与 JOIN 是相同的。
注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。
内连接:是最常⽤的链接,也叫等值链接
不管限制条件在on中还是在where中,内连接都得到笛卡尔积中满⾜所有条件的记录。对于
inner join, on和where的效果是⼀样的。
1)当没有限制条件,此时为笛卡尔积:
Sql代码
1. select * from employee , department ;
2. select * from employee inner join department on 1=1;
得到的效果是⼀样的.
2)此时如果加上where限制条件,则对上⾯笛卡尔积的每⼀条记录看它是否满⾜限制条件,如果满
⾜,则它在结果集中。
Sql代码
1. select * from employee emp , department dept where emp.deptid= dept.id;
2. select * from employee emp inner join department dept on emp.deptid= dept.id;
外连接
则分为"左外连接(左连接)","右外连接(右连接)"两种情况: left join / right join
交叉连接(完全连接)cross join 不带 where 条件的
左连接(left join):
1)当没加限制条件时,得到笛卡尔积,同内连接没加限制条件⼀样
Sql代码
1. select * from employee left join department on 1=1;
2)当添加特定条件时:
oracle数据库中可以⽤(+)来实现,
Sql代码
1. select * from employee emp , department dept where emp.deptid= dept.id(+);
即“(+)”所在位置的另⼀侧为连接的⽅向,左连接说明等号左侧的所有记录均会被显⽰,⽆论其在右侧是否得到匹配;
等同于:
Sql代码
1. select * from employee emp left join department dept on emp.deptid= dept.id;
右连接:
oracle数据库中可以⽤(+)来实现,
Sql代码
1. select * from employee emp , department dept where emp.deptid(+)= dept.id;
即“(+)”所在位置的另⼀侧为连接的⽅向,右连接说明等号右侧的所有记录均会被显⽰,⽆论其在左侧是否得到匹配;
等同于:
Sql代码
1. select * from employee emp right join department dept on emp.deptid= dept.id;
全连接:会从左表 (employee) 和右表 (department) 那⾥返回所有的⾏。如果 "employee" 中的⾏在表 "department" 中没有匹配,或者如果 "department" 中的⾏在表 "employee" 中没有匹配,这些⾏同样会列出
连接分为三种:内连接、外连接、交叉连接
1、等值连接:在连接条件中使⽤等于号(=)运算符⽐较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接:在连接条件使⽤除等于运算符以外的其它⽐较运算符⽐较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<;和<>。
3、⾃然连接(仅仅是⼀种特的等值连接):在连接条件中使⽤等于(=)运算符⽐较被连接列的列值,但它使⽤选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
外连接:
分为三种:左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或
分为三种:左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或
RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种
交叉连接(CROSS JOIN)
没有WHERE ⼦句,它返回连接表中所有数据⾏的笛卡尔积
先返回左表所有⾏,左表⾏在与右表⾏⼀⼀组合,等于两个表相乘
Sql代码
1. select * from employee emp cross join department dept
如果需要加条件,则使⽤where
Sql代码
1. select * from employee emp cross join department dept where emp.deptid= dept.id;
2. --等同于
3. select * from employee emp inner join department dept on emp.deptid= dept.id;
两个主要的连接类型是内连接和外连接。到⽬前为⽌,所有⽰例中使⽤的都是内连接。内连
接只保留交叉积中满⾜连接条件的那些⾏。如果某⾏在⼀个表中存在,但在另⼀个表中不存
在,则结果表中不包括该信息。
外连接是内连接和左表和/或右表中未包括内连接中的那些⾏的并置。当对两个表执⾏外连接
时,可任意将⼀个表指定为左表⽽将另⼀个表指定为右表。外连接有三种类型:
左外连接包括内连接和左表中未包括在内连接中的那些⾏。
右外连接包括内连接和右表中未包括在内连接中的那些⾏。
全外连接包括内连接以及左表和右表中未包括在内连接中的⾏。
内连接⼀般是检索两个表⾥连接字段都存在的数据。
左连接的意思是,查询左(语句前⾯)表⾥的所有内容,⽆论右边表⾥有没有。右边表⾥没有
的内容⽤NULL代替。
右连接和左连接相反。
数据表的连接有:
sql left join 多表连接1、内连接(⾃然连接): 只有两个表相匹配的⾏才能在结果集中出现
2、外连接: 包括
(1)左外连接(左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
3、⾃连接(连接发⽣在⼀张基表内)
2/SELECT语句中内连接,左连接,右连接,⾃连接和全连接
A/// 更确切的说是inner joins內连接.內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。为更好的理解这个概念,我们介绍两个表作演⽰。苏格兰议会中的政党表(party)和议员表(msp)。party(Code,Name,Leader)Code: 政党代码Name:政党名称Leader: 政党领袖msp(Name,Party,Constituency)Name: 议员名Party: 议员所在政党代码Constituency: 选区在介绍左连接、右连接和全连接前,有⼀个数据库中重要的概念要介绍⼀下,即空值(NULL)。
*****  空值的特定条件查询
有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使⽤=,< >这些判断符。必需有专⽤的短语:IS NULL 来选出有空值字段的记录,同理,可⽤ IS NOT NULL 选出不包含空值的记录。
例如:下⾯的语句选出了没有领导者的政党。(不要奇怪,苏格兰议会中确实存在这样的政党)SELECT code, name FROM party WHERE leader IS NULL⼜如:⼀个议员被开除出党,看看他是谁。(即该议员的政党为空值)SELECT name FROM msp WHERE party IS NULL好了,让我们⾔归正传,看看什么叫左连接、右连接和全连接。
B/// A left join(左连接)包含所有的左边表中的记录甚⾄是右边表中没有和它匹配的记录。同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚⾄是左边表中没有和它匹配的记录。⽽full join(全连接)顾名思义,左右表中所有记录都会选出来。
讲到这⾥,有⼈可能要问,到底什么叫:包含所有的左边表中的记录甚⾄是右边表中没有和它匹配的记录。 Ok,我们来看⼀个实例:SELECT msp.name, party.name FROM msp JOIN party ON party=code 这个是我们上⼀节所学的Join(注意:也叫inner join),这个语句的本意是列出所有议员的名字和他所属政党。你可以在亲⾃执⾏⼀下该语句,看看结果是什么。
很遗憾,我们发现该查询的结果少了个议员:Canavan MSP, Dennis。为什么,因为这个议员不属于任和政党,即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了?这是因为空值在作怪。因为议员表中政党字段(Party)的空值在政党表中不到对应的记录作匹配,即 FROM msp JOIN party ON party=code 没有把该记录连接起来,⽽是过滤出去了。在该短语中,msp在Join的左边,所有称为左表。party在Join的右边,所有称为右表。
C/// Ok,现在再看看这句话,“包含所有的左边表中的记录甚⾄是右边表中没有和它匹配的记录”,意思应该很明⽩了吧。执⾏下⾯这个语句,那两个没有政党的议员就漏不了了。SELECT msp.name, party.name FROM msp LEFT JOIN party ON party=code关于右连接,看看这个查询就明⽩了:SELECT msp.name, party.name FROM msp RIGHT JOIN party ON msp.de这个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员。
D/// 那么既要包含没有议员的政党,⼜要包含没有政党的议员该怎么办呢,对了,全连接(full join)。SELECT msp.name, party.name FROM msp FULL JOIN party ON msp.de

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。