内外连接的区别的区别

三角形内外心连线的一个性质_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
三角形内外心连线的一个性质
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
字体:[ ] 类型:转载 时间:
本篇文章是对SQL中的四种连接-左外连接、右外连接、内连接、全连接进行了详细的分析介绍,需要的朋友参考下
1、内联接(典型的联接运算,使用像 =& 或 && 之类的比较运算符)。包括相等联接和自然联接。&&&& 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。&& &&& 2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。&&&& 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:&&&& 1)LEFT& JOIN或LEFT OUTER JOIN&&&& 左向外联接的结果集包括& LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。&&&&&& 2)RIGHT& JOIN 或 RIGHT& OUTER& JOIN&&&& 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。&&&&&& 3)FULL& JOIN 或 FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。&& 3、交叉联接&& 交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。&&& FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。&&&& 例子:&& -------------------------------------------------& a表&&&& id&& name&&&& b表&&&& id&& job&& parent_id&& &&&&&&&&&&&&& 1&& 张3&&&&&&&&&&&&&&&&&& 1&&&& 23&&&& 1&& &&&&&&&&&&&&& 2&& 李四&&&&&&&&&&&&&&&& 2&&&& 34&&&& 2&& &&&&&&&&&&&&& 3&& 王武&&&&&&&&&&&&&&&& 3&&&& 34&&&& 4&&&&&& & a.id同parent_id&& 存在关系&& --------------------------------------------------&&& &1) 内连接&& & select&& a.*,b.*&& from&& a&& inner&& join&& b&&&& on&& a.id=b.parent_id&&&&&& & 结果是&&&& & 1&& 张3&&&&&&&&&&&&&&&&&& 1&&&& 23&&&& 1&& & 2&& 李四&&&&&&&&&&&&&&&&& 2&&&& 34&&&& 2&& & 2)左连接&& & select&& a.*,b.*&& from&& a&& left&& join&& b&&&& on&& a.id=b.parent_id&&&&&& & 结果是&&&& & 1&& 张3&&&&&&&&&&&&&&&&&& 1&&&& 23&&&& 1&& & 2&& 李四&&&&&&&&&&&&&&&&& 2&&&& 34&&&& 2&& & 3&& 王武&&&&&&&&&&&&&&&&& null&& &3) 右连接&& & select&& a.*,b.*&& from&& a&& right&& join&& b&&&& on&& a.id=b.parent_id&&&&&& & 结果是&&&& & 1&& 张3&&&&&&&&&&&&&&&&&& 1&&&& 23&&&& 1&& & 2&& 李四&&&&&&&&&&&&&&&&& 2&&&& 34&&&& 2&& & null&&&&&&&&&&&&&&&&&&&&&& 3&&&& 34&&&& 4&& &4) 完全连接&& & select&& a.*,b.*&& from&& a&& full&& join&& b&&&& on&& a.id=b.parent_id&& & 结果是&&&& & 1&& 张3&&&&&&&&&&&&&&&&& 1&&&& 23&&&& 1&& & 2&& 李四&&&&&&&&&&&&&&&& 2&&&& 34&&&& 2&& & null&&&&&&&&&&&&&&   & 3&&&& 34&&&& 4&& & 3&& 王武&&&&&&&&&&&&&&&& null--------------------------------------------------------------------------------------------一、交叉连接(CROSS JOIN)交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。例如:下面的语句1和语句2的结果是相同的。
语句1:隐式的交叉连接,没有CROSS JOIN。SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAMEFROM ORDERS O , CUSTOMERS CWHERE O.ID=1;
语句2:显式的交叉连接,使用CROSS JOIN。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM ORDERS O CROSS JOIN CUSTOMERS CWHERE O.ID=1;语句1和语句2的结果是相同的,查询结果如下:
二、内连接(INNER JOIN)内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。例如:下面的语句3和语句4的结果是相同的。
语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C,ORDERS OWHERE C.ID=O.CUSTOMER_ID;
语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;语句3和语句4的查询结果:
三、外连接(OUTER JOIN):外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:左外连接还返回左表中不符合连接条件单符合查询条件的数据行。右外连接还返回右表中不符合连接条件单符合查询条件的数据行。全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。
下面举例说明:语句5:左外连接(LEFT OUTER JOIN)SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
语句6:右外连接(RIGHT OUTER JOIN)SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;注意:WHERE条件放在ON后面查询的结果是不一样的。例如:
语句7:WHERE条件独立。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDWHERE O.ORDER_NUMBER&&'MIKE_ORDER001';
语句8:将语句7中的WHERE条件放到ON后面。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER&&'MIKE_ORDER001';
从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。语句9:全外连接(FULL OUTER JOIN)。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果:语句10:左外和右外的合集,实际上查询结果和语句9是相同的。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDUNIONSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;语句9和语句10的查询结果是相同的,如下:
四、联合连接(UNION JOIN):这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。语句11:联合查询(UNION JOIN)例句,还没有找到能执行的SQL环境。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O UNION JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID语句12:语句11在DB2下的等价实现。还不知道DB2是否支持语句11呢!SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDEXCEPTSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;语句13:语句11在Oracle下的等价实现。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDMINUSSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;查询结果如下:
五、自然连接(NATURAL INNER JOIN):说真的,这种连接查询没有存在的价值,既然是SQL2标准中定义的,就给出个例子看看吧。自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示(ORACLE环境下测试的)。对于每种连接类型(除了交叉连接外),均可指定NATURAL。下面给出几个例子。语句14:SELECT *FROM ORDERS O NATURAL INNER JOIN CUSTOMERS C;
语句15:SELECT *FROM ORDERS O NATURAL LEFT OUTER JOIN CUSTOMERS C;
语句16:SELECT *FROM ORDERS O NATURAL RIGHT OUTER JOIN CUSTOMERS C;
语句17:SELECT *FROM ORDERS O NATURAL FULL OUTER JOIN CUSTOMERS C;
六、SQL查询的基本原理:两种情况介绍。第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。第二、两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。第三、多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。理解SQL查询的过程是进行SQL优化的理论依据。
七、ON后面的条件(ON条件)和WHERE条件的区别:ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:ON只进行连接操作,WHERE只过滤中间表的记录。
八、总结连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据:1、 查两表关联列相等的数据用内连接。2、 Col_L是Col_R的子集时用右外连接。3、 Col_R是Col_L的子集时用左外连接。4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。5、 求差操作的时候用联合查询。多个表查询的时候,这些不同的连接类型可以写到一块。例如:SELECT T1.C1,T2.CX,T3.CYFROM TAB1 T1&&&&&& INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)&&&&&& INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)&&&&&& LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);WHERE T1.X &T3.Y;上面这个SQL查询是多表连接的一个示范。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具外键和内外左右连接的基础知识
外键和内外左右连接的基础知识由于现有公司一直不用mysql的外键(影响库的性能,采用代码逻辑控制),所以我对外键也不是很了解,今天特意在网上看了些有关外键的资料,顺便搜到了些内外连接的知识,一起整理起来...
外键和内外左右连接的基础知识
由于现有公司一直不用的外键(影响库的性能,采用代码逻辑控制),所以我对外键也不是很了解,今天特意在网上看了些有关外键的资料,顺便搜到了些内外连接的知识,一起整理起来。
1mysql的外键相关知识
mysql的外键有三种,如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。常见的外键 有级联(cascade)方式,置空(set null)方式及禁止(no action / restrict)方式
a测试级联方式:
create table test111 (
id int not null,
name varchar(30),
primary key (id)
create table test222 (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references test111(id) on delete cascade on update cascade
insert into test111 values (1, 'Group1');
insert into test111 values (2, 'Group2');
insert into test222 values (1, 'qianxin', 1);
insert into test222 values (2, 'yiyu', 2);
insert into test222 values (3, 'dai', 2);
delete from test111 where id=2;
update test111 set id=2 where id=1;
这种情况下无法插入,用户组3不存在,与参照完整性约束不符
删除时test222r中的2、3记录级联删除
更新时test222的1记录的groupid级联修改为2
b测试置空(set null)方式
create table test111 (
id int not null,
name varchar(30),
primary key (id)
create table test333 (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references test111(id) on delete set null on update set null
insert into test111 values (1, 'Group1');
insert into test111 values (2, 'Group2');
insert into test333 values (1, 'qianxin', 1);
insert into test333 values (2, 'yiyu', 2);
insert into test333 values (3, 'dai', 3);
delete from test111 where id=2;
update test111 set id=2 where id=1;
无法插入,用户组3不存在,与参照完整性约束不符
删除是导致test333中的2、3记录的groupid被设置为NULL、
更新时导致t_user中的1记录的groupid被设置为NULL
c测试禁止(no action / restrict)方式
create table test111 (
id int not null,
name varchar(30),
primary key (id)
create table test444 (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references test111(id) on delete no action on update no action
insert into test111 values (1, 'Group1');
insert into test111 values (2, 'Group2');
insert into test444 values (1, 'qianxin', 1);
insert into test444 values (2, 'yiyu', 2);
insert into test444 values (3, 'dai', 3);
delete from test111 where id=2;
update test111 set id=2 where id=1;
插入时无法插入,用户组3不存在,与参照完整性约束不符
删除时从表中有相关引用,因此主表中无法删除
更新时从表中有相关引用,因此主表中无法修改
在MySQL中,restrict方式与no action方式作用相同。
2 oracle的外键
外键是该表是另一个表之间联接的字段 ,必须为另一个表中的主键 用途是确保数据的完整性。它通常包括以下几种:
A实体完整性,确保每个实体是唯一的(通过主键来实施)
B域完整性,确保属性值只从一套特定可选的集合里选择
C关联完整性,确保每个外键或是NULL(如果允许的话)或含有与相关主键值相配的值
下面是一个测试例子,如何建立两个表的外键
CREATE TABLE ZZ_STUDENT (
ID CHAR (10),
NAME VARCHAR (8),
SEX CHAR (1)
ALTER TABLE ZZ_STUDENT ADD CONSTRAINT PK_STUDENT PRIMARY KEY (ID);
CREATE TABLE ZZ_SCORE (ID CHAR(10), MATH NUMBER(5, 2));
ALTER TABLE ZZ_SCORE ADD CONSTRAINT FK_SCROE FOREIGN KEY (ID) REFERENCES ZZ_STUDENT (ID);
3内连接外连接左连接右连接
内连接:把两个表中数据对应的数据查出来
外连接:以某个表为基础把对应数据查出来
全连接是以多个表为基础
首先插入如下测试数据:
insert into student(sno,sname) values(';,'小施');
insert into student(sno,sname) values(';,'小王');
insert into student(sno,sname) values(';,'小张');
insert into student(sno,sname) values(';,'小贾');
insert into stu_score(sno,scrore) values(';,90.00);
insert into stu_score(sno,scrore) values(';,95.00);
insert into stu_score(sno,scrore) values(';,80.50);
insert into stu_score(sno,scrore) values(';,88.50);
(一) 内连接
  内连接,inner join,join 查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的
----假设a表有M条记录,b表有N条记录,a和b表sno相同的记录有K条
----内连接(数据量=K)
select a.*,b.* from student a join stu_score b on a.sno=b.
select a.*,b.* from student a inner join stu_score b on a.sno=b.
查询结果如下:
2005001 小施
2005002 小王
(二) 外连接 (左连接、右连接) 
左连接或left join,left outer join 返回包括左表中的所有记录和右表中联接字段相等的记录
右连接或right join ,right outer join 返回包括右表中的所有记录和由表中联接字段相等的记录
----左连接/左外连接(数据量=M)
select a.*,b.* from student a left join stu_score b on a.sno=b.
select a.*,b.* from student a left outer join stu_score b on a.sno=b.
查询结果如下:
2005001 小施
2005002 小王
2005003 小张
2005004 小贾
----右连接/右外连接(数据量=N)
select a.*,b.* from student a right join stu_score b on a.sno=b.
select a.*,b.* from student a right outer join stu_score b on a.sno=b.
查询结果如下:
2005001 小施
2005002 小王
(三) 完全连接()
定义:在内连接的基础上,还包含两个表中所有不符合条件的数据行,并在其中的左表、和右表列填写NULL
关键字:FULL JOIN
----完全连接(数据量=M+N-K)
select a.*,b.* from student a full join stu_score b on a.sno=b.
查询的时候mysql是不支持的
(四) 交叉连接
定义:将两个表的所有行进行组合,连接后的行数为两个表的乘积数。(笛卡尔积)
关键词:CROSS JOIN
格式:FROM 表名1 CROSS JOIN 表名2 
----交叉连接(数据量=M*N)
select a.*,b.* from student a cross join stu_
查询结果如下:
2005001 小施
2005002 小王
2005003 小张
2005004 小贾
2005001 小施
2005002 小王
2005003 小张
2005004 小贾
2005001 小施 .5
2005002 小王 .5
2005003 小张 .5
2005004 小贾 .5
2005001 小施 .5
2005002 小王 .5
2005003 小张 .5
2005004 小贾 .5不去外面的世界都不知道自己的数据库是那么的垃圾,连难一点的sql语句都不会写,悲催。
假设有A,B两个表。
表A记录如下:
表B记录如下:
--------------------------------------------
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID
(所影响的行数为 5 行)
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
--------------------------------------------
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID
(所影响的行数为 5 行)
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。
语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", "&", "&", "&=", "&=" 或 "&&"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误
注:left和right是外连接,Inner是内连接。
阅读(...) 评论()

我要回帖

更多关于 开内外眼角的区别 的文章

 

随机推荐