MYSQL学习笔记(八)之子查询的优化-使用连接

当在其他表进行子查询时,MYSQL会将结果保存在一张临时表中,查询结束后会释放创建的临时表,这就将使查询的速度变慢。在多表查询时一般不使用子查询,而使用连接。

连接分为内连接,外连接,外连接又分为左外连接右外连接

实例:


观察表tdb_goods会发现,字段goods_cate和brand_name中有很多重复的记录。

可以对goods_cate,brand_name进行分类。

语句:SELECT  `goods_cate` FROM `tdb_goods` GROUP BY `goods_cate`;


语句:SELECT  `brand_name` FROM `tdb_goods` GROUP BY `brand_name`;


我们发现在仅仅上面的23条记录中就有很多重复的条目,如果记录的条数为1000条,10000条,1000000条甚至更多呢?那将会多少是重复的?并且存储一个汉字要占两字节,那有没有更好的办法来记录这些数据呢?答案是有的。

可以把goods_cate和brand_name设置为“逻辑外键“,通过外键关联其他的表来达到存储的目的。

具体操作如下:

创建一张tdb_goods_cates表,把上面分类的结果插入到表中。


使用INSERT ...SELECT....语句把记录插入的表中

INSERT `tdb_goods_cates`(`cate_name`) SELECT `goods_cate` FROM `tdb_goods` GROUP BY  `goods_cate`;


现在台式机对应有个编号为1,其他的类别都有一个对应的编号。

接下来我们通过CREATE...SELECT实现查找和插入数据一步到位。


查询表中的记录如下:


表中各种类别也都对应有一个编号。

同样的我们把表tdb_goods中字段goods_cate和brand_name中的相应类别也更新为对应的编号,并把字段名也相应的更新为cate_id,和brand_id.

使用内连接(INNER JOIN)来更新。

UPDATE tdb_goods INNER JOIN `tdb_goods_cates` ON goods_cate=cate_name SET cate_name=cate_id;

UPDATE tdb_goods AS a INNER JOIN `tdb_goods_brands` AS b ON a.brand_name=b.brand_name SET a.brand_name=b.brand_id.

注意更新brand_name时一定要为两张表起别名。因为两张表中有重复字段,会有二义性。

修改字段名称ALTER TABLE  tdb_goods

                    CHANGE `goods_cate` `cate_id` SMALLINT UNSIGNED NOT NULL,

                    CHANGE `brand_name` `brand_id` SMALLINT UNSIGNED NOT NULL;

同样的当我们要显示产品的信息时,也要同多表连接才能得到具体的值,而不是对应的编号。

使用内连接INNER JOIN来查询出表中的信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值