MySQL JOIN | 联结

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

答案是JOIN(联结)。在一条SELECT语句中,我们可以联结多张表返回一组数据。
联结主要有4种,分别是INNER JOIN(内联结)、LEFT JOIN(左联结)、RIGHT JOIN(右联结)、CROSS JOIN(叉联结)

为了能清楚地说明这4种联结,首先需要准备好实例数据:

创建2个表:

CREATE TABLE product(
id INT 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(
id INT 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.id
WHERE 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.id
WHERE 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子句,可以更清楚看到CROSS JOIN的返回结果:

示例4-2:

SELECT * FROM product,vendor;

结果:

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

时间: 2024-10-06 01:37:17

MySQL JOIN | 联结的相关文章

MySQL的联结(Join)语法

MySQL的联结(Join)语法 1.内联结.外联结.左联结.右联结的含义及区别: ? 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,可以来信咨询:陈朋奕chenpengyi#gmail.com),国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的("+"号)弄得糊涂了. ? 在SQL标准中规划的(Join)联结大致分为

图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join.我觉得清楚易懂,转过来. 假设我们有两张表. Table A 是左边的表. Table B 是右边的表. 其各有四条记录,其中有两条记录是相同的,如下所示

Mysql Join语法解析与性能分析详解

一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEF

MySQL JOIN原理

先看一下实验的两张表: 表comments,总行数28856 表comments_for,总行数57,comments_id是有索引的,ID列为主键. 以上两张表是我们测试的基础,然后看一下索引,comments_for这个表comments_id是有索引的,ID为主键. 最近被公司某一开发问道JOIN了MySQL JOIN的问题,细数之下发下我对MySQL JOIN的理解并不是很深刻,所以也查看了很多文档,最后在InsideMySQL公众号看到了两篇关于JOIN的分析,感觉写的太好了,拿出来分

mysql join详解

下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录如下: bID bName 1 2006032401 2 2006032402 3 2006032403 4 2006032404 8 2006032408 创建这两个表SQL语句如下: CREATE TABLE a aID int( 1 ) AUTO_INCREMENT PRIMARY KEY , aNum char(

MySQL JOIN 语法说明与 图解

一.MySQL JOIN 分类 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录. 二.图解关系 INNER JOIN:用于取得两个表中存在连接匹配关系的记录. mysql> select * f

mysql join 对比和分析

学习的时候了解了一下join操作,包含left join,right join,inner join和out join,每种操作之后生成的表的空间大小不同:假设A和B表做join操作,如果是left join,则以A表为基准,然后和B表进行匹配,表的大小至少A表的大小(乘以B表中和A表中连接的最大覆盖率,及A表的一条记录所对应B表中记录的最大条数):则right join则以B表为基准:inner join,则为A和B intersection之后的交集:outer intersection,则

图解mysql join

原文:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins 这个图文解释mysql join的各种技巧

MySQL join的实现原理及优化思路

Join 的实现原理 在MySQL 中,只有一种Join 算法,也就是Nested Loop Join,没有其他很多数据库所提供的Hash Join,也没有Sort Merge Join.顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果.如果还有第三个参与Join,则再通过前两个表的Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复. 下面