查询总数
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 )