MySQL学习笔记:高级联结(重要)

本文为本人学习书籍《MySQL必知必会》笔记系列,欢迎持续关注,有问题随时留言评论,一起探讨学习~

16 高级联结

16.1 使用表别:可以缩短语句,单条SELECT多次使用相同表

SELECT p.Name AS p_name,
       c.Name AS c_name,
			 b.Name AS b_name,
       Price1,
			 Model
FROM product AS p,product_category AS c,brand AS b
WHERE p.CategoryId=c.Id
  AND p.BrandId=b.Id
	AND c.Id=615432733113008653
	AND b.Id=-9014347894162505346
ORDER BY p.Name;

品牌表brand、商品表product、品类表product_category都被起了别名。但表别名只能在查询执行中使用,不能返回到客户机中(列别名可以)。

16.2不同类型的联结

16.2.1自联结

问题描述:发现商品Id=-9223342254556101702的Id存在错误,查找该品牌的其他商品Id是否存在问题。分为两步:找到商品Id=-9223342254556101702对应的品牌Id,再由品牌Id确定该品牌的所有商品id。即用子查询解决。

SELECT BrandId
FROM product 
WHERE product.Id=-9223342254556101702;
SELECT  product.Id,product.Name
FROM product 
WHERE product.BrandId=4860751648763693994;
SELECT  product.Id,product.Name
FROM product 
WHERE product.BrandId=(SELECT BrandId
                       FROM product 
                       WHERE product.Id=-9223342254556101702);

现在用联结解决该问题:

SELECT p1.Id,p1.Name
FROM product AS p1,product AS p2
WHERE p1.BrandId=p2.BrandId #自联结
  AND p2.Id=-9223342254556101702;

16.2.2自然联结

SELECT c.*,
       p.Name AS p_name,
			 b.Name AS b_name,
       Price1,
			 Model
FROM product AS p,product_category AS c,brand AS b
WHERE p.CategoryId=c.Id
  AND p.BrandId=b.Id
	AND c.Id=615432733113008653
	AND b.Id=-9014347894162505346
LIMIT 0,5;

16.2.3外部联结LEFT/RIGHT OUTER JOIN…ON:包含了在关联表中没有关联行的行的联结是外部联结。

例:检索所有的商品名称和其对应品类名称,包括没有品类名称的商品。此时用外部联结。
下面是外部右联结

SELECT product.Name AS p_name,
       product_category.Name AS c_name
FROM product RIGHT OUTER JOIN product_category
ON product.CategoryId=product_category.Id
Limit 0,5;

类似内部联结,这条SELECT语句使用了关键字OUTER JOIN来指定联结的类型。但与内部联结不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表( RIGHT指出的是OUTER J0IN右边的表,而LEFT指出的是OUTER JOIN左边的表)。上面的例子使用RIGHT OUTER JOIN从FRON子句的右边表(product表)中选择所有行。如果想从左边的表中选择所有行,应该使用LEFT OUTER JOIN, 如下例所示:
下面是外部左联结

SELECT product.Name AS p_name,
       product_category.Name AS c_name
FROM product LEFT OUTER JOIN product_category
ON product.CategoryId=product_category.Id
Limit 0,5;

到底用左联结还是右联结,哪种方便用哪种。
下面是内部联结:包含有关联行

SELECT product.Name AS p_name,
       product_category.Name AS c_name
FROM product INNER JOIN product_category
ON product.CategoryId=product_category.Id
Limit 0,5;

16.3带聚集函数的联结

例:不同品类的商品数量

SELECT product.Name AS p_name,
       product_category.Name AS c_name,
			 COUNT(product.Id) AS num_product
FROM product INNER JOIN product_category
ON product.CategoryId=product_category.Id
GROUP BY c_name;
发布了51 篇原创文章 · 获赞 34 · 访问量 884

猜你喜欢

转载自blog.csdn.net/weixin_43412569/article/details/104860542