用mysql关联4个表_MySQL多表操作

本文详细介绍了MySQL中多表查询的三种主要方式:联合查询、连接查询(包括交叉连接、内连接、自连接、左连接和右连接)以及子查询(包括标量子查询、列子查询、行子查询和表子查询)。同时,讨论了外键约束的添加、查看、关联操作以及删除,并给出了实际示例。
摘要由CSDN通过智能技术生成

(所需的两个表sh_goods与sh_goods_category 的创建在博客中已写过。注:命令窗口中所有符号为英文状态)

一、多表查询

1.联合查询

union是实现联合查询的关键字,all和distinct是联合查询的选项。其中,all表示保留所有的查询结果;distinct是默认值,可以省略,表示去除完全重复的记录。

在sh_goods表中,以联合查询的方式获取category_id为9的商品id、name和price,以及category_id为6的商品id、name和keyword。

select id,name,price from sh_goods where category_id=9 union select id,name,keyword from sh_goods where category_id=6;

(select查询的字段个数必须相同,且联合查询的结果中只保留第一个select语句对应的字段名称,即使union后select查询的字段与第一个select查询的字段表达含义或数据类型不同,MySQL也仅会根据查询字段出现的顺序,对结果进行合并。)

若要对联合查询的记录进行排序等操作,需要使用圆括号“()”包裹每一个select语句,在select语句内或在联合查询的最后添加order by语句。并且若要排序生效,必须在order by后添加limit限定联合查询排序的数量,通常推荐使用大于表记录数的任意值。

例如,以联合查询的方式,对sh_goods表中category_id为3的商品按价格升序排序,其他类型的产品按价格降序排序,查询的商品信息为id、name和price。

(select id,name,price from sh_goods where category_id<>3 order by price desc limit 7)

union (select id,name,price from sh_goods where category_id=3 order by price asc limit 3);

2.连接查询

交叉连接

交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积。例如,商品分类表中3个字段、4条记录,商品表中有5个字段、10条商品信息,那么交叉连接后的笛卡儿积就等于4*10条记录,每条记录中含有3+5个字段。

cross join用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。

使用sh_goods_category 表中的每一条记录与sh_goods表中的记录进行连接,最后查询出来的记录数为160(sh_goods_category表中的记录数16乘以sh_goods表中的记录10)。

select c.id cid, c.name cname, g.id gid, g.name gname from sh_goods_category as c cross join sh_goods as g;

内连接

on用于指定内连接的查询条件,在不设置on时,与交叉连接等价,此时可以使用where完成条件的限定,效果与on一样。但由于where是限定已全部查询出来的记录,那么在数据量很大的情况下,此操作会浪费很多性能,所以此处推荐使用on实现内连接的条件匹配。

下面以内连接的方式查询商品表sh_goods和商品分类表sh_goods_category表中对应商品的分类id及name。

select c.id cid, c.name cname, g.id gid, g.name gname from sh_goods g join sh_goods

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值