MySQL中表的几种连接方式

MySQL表中的连接方式其实非常简单,这里就简单的罗列出他们的特点。

表的连接(JOIN)可以分为内连接(JOIN/INNER JOIN)和外连接(LEFT JOIN/RIGHT JOIN)。

首先我们看一下我们本次演示的两个表:

mysql> SELECT * FROM student;
+------+----------+------+------+
| s_id | s_name  | age | c_id |
+------+----------+------+------+
|  1 | xiaoming |  13 |  1 |
|  2 | xiaohong |  41 |  4 |
|  3 | xiaoxia |  22 |  3 |
|  4 | xiaogang |  32 |  1 |
|  5 | xiaoli  |  41 |  2 |
|  6 | wangwu  |  13 |  2 |
|  7 | lisi   |  22 |  3 |
|  8 | zhangsan |  11 |  9 |
+------+----------+------+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM class;
+------+---------+-------+
| c_id | c_name | count |
+------+---------+-------+
|  1 | MATH  |  65 |
|  2 | CHINESE |  70 |
|  3 | ENGLISH |  50 |
|  4 | HISTORY |  30 |
|  5 | BIOLOGY |  40 |
+------+---------+-------+
5 rows in set (0.00 sec)

首先,表要能连接的前提就是两个表中有相同的可以比较的列。

1.内连接

mysql> SELECT * FROM student INNER JOIN class ON student.c_id = class.c_id;
+------+----------+------+------+------+---------+-------+
| s_id | s_name  | age | c_id | c_id | c_name | count |
+------+----------+------+------+------+---------+-------+
|  1 | xiaoming |  13 |  1 |  1 | MATH  |  65 |
|  2 | xiaohong |  41 |  4 |  4 | HISTORY |  30 |
|  3 | xiaoxia |  22 |  3 |  3 | ENGLISH |  50 |
|  4 | xiaogang |  32 |  1 |  1 | MATH  |  65 |
|  5 | xiaoli  |  41 |  2 |  2 | CHINESE |  70 |
|  6 | wangwu  |  13 |  2 |  2 | CHINESE |  70 |
|  7 | lisi   |  22 |  3 |  3 | ENGLISH |  50 |
+------+----------+------+------+------+---------+-------+
7 rows in set (0.00 sec)

简单的讲,内连接就是把两个表中符合条件的行的所有数据一起展示出来,即如果不符合条件,即在表A中找得到但是在B中没有(或者相反)的数据不予以显示。

2.外连接

mysql> SELECT * FROM student LEFT JOIN class ON student.c_id = class.c_id;
+------+----------+------+------+------+---------+-------+
| s_id | s_name  | age | c_id | c_id | c_name | count |
+------+----------+------+------+------+---------+-------+
|  1 | xiaoming |  13 |  1 |  1 | MATH  |  65 |
|  2 | xiaohong |  41 |  4 |  4 | HISTORY |  30 |
|  3 | xiaoxia |  22 |  3 |  3 | ENGLISH |  50 |
|  4 | xiaogang |  32 |  1 |  1 | MATH  |  65 |
|  5 | xiaoli  |  41 |  2 |  2 | CHINESE |  70 |
|  6 | wangwu  |  13 |  2 |  2 | CHINESE |  70 |
|  7 | lisi   |  22 |  3 |  3 | ENGLISH |  50 |
|  8 | zhangsan |  11 |  9 | NULL | NULL  | NULL |
+------+----------+------+------+------+---------+-------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM student RIGHT JOIN class ON student.c_id = class.c_id;
+------+----------+------+------+------+---------+-------+
| s_id | s_name  | age | c_id | c_id | c_name | count |
+------+----------+------+------+------+---------+-------+
|  1 | xiaoming |  13 |  1 |  1 | MATH  |  65 |
|  4 | xiaogang |  32 |  1 |  1 | MATH  |  65 |
|  5 | xiaoli  |  41 |  2 |  2 | CHINESE |  70 |
|  6 | wangwu  |  13 |  2 |  2 | CHINESE |  70 |
|  3 | xiaoxia |  22 |  3 |  3 | ENGLISH |  50 |
|  7 | lisi   |  22 |  3 |  3 | ENGLISH |  50 |
|  2 | xiaohong |  41 |  4 |  4 | HISTORY |  30 |
| NULL | NULL   | NULL | NULL |  5 | BIOLOGY |  40 |
+------+----------+------+------+------+---------+-------+
8 rows in set (0.00 sec)

上面分别展示了外连接的两种情况:左连接和右连接。这两种几乎是一样的,唯一的区别就是左连接的主表是左边的表,右连接的主表是右边的表。而外连接与内连接不同的地方就是它会将主表的所有行都予以显示,而在主表中有,其他表中没有的数据用NULL代替。

总结

到此这篇关于MySQL中表的几种连接方式的文章就介绍到这了,更多相关MySQL表的连接方式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中对表连接查询的简单优化教程

    在MySQL中,A LEFT JOIN B join_condition执行过程如下: · 根据表A和A依赖的所有表设置表B. · 根据LEFT JOIN条件中使用的所有表(除了B)设置表A. · LEFT JOIN条件用于确定如何从表B搜索行.(换句话说,不使用WHERE子句中的任何条件). · 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外.如果出现循环依赖关系,MySQL提示出现一个错误. · 进行所有标准WHERE优化. · 如果A中有一行匹配WHERE子句,但B中没

  • MySQL中基本的多表连接查询教程

    一.多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS JOIN tabl

  • 图文详解MySQL中两表关联的连接表如何创建索引

    本文介绍了MySQL中两表关联的连接表是如何创建索引的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 问题介绍 创建数据库的索引,可以选择单列索引,也可以选择创建组合索引. 遇到如下这种情况,用户表(user)与部门表(dept)通过部门用户关联表(deptuser)连接起来,如下图所示: 表间关系 问题就是,在这个关联表中该如何建立索引呢? 针对该表,有如下四种选择: 针对于user_uuid建立单列索引idx_user 针对于user_dept建立单列索引idx_dept 建立组合

  • MySQL多表连接的入门实例教程

    连接可用于查询,更新,建立事实外键(指人为建立的两张表的对应关系,相对的,FORGIEN KEY也称物理外键) 表的连接实质就是外键的逆向约束 连接条件 使用ON设定连接条件,也可以用WHERE代替. 一般情况下 ON:设定连接条件 WHERE:进行结果集记录的过滤 没有条件的JOIN内连接实质就是笛卡尔积 [INNER] JOIN 内连接 在MySQL中,JOIN, CROSS JOIN 和 INNER JOIN 是等价的. 内连接表示交集,仅显示A.B两表符合连接条件的记录.不符合连接条件的

  • mysql三张表连接建立视图

    三张表连接·· A表的a字段 对应 B表的b字段 ,B表的b1字段对应C 表的c字段 现在 建立 一个视图,可以同时 看到三张表的 所有信息·~ create or replace view v_name as select t1.*,t2.*,t3.* from A表 t1, B表 t2, C表 t3 where t1.a=t2.b and t2.b1=t3.c 两表链接创建视图 CREATE TABLE `aa_user` ( `id` int(10) NOT NULL, `name` va

  • MySQL的LEFT JOIN表连接的进阶学习教程

    LEFT JOIN的主表 这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询.比如说在LEFT JOIN查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts: CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(15) NOT NULL

  • mysql delete 多表连接删除功能

    单个表的删除: DELETE FROM tableName WHERE columnName = value; 删除表内的所有行: 即:保留表的结构.属性.索引 DELETE FROM tablename; DELETE * FROM tablename; 删除同一张表内的所有内容(删除数据.表结构) TRUNCATE customer; 无法报告删除了几行,且只能用于单一表 多表连接删除: DELETE orders,itrms FROM orders,items WHERE orders.u

  • 详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询

    多表查询 使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上; 1交叉连接 第一个表格的所有行 乘以 第二个表格中的所有行,也就是笛卡尔积 创建一个消费者与顾客的表格: 代码如下: -- create table customers( -- id int primary key auto_increment, -- name VARCHAR(20)not null, -- address VARCHAR(20)not NULL -- ); -- C

  • MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    LEFT JOIN 语法用法与实例 MySQL LEFT JOIN 语法 SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配记录.LEFT JOIN 基本语法如下: ... FROM table1 LEFT JOIN table2 ON condition ... MySQL LEFT JOIN 用法实例 下面是两个原始数据表: article 文章表: user 用户表: 我们列出所有的文章及对应的所属用户,即使没有用户的文章也列

  • mysql多表连接查询实例讲解

    实际的项目,存在多张表的关联关系.不可能在一张表里面就能检索出所有数据.如果没有表连接的话,那么我们就需要非常多的操作.比如需要从A表找出限制性的条件来从B表中检索数据.不但需要分多表来操作,而且效率也不高.比如书中的例子: 代码如下: SELECT FId FROM T_Customer WHERE FName='MIKE' 这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就可以到T_Order中检索FCustomerId等于2 的记录: 代码如下: SELECT FNu

随机推荐