史上最简单的 MySQL 教程(二十七)「连接查询(下)」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

连接查询

连接查询:将多张表(大于等于 2 张表)按照某个指定的条件进行数据的拼接,其最终结果记录数可能有变化,但字段数一定会增加。

连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表。

连接查询为join,使用方式为:左表join右表

  • 左表:join左边的表;
  • 右表:join右边的表。

连接查询分类:在 SQL 中将连接查询分为四类,分别为内连接、外链接、自然连接和交叉连接。

外连接

外连接left\right join,以某张表为主表,取出里面的所有记录,然后让主表中的每条记录都与另外一张表进行连接,不管能否匹配成功,其最终结果都会保留,匹配成功,则正确保留;匹配失败,则将另外一张表的字段都置为NULL.

  • 基本语法左表 + left\right + join + 右表 + on + 左表.字段 = 右表.字段;

其中,关键字on表示连接条件,两表中的条件字段有着相同的业务含义。在这里,以主表为依据,外连接分为两种,分别为:

  • left join:左外连接(左连接),以左表为主表;
  • right join:右外连接(右连接),以右表为主表。

执行如下 SQL 语句,进行测试:

-- 将表 student 与 class 进行左连接
select s.*,c.id as c_id,c.grade as c_grade,room from student as s left join class as c on s.grade = c.grade;

-- 将表 student 与 class 进行右连接
select s.*,c.id as c_id,c.grade as c_grade,room from student as s right join class as c on s.grade = c.grade;
outer

实际上,无论以那张表为主表,其外连接的结果(记录数量)都不会少于主表的记录总数。此外,虽然左连接与右连接有主表差异,但显示的结果都是:左表的数据在左边,右表的数据在右边

自然连接

自然连接nature join,自然连接其实就是自动匹配连接条件,系统以两表中同名字段作为匹配条件,如果两表有多个同名字段,那就都作为匹配条件。在这里,自然连接可以分为自然内连接和自然外连接。

自然内连接

  • 基本语法左表 + nature + join + 右表;

执行如下 SQL 语句,进行测试:

-- 将表 student 与 class 进行自然内连接
select * from student natural join class;

-- 将表 student 与 class 进行内连接,连接条件为 id 和 grade
select * from student inner join class on student.id = class.id and student.grade = class.grade;
natural

观察上图,咱们会发现:自然连接自动使用同名字段作为连接条件,而且在连接完成之后合并同名字段

自然外连接

  • 基本语法左表 + nature + left/right + join + 右表;

执行如下 SQL 语句,进行测试:

-- 将表 student 与 class 进行自然左外连接
select * from student natural left join class;

-- 将表 student 与 class 进行自然右外连接
select * from student natural right join class;
naturalwai

实际上,自然连接并不常用。而且,咱们可以用内连接和外连接来模拟自然连接,模拟的关键就在于使用同名字段作为连接条件及合并同名字段。

  • 基本语法左表 + inner/left/right + join + 右表 + using(字段名);

其中,using内部的字段名就是作为连接条件的字段,也是需要合并的同名字段。

执行如下 SQL 语句,进行测试:

-- 将表 student 与 class 进行自然左外连接
select * from student natural left join class;

-- 用左外连接模拟自然左外连接
select * from student left join class using(id,grade);
moni

温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玩转JavaEE

初识MongoDB中的索引

索引就像图书的目录一样,可以让我们快速定位到需要的内容,关系型数据库中有索引,NoSQL中当然也有,本文我们就先来简单介绍下MongoDB中的索引。 本文是Mo...

3195
来自专栏不想当开发的产品不是好测试

mysql 删表引出的问题

背景 将测试环境的表同步到另外一个数据库服务器中,但有些表里面数据巨大,(其实不同步该表的数据就行,当时没想太多),几千万的数据!! 步骤 1. 既然已经把数据...

2097
来自专栏大内老A

创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]

在《基于T4的代码生成方式》中,我对T4模板的组成结构、语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码...

3808
来自专栏维C果糖

史上最简单的 MySQL 教程(二十)「数据的高级操作 之 主键冲突」

当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即更新或替换。

34611
来自专栏java初学

mysql入门 — (1)

3379
来自专栏杨建荣的学习笔记

MySQL 5.7 General Tablespace学习(r11笔记第34天)

MySQL里面的文件蛮有意思,之前大体有两个参数来做基本的控制。一个是innodb_data_file_path就是一个共享表空间,数据都往这一个文件里放,也就...

3459
来自专栏黑白安全

二次注入代码剖析

本文针对二次注入进行讲解,并简单的绕过360脚本waf。。。。。 首先来看程序的注册页面代码:

812
来自专栏Ryan Miao

mysql创建定时执行存储过程任务

sql语法很多,是一门完整语言。这里仅仅实现一个功能,不做深入研究。 目标:定时更新表或者清空表。 案例:曾经做过定时清空位置信息表的任务。(然而,当时并未考虑...

3517
来自专栏idba

MySQL 5.7 新特性之三

本系列文章基于5.7.20 版本讲述MySQL的新特性,从安装,文件结构,SQL,优化,复制等几个方面展开介绍5.7 的新特性和功能,同时也建议大家跟踪官方bl...

682
来自专栏PHP技术

如何将 Text, XML, CSV 数据文件导入 MySQL

原文出处: freenik@Jianshu 将 外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (...

3358

扫码关注云+社区