Mysql学习笔记

1.关于网站访问计数  http://www.oschina.net/code/snippet_938918_36840?p=1

CRETE TABLE `article_view`(
     `article_id` int(11) NOT NULL,
     `pond` tinyint(4) NOT NULL COMMENT '池子,就是用来随机用的' ,
     `view` int(11) NOT NULL,
     PRIMARY KEY (`article_id`);
)ENGINE=

INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (`123`, RAND()*5, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1

SELECT SUM(`view`) FROM `article_view` WHERE `article_id`='123'


2.mysql优化 http://blog.jobbole.com/86547/

inner join查询速度比where联合要快,mysql数据库自动把where联合转成了inner join,所以效率差不多

having只有在聚合的时候才使用,其余情况下用where条件来刷选


3.find_in_set和group_concat合起来使用

因为需求是根据多重不同优先级条件判断,用IFNULL进行判断,如果用IF的话SQL语句会很长,类似下面查询特定用户的需求,先查身份证号码一致的用户,如果不存在就查姓名和手机号码一致的用户,表格中会存在重复的用户

select * from user where find_in_set(user_id,ifnull((select group_concat(user_id) from user where id_no='身份证号'),(select group_concat(user_id) from user where name='姓名' and phone='手机号码'))


4.如果不存在则插入,存在则不插入,dual是MYSQL自带的虚拟表

1) insert into table(字段) select 字段值 from dual where not exists(select * from table where 字段=字段值)

 例子:insert into user(name,sex) select '刘','男' from dual where not exists(select * from user where name='刘' and sex='男')

有人提议用下面的写法,经过验证这种写法是错误的,不能使用

insert into table(字段) select 字段值 from  table where !(字段=字段值) LIMIT 1

例子改写为下面的结果会插入多条记录,所以这种写法不可取:

insert into user(name,sex) select '刘','男' from user where !(name='刘' and sex='男') limit 1


如果表格中设定了主键或者唯一索引,还可以使用,replace intoinsert ignore into的写法

2)replace into user(name,sex) values('刘','男')   这种写法,如果存在相同的主键记录,则进行替换操作,内容修改了,影响行数为2,替换的内容没有改动影响行数为1;如果不存在该主键则进行插入操作,影响行数为1

3)insert ignore into user(name,sex)values('刘','男') 这种写法,如果存在相同的主键记录,则不进行任何操作,影响行数为0;如果不存在该主键则进行插入操作,影响行数为1

4) insert into table(字段) values(字段值) on duplicate key update 字段=字段


5. 类型转换

CAST(字段 AS 类型)

CONVERT(字段,类型)


6.ROUND()函数的陷阱,两个float字段相乘得到的结果会有偏差

http://blog.jobbole.com/109735/


7.对in进行排序

select * from table where id in(2,3,1) order by filed(id,2,3,1)


8.设计数据库的时候最好考虑大小写区分,尤其是要做唯一性判断的时候

mysql对于类型为varchar数据默认不区分大小写,但如果该字段以“*_bin”编码的话会使mysql对其区分大小写,现在用的utf8_bin和utf8_general_cs都是区分大小写的,但是好像部分版本的mysql没有utf_general_cs


9.不管是加不加索引 group by 都比 distinct 快,因此使用的时候建议选 group by。 结论来自http://www.cnblogs.com/zox2011/archive/2012/09/12/2681797.html,未经测试。


10.mysql连接最常见的一个错误:

The last packet successfully received from the server was 1 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.

设置数据库配置参数net_write_timeout=1800 

设置数据库连接参数connectTimeout=120000 socketTimeout=120000 autoReconnect=true failOverReadOnly=false

设置以后会引发其它的错误,目前没有找到最佳的解决办法,寻求帮助中。


10.union合并查询集会去掉重复数据,包括子查询中本身重复的记录。


11.碰到一个很奇葩的问题,因为空格的问题造成了sql语法错误,我现在还没搞懂为什么,错误的sql粘贴到博客来再粘贴回去就正确了,现在只能理解为空格的编码是错误的。



你可能感兴趣的:(数据库,mysql)