本文为本人学习书籍《MySQL必知必会》笔记系列,欢迎持续关注,有问题随时留言评论,一起探讨学习~
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都被起了别名。但表别名只能在查询执行中使用,不能返回到客户机中(列别名可以)。
问题描述:发现商品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;
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;
例:检索所有的商品名称和其对应品类名称,包括没有品类名称的商品。此时用外部联结。
下面是外部右联结
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;
例:不同品类的商品数量
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;