准备表

drop table if exists test_a;
CREATE TABLE `test_a` (`id` varchar(10) NOT NULL,`username` varchar(10) NOT NULL,`password` varchar(10) NOT NULL,PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;drop table if exists test_a_description;
CREATE TABLE `test_a_description` (`id` varchar(10) NOT NULL,`age` varchar(10) ,`address` varchar(50) ,`parent_id` varchar(10) NOT NULL,PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

准备数据

insert into test_a values('1','小明','11');
insert into test_a values('2','宁宁','22');
insert into test_a values('3','敏敏','33');
insert into test_a values('6','生生','66');insert into test_a_description values('1','10','aaa','1');
insert into test_a_description values('2','20','bbb','2');
insert into test_a_description values('3','30','ccc','3');
insert into test_a_description values('4','40','ddd','4');

一、内连接(inner join)


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

查出的是两张表的交集,两张表都有的才查出来

SQL:

select * from 表A inner join 表B on 判断条件;

select * from 表A, 表B where 判断条件;

select a.*, ad.* from test_a as a inner join test_a_description as ad on a.id=ad.parent_id;select a.*, ad.* from test_a as a, test_a_description as ad where a.id=ad.parent_id;

结果:

二、外连接

1、左外连接(left join)

以左表为主表(查询全部), 右表为辅表(没有的显示null)

SQL:

select * from 表A left join 表B on 判断条件;

select a.*, ad.* from test_a as a left join test_a_description as ad on a.id=ad.parent_id;

结果:

2、右外连接(right join)

以右表为主表(查询全部), 左表为辅表(没有的显示null)

SQL:

select * from 表A right join 表B on 判断条件;

select a.*, ad.* from test_a as a right join test_a_description as ad on a.id=ad.parent_id;

结果:

三、全连接(full join)

两个表的所有数据都展示出来

SQL:

select * from 表A full join 表B on 判断条件;

select a.*, ad.* from test_a as a full join test_a_description as ad on a.id=ad.parent_id;

结果:

四、联合(合并)查询(union)

MySQL 不识别 FULL join,所以可以通过 union 来实现

SQL:

select a.*, ad.* from test_a as a left join test_a_description as ad on a.id=ad.parent_id
union
select a.*, ad.* from test_a as a right join test_a_description as ad on a.id=ad.parent_id;

结果:

五 交差集

还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

SELECT * FROM TableA CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

六、区别分析

外连接:外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)

三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接:还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接:还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接:还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外 = 左外 UNION 右外”。

说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。

七 、SQL查询的基本原理

单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。
两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
理解SQL查询的过程是进行SQL优化的理论依据。

SQL的几种连接查询方式(内连接、外连接、全连接、联合查询)相关推荐

  1. hibernate查询方式总结(四)之QBC,QBE查询

    QBC(Query By Criteria) 查询方式 这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections.使用QBC查询,一般需要以下 ...

  2. android连接mysql查询表内记录_Android Room数据库多表查询的使用实例

    前言 在SQLite数据库中,我们可以指定对象之间的关系,因此我们可以将一个或多个对象与一个或多个其他对象绑定.这就是所谓的一对多和多对多的关系. 既然要多表查询,所以表之间就得有关联.这时候我们就得 ...

  3. 查询域内计算机命令,AD域控Dsquery查询命令实列

    注:请以管理员的身份运行cmd程序,要不然某些命令不生效 AD域控Dsquery查询命令实列 查询技术支持二部的所有用户 dsquery user OU=技术支持二部,OU=技术部,OU=ZT-Use ...

  4. 高级查询(1.连接查询(对列的扩展)2.联合查询(对行的扩展)3.子查询)

    高级查询 1.连接查询(对列的扩展) 第一种形式: select * from Info,Nation #会形成笛卡尔积 select * from Info,Nation where Info.Na ...

  5. 内网外网同时连接方法

    资料 内网ip:192.168.40.19 内网网网关:192.168.40.1 外网(无线网)ip:192.168.61.161 外网(无线网)网关:192.168.60.1 查询网关的方法: 1 ...

  6. SQL联合查询:子表任一记录与主表联合查询

    今天有网友群里提了这样一个关于SQL联合查询的需求: 一.有热心网友的方案: 二.我的方案: select * from ( select a.*,(select top 1 Id from B as ...

  7. mysql联合查询语句详解_实例讲解MySQL联合查询

    1. 内联结: Select A.Name, B.Hobby from A, B where A.id = B.id,这是隐式的内联结,查询的结果是: Name Hobby Tim Football ...

  8. tplink连接服务器失败_管家婆财贸双全连接失败,服务器端没有找到加密狗

    管家婆财贸双全连接失败,服务器端没有找到加密狗 管家婆财贸双全找不到狗判断步骤 1.先判断电脑能否识别管家婆财贸双全加密狗我的电脑--右键--属性--硬件--设备管理器--通用串行总线控制器(或人体学 ...

  9. oracle 连接查询(内、外连接、自连接、子查询)

    内连接: 一般使用inner join来实现.其中inner关键字可以省略 同时必须在from子句之后定义一个on子句,用来指定连接条件 外连接 1 左外连接:关键字为left outer join或 ...

  10. SQL-join连接查询整理区分-交叉/内/左外/右外/全外连接

    整理join连接查询: 1.交叉连接(等同于select from) SELECT * FROM tbl_emp JOIN tbl_dept SELECT * FROM tbl_emp,tbl_dep ...

最新文章

  1. 开源项目哪家强?Github年终各大排行榜超级盘点(内附开源项目学习资源)
  2. Swift 范的 CGRect、CGSize 和 CGPoint
  3. 活动目录.NET编程Tips
  4. Visual Basic编程常见问题及解答(2)
  5. 『001』如何在自己的网页里引入一个聊天机器人(。・∀・)ノ
  6. accept 返回0_Netty深入浅出系列:Netty源码分析之accept过程
  7. TASKCTL-函数表达式分类
  8. 怎么查看计算机硬盘sn,硬盘序列号,教您怎么查看硬盘序列号
  9. 基于产生式系统方法实现动物识别系统
  10. 阿里矢量图~!import
  11. java求第n项斐波那契_【剑指offer】数列——求斐波那契第n项
  12. opencv轮廓检测
  13. Java语言HttpClient使用代理IP
  14. 惠普打印机安装驱动 无法注册字体
  15. SyntaxError报错成功解决
  16. etcd教程(二)—clientv3简单使用
  17. starbound服务器无响应,星界边境无法开始游戏解决方法
  18. 小米9刷鸿蒙,小米手机怎么刷机 小米9刷第三方ROM方法【详解】
  19. 理解虚拟机(Android 虚拟机进化史)
  20. 矩阵理论——内积空间

热门文章

  1. ddk开发 c语言,ddk_helloWDM_原代码是网上高手的杰作
  2. 我的Android之路
  3. 数据分析---统计学基础知识
  4. multisim中pwl_(Multisim电子电路仿真教程)第3章Multisim仿真元件库与虚拟仪器.ppt
  5. 初入PLC编程(基本理论知识)
  6. 百度干净云(无广告不限速的绿色百度云客户端)
  7. php 导出excel接口,PHP实现导出Excel文件
  8. php两个手机号正则表达式_php中手机号码正则表达式代码
  9. LFW pairs.txt解释
  10. 现代光学字符识别技术综述