内连接 外连接 交叉连接

数据库表连接大致分为三种:交叉连接、内连接、外连接

交叉连接(CROSS JOIN):其实就是内连接的一种特例,不带查询条件

内连接(INNER JOIN):相等连接、不等连接、自然连接

外连接(OUTER JOIN):左外联接、右外链接、全外连接(全外连接只有部分RDBMS系统可以做到,例如Oracle。做不到的有MySQL、SQL Server、Access)

交叉连接:

最简单,返回多张表每一行相乘的结果,也就是笛卡尔积。关键字是 CROSS JOIN

写法有三种:CROSS JOIN , JOIN , 英文逗号分隔表名

交叉连接是内连接的一种,内连接基本上就是通过查询条件移除某些结果数据行后的交叉连接。

以下四种写法得到的结果都是一样的,前三种属于交叉连接,最后一种是内连接的特例(不带条件):

1 SELECT * FROM tb_person CROSS JOIN tb_book;  -- 全写: CORSS JOIN
2 SELECT * FROM tb_person JOIN tb_book;  -- 简写: JOIN
3 SELECT * FROM tb_person,tb_book;  -- 还可以再简写: ,
4
5 SELECT * FROM tb_person INNER JOIN tb_book;   -- 和不带条件的内联接一样

内连接:

相等连接:就是条件使用等值符号(=)

不等连接:就是条件使用不等符号(>,>=,<,<=,!>,!<,<>)

自然连接:只有在两张表中含有相同的列名称时,才能使用自然连接,自然连接默认利用同名列构造出相等连接

1 SELECT * FROM tb_person INNER JOIN tb_book WHERE tb_person.id = tb_book.person_id;  -- 相等连接
2 SELECT * FROM tb_person INNER JOIN tb_book WHERE tb_person.id <> tb_book.person_id;  -- 不等连接
3 SELECT * FROM tb_person NATURAL JOIN tb_book;  -- 自然连接
4 SELECT * FROM tb_person NATURAL JOIN tb_book WHERE tb_person.id = tb_book.id;  -- 与上一句一样,只是把默认条件显式的写出来了

外连接:

注重两张表之间的关系,也就是表的左右顺序,通常称之为左表和右表。

左外连接(LEFT OUTER JOIN):接收左表中的每一行,并利用这些行与右表匹配,找出右表中符合条件的行,最终连接形成数据结果集。如果对于左表行记录右表找不到能与之匹配的行记录,就会使用NULL替代右表,得到连接匹配结果。当左表与右表具有一对多关系时,左外联接特别有用。

右外连接(RIGHT OUTER JOIN):与左外联接是相同的道理,只是右表占主导地位而已。如果把左外联接中的左表和右表互换位置,得到的就是右外连接的结果。

全外连接(FULL OUTER JOIN):综合了左外连接和右外连接的特性,左表和右表地位相同,左表无匹配数据用NULL替代,右表无匹配数据也用NULL替代,也就是说左表和右表的数据都会在查询结果里面,不会少数据。

1 SELECT * FROM tb_person LEFT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
2 SELECT * FROM tb_person LEFT JOIN tb_book ON tb_person.id = tb_book.person_id;  -- 简写
3
4 SELECT * FROM tb_person RIGHT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
5 SELECT * FROM tb_person RIGHT JOIN tb_book ON tb_person.id = tb_book.person_id;  -- 简写
6
7 -- 外联接不是每一种数据库都有的特性
8 SELECT * FROM tb_person FULL OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
9 SELECT * FROM tb_person FULL JOIN tb_book ON tb_person.id = tb_book.person_id;  -- 简写

这里有一点需要注意:

交叉连接的逗号简写形式和自然连接只能使用 WHERE 条件,外连接只能使用 ON 条件,其余的连接形式既可以使用 WHERE 又可以使用 ON

1 -- 只能使用 WHERE 关键字
2 SELECT * FROM tb_person,tb_book WHERE tb_person.id = tb_book.person_id;
3 SELECT * FROM tb_person NATURAL JOIN tb_book WHERE tb_person.id = tb_book.id;  -- 其实自然连接根本不需要显式加条件
4
5 -- 只能使用 ON 关键字
6 SELECT * FROM tb_person LEFT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
7 SELECT * FROM tb_person RIGHT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
8 SELECT * FROM tb_person FULL OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
时间: 2024-10-13 02:10:25

内连接 外连接 交叉连接的相关文章

内连接 外连接 自连接 交叉连接

======================================================== My SQL如下: ======================================================== 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行. 2.外联接.外联接

SQL中的内连接外连接和交叉连接是什么意思?

内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种.与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时).右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行. 交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,

【cl】多表查询(内、外连接)

交叉连接(cross join):该连接产生的结果集笛卡尔积 a有7行,b有8行    a的第一行与b的每一行进行连接,就有8条a得第一行 7*8=56条 select a.real_name,s.unix_host,s.os_username from account a cross  join service s:(56条) select a.real_name,s.unix_host,s.os_username from account a cross  join service s wh

sql 内连接 外连接 左连接 右连接

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

SQL内连接-外连接join,left join,right join,full join

1.创建测试表test1及test2 SQL> CREATE TABLE TEST1(ID NUMBER,NAME VARCHAR2(20)); 表已创建. SQL> create table test2(id number, country varchar2(10)); 表已创建. INSERT INTO TEST1 VALUES(1,'name1'); INSERT INTO TEST1 VALUES(2,'name2'); INSERT INTO TEST1 VALUES(3,'name

mysql 内连接 左连接 右连接 外连接

mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| ID | int(11) | NO | PRI | 0 | || NAME | varchar(16) | YES | | NULL | || A

左连接,右连接,内连接,外连接, join, left join, right join ,mysql ,oracle

2016-6-12 22:35:51 工作用了一年多的oracle,最近在学mysql, 仔细想想 各种连接,感觉这些概念还是蛮烦人的! 最近整理了一下,分享一下自己的理解,有些东西是借鉴网上并自己吸收了的. 1.不管是什么连接,oracle和mysql的原理是一模一样的,只是有些写法不一样而已.说到写法,这里提一下, select * from A, B where a.filed1=b.filed2; --这是第1种写法, 内连接,这样写,很方便, oracle和mysql通用 select

Oracle学习笔记(一)----------内、外连接

这么久终于可以静下来整理一下工作上学到的东西了(主要还是自己太懒了..) 废话少说,正文开始 在公司里,数据库用的基本都是Oracle,所以就学了一下Oracle的一点知识,现在整理一下自己遇到的问题和学到的一些东西. 先说说自己经常搞混的内连接.外连接(大学里一直没搞懂..) 数据表之间有很多种连接方式,如:内外连接等 一(内连接): 内连接就是我们经常说的等值连接或者自然连接. 内连接用连接 inner join(join)关键字连接表(或者直接用where和“=”号). 直接上例子: 设有

Oracle 内、外连接

一.Oracle连接类型     ☆说明:按照自己的理解划分的类型,并不是官方定义. 1.内连接 ①等值连接 ②非等值连接 ③自然连接 2.外连接 ①左外连接 ②右外连接 ③全外连接 二.表数据准备 t表 字段a 字段b 1 18 2 28 3 38 4 NULL t1表 字段x 字段y 1 9 2 8 3 7 三.内连接 1.内连接是通过inner join进行多表关联,展示查询结果,示例如下: SQL>select * from t inner join t1 on t.a=t1.x; 效果