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,'name3');
INSERT INTO TEST1 VALUES(4,'name4');
INSERT INTO TEST1 VALUES(5,'name5'); SQL> select * from test1;
ID NAME
---------- --------------------
1 name1
2 name2
3 name3
4 name4
5 name5 INSERT INTO TEST2 VALUES(1,'China');
INSERT INTO TEST2 VALUES(2,'Japan');
INSERT INTO TEST2 VALUES(3,'USA'); SQL> SELECT * FROM TEST2;
ID COUNTRY
---------- ----------
1 China
2 Japan
3 USA
2、笛卡尔积,即交叉连接cross join列出两张表中所有组合的值。
SQL> insert into test2 values(10,'Hongkong');
SQL> select * from test1 right join test2 on test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
10 Hongkong
SQL> select * from test1, test2;--不加连接条件时,默认使用交叉连接。 ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 1 China
3 name3 1 China
4 name4 1 China
5 name5 1 China
1 name1 2 Japan
2 name2 2 Japan
3 name3 2 Japan
4 name4 2 Japan
5 name5 2 Japan
1 name1 3 USA
2 name2 3 USA
3 name3 3 USA
4 name4 3 USA
5 name5 3 USA
1 name1 10 Hongkong
2 name2 10 Hongkong
3 name3 10 Hongkong
4 name4 10 Hongkong
5 name5 10 Hongkong 已选择20行。 SQL> select * from test1 cross join test2;---跟上面语句执行结果一样。 ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 1 China
3 name3 1 China
4 name4 1 China
5 name5 1 China
1 name1 2 Japan
2 name2 2 Japan
3 name3 2 Japan
4 name4 2 Japan
5 name5 2 Japan
1 name1 3 USA
2 name2 3 USA
3 name3 3 USA
4 name4 3 USA
5 name5 3 USA
1 name1 10 Hongkong
2 name2 10 Hongkong
3 name3 10 Hongkong
4 name4 10 Hongkong
5 name5 10 Hongkong 已选择20行。
SQL> select * from test1, test2 where test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
SQL> select * from test1 cross join test2 on test1.id=test2.id; --当使用关键字corss join时,不能使用on 来加条件。只能使用where.....
select * from test1 cross join test2 on test1.id=test2.id
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束
SQL> select * from test1 cross join test2 where test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
3、内连接join即inner join.
SQL> select * from test1 join test2 on test1.id= test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA SQL> select * from test1 inner join test2 on test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
4、左连接(外连接包括左外连接、右外连接及全连接,而左外连接及右外连接简称左连接和右连接,即outer可省略不与)
SQL> select * from test1 left outer join test2 on test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
5 name5
4 name4 SQL> select * from test1 left join test2 on test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
5 name5
4 name4
5、右连接
SQL> select * from test1 right join test2 on test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
10 Hongkong SQL>
6、全连接
SQL> select * from test1 full join test2 on test1.id=test2.id; ID NAME ID COUNTRY
---------- -------------------- ---------- ----------
1 name1 1 China
2 name2 2 Japan
3 name3 3 USA
4 name4
5 name5
10 Hongkong 已选择6行。 SQL>
总结:
其实总的连接查询也就6种:交叉连接、内连接、外连接(左连接,右连接,全连接)、自连接
交叉连接:
SELECT * FROM TEST1,TEST2;取迪卡尔积。
SELECT * FROM TEST1,TEST2 WHERE TEST1.ID=TEST2.ID; //默认就是交叉连接
SELECT * FROM TEST1 CROSS JOIN TEST2 WHERE TEST1.ID=TEST2.ID; // WHERE不能换成ON
内连接:
内连接取的是两个表的公共部分。INNER JOIN 跟JOIN一样,必须要有关键字ON加上条件。而不能像交叉连接一样取迪卡尔积。
SELECT * FROM TEST1 JOIN TEST2 ON TEST1.ID=TEST2.ID;
SELECT * FROM TEST1 INNER JOIN TEST2 ON TEST1.ID=TEST2.ID; //两个语句执行结果一致。INNER可省略。
SELECT * FROM TEST1,TEST2 WHERE TEST1.ID=TEST2.ID;//交叉连接,取出满足条件的迪卡尔积。跟上面两个语句执行结果一样。
外连接:
外连接可省略outer:
LEFT JOIN: 以左表为主,即使右表中没有匹配,也从左表返回所有的行。相当于左表显示全部,右表没有的显示为空。
RIGHT JOIN:以右表为主, 即使左表中没有匹配,也从右表返回所有的行。右表显示全部,左表没有的显示为空。
FULL JOIN: 只要其中一个表中存在匹配,就返回行。相当于两张表都显示全部值,哪一个表没有对应的值则显示为空。
自连接:
自连接就是同一个表自己与自己进行连接。可以简单理解为两张表内容完全一样,表名不一样进行连接。
SQL> select * from dept,dept;
select * from dept,dept
ORA-00918: column ambiguously defined
SQL> select * from dept d1,dept d2;
http://www.nowamagic.net/librarys/veda/detail/936
SQL内连接-外连接join,left join,right join,full join的更多相关文章
- sql内连接外连接自然连接
为什么我们要使用内连接和外连接呢?可以从两张或者多张表中找出,我们需要的属性. 这个比较好:http://www.cnblogs.com/youzhangjin/archive/2009/05/22/ ...
- 知识点:Oracle+表连接方式(内连接-外连接-自连接)+详解 来自百度文库
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右 ...
- mysql数据库中的多表查询(内连接,外连接,子查询)
用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...
- SQL中的内连接外连接和交叉连接是什么意思?
内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接( ...
- mysql 内连接 左连接 右连接 外连接
mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...
- Oracle内链接+外连接详解
inner join(内连接) 内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据.也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表 ...
- mysql中的内连接,外连接实例详解
内连接: 只连接匹配的行左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边 ...
- oracle 内连接 外连接 查询 笔记
elect ename,job,sal from emp where deptno>10 order by sal desc; 联合查询,PK dept.deptno FK emp.deptno ...
- mysql8必知必会7 连接 内连接 外连接 交叉连接
/* 2 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- --------------- ...
随机推荐
- (转)Web.config配置文件详解(新手必看)
花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点.所以这里只介绍一些比较常用的节点. <? ...
- Arcgis Engine - 脱离ToolBarControl控件的命令和工具
可以手动实现脱离ToolBarControl控件的命令和工具 //打开文件. private void file_tsmItem_Click(object sender, EventArgs e) { ...
- angularjs directive 实例 详解
前面提到了angularjs的factory,service,provider,这个可以理解成php的model,这种model是不带html的,今天所说的directive,也可以理解成php的mo ...
- 浅析Javascript原型继承(转)
引自: http://blog.csdn.net/kittyjie/article/details/4380918 原作者解释的浅显易懂,非常不错的JavaScript prototype总结 JS没 ...
- 如何从数据库(实体提供者)读取安全用户(转自http://wiki.jikexueyuan.com/project/symfony-cookbook/entity-provider.html)
Symfony 的安全系统可以通过活动目录或开放授权服务器像数据库一样从任何地方加载安全用户.这篇文章将告诉你如何通过一个 Doctrine entity 从数据库加载用户信息. 前言 在开始之前,您 ...
- 修改mysql的默认字符集
\s 查看mysql的字符集 把server characterset和db characterset修改成utf8 在my.ini的mysqld下面添加两行代码,重启mysql [mysql] de ...
- css 溢出文本显示省略号
这个标题其实已经是一个老生常谈的问题了.很多时候,比如网站最基本的文章列表,标题会很长,而显示列表的区域宽度却没有这么宽,这时候最正常的做法就是 让超出宽度的部分文字用省略号(…)来表示.通常做法是网 ...
- pyopenssl
https://pyopenssl.readthedocs.org/en/stable/ pyopenssl是一个封装了openssl的python模块. 使用它可以方便地进行一些加解密操作. 1.产 ...
- 文件:因为懂你,所以永恒 - 零基础入门学习Python028
文件:因为懂你,所以永恒 让编程改变世界 Change the world by program 因为懂你,所以永恒 大多数的程序都遵循着:输入->处理->输出的模型,首先接受输入数据,然 ...
- BasicExcel说明文档
BasicExcel说明文档 BasicExcel原始链接:http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-a ...