关闭

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

标签: 数据库mysql连接查询外连接自然连接
2051人阅读 评论(4) 收藏 举报
分类:

温馨提示:本系列博文已经同步到 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 教程 <- 目录 —— ☆☆☆ ————

3
1
查看评论

史上最简单的 MyBatis 教程

1 前言  MyBatis 源于 Apache 的一个开源项目 iBatis,而 iBatis 一词则来源于“internet”和“abatis”的组合,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis ,2013...
  • qq_35246620
  • qq_35246620
  • 2017-02-01 00:49
  • 6629

史上最简单的SpringCloud教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于spri...
  • fend0875
  • fend0875
  • 2017-04-21 08:39
  • 1578

史上最简单的SpringCloud教程

转载请标明出处:  http://blog.csdn.net/forezp/article/details/70148833  本文出自方志朋的博客 错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spr...
  • zhongzh86
  • zhongzh86
  • 2017-11-22 14:15
  • 50

微服务:史上最简单的 SpringCloud 教程 | 终章

http://blog.csdn.net/forezp/article/details/70148833  本文出自方志朋的博客 案例全部采用Spring Boot 1.5.x ,Spring Cloud版本为Dalston.RELEASE  码农下载:https://gi...
  • superdangbo
  • superdangbo
  • 2017-11-01 17:20
  • 291

史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于springboot的。本文主要介绍了服务的注册与发现。
  • forezp
  • forezp
  • 2017-04-08 18:16
  • 311058

史上最直白的logistic regression教程 之 五

史上最直白的logistic regression教程整理稿,将4篇博文整理成一个完整的pdf文档,且修改成学术语境。 链接在这里: http://download.csdn.net/detail/u011539200/9290695 0积分下载,求rp,^_^
  • u011539200
  • u011539200
  • 2015-11-22 15:57
  • 663

史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

这篇文章主要讲述通过feign去消费服务。Feign是一个声明式的web服务客户端,它使得写web服务变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,包括Feign 注解和JAX-RS注解。Feign同时支持可插拔的编码器和解码器。
  • forezp
  • forezp
  • 2017-04-09 11:53
  • 189188

log4j 史上最简单的配置

log4j.properties 文件内容:具体需求课根据自己的意愿选择不同的权限# Log4j properties log4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j....
  • forever_insist
  • forever_insist
  • 2017-11-20 11:26
  • 108

史上最直白的logistic regression教程 之 三

在线性拟合的基础上,我们实现logistic regression了。如前所述,样本集是 {x1,y1},{x2,y2},...,{xn,yn}[1]\{x_1,y_1\}, \{x_2, y_2\}, ..., \{x_n, y_n\}[1] 其中,xi=[1,xi,1,xi,2,xi,3,....
  • u011539200
  • u011539200
  • 2015-11-19 16:09
  • 1362

史上最简单的 MySQL 教程(二十一)「数据的高级操作 之 蠕虫复制」

数据的高级操作蠕虫复制蠕虫复制:从已有的数据表中获取数据,然后将数据进行新增操作,数据成倍(以指数形式)的增加。根据已有表创建新表,即复制表结构,其基本语法为: create table + 表名 + like + [数据库名.]表名; 执行如上 SQL 语句,进行测试:-- 根据已有表,创建新表,...
  • qq_35246620
  • qq_35246620
  • 2017-06-03 21:14
  • 2616
    个人资料
    • 访问:963417次
    • 积分:12935
    • 等级:
    • 排名:第1267名
    • 原创:258篇
    • 转载:86篇
    • 译文:11篇
    • 评论:954条
    博主的 GitHub 账号
    GitHub : Charies Gavin

        鉴于 CSDN 糟糕的用户体验,博主会将一些优质的文章迁移到 Charies Gavin's Blog  欢迎大家在 GitHub 上 Follow 博主,以及 Fork、Star、Watch 博主的项目。


      青春不老 奋斗不止


      好学若饥虚心若愚
    博客专栏