美文网首页
sql 基础(7)自连接

sql 基础(7)自连接

作者: 洛水青柳2017 | 来源:发表于2018-02-08 11:26 被阅读0次

    集合 是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)自连接

          本文链接:https://www.haomeiwen.com/subject/tooroxtx.html