您的位置:首页 > 数据库

常用sql技巧总结_持续更新

2015-02-07 12:04 585 查看
更新中。。。。。

=================

基本:

-----------------------------

限制数量:

TOP 或者TOP 50 PERCENT的方法,前者是数量,后者是百分比

SELECT TOP 300 * FROM talbleA;

Mysql不同,不支持TOP,不过Mysql可以用LIMIT

SELECT * FROM tableA LIMIT 300;

用途:

限制数量,减少开销吧,自己用着手动查东西也可以少查点,免得乱或者慢。

--------------------------------------

获取时间:

直接获取当前时间的sql函数——now()——不过类型是datetime

想或许linux的时间,一种方法是传入给数据库就用linux的1970到现在的描述,int型,到时候直接取出

第二种方法就是不传入,继续用now()获取时间(当然只限于用当前时间的情况),用datetime存储时间,不过读取的时候用unix_timestamp()转换一下就完了。

用途:

对于需求秒数的,前端就不用再费力转换了。

--------------------------------------

查重:

看表中是否有重复数据:比如用户表

select * from user group by user_id having count(*) > 1;

select new_id,user,count(*) from leiren.circle group by new_id having count(*)>1;

衍生出看表中是否有符合条件的数据:大于1是重复数据,大于0就是有数据咯,不过有数据就不用这个条件了,直接搜。

用途:

比如mysql-front某些版本不好用或者网络不好,某些需要唯一的数据,初始化时候插了两边,全都重了,查重比较方便确认数据表是否有问题。

--------------------------------------

嵌套:

select a,b(select b from table1)c from table2;

嵌套内部只能搜出一个结果,等于把结果当成一个数值

例子:

select sex,(select user_id from user where user_id = 15911086638)c from user where user_id = 15911086638;

----------------------------------------------------

跨表:

-------------------------------------------

难的是如何

跨表又嵌套,还查多条数据

(因为嵌套里边的条件和外边的难协调),目前没办到,只能从其他方向简化操作。

稍微麻烦的个例:

SELECT user_feeling.user_id,user_feeling.picture_url,user_feeling.update_time,friend_list.feeling_praise_type,user_feeling.praise_1,user_feeling.praise_2,user_feeling.praise_3

FROM user_feeling LEFT JOIN friend_list

ON friend_list.friend_id = user_feeling.user_id #联结,关键不是一对一关系,在friend_list中friend_id不是唯一,是每个好友用user_id向你friend_id辐射一个关系

WHERE friend_list.user_id = 15911086638 AND state = 0;

------------------------------------------------

条件控制:IF ELSE

需要针对多种条件做不同操作时,还是很有用的

尤其注意多分支时用的不是ELSE IF,是ELSEIF,没空格!!!

而且END IF不是ENDIF,是有空格的~!!!!

案例:奖励ordinary数量,正常奖励iMines(10),奖励又不能超100,但是人家已有的你不能剥夺,比如500,所以最后要判断一下。知道这个写的不是最简化,没用变量做判断,奖励数额变了还得更改,但是奇葩需求太多变更太快,还是快速实现为主:

BEGIN
      SELECT ordinary from lib_mines where user_id = _lluser  INTO iTotalMines; #查出来当前数量
      IF (iTotalMines < 100 AND iTotalMines >90) THEN
      BEGIN
           SET iTotalMines = 100;
      END;
      ELSEIF iTotalMines < 91 THEN
      BEGIN
           SET iTotalMines = iTotalMines + iMines;
      END;
      ELSE
      BEGIN
          SET iTotalMines = iTotalMines;
      END;
      END IF;   
    
      # 更新雷库
      UPDATE lib_mines SET ordinary = iTotalMines WHERE user_id = _lluser;#    
      CALL p_add_mines_record(_lluser, 1, iMines);#加记录,可有可无,以前的功能
      
      RETURN iTotalMines;
    END;


好吧我还是改改吧:

DECLARE iMaxRewardTo int DEFAULT 100;#最大奖励到100
#。。。。。。。
#一些前提判断
SET iMines = 10;
BEGIN
      SELECT ordinary from lib_mines where user_id = _lluser  INTO iTotalMines; #查出来当前数量
      IF (iTotalMines < iMaxRewardTo AND iTotalMines > iMaxRewardTo - iMines) THEN
      BEGIN
           SET iTotalMines = iMaxRewardTo;
      END;
      ELSEIF iTotalMines < iMaxRewardTo - iMines + 1 THEN
      BEGIN
           SET iTotalMines = iTotalMines + iMines;
      END;
      ELSEIF iTotalMines > iMaxRewardTo THEN
      BEGIN
          SET iTotalMines = iTotalMines;
      END;
      END IF;   
    
      # 更新雷库
      UPDATE lib_mines SET ordinary = iTotalMines WHERE user_id = _lluser;#    
      CALL p_add_mines_record(_lluser, 1, iMines);#加记录,可有可无,以前的功能
      
      RETURN iTotalMines;
    END;


-----------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: