要求:打印报价单,打印出所有商品的名称、库存和价格
一张表就是一个集合,每一行就是一个元素。
在数据库的操作上,如何操作表,达到集合的笛卡尔积的效果?
直接用“,”隔开,表明查询即可。
select goods_id,cat_id,goods_name,cat_id,cat_name from goods,category;
ambiguous adj.模糊的
原因:cat_id在两张表中都有,到底指哪张表的cat_id字段呢?
如果在多表联查时,某一列名,在2张或2张以上表都有,则需要在列名前指定表名,即:表名.列名
select goods_id,goods.cat_id,goods_name,category.cat_id,cat_name
from goods,category;
但是得出的这所有行,并不是都需要,都有意义,我们还需要对其进行筛选:
select goods_id,goods.cat_id,goods_name,category.cat_id,cat_name
from goods,category where goods.cat_id = category.cat_id;
但是,这种两张表全相乘的方法,在内存中会生成一个非常大的数据,对服务器会造成负担,需要继续改进。另外:没有利用索引。
左连接:
假设A表在左,不动,B表在A表的右边滑动,A表与B表通过一个关系来筛选B表的行。
语法:
A left join B on 条件 条件为真,则B表对应的行,取出
↑这一块,形成的也是一个结果集,可以看成一张表,设为C,甚至还可以继续 join。。。
既然这样,那么可以对C表作查询。
问:C表可以查询的列有哪些列?
答:A、B的列都可以查
因此这个题:另外的做法——用左连接来查询:
goods left join category on goods.cat_id = category.cat_id 当作C表看。
select goods_id,goods_name,goods_number,shop_price,cat_name from C;
select goods_id,goods_name,goods_number,shop_price,cat_name from
goods left join category on goods.cat_id = category.cat_id;
查询出的结果相同,且效率高很多。
左连接之后,还能用where等子句吗?——可以啊!
select goods_id,goods_name,goods_number,shop_price,cat_name from
goods left join category on goods.cat_id = category.cat_id
where goods.cat_id = 4;
# 这里还是要有明确指明cat_id 是哪张表里的