联结是利用SQL的SELECT能执行的最重要的操作。为了提高存储的有效性和避免数据冗余,往往会将有关联的数据存储在好几张表中,那么怎样用一条SELECT语句就能检索出这些数据呢?

答案是JOIN(联结)。在一条SELECT语句中,我们可以联结多张表返回一组数据。

联结的本质是主表中符合条件的每一行与附表中符合条件的每一行进行配对,假如没有WHERE子句或联结条件,则主表中每一行将与附表中的每一行配对,总共会返回的行数是main_table_row_num * attach_table_row_num。如果主表和附表中包含的行数非常多,那么就有必要在WHERE子句中加入筛选条件,这样会大大减少不必要的配对。

联结主要有4种,分别是INNER JOIN(内联结)、LEFT JOIN(左联结)、RIGHT JOIN(右联结)、CROSS JOIN(叉联结)。

为了能清楚地说明这4种联结,我准备了如下示例数据:

一个product表,用来保存商品的名称、价格和供应商ID,一个vendor表,用来保存供应商ID,供应商名称。product表和vendor表之间通过product.vendor_id = vendor.id进行关联。

创建2个表:

CREATE TABLE product(idINT UNSIGNED NOT NULL AUTO_INCREMENT,

name VARCHAR(30) NOT NULL,

price INT UNSIGNED NOT NULL,

vendor_id INT UNSIGNED NOT NULL,

PRIMARY KEY (id)

);

CREATE TABLE vendor1(idINT UNSIGNED NOT NULL AUTO_INCREMENT,

name VARCHAR(30) NOT NULL,

PRIMARY KEY (id)

);

插入数据:

INSERT INTO product (name,price,vendor_id) VALUES('bread', 10, 1);

INSERT INTO product (name,price,vendor_id) VALUES('beer', 27, 2);

INSERT INTO product (name,price,vendor_id) VALUES('vegetables', 15, 0);

INSERT INTO product (name,price,vendor_id) VALUES('beef', 22, 3);

INSERT INTO product (name,price,vendor_id) VALUES('noodles', 30, 2);

INSERT INTO product (name,price,vendor_id) VALUES('fish', 45, 0);

INSERT INTO product (name,price,vendor_id) VALUES('milk', 22, 3);

INSERT INTO product (name,price,vendor_id) VALUES('water', 18, 1);

INSERT INTO vendor (name) VALUES('hellen');

INSERT INTO vendor (name) VALUES('ella');

INSERT INTO vendor (name) VALUES('matt');

INSERT INTO vendor (name) VALUES('jake');

说明:product表中保存商品信息,其中,有一部分商品是由店铺老板自己提供,所以这类商品没有供应商,用vendor_id = 0表示

1. INNER JOIN | 内联结

示例1-1:

找出product表中由ella提供的所有商品:

SELECT product.name, product.price, vendor.name FROM product

INNER JOIN vendor

ON product.vendor_id= vendor.idWHERE vendor.name= 'ella';

结果:

总结:

INNER JOIN可以检索出符合条件(JOIN条件和WHERE条件等)的表product和表vendor的交集,如下图所示:

2. LEFT JOIN | 左联结

示例2-1:

列出product表中所有product,并列出其供应商

SELECT product.name, product.price, vendor.name FROM product

LEFT JOIN vendor

ON product.vendor_id= vendor.id;

结果:

总结:

LEFT JOIN 会检索出主表的所有记录,并且如果附表中的记录符合条件会附加到主表的记录中,主表与附表之间的关系如下图所示:

3. RIGHT JOIN | 右联结

示例3-1:

列出由ella和jake所提供的所有products

SELECT vendor.name as vendor_name,product.name as product_name FROM product

RIGHT JOIN vendor

ON product.vendor_id= vendor.idWHERE vendor.name IN ('ella', 'jake');

结果:

总结:

RIGHT JOIN 会检索出附表的所有记录,并且如果主表中的记录符合条件会附加到附表的记录中,主表与附表之间的关系如下图所示:

4. CROSS JOIN | 叉联结

示例4-1:

列出由ella和hellen所提供的所有products

SELECT product.name as product_name, product.price, vendor.name as vendor_name

FROM product, vendor

WHERE product.vendor_id= vendor.id AND vendor.name IN ('ella', 'hellen');

结果:

CROSS JOIN 返回主表中符合条件的每一行与附表中符合WHERE条件的每一行的配对。

如果没有WHERE子句,可以更清楚看到CROSS JOIN的返回结果:

示例4-2:

SELECT * FROM product,vendor;

结果:

很明显,返回的结果是主表中的每一行与附表中的每一行的配对。

如果您觉得阅读本文对您有帮助,欢迎转载本文,但是转载文章之后必须在文章页面明显位置保留此段声明,否则保留追究法律责任的权利。

mysql join 自联结_MySQL JOIN | 联结相关推荐

  1. mysql join性能_Mysql Join语法解析与性能分析

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  2. mysql join 性能测试_Mysql Join语法解析与性能分析

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: SELECT * FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona t ...

  3. mysql join 条件_MySQL Join 竟然可以这么玩?根据条件 进行复制

    大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家带来, 根据条件进行复制的案例 with t1 as ( select 1 seq ,'AK' id ,'A' type ,'g1' ...

  4. mysql中的联结_MySQL的联结(Join)语法

    MySQL的联结(Join)语法 1.内联结.外联结.左联结.右联结的含义及区别: 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内 ...

  5. mysql 给表起别名_MySQL ------ 高级联结 (自联结,自然联结,外联结,带聚合函数的联结)(十五)...

    一.表别名 1.别名除了可以用于列名和计算字段也可以用于给表起别名. 2.使用表别名可以缩短SQL语句,可以在单条select 语句中多次使用相同的表,就是表别名的作用范围在此条语句中 select ...

  6. mysql不用left join_MySQL在右表数据不唯一的情况下使用left join的方法_MySQL - join

    一.Join语法概述join 用于多表中字段之间的联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionatable1:左表 ...

  7. mysql natural join用法_MySQL NATURAL JOIN

    NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种. MySQL NATURAL JOIN 语法如下: ... FROM table1 NATURAL JOIN table2 ... ...

  8. mysql left join 中文_MySQL之LEFT JOIN问题汇总

    使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对j ...

  9. mysql right关键字_MYSQL 中的LEFT( RIGHT ) JOIN使用ON 与WHERE 筛选的差异

    有这样的一个问题:查询使用mysql中left(right)join筛选条件在on与where查询出的数据是否有差异. 可能只看着两个关键字看不出任何的问题.那我们使用实际的例子来说到底有没有差异. ...

最新文章

  1. 比特币现金驱动的社交媒体平台备忘录继续蓬勃发展
  2. 使用PHPExcel判别和格式化Excel中的日期格式
  3. tp5 童攀_童攀TP5企业网站实战笔记
  4. springboot 搭建 简单 web项目 【springboot + freemark模板 + yml 配置文件 + 热修复 + 测试用例】附源码...
  5. python文本去重函数_python3.4.3下逐行读入txt文本并去重的方法
  6. 使用vue实现自定义搜索功能
  7. uboot之fastboot烧录镜像
  8. java_security之base64原理解析以及三种代码的实现方式
  9. fastadmin 后台管理 时间戳字段使用
  10. Yii和ThinkPHP对比心得
  11. RS 纠删码为什么可以提高分布式存储可靠性?| 原力计划
  12. 网友神总结:我们继续用 XP 的十大理由
  13. 多项式拟合缺点_三种回归算法及其优缺点
  14. linux pppd源码下载_LINUX下的拨号利器:wvdial和pppd —— 转载
  15. 求链表中的中点、上中点、下中点
  16. 《组网技术》:路由器基本配置
  17. 华为手机计算机怎么语音算术,华为自带的语音识别功能太实用了!这样操作,3秒语音变文字...
  18. ES 问题 拼音 en ou等词被拆分,导致搜不到
  19. 运筹学基础(名词解释题总结)
  20. Android 9.0 (Pie)

热门文章

  1. 随意取名取字php,给孩子取名可诗意莫随意
  2. OPENCV中图像数据结构及其转化
  3. python绘图库turtle_Python库-----Turtle绘图库
  4. iMeta | 第1卷第3期来自8个国家的14篇文章正式发布(2022.9)
  5. 软件高分辨率缩放问题
  6. 趣味C语言小游戏(四)之连连看
  7. 使用Oracle Enterprise Manager波折记录
  8. 【免费使用】【redis】【数据库】快速使用redislabs免费套餐 注册和配置redis 缓存 数据库 nosql
  9. 马拉雅-传统国学-钱文忠讲佛
  10. 麒麟系统开发笔记(一):国产麒麟系统搭建开发环境之虚拟机安装