mysql-joins具体用法说明

JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻。
假设我们有两个表,Table_A和Table_B。这两个表中的数据如下所示:

TABLE_A										|		 TABLE_B
 PK Value     	 				|   PK Value
---- ----------    				|   ---- ----------
 1 FOX     				|   1 TROT
 2 COP     				|   2 CAR
 3 TAXI     				|   3 CAB
 6 WASHINGTON    				|   6 MONUMENT
 7 DELL     				|   7 PC
 5 ARIZONA    				|   8 MICROSOFT
 4 LINCOLN    				|   9 APPLE
 10 LUCENT     				|   11 SCOTCH

Join 语法:

join_table:
 table_reference JOIN table_factor [join_condition]											//内连接
 | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition				//外连接
 | table_reference LEFT SEMI JOIN table_reference join_condition								//左半连接
 | table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)

table_reference:
 table_factor					//表
 | join_table						//join语句

table_factor:
 tbl_name [alias]				//表名[别名]
 | table_subquery alias			//子查寻[别名]
 | ( table_references )			//带空号的table_reference

join_condition:
 ON expression					//on开头的条件语句

1、Inner JOIN: (内连接)

这是最简单、最容易理解的连接,也是最常见的连接。此查询将返回左表(表A)中具有右表(表B)中匹配记录的所有记录。此连接写成如下:

SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
-- Inner JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
  B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
INNER JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
 1 FOX  TROT   1
 2 COP  CAR   2
 3 TAXI  CAB   3
 6 WASHINGTON MONUMENT  6
 7 DELL  PC   7

(5 row(s) affected)

2、Left JOIN: (左连接)

此查询将返回左表(表A)中的所有记录,而不管这些记录是否与右表(表B)中的任何记录匹配。它还将从正确的表中返回任何匹配的记录。此连接写成如下:

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
-- Left JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
 1 FOX  TROT   1
 2 COP  CAR   2
 3 TAXI  CAB   3
 4 LINCOLN NULL  NULL
 5 ARIZONA NULL  NULL
 6 WASHINGTON MONUMENT  6
 7 DELL  PC   7
 10 LUCENT  NULL  NULL

(8 row(s) affected)

3、Left Excluding JOIN: (左连接排除内连接结果)

此查询将返回左表(表A)中与右表(表B)中的任何记录都不匹配的所有记录。此连接写成如下:

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
-- Left Excluding JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
WHERE B.PK IS NULL

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
 4 LINCOLN NULL  NULL
 5 ARIZONA NULL  NULL
 10 LUCENT  NULL  NULL
(3 row(s) affected)

4、Right JOIN: (右连接)

此查询将返回右表(表B)中的所有记录,而不管这些记录中是否有任何记录与左表(表A)中的记录相匹配。它还将返回左表中的任何匹配记录。此连接写成如下:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
-- Right JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
 1 FOX  TROT   1
 2 COP  CAR   2
 3 TAXI  CAB   3
 6 WASHINGTON MONUMENT  6
 7 DELL  PC   7
NULL NULL  MICROSOFT  8
NULL NULL  APPLE   9
NULL NULL  SCOTCH  11

(8 row(s) affected)

5、Right Excluding JOIN: (右连接排除内连接结果)

此查询将返回右表(表B)中与左表(表A)中的任何记录都不匹配的所有记录。此连接写成如下:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL
-- Right Excluding JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
NULL NULL  MICROSOFT  8
NULL NULL  APPLE   9
NULL NULL  SCOTCH  11

(3 row(s) affected)

6、Outer JOIN: (外连接)

此联接也可以称为完全外联接或完全联接。此查询将返回两个表中的所有记录,连接左表(表A)中与右表(表B)中的记录相匹配的记录。此连接写成如下:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
-- Outer JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
 1 FOX  TROT   1
 2 COP  CAR   2
 3 TAXI  CAB   3
 6 WASHINGTON MONUMENT  6
 7 DELL  PC   7
NULL NULL  MICROSOFT  8
NULL NULL  APPLE   9
NULL NULL  SCOTCH  11
 5 ARIZONA NULL  NULL
 4 LINCOLN NULL  NULL
 10 LUCENT  NULL  NULL

(11 row(s) affected)

7、Outer Excluding JOIN: (外连接排除内连接结果)

此查询将返回左表(表A)中的所有记录和右表(表B)中不匹配的所有记录。我还不需要使用这种类型的联接,但所有其他类型的联接我都相当频繁地使用。此连接写成如下:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL
-- Outer Excluding JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
OR B.PK IS NULL

A_PK A_Value B_Value B_PK
---- ---------- ---------- ----
NULL NULL  MICROSOFT  8
NULL NULL  APPLE   9
NULL NULL  SCOTCH  11
 5 ARIZONA NULL  NULL
 4 LINCOLN NULL  NULL
 10 LUCENT  NULL  NULL

(6 row(s) affected)

注意,在外部联接上,首先返回内部连接记录,然后返回右连接记录,最后返回左连接记录(至少,我的Microsoft SQL Server就是这样做的;当然,这不需要使用任何ORDERBY语句)。您可以访问维基百科文章以获得更多信息(但是,条目不是图形化的)。我还创建了一个备忘单,您可以在需要时打印出来。如果您右键单击下面的图像并选择“将目标保存为.”,您将下载完整大小的图像。

到此这篇关于mysql-joins具体用法说明的文章就介绍到这了,更多相关mysql-joins用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL实现差集(Minus)和交集(Intersect)测试报告

    可以用SQL实现同样的功能,就是麻烦了点. drop table t1; drop table t2; create table t1(id int primary key,nickname varchar(20),playNum varchar(20)); create table t2(id int primary key,nickname varchar(20),playNum varchar(20)); insert into t1 values(1,1,10); insert into

  • MySQL 查询结果取交集的实现方法

    1 MySQL中如何实现以下SQL查询 (SELECT S.Name FROM STUDENT S, TRANSCRIPT T WHERE S.StudId = T.StudId AND T.CrsCode = 'CS305') INTERSECT (SELECT S.Name FROM STUDENT S, TRANSCRIPT T WHERE S.StudId = T.StudId AND T.CrsCode = 'CS315') 请各位不吝赐教,小弟先谢过~ 解: 取交集 select a

  • sql server 交集,差集的用法详解

    概述 为什么使用集合运算: 在集合运算中比联接查询和EXISTS/NOT EXISTS更方便. 并集运算(UNION) 并集:两个集合的并集是一个包含集合A和B中所有元素的集合. 在T-SQL中.UNION集合运算可以将两个输入查询的结果组合成一个结果集.需要注意的是:如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现.T-SQL支持以下两种选项: (1)UNION ALL:不会删除重复行 -- union allselect country, region, city fr

  • SQL语句的并集UNION 交集JOIN(内连接,外连接)等介绍

    1. a. 并集UNION SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2 b. 交集JOIN SELECT * FROM table1 AS a JOIN table2 b ON a.name=b.name c. 差集NOT IN SELECT * FROM table1 WHERE name NOT IN(SELECT name FROM table2) d. 笛卡尔积 SELECT

  • SQLServer中求两个字符串的交集

    使用javascript的数组来计算,代码如下: 复制代码 代码如下: use tempdb go if (object_id ('fn_getArray' ) is not null ) drop function dbo . fn_getArray go create function fn_getArray (@ inStr1 varchar (8000 ), @ inStr2 varchar (8000 )) returns varchar (8000 ) as begin declar

  • php中mysql操作buffer用法详解

    本文实例讲述了php中mysql操作buffer用法.分享给大家供大家参考.具体分析如下: php与mysql的连接有三种方式,mysql,mysqli,pdo.不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别. 什么叫使用buffer和不使用buffer呢? 客户端与mysql服务端进行查询操作,查询操作的时候如果获取的数据量比较大,那个这个查询结果放在哪里呢? 有两个地方可以放:客户端的缓冲区和服务端的缓冲区. 我们这里说的buffer指的是客户端的缓冲区,如果查询结

  • MySQL子查询用法实例分析

    本文实例讲述了MySQL子查询用法.分享给大家供大家参考,具体如下: 假设表my_tbl包含三个字段a,b,c:现在需要查询表中列a的每个不同值下的列b为最小值的记录量. 比如表记录为: a  b  c 1  3  'cd' 2  3  'nhd' 1  5  'bg' 2  6  'cds' 1  7  'kiy' 3  7  'vsd' 3  8  'ndf' 希望得到结果为: a  b  c 1  3  'cd' 2  3  'nhd' 3  7  'vsd' (1) 其中一个做法:先查出

  • mysql group_concat()函数用法总结

    本文实例讲述了mysql group_concat()函数用法.分享给大家供大家参考,具体如下: group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来.要返回哪些列,由函数参数(就是字段名)决定.分组必须有个标准,就是根据group by指定的列进行分组. group_concat函数应该是在内部执行了group by语句,这

  • MySQL切分查询用法分析

    本文实例讲述了MySQL切分查询用法.分享给大家供大家参考,具体如下: 对于大查询有时需要'分而治之',将大查询切分为小查询: 每个查询功能完全一样,但只完成原来的一小部分,每次查询只返回一小部分结果集. 删除旧的数据就是一个很好地例子.定期清理旧数据时,如果一条sql涉及了大量的数据时,可能会一次性锁住多个表或行,耗费了大量的系统资源,却阻塞了其他很多小的但重要的查询.将一个大得DELETE语句切分为较小的查询时,可以尽量减少影响msql的性能,同时减少mysql复制造成的延迟. 例如,每个月

  • php封装的连接Mysql类及用法分析

    本文实例讲述了php封装的连接Mysql类及用法.分享给大家供大家参考,具体如下: class mysql{ private $db_name; private $db_host; private $db_user; private $db_pwd; private $conn; private $querysql; private $result; private $resultarray=array(); private $row; //创建构造函数 数据库名 主机名 用户名 密码 func

  • MySQL存储结构用法案例分析

    本文实例讲述了MySQL存储结构用法.分享给大家供大家参考,具体如下: 前言 今天公司老大让我做一个MySQL的调研工作,是关于MySQL的存储结构的使用.这里我会通过3个例子来介绍一下MySQL中存储结构的使用过程,以及一些需要注意的点. 笔者环境 系统:Windows 7 MySQL:MySQL 5.0.96 准备工作 1.新建两张数据表:student1, student2 新建student1 DROP TABLE IF EXISTS student1; CREATE TABLE stu

  • MySQL触发器简单用法示例

    本文实例讲述了MySQL触发器简单用法.分享给大家供大家参考,具体如下: mysql触发器和存储过程一样,是嵌入到mysql的一段程序,触发器是由事件来触发的,这些事件包括,INSERT,UPDATE,DELETE,不包括SELECT 创建触发器 CREATE TRIGGER name,time,event ON table_name FOR EACH ROW trigger_stmt 例如 复制代码 代码如下: CREATE TRIGGER ins_sum BEFORE INSERT ON a

  • node.js连接mysql与基本用法示例

    本文实例讲述了node.js连接mysql与基本用法.分享给大家供大家参考,具体如下: 下载mysql模块 使用命令npm install mysql下载mysql模块 mysql引入模块 var mysql = require("mysql"); 创建连接池 使用createPool()创建一个mysql连接池,传入一个表参数作为连接信息 var pool = mysql.createPool({ host:"127.0.0.1", port:3306, //默认

  • Mysql数据库高级用法之视图、事务、索引、自连接、用户管理实例分析

    本文实例讲述了Mysql数据库高级用法之视图.事务.索引.自连接.用户管理.分享给大家供大家参考,具体如下: 视图 视图是对若干张基本表的引用,一张虚表,只查询语句执行结果的字段类型和约束,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变),方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性. 1.----创建视图: create view 视图名称(一般以v_开头) as 查询语句; 2.----查看视图: select * from 视图名称; 3.----删除视图: dro

  • MySQL触发器基本用法详解【创建、查看、删除等】

    本文实例讲述了MySQL触发器基本用法.分享给大家供大家参考,具体如下: 一.MySQL触发器创建: 1.MySQL触发器的创建语法: CREATE [DEFINER = { 'user' | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body 2.MySQL创建语法中的关键词解释: 字段 含义 可能的值 DE

随机推荐