sql 我没用过的写法~

查询总数
SELECT SUM (app_id = 101),COUNT(*) FROM account;
COUNT(*) 表示总数,SUM(app_id =101) 表示 where app_id=101 的总数

Innodb修改主键自增值,可以直接用AUTO_INCREMENT =1 不会对数据有影响。
ALTER TABLE account AUTO_INCREMENT=1;

innodb_autoinc_lock_mode 设置的值 0 1(默认) 2
0 会有表所, 1会预留主键值, 2不关注主键值,来一个插一个,可能会产生与主库主键不相同的情况。

SELECT
    c.*,
    DATE_FORMAT(c.date_payment, '%k') AS hours,
    SUM(c.amount) AS cnt 
FROM
    charge AS c
INNER JOIN device_act AS da ON (
    da.dev_str = c.dev_str
    AND da.act_date BETWEEN '2016-09-21 00:00:00'
    AND '2017-09-21 23:59:59'
)
WHERE
    c.date_payment BETWEEN '2016-09-21 00:00:00'
AND '2017-09-21 23:59:59'
AND c.app_id IN (101, 103, 104, 111)

SUM //会将多条记录合并成一条,而不是在每一条后面添加一个cnt属性

SELECT * FROM profiles INNER JOIN (
    SELECT <primary_key> FROM profiles
    WHERE x.sex='M' ORDER BY rating LIMIT 1000,10
)AS x Using(primary_key)

using 表示两个关联表中都有相同的字段。

此种方式查询使用了,延时关联,使用到了索引覆盖,可以提高 ORDER BY的查询速度。

 SELECT post.*
FROM post
STRAIGHT_JOIN post_tag ON post.id = post_tag.post_id
WHERE post.status = 1 AND post_tag.tag_id = 123
ORDER BY post.created DESC
LIMIT 100
STRAIGHT_JOIN    在关联表时,强制使用后面的这个表做为驱动
在where条件中有很多条件是这个表中的数据时有很有效的效果。(PS,在mysql执行计划选择其他表作为主驱动时)一般也不怎么用

mysql 存储过程

DROP PROCEDURE IF EXISTS test_insert1;
DELIMITER ;; 
CREATE PROCEDURE test_insert1() 
BEGIN 
DECLARE y INT DEFAULT 1;
WHILE y<10000
DO
insert into Ben(bb,cc) values(y,substring(MD5(y),20)); 
SET y=y+1; 
END WHILE ; 
commit; 
END;; 
CALL test_insert1();

删除表中重复数据

delete from ad_finance_request_log where id in( select id from (select id,count(1) from `ad_finance_request_log` where request_type=5 group by request_account_id,ad_director,created_at having count(1) >1)as a )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值