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>

总结:

其实总的连接查询也就4种:内连接、外连接(左连接、右连接、全连接)

JOIN默认就是内连接inner join,其中inner可省略不写。如果表中有至少一个匹配,则返回行。
外连接可省略outer:
LEFT JOIN: 以左表为主,即使右表中没有匹配,也从左表返回所有的行。
RIGHT JOIN:以右表为主, 即使左表中没有匹配,也从右表返回所有的行。
FULL JOIN: 只要其中一个表中存在匹配,就返回行。

(最近重新拾起ORACLE数据库技术知识,整理下以前学过的知识点,怎么自己印象中竟然有这么多种的连接查询,以至于曾经混乱了很久:join,inner join, left join, right join, full join, full outer join, left outer join, right outer join, cross join),其实想想原来竟是这么简单。

时间: 2024-10-07 08:18:36

SQL内连接-外连接join,left join,right join,full join的相关文章

内连接 外连接 交叉连接

数据库表连接大致分为三种:交叉连接.内连接.外连接 交叉连接(CROSS JOIN):其实就是内连接的一种特例,不带查询条件 内连接(INNER JOIN):相等连接.不等连接.自然连接 外连接(OUTER JOIN):左外联接.右外链接.全外连接(全外连接只有部分RDBMS系统可以做到,例如Oracle.做不到的有MySQL.SQL Server.Access) 交叉连接: 最简单,返回多张表每一行相乘的结果,也就是笛卡尔积.关键字是 CROSS JOIN 写法有三种:CROSS JOIN ,

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

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

左连接,右连接,内连接,外连接, 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

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

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

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

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

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

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

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; 效果

数据库操作-内连接外连接

内连接: 只连接匹配的行 左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行 全外连接: 包含左.右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行. /**************************************************************************************/ 表A id   n