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

连接可用于查询,更新,建立事实外键(指人为建立的两张表的对应关系,相对的,FORGIEN KEY也称物理外键)

表的连接实质就是外键的逆向约束

连接条件

使用ON设定连接条件,也可以用WHERE代替.

一般情况下

  • ON:设定连接条件
  • WHERE:进行结果集记录的过滤

没有条件的JOIN内连接实质就是笛卡尔积

[INNER] JOIN 内连接

在MySQL中,JOIN, CROSS JOIN 和 INNER JOIN 是等价的。

内连接表示交集,仅显示A、B两表符合连接条件的记录。不符合连接条件的记录不显示。

SELECT goods_id,goods_name,cate_name
FROM tdb_goods
INNER JOIN tdb_goods_cate
ON tdb_goods.cate_id = tdb_goods_cate.cate_id;

使用内连接进行多表更新操作:

--将tdb_goods表中用中文存储的goods_cate修改为tdb_goods_cates表中对应的cate_id,以节省空间
UPDATE tdb_goods
INNER JOIN tdb_goods_cates
ON goods_cate=cate_name
SET goods_cate=cate_id;
--tdb_goods 想要更改的表名
--tdb_goods_cates 关联的附表
--goods_cate=cate_name 两个表对应列的关系
--goods_cate=cate_id; 设置 值

外连接

内连接比外连接用的多一些.

若某字段只存在某一表,则另一表的里字段返回 NULL

LEFT [OUTER] JOIN 左外连接

显示左表的全部记录及右表符合连接条件的记录。

  • 如果使用LEFT JOIN,左表中存在一条记录A,在右表中没有找到相应的记录,则返回结果会出现一条只有记录A中的相应字段内容,其他字段都为NULL的记录(RIGHT JOIN类似).

RIGHT [OUTER] JOIN 右外连接

显示右表的全部记录及左表符合连接条件的记录。

多表连接

跟两张表的连接类似

如三张表的连接:

SELECT goods_id,goods_name,b.cate_name,c.brand_name,goods_price
FROM products AS a
INNER JOIN products_cate AS b
ON a.goods_cate = b.cate_id
INNER JOIN products_brand AS c
ON a.brand_name = c.brand_id;

自连接

设计无限分类数据表

在同一张表中既有父类,又有子类,本质上是一棵树:

可以通过对同一张数据表的自身连接来进行查询:

--查找显示父类id对应的名称
SELECT s.type_id,s.type_name,p.type_name AS parent_name
FROM tdb_goods_types AS s
LEFT JOIN tdb_goods_types AS p
ON s.parent_id=p.type_id;

--查找子类id对应的名称
SELECT p.type_id,p.type_name,s.type_name AS child_name
FROM tdb_goods_types AS p
LEFT JOIN tdb_goods_types AS s
ON p.type_id=s.parent_id;

--查找有多少子级
SELECT p.type_id,p.type_name,COUNT(s.type_name) AS child_count
FROM tdb_goods_types AS p
LEFT JOIN tdb_goods_types AS s
ON p.type_id=s.parent_id
GROUP BY p.type_name
ORDER BY p.type_id;

多表查询并删除

这里用自连接模拟两张表,删除该表中的重复项,保留goods_id 较小的记录.

DELETE t1
FROM tdb_goods AS t1
LEFT JOIN( --选出goods_name重复的记录
 SELECT goods_id,goods_name
 FROM tdb_goods
 GROUP BY goods_name --MySQL 5.7.5以上版本启用了only_full_group_by SQL模式,select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN)才行,这里没有启用
 HAVING COUNT(goods_name)>=2)
AS t2 --将t1与t2进行左连接,其实这里内连接和右连接也行
ON t1.goods_name=t2.goods_name --t1和t2的连接条件
WHERE t1.goods_id>t2.goods_id; --在LEFT JOIN结果集中,选出满足t1.goods_id>t2.goods_id的记录

为帮助理解,LEFT JOIN的结果为:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

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

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

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

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

  • 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 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多表连接的入门实例教程

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

  • MyBatis多表连接查询的实例教程

    多表连接的两种方式(数据库逻辑模型): 1.一对一关系 2.一对多关系 一.通过 resultMap 和 association 实现一对一关系 在 mapper.xml 文件里面的代码: <resultMap type="com.pojo.TRecruitment" id="tRecruitmentCollegeResultMap"> <id property="id" column="id" />

  • MyBatis入门实例教程之创建一个简单的程序

    准备: (1) IDEA 2021 (2)Java 1.8 (3)数据库 MySQL 5.7 (SQLyog 或 Navicat) 在 MySQL 中创建数据库 mybatisdemo,编码为 utf8 新建表: USE mybatisdemo CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, uname VARCHAR(20) NOT NULL, uage INT NOT NULL ); INSERT INTO users(uid,

  • MySQL多表查询的具体实例

    一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 - WHERE 表1.字段 = 表2.字段 AND 其它查询条件 SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id 注:在上面的的代码中,以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键

  • MySQL 清除表空间碎片的实例详解

    MySQL 清除表空间碎片的实例详解 碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行

  • Vue.js快速入门实例教程

    什么是vue vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 一.基本结构 index.html代码: <script src="../vue.js"></script> <div id="app"> {{ message }} </div> <script src="app.js"></script> <

  • SQL Server 2012 多表连接查询功能实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: -- 交叉连接产生笛卡尔值 (X*Y) SELECT * FROM Student cross Join dbo.ClassInfo --另外一种写法 SELECT * FROM Student , ClassInfo -- 内连接 (Inner 可以省略) SELECT * FROM Student JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID; -- Inner Jo

  • jquery validate.js表单验证入门实例(附源码)

    小编上网查阅了许多关于jquery.validate的文章,大部门只是介绍它的api和用法,没有一个详细的的入门案例介绍,研究了半天还是无从下手.为此,小编自己做了一个jquery validate.js表单验证入门实例,写的不是特别好,但应该适用于初学者,分享给大家. 以下是validate.js表单验证入门实例参考源码,文章下面有源码下载地址: <html> <head> <meta http-equiv="Content-Type" content=

  • 浅谈Mysql多表连接查询的执行细节

    先构建本篇博客的案列演示表: create table a(a1 int primary key, a2 int ,index(a2)); --双字段都有索引 create table c(c1 int primary key, c2 int ,index(c2), c3 int); --双字段都有索引 create table b(b1 int primary key, b2 int); --有主键索引 create table d(d1 int, d2 int); --没有索引 insert

  • ReactJS入门实例教程详解

    目录 一.ReactJS简介 二.对ReactJS的认识及ReactJS的优点 1.ReactJS的背景和原理 2.组件化 三.下载ReactJS,编写Hello,world 四.Jsx语法 五.ReactJS组件 1.组件属性 2.组件状态 3.组件的生命周期 4.组件的嵌套 六.ReactJS小结 七.参考资料 现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我

随机推荐