复杂查询主要包括视图、子查询和关联子查询
先介绍一下视图:
T语句(视图本身并不存储数据)。
CREATE VIEW 视图名称(<视图列名1><视图列名2><视图列名3>......) AS <SELECT语句>
例如:创建一个视图
CREATE VIEW productsum(product type,cnt product) AS SELECT product type,COUNT(*) FROM product GROUP BY product type;
介绍一下关联子查询:
关联子查询会在细分的组内进行比较时使用。
关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分。
关联子查询的结合条件如果未出现在子查询中就会发生错误。
例如:我们查询各种商品种类中高于该种类的平均销售单价的商品。
--发生错误的语句 SELECT product id,product name,sale price FROM product WHERE sale_price >(SELECT AVG(sale price)FRoM product GRouP BY product type);--这里会报错,因为不是唯一值
正确的方式应该是:
SELEcT product type,product name,sale price 登录后复制 FRoM product AS P1 WHERE sale price >(SELECT AVG(sale price)FRoM product As P2 WHERE P1.product type=P2.product type GROUP BY product type);
结果如下:
MySQL 关联子查询效率
一般情况下关联子查询的效率是比较低下的,实际上本例中的关联子查询例子也仅是为了演示关联子查询的原理及用法。如果可以的话,关联子查询尽量使用 JOIN 或其他查询来代替。如本例中,使用 INNER JOIN 来替换的 SQL 为:
SELECT artiC++le.* FROM article INNER JOIN user ON article.uid = user.uid
注意:此处只是为了演示用 INNER JOIN 替换关联子查询的样例,并非表名这种处理是最优处理