MySQL学习16:多表连接

一连接概述

(1)连接

MySQL数据库在SELECT语句,多表更新以及多表删除中都支持JOIN操作。多表连接的语法结构为:

table_reference {[INNER | CROSS] JOIN} | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON

condtional_expr;

(2)数据表参照

table_reference table_name [[AS] alias] | table_subquery [AS] alias

数据表可以使用table_name AS alias_name或table_name alias_name赋予别名。table_subquery可以作为子查

询使用在FROM子句中,这样的子查询必须为其赋予其别名。

我们在两张数据表中的可能会有相同名称的字段,为了区分各个表中的字段我们给其数据表名称起了别名,用别

名加以区分。

(3)连接类型

INNER JOIN,内连接;在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等价的。

LEFT [OUTER] JOIN,左外连接。

RIGHT [OUTER] JOIN,右外连接。

(4)连接条件

使用ON关键字来设定连接条件,也可以使用WHERE来代替。

通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。

二连接方式

(1)内连接(INNER JOIN)

显示左表及右表符合连接条件的记录:

实例:

使用内连接将数据表tdb_goods和数据表tdb_goods_cates两个表连接起来进行联合查询

SELECT goods_id,goods_name,cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON

tdb_goods.cate_id = tdb_goods_cates.cate_id;

我们看到查询的结果只是查找到22条记录,我们新添加的第23条记录并没有被查询到,因为不符合查询的连接的

条件。

(2)左外连接(LEFT [OUTER] JOIN)

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

实例:

显示tdb_goods数据表中全部的记录以及tdb_goods_cates数据表中符合条件的记录

SELECT goods_id,goods_name,cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON

tdb_goods.cate_id = tdb_goods_cates.cate_id;

(3)右外连接(RIGHT [OUTER] JOIN)

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

实例:

显示tdb_goods_cates数据表中的所有记录以及tdb_goods数据表中符合条件的记录

SELECT goods_id,goods_name,cate_name FROM tdb_goods RIGHT JOIN tdb_goods_cates ON

tdb_goods.cate_id = tdb_goods_cates.cate_id\G;

三多表连接

(1)多表连接示例

我们在这里使用三张数据表的内连接作为说明:

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g INNER JOIN

tdb_goods_cates AS c ON g.cate_id = c.cate_id INNER JOIN tdb_goods_brands AS b ON

g.brand_id =b.brand_id\G;

我们得条到了最初的添加的22记录。

(2)关于连接的几点说明

外连接:A LEFT JOIN B join_condition

1)数据表B的结果集依赖数据表A

2)数据报A的结果集根据左连接条件依赖所有数据表(B表除外)

3)左外连接条件决定如何检索数据表B(在没有指定WHERE条件的情况下)

4)如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为

空的额外的B行。

也就是下面显示的结果:

SELECT goods_id,goods_name,cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON

tdb_goods.cate_id = tdb_goods_cates.cate_id;

这个结果我们在上面的例子中已经知道。

如果使用内连接查找的记录在连接数据表中不存在,并且在WHERE子句中尝试以下操作:col_name IS NULL

时,如果col_name被定义为NOT NULL,MySQL将在找到符合连接条件的记录后停止搜索更多的行。

四无限级分类表设计

(1)设计步骤:

1)首先创建数据表

CREATE TABLE tdb_goods_types(

type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

type_name VARCHAR(20) NOT NULL,

parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0

);

2)插入记录

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘家用电器‘,DEFAULT);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑办公‘,DEFAULT);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘大家电‘,1);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘生活电器‘,1);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘平板电视‘,3);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘空调‘,3);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电风扇‘,4);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘饮水机‘,4);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑整机‘,2);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘电脑配件‘,2);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘笔记本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘超级本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘游戏本‘,9);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘CPU‘,10);

INSERT tdb_goods_types(type_name,parent_id) VALUES(‘主机‘,10);

3)查看数据表中的记录

SELECT * FROM tdb_goods_types;

上面的显示结果的最后一列表示的意思是:0代表顶级分类,没有父亲节点;1到10代表子类。

(2)自身连接

自身连接指的是同一个数据表对其自身进行连接。

实例:

1)查看所有分类及其父类

SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p

ON s.parent_id = p.type_id;

2)查找所有分类及其子类

SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS

s ON s.parent_id = p.type_id;

3)查找所有分类及其子类的数目

SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT

JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;

五多表删除

多表删除的语法结构为:

DELETE tabke_name[.*] [,table_name[.*]] ... FROM table_references [WHERE where_condition];

SELECT * FROM tdb_goods\G;

我们查找到有重复的记录。那么下面所做的事情就是将重复的记录删除,保留id值较小的记录。

(1)查找重复记录

SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >=

2;

(2)删除重复记录

DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP

BY goods_name HAVING count(goods_name) >= 2 ) AS t2  ON t1.goods_name = t2.goods_name  WHERE

t1.goods_id > t2.goods_id;

(3)再次查看数据表中的所有记录是否存在重复记录

SELECT * FROM tdb_goods\G;

SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >=

2;

从上面的结果可以看出数据表中已经没有重复的记录,说明我们成功删除了重复的记录,并且保留了goods_id值

较小的记录。

时间: 2024-11-02 07:10:18

MySQL学习16:多表连接的相关文章

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于

MySQL学习笔记-操作数据表中的记录

MySQL学习笔记-操作数据表中的记录 1.插入记录 INSERT INSERT [INTO] tbl_name [(col_name,...)] {VAULES|VALUE} ({expr|DEFAULT},...),(...),... 例,插入单条记录: mysql> USE testDatabase changed mysql> CREATE TABLE users(    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,   

mysql笔记5_多表连接

多表连接: 交叉连接(笛卡尔积)cross join(基本上无实际意义,避免). 内连接,即等值连接 inner join...on... 左外连接 left join...on...主表的记录全部显示,如果没有记录则补空.连接左边的表作为主表. 右外连接 right join...on...同左外连接. 全外连接 自连接 主表.从表是同一张表. 子查询:为主查询提供查询数据. mysql笔记5_多表连接

MySql数据库再学习——简述多表连接查询的自我理解

一:序 这几天在学习数据库部分,因为在学校听课也是比较迷糊,经过学习之后感觉现在思路比较清楚,对于多表连接查询操作有了一个新的认识. 二:假设 假设现在有两个表 :A ,B. 三:两表之间的连接方式 两个表的连接方式分为,内,外,交叉三种. 内连接的查询方式又分为隐式和显式两种. 外连接的查询方式又分为左,右两种. 交叉是将两个表的记录做乘积,因为得到的记录很大程度上没有直接联系,所以交叉连接查询基本没什么意义. 四:内连接 内连接的关键词:inner join...(inner可以省略) 隐式

Hadoop 学习之单表连接

我在学习hadoop, 在看 陆嘉恒编著的hadoop实战,其中有单表连接的程序,我现在整理一下思路.这个问题是课本上的例子. 给出 child-parent 表, 要求输出 grandchild-grandparent 表 样例输入: child parent Tom Lucy Tom Jack Jone Lucy Jone Jack Lucy Mary Lucy Ben Jack Alice Jack Jesee Terry Alice Terry Jesee Philip Terry Ph

MySQL学习10 - 多表查询

一.多表连接查询 1.交叉连接 2.内连接 3.外连接之左连接 4.外连接之右连接 5.全外连接 二.符合条件连接查询 三.子查询 1.带in关键字的子查询 2.带比较运算符的子查询 3.带EXISTS关键字的子查询 本节重点: 多表连接查询 符合条件连接查询 子查询 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, name varchar(20) ); create table employee

MySql left join 多表连接查询优化语句

先过滤条件然后再根据表连接 同时在表中建立相关查询字段的索引这样在大数据多表联合查询的情况下速度相当快 SELECT M.*,SS.SensorCode,SS.SensorStatus,SS.ManufacturerId,SS.Electricity, SS.Voltage,SS.MinElectricity,SS.MinVoltage,SS.Temperature,SS.StatusUpdteDate,SS.UpdateStatus ,tp.PricingStrategyid,tps.Free

SQLServer学习(多表连接查询)(四)

(1)双表内部连接查询 ①在where中指定内部连接的条件(这种写法使用的很少) SELECT WorkNo,Name,DeptName,SignImg FROM S_A_User,S_A_UserImg WHERE S_A_User.ID=S_A_UserImg.UserID ORDER BY DeptName,Name ②在from中指定内部连接的条件(推荐使用) SELECT WorkNo,Name,DeptName,SignImg FROM S_A_User INNER JOIN S_A

MySQL学习9 - 单表查询

一.单表查询的语法 二.关键字的执行优先级(重点) 三.单表查询示例 1.where约束 2.group by分组查询 3.聚合函数 4.HAVING过滤 5.order by查询排序 6.limit 限制查询的记录数 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二.关键字的执行优先级(重点) 重点中的重点:关键字的执行优先级 from where