当前位置: 首页 > 编程日记 > 正文

sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接

例子:

-------------------------------------------------

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.NAME

FROM ORDERS O , CUSTOMERS C

WHERE O.ID=1;

语句2:显式的交叉连接,使用CROSS JOIN。SELECT O.ID,O.ORDER_NUMBER,C.ID,

C.NAME

FROM ORDERS O CROSS JOIN CUSTOMERS C

WHERE O.ID=1;

语句1和语句2的结果是相同的,查询结果如下:

二、内连接(INNER JOIN)内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。

语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

FROM CUSTOMERS C,ORDERS O

WHERE C.ID=O.CUSTOMER_ID;

语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME

FROM 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.NAME

FROM 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.NAME

FROM 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.NAME

FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

WHERE O.ORDER_NUMBER<>‘MIKE_ORDER001‘;

语句8:将语句7中的WHERE条件放到ON后面。SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM 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.NAME

FROM 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.NAME

FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

UNION

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM 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.NAME

FROM 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.NAME

FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

EXCEPT

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM 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.NAME

FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID

MINUS

SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME

FROM 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、 求差操作的时候用联合查询。

相关文章:

MySQL冷备份的跨操作系统还原

数据来源&#xff1a;linux平台mysql版本为5.7 数据去向&#xff1a;windows平台mysql版本为5.7 操作步骤&#xff1a; 第一步&#xff1a;关闭mysql服务 service mysqld stop 第二步&#xff1a;归档linux平台下mysql的数据目录 tar -czvf data.tar.gz /usr/local/mysql/data …

Java 社区领袖联合发文:别慌,Java 仍然是免费的!

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 在去年的 Java One 上&#xff0c;Mark Cavage 当时宣布 Oracle 将逐步开源 Oracle JDK 的专有功能&#xff08;商业特性&#xff09;。Oracle Java 平台产品管理高级总监 Donald …

Squid安装

最新版Squid安装 http://www.squid-cache.org/Versions/v3/3.5/# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.7.tar.gz# tar zxvf squid-3.5.7.tar.gz# cd squid-3.5.7# ./configure --prefix/usr/local/squid# make && make install# chmod -R 777 /…

Java内部类手机专卖店_JAVA——内部类的那些事儿

obj3.func();//3.2 访问静态内部类的静态方法(通过类名访问)Outer.StaInner.staFunc();//4 局部内部类访问局部变量Outer obj4 new Outer();obj4.local();//5 匿名内部类Outer obj5 new Outer();obj5.anonymous();//6 匿名内部类作为参数asPara(new AbstractClass() {public …

Linux下Postfix的配置和使用

Postfix为何物&#xff0c;详见&#xff1a;http://zh.wikipedia.org/wiki/Postfix 0.关于Postfix postfix的产生是为了替代传统的sendmail.相较于sendmail,postfix在速度。性能和稳定性上都更胜一筹。如今眼下许多的主流邮件服务事实上都在採用postfix. 当我们须要一个轻量级的…

部分人说 Java 的性能已经达到甚至超过 C++,是真的吗?

好多Java程序员都说由于JIT技术的引入&#xff0c;Java的性能已经和C一样了&#xff0c;而且Java的开发效率极高&#xff0c;可以省下60%的时间。请问事实真的是这样吗&#xff1f;我平常也都在写这两个语言&#xff0c;但是因为开发的软件的复杂度不大&#xff0c;并没有感觉到…

Wiki 开源软件

Wiki 是一个协同著作平台或称开放编辑系统。所谓协同工作&#xff0c; 即它能够让浏览网页的人都能够去修订网页&#xff0c;其简介的 ... Wiki 是怎么做到的. Wiki 使用 了简化的语法&#xff0c;替代复杂的HTML&#xff0c;加上WEB 界面的编辑工具&#xff0c;降低内容维护的…

Android studio安装与调试

1.下载安装android studio 下载好之后安装好2.启动报错提示1&#xff09;进入刚安装的Android Studio目录下的bin目录。找到idea.properties文件&#xff0c;用文本编辑器打开。2&#xff09;在idea.properties文件末尾添加一行&#xff1a; disable.android.first.runtrue &am…

java的父类java.lang.object_根父类:java.lang.Object

1、根父类(1)Object类型是所有引用数据类型的超类&#xff0c;包括数组类型如果一个类没有显式的声明它的父类&#xff0c;那么它的父类就是Object。(2)Object类中的方法&#xff0c;会继承到所有类型的对象中&#xff0c;包括数组对象。即所有对象都可以调用Object类中声明的方…

spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient

在使用服务发现的时候提到了两种注解&#xff0c;一种为EnableDiscoveryClient,一种为EnableEurekaClient,用法上基本一致&#xff0c;今天就来讲下两者&#xff0c;下文是从stackoverflow上面找到的对这两者的解释&#xff1a;原文链接 There are multiple implementations of…

strust2自定义interceptor的基本方法及操作

需求&#xff1a;制作一个网站需要用户登陆后才能查看&#xff0c;即一个权限的问题 1.首先明确在用户没登陆前有两个Action请求是可以通过的&#xff0c;即注册和登陆。 2.创建拦截器&#xff0c;如UserLoginInterceptor.java&#xff0c;如下 public class UserLoginIntercep…

使用xdebug分析thinkphp框架函数调用图

开发中需要性能调优&#xff0c;使用xdebug分析thinkphp框架函数调用图。关于xdebug的安装参考这2篇 NetBeans配置Xdebug 远程调试PHP php扩展xdebug安装以及用kcachegrind系统分析1.安装xdebug 需要先去http://www.xdebug.org看看一些文档&#xff0c;xdebug作为php扩展安装 #…

java+script+当前日期_如何在JavaScript中获取当前日期?

如何在JavaScript中获取当前日期&#xff1f;#1楼您可以使用扩展了 Date对象的Date.js库&#xff0c;从而可以使用.today()方法。#2楼如果您想对日期格式进行更多的粒度控制&#xff0c;我强烈建议您查看一下momentjs。 很棒的图书馆-只有5KB。 http://momentjs.com/#3楼你可以…

java中的类修饰符、成员变量修饰符、方法修饰符。

类修饰符&#xff1a; public&#xff08;访问控制符&#xff09;&#xff0c;将一个类声明为公共类&#xff0c;他可以被任何对象访问&#xff0c;一个程序的主类必须是公共类。 abstract&#xff0c;将一个类声明为抽象类&#xff0c;没有实现的方法&#xff0c;需要子类提供…

Linux 系统挂载数据盘

Linux 系统挂载数据盘&#xff1a; 适用系统&#xff1a;Linux&#xff08;Redhat , CentOS&#xff0c;Debian&#xff0c;Ubuntu&#xff09;* Linux的云服务器数据盘未做分区和格式化&#xff0c;可以根据以下步骤进行分区以及格式化操作。下面的操作将会把数据盘划分为一个…

java 启动某个类_java – Spring Boot – 如何指定备用启动类? (多个入口点)

我想添加一个替代的入口点到我的Spring-Boot应用程序.我宁愿把它当成一个肥罐.这可能吗&#xff1f;根据他们的documentation,属性loader.main指定要启动的主类的名称.我尝试java -jar MyJar.jar –loader.main com.mycompany.AlternateMain,但是我的pom.xml中指定的start-cla…

WIN7 64位系统下,右下角的声音和电源图标不见的解决办法

近日&#xff0c;电脑突然出现任务栏右下角的声音和电源图标消失不见的问题&#xff0c;重启仍旧没有修复&#xff0c;后来找到了解决办法 解决办法&#xff1a; 1.CtrlShiftEsc键调出windows资源管理器。 2.找到进程中的explorer.exe进程并结束它。 3.在文件选项的新建任务选项…

创建Maven版Java工程

步骤&#xff1a; 创建成功后&#xff0c;如图&#xff1a; 转载于:https://www.cnblogs.com/zhzcode/p/9722902.html

Linux系统启动任务的写法

1.到/etc/rc.d目录# cd /etc/rc.d 2.修改rc.local # vim ./rc.local你之前是怎么启动nginx和php命令复制即可。例如&#xff1a;/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf/etc/init.d/php-fpm3.一定要给权限 # chmod x rc.local特别是喜欢下载到本地修…

java ee不能运行_Java9+移除 Java EE,导致我的 groovy 脚本无法运行

以以下这段代码为例Grab(org.jsoup:jsoup:1.10.1)import org.jsoup.JsoupJsoup.connect(https://v2ex.com).get().select(span.item_title > a).each {println it.text() : https://v2ex.com it.attr(href)}原本是 groovy2.5java8&#xff0c;可以正常跑&#xff0c;然后…

虚拟文件系统(VFS)

原文链接&#xff1a;http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层&#xff0c;使得文件、目录、读写访问等概念都成为抽象层概念&#xff0c;这个抽象层被称为虚拟文件系统(VFS)。 linux内核的VFS子系统如下: 每个进程在PCB(Process Control Block)中…

[学习笔记]矩阵乘法及其优化dp

1.定义&#xff1a; $c[i][j]\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件&#xff0c;(n*m)*(m*p)n*p 即第一个矩阵的列数等于第二个矩阵的行数&#xff0c;否则没有意义。 2.结合律与分配率 矩阵乘法不一定任何时候都有交换律。因为交换后甚至不能保证第一个矩阵的列数等…

[LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串...

Given a string, find the length of the longest substring T that contains at most k distinct characters. For example, Given s “eceba” and k 2, T is "ece" which its length is 3. 这道题是之前那道Longest Substring with At Most Two Distinct Charac…

Linux创建指定用户特定指定目录权限

指定用户特定指定目录权限需要注意要指定好文件夹的权限&#xff0c;不然会导致nginx不能访问&#xff0c;最好是在root下建立目录&#xff0c;然后 # useradd -d /usr/www -m tempuser# passwd tempuser 回车输入密码 注意一定要带用户名&#xff0c;不然就是修改root!!!# c…

python asyncio教程_python中使用asyncio实现异步IO实例分析

1、说明Python实现异步IO非常简单&#xff0c;asyncio是Python 3.4版本引入的标准库&#xff0c;直接内置了对异步IO的支持。asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用&#xff0c;然后把需要执行的协程扔到EventLoop中执行&#xf…

c语言初学 循环 的灵活使用小案例

上为流程图 上为代码实现&#xff0c;没有做优化。接下来是效果图。 时间2018.10.01 地点&#xff1a;广东轻工业职业技术学院复制代码 转载于:https://juejin.im/post/5bb1d98a5188255c9a77441a

常见maven引用

json-lib Could not find artifact net.sf.json-lib:json-lib:jar json-lib是需要区分jdk版本的&#xff0c;pom.xml中的配置应加上<classifier>标签&#xff0c;如用jdk15&#xff1a; <dependency><groupId>net.sf.json-lib</groupId><artifactId…

怎么控制table的大小java_如何查询Table占用空间的大小

Oracle和DB2都支持分区表&#xff0c;但是我们得知道什么样的表适合使用分区表技术&#xff0c;Oracle的官方建议是超过2G的Table就要使用分区表。下面来总结一下&#xff0c;各DB中如何获得这些大小信息&#xff1a;Oracle 10G中&#xff1a;查询出当前用户的表所占用的空间大…

王豪:HW265到“HW266”

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/82929609 每年的MSU的视频压缩评比报告都是多媒体的热点话题之一&#xff0c;在MSU 2018评比中&#xff0c;华为HW265在多项测试中排名…

Flex报错Error #2048: 安全沙箱冲突

FlexJPA架构&#xff0c;JPA程序迁移&#xff0c;从A服务器到B。其他一切没变&#xff0c;唯一变的就是IP。 前端Flex也就是swf报错Error #2048: 安全沙箱冲突:http://xxx.swf 不能从 xxx 加载数据 如下&#xff1a;其实原因就是需要在www网站的根目录放一个crossdomain.xml就可…