连接查询

连接是关系型数据库模型的主要特点。

连接查询是关系型数据库中最主要的查询,主要包括内连接外连接等通过联结运算符可以实现多个表查询。

在关系型数据库管理系统中,表建立时各种数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中,当查询数据时通过连接操作查询出存放在多个表中的不同实体信息,当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。

本文将介绍多表之间的内连接查询、外连接查询。

创建测试数据

为了后面可以演示内连接、外连接中的左外连接和右外连接,下面创建一些测试数据,首先创建一张base_worker表,用于存放工人基本信息:

create table base_worker
(
s_id int auto_increment,
s_name varchar(20),
s_age int,
primary key(s_id)
)engine=innodb, charset=utf8; insert into base_worker values(null, "aaa", 20);
insert into base_worker values(null, "bbb", 21);
insert into base_worker values(null, "ccc", 22);
commit;

然后创建一张extra_worker表,用于存放工人额外信息:

create table extra_worker
(
e_id int auto_increment,
s_id int,
s_nation varchar(20),
s_phone varchar(30),
primary key(e_id)
)engine=innodb, charset=utf8; insert into extra_worker values(null, 1, "中国", "00000000");
insert into extra_worker values(null, 2, "美国", "11111111");
insert into extra_worker values(null, 5, "英国", "22222222");
commit;

两张表之间通过s_id相关联,当然这里没有设置外键,因为我不太喜欢使用外键,一个是语法太麻烦了,另一个是外键的关联关系太死了,外键不存在插入会报错,还得重新定位问题。

内连接inner join

内连接(inner join)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。换句话说,在内连接查询中,只有满足条件的记录才能出现在结果关系中

对base_worker和extra_worker使用内连接:

select b.s_id, b.s_name, b.s_age, e.s_nation, e.s_phone from
base_worker b, extra_worker e where b.s_id = e.s_id;

看一下查询结果:

看到base_worker和extra_worker中分别有三条记录,但是最终查询出来只有两条记录,因为只有这两条记录可以通过s_id相匹配上。

另外一个细节点是,s_id这种在两张表中都存在的字段,必须指明读取的是哪张表中的s_id,否则SQL将报错,但是s_name这种只在base_worker表中存在的字段则没有这个限制

最后,上面的SQL是内连接最常用的SQL写法,内连接还有另外一种SQL写法,结果也是一样的:

select b.s_id, b.s_name, b.s_age, e.s_nation, e.s_phone from
base_worker b inner join extra_worker e on b.s_id = e.s_id;

可以自己验证一下,执行效率上也没有什么差别。

左外连接left join

连接查询将查询多个表中相关联的行,内连接时返回查询结果集合中的仅仅是符合查询条件和连接条件的行。但有时候需要包含没有关联的行中的数据,即返回查询结果集合中的不仅仅包含符合的连接条件的行,而且还包含左表或右表中的所有数据行。外连接分为左外连接和右外连接,这里先看一下左外连接。

左外连接,返回的是左表中的所有记录以及由表中连接字段相等的记录

看一下SQL:

select b.s_id, b.s_name, b.s_age, e.s_nation, e.s_phone from
base_worker b left outer join extra_worker e on b.s_id = e.s_id;

看一下查询结果:

显示了三条纪录,s_id为3的记录在extra_worker表中并没有s_nation与s_phone,所以这两个值为null,但因为base_worker为左表,因此base_worker中的所有数据都会被查出来。

右外连接right join

右外连接是左外连接的反向连接,将返回右表中的所有行,如果右表中的某行在左表中没有匹配的行,左表将返回空值。

看一下SQL:

select e.s_id, b.s_name, b.s_age, e.s_nation, e.s_phone from
base_worker b right outer join extra_worker e on b.s_id = e.s_id;

注意一下,这里的s_id是extra_worker的而不是base_worker的。

看一下查询结果:

同样的,看到显示了三条纪录,s_id为5的记录在base_worker中并没有s_name与s_age,所以这两个值为null,但因为extra_worker表为右表,因此extra_worker表中的所有数据都会被查出来。

MySQL8:连接查询的更多相关文章

  1. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  2. Mysql联合,连接查询

    一. 联合查询    UNION, INTERSECT, EXCEPT UNION运算符可以将两个或两个以上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询.UNION的语法格式为 ...

  3. Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

    GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...

  4. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  5. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  6. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

  7. Sql Server系列:多表连接查询

    连接查询是关系数据中最主要的查询,包括内连接.外连接等.通过连接运算符可以实现多个表查询.内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.SQL Server中的内连接有 ...

  8. SubSonic3.0使用外连接查询时查询不出数据的问题修改

    今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...

  9. Access数据库多表连接查询

    第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...

随机推荐

  1. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  2. excel 日期/数字格式不生效需要但双击才会生效的解决办法

    原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...

  3. 如何选择PHP框架?

    PHP是世界上最受欢迎的编程语言之—.最近发布的PHP7令这种服务器的编程语言比以前变得更好,更稳定了. PHP被广泛应用于重大的项目.例如Facebook就是使用PHP来维护和创建它们的内部系统的. ...

  4. [内核笔记1]内核文件结构与缓存——inode和对应描述

    由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...

  5. Log4net - 规则简介

    参考页面: http://www.yuanjiaocheng.net/CSharp/csharprumenshili.html http://www.yuanjiaocheng.net/entity/ ...

  6. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  7. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  8. 基于Ubuntu Hadoop的群集搭建Hive

    Hive是Hadoop生态中的一个重要组成部分,主要用于数据仓库.前面的文章中我们已经搭建好了Hadoop的群集,下面我们在这个群集上再搭建Hive的群集. 1.安装MySQL 1.1安装MySQL ...

  9. [css]实现垂直居中水平居中的几种方式

    转自博客 http://blog.csdn.net/freshlover/article/details/11579669 居中方式: 一.容器内(Within Container) 内容块的父容器设 ...

  10. Hadoop

    Hadoop应用场景 Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式. 大数据存储:Hadoop最适合一次写入.多次读取的数据存储需求,如数据仓 ...