多表查询涉及到笛卡尔积,使用内外连接可以消除笛卡尔积,还有很多种方法,这里就不一一列举了,主要是内连接和外连接,帮助大家,也是对自己加深印象
内连接
内连接分为隐式和显示
隐式内连接
因为这种查询方式是将两张表所有的信息先查出来,再进行筛选,所以效率低下
隐式内连接语法:SELECT 列名 FROM 表A ,表B WHERE 表A与表B之间的关系;
设计两张张产品表,产品信息表product和产品库存表product_stock
SELECT * FROM product p,product_stock ps WHERE p.id = ps.product_id;
很好理解,查询 product p,product_stock两张表,过滤条件就是表product中的id等于product_stock中的product_id,如果有一张表中有这个id,而另一张表中没有这个id,则不会查询出来
结果和下面一张图效果一样
显示内连接
因为这种查询方式是直接查询两张表的交集,所以效率相对较高
使用:SELECT 列名 FROM 表A (INNER) JOIN 表B ON 表A与表B之间的关系;
再设计一张产品分类表product_category
查询所有商品的名称和分类名称
SELECT p.product_name,pc.category_name FROM product p
INNER JOIN
product_category pc ON p.category_id = pc.id;
product_name和category_name分别是两张表特有的字段,结果如下,共20条数据:
外连接
外连接分为左外连接和右外连接
左外连接
使用:
SELECT 列名 表A LEFT JOIN 表B ON 表A与表B之间的关系;
使用上面的产品表
SELECT * FROM product p
LEFT JOIN
product_stock ps ON p.id = ps.product_id;
左外连接,顾名思义,就是以LEFT JOIN左边的表为主,如果左边有一字段的值,而与他关联的表没有与之对应的值,那么会将左边表的所有信息全部查询出来,另一张表没有与之对应的值会用null代替
右外链接
右外连接和左外连接原理相同。这里展示代码和效果
SELECT * FROM product p
RIGHT JOIN
product_stock ps ON p.id = ps.product_id;
效果展示,共17条,因为从上图可以看出有3条是null,所以这里是以另一张表为主的:
另外,自连接查询和自连接查询我的理解就是内外连接的一个扩展,自连接查询就是将自己查出来的结果作为一张表,然后再与自己关联,子查询就是查询自己的结果作为一个过滤条件
以上就是我想记录的全部内容,如果有不对或改进的地方请指教…