sql 基础(7)自连接

集合 是SQL能处理的唯一数据结构!

自连接是不亚于 CASE 表达式的重要技术,请一定熟练掌握。最后说一个需要注意的地方,与多表之间进行的普通连接相比,自连接的性能开销更大(特别是与非等值连接结合使用的时候),因此用于自连接的列推荐使用主键或者在相关列上建立索引。

在日常的数据处理过程中自连接似乎用的很少,那是因为缺少对自连接认识,遇到问题,都采用数据库特有的函数或者标量(面向过程)来解决了!

下面是几个问题:

1.水果的组合问题


product表


查询语句


对应查询结果(由左至右)

2.水果价格的排名问题


productnew


查询语句


查询结果

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

你可能感兴趣的:(sql 基础(7)自连接)