大家好,本人了解一些基本的SQL知识,对SQL查询也了解一点点,有点问题一直学不会(主要是针对SQL查询),请大家指点一下。己了解的基本知识如下:
SELECT、FROM、WHERE、GROUP BY、ORDER BY、LIMIT(部分聚合函数、非聚合函数。
联合查询、连接查询基本了解(union、union all、join、left join、right join等等)。
对SQL的执行顺序有一点了解。最困惑的问题如下:
对一些比较复杂的查询无从下手。在网上也浏览了一些,比如说化繁为简,复杂的SQL都是由简单的SQL堆叠而成,虽然听起来好像是这个道理,可自去想去写时又无从下手。请问我该如何去突破呢,有没有相关的贴子OR文档OR书籍,请大家发一下。谢谢。

解决方案 »

  1.   

    说的简单点可以这样理解:如果是单表查询,写起来没问题。
    如果是复杂点的数个表查询的SQL有时就无从写起。
    其实我也知道无非就是联合查询、连接查询、子查询,然后运用相关SQL聚合函数、非聚合函数、GROUP BY等。可对于复杂的业务逻辑我不太明白何时用GROUP BY,何时运用连接查询。
      

  2.   

    连接查询:由于你按数据间的关系,把数据按相关性的程度分成了多个表。所以在需要取得的数据分布在二个及以上的表中时,就需要将先挂的表连接成一个大表GROUP: 分组,当你需要考察同类数据的数理特征时,就需要分组(计数、求和、平均数...)
      

  3.   

    那些基本的很好理解,只是时间问题,许多复杂的只能在请教老鸟的过程中慢慢积累。比如:insert into image_tb (images,link) 
    select CONCAT(COALESCE((SELECT MAX(ID) + 1 FROM image_tb),1), '.jpeg'),'".$link."' 
    from image_tb这个已经搞明白了
    再比如SELECT * from
    (SELECT @rn:=if(@pv=source, @rn+1, 1) as rId,
    'a' t_name,id,title,@pv:=source,description,date,fullindex 
    FROM table1 a1
    JOIN (SELECT @pv:=0, @rId:=0)tmp
    WHERE MATCH (fullindex) AGAINST ('+bool' IN BOOLEAN MODE)
    ORDER BY source, date)a
    WHERE a.rId <=5;为什么会有 @ if,到现在还没搞懂。
      

  4.   

    看手册是最好的@:
    http://dev.mysql.com/doc/refman/5.0/en/user-variables.htmlif:
    http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html
      

  5.   

    一般使用数据管理来处理问题,查询太多的话,会造成服务器相应过慢的。
    比如
    管理员表 id,用户名,密码,组ID
    管理组表 id,组名,权限...我一般要建个索引表索引 管理员ID,管理组id
    这样的话 你在使用的过程中就会减少很多的查询量
    从时间复杂度上来说 可以减去一个次方