连接查询

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

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

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

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

创建测试数据

为了后面可以演示内连接、外连接中的左外连接和右外连接,下面创建一些测试数据,首先创建一张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. Ubuntu下使用nvm

    写在前面:刚写着写着博客就跨年了,希望新的一年大家万事如意,一切向"前"看! 安装 wget -qO- https://raw.githubusercontent.com/crea ...

  2. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  3. WPF做12306验证码点击效果

    一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...

  4. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  5. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  6. springmvc SSM shiro redis 后台框架 多数据源 代码生成器

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  7. Android中开发工具Android Studio修改created用户(windows环境)

    最近经常有朋友反馈说我的安卓项目中,在一些类中会出现Created by panchengjia on 2016/12/30的字样,是如何自动实现的(默认一般为Administrator),如下图: ...

  8. Atitit 软件工程概览attilax总结

    Atitit 软件工程概览attilax总结 1.1. .2 软件工程的发展 进一步地,结合人类发展史和计算机世界演化史来考察软件工程的发展史. 表2 软件工程过程模型 表2将软件工程的主要过程模型做 ...

  9. SQL Server 批量删除存储过程

    原理很简单的'drop proc xxx'即可,下面有提供了两种方式来删除存储过程,其实本质是相同的,方法一是生成删除的sql后直接执行了,方法二会生成SQL,但需要检查后执行,个人推荐第二种做法. ...

  10. 如何给FineReport设置自定义消息提醒工具

    FineReport设计器有自动的消息推送功能,可设置报表定时推送和常规的日报周报推送.官方有自己的消息推送的接口,不过有些用户旺旺希望自己开发,符合自己需求的推送界面. 下面这个方案就从逻辑层面简单 ...