集合 是SQL能处理的唯一数据结构!
自连接是不亚于 CASE 表达式的重要技术,请一定熟练掌握。最后说一个需要注意的地方,与多表之间进行的普通连接相比,自连接的性能开销更大(特别是与非等值连接结合使用的时候),因此用于自连接的列推荐使用主键或者在相关列上建立索引。
在日常的数据处理过程中自连接似乎用的很少,那是因为缺少对自连接认识,遇到问题,都采用数据库特有的函数或者标量(面向过程)来解决了!
下面是几个问题:
1.水果的组合问题
2.水果价格的排名问题
3分地区后的水果价格排序
--备用代码
-- 1_2自连接示例
SELECT a.`name` ,b.`name` FROM 1_2product as a ,1_2product as b -- 查询所有组合
SELECT a.`name` ,b.`name` FROM 1_2product as a ,1_2product as b WHERE a.`name` =b.`name` -- 查询所有重复组合
SELECT a.`name` ,b.`name` FROM 1_2product as a ,1_2product as b WHERE a.`name` <>b.`name`-- 查询所有不重复组合
SELECT a.`name` ,b.`name` FROM 1_2product as a ,1_2product as b WHERE a.`name` >b.`name` -- 查询所有不重复列
SELECT a.`name` ,b.`name` FROM 1_2product as a ,1_2product as b WHERE a.`name` >=b.`name` -- 查询可重复集合
SELECT a.`name` ,b.`name` ,c.`name` FROM 1_2product as a ,1_2product as b ,1_2product as c
WHERE a.`name` >b.`name` and b.`name` > c.`name` -- 三个产品组合的集合组合
-- 删除重复的行 (mysql中没有相应的函数 )
--1查询价格相同的水果
SELECT DISTINCT a.`name`,a.price FROM 1_2productnew as a ,1_2productnew as b
WHERE a.`name`<>b.`name` and a.price =b.price ORDER BY price
--2根据价格大小对 水果进行排序 ,分跳过和不跳过
--2_1运用子查询
SELECT P1.name,P1.price,
(SELECT COUNT(P2.price) FROM 1_2productnew P2 WHERE P2.price > P1.price) + 1 AS rank_1,
(SELECT COUNT( DISTINCT P2.price) FROM 1_2productnew P2 WHERE P2.price > P1.price) +1 as rank_2
FROM 1_2productnew P1
ORDER BY rank_1;
--2_2运用自连接
SELECT P1.name,P1.price ,COUNT(P2.price)+1 as rank_1,COUNT(DISTINCT P2.price)+1 as rank_2
FROM 1_2productnew P1 LEFT join 1_2productnew P2 on P1.price