当在其他表进行子查询时,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来查询出表中的信息。