一 coalesce

在mysql中,其实有不少方法和函数是很有用的,这次介绍一个叫coalesce的,拼写十分麻烦,但其实作用是将返回传入的参数中第一个非null的值,比如
SELECT COALESCE(NULL, NULL, 1); 
-- Return 1

SELECT COALESCE(NULL, NULL, NULL, NULL); 
-- Return NULL

如果传入的参数所有都是null,则返回null

这个参数使用的场合为:假如某个字段默认是null,你想其返回的不是null,而是比如0或其他值,可以使用这个函数

   SELECT COALESCE(field_name,0) as value from table;

 
 

二 mysql dump shell

#!/bin/bash

dump_sql='mysqldump -hxxx.xxx.com  -P3316 -uuser_r -ppassword db'

config_where=" --where"
config="--no-create-info --complete-insert --single-transaction --default-character-set=utf8mb4" qadmin_user_file=qadmin_user.txt
qadmin_user_org_file=qadmin_user_org.txt
tmp1_file=tmp1.txt
tmp2_file=tmp2.txt ${dump_sql} qadmin_user ${config_where} "1 = 1" ${config} >> ./${tmp1_file}
cat ${tmp1_file} | grep 'INSERT INTO' | sed 's/),(/),\n(/g' >> ./${qadmin_user_file} ${dump_sql} qadmin_user_org ${config_where} "1 = 1" ${config} >> ./${tmp2_file}
cat ${tmp2_file} | grep 'INSERT INTO' | sed 's/),(/),\n(/g' >> ./${qadmin_user_org_file} rm ${tmp1_file}
rm ${tmp2_file}

三. grant all privileges on

遇到了 SQLException: access denied for  @'localhost' (using password: no)

解决办法   grant all privileges on *.* to joe@localhost identified by '1';

flush privileges;

拿  joe    1 登陆

MySQL> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;

权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。
当权限1,权限2,…权限n被all privileges或者all代替,表示赋予用户全部权限。
数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%'表示从任何地址连接。
‘连接口令’不能为空,否则创建失败。

mysql>grant select,insert,update,delete,create,drop on vtdc.employee to joe@10.163.225.87 identified by ‘123′;
给来自10.163.225.87的用户joe分配可对数据库vtdc的employee表进行select,insert,update,delete,create,drop等操作的权限,并设定口令为123。

 

四 mysql中不能插入中文

 

(1)#vim /etc/mysql/my.cnf 。(5.5以前系统)在【client】下面加入 default-character-set=utf8

在【mysqld】下面加入default-character-set=utf8

Notice:注意 如果修改后不能启动报错试试把default-character-set=utf8改为character_set_server=utf8,仅仅加入到mysqld下面的.client就不需要加了

(2)#vim /etc/mysql/my.cnf 。(5.5以后系统)如下修改:

[client]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci

五、重启mysql(/etc/init.d/mysql stop   /etc/init.d/mysql  start) service mysql restart

六、修成成功,进入mysql查看字符集(mysql>show variables like ‘character_set_%’;)

 
 

五 mybatis中的 ${} 和 #{} 有什么区别

动态sql时mybatis的强大特性之一,也是它优于其他orm框架的一个重要原因。mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理的。在动态sql解析阶段, #{}和${} 会有不同的表现

(1) #{}

select * from user where name = #{name};

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?;

(2) ${}

select * from user where name = ${name}; 

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "zhangsan"; 

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上${} 变量的替换阶段实在动态sql解析阶段,而#{} 变量的替换是在dbms中,#方式能够很大程度防止sql注入,一般而言能用#就别用$

六 数据库三范式

1 第一范式1NF

在任何一个关系数据库中,1NF是对关系模型的基本要求,不满足1NF的数据库就不是关系数据库。所谓1NF是指数据库表的每一列都是不可分割的基本数据项,同一列不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。简而言之,1NF就是无重复的列

2 第二范式2NF

满足2NF的前提是满足1NF,2NF要求数据库表中的每个实例或行必须可以被唯一地区分,为实现这个通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一标识被称为主关键字或主键。2NF要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。简而言之,2NF就是非主属性非部分依赖于主关键字。

3 第三范式3NF

满足3NF的前提是满足2NF,3NF要求一个数据库表中不包含已在其他表中包含的非关键字信息。例如,有一个部门信息表(部门编号,部门名称,部门简介),那么在员工信息表中列出部门编号后就不能再将部门名称,部门简介等于部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据3NF也应该构建它,否则就会有大量的数据冗余。简而言之,3NF就是属性不依赖于其他非主属性。

七 数据库连接池配置

<jdbc name="server1"
url="jdbc:mysql://xxxxx:xxxx/?characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull"
username="xxxxxxx" password="xxxxxxxx" driverClassName="com.mysql.jdbc.Driver"
removeAbandoned="true" removeAbandonedTimeout="" logAbandoned="true"
maxWait="" minIdle="" maxIdle="" initialSize="" maxActive="" testOnBorrow="true"
testWhileIdle="true" timeBetweenEvictionRunsMillis="" minEvictableIdleTimeMillis=""
validationQuery="select 1"/>

我们来看一下各个参数的含义:

maxActive="100": 并发情况下最大连接数。通过设置maxActive参数可以避免某个应用无限制地获取连接

maxIdle="30": 例如并发时最大线程数达到了100(maxActive="100"),那么连接池就必须从数据库获得100个连接来供应用程序使用。当应用程序关闭连接后,例如maxIdle为30的话,那么并不是所有的连接都会归还给数据库,将会有30个连接保持在连接池中,状态为空闲。设0为无限制

minIdle="2": 最小默认情况下并不生效,它的含义是当连接池中的连接少于minIdle,系统监控线程将启动补充功能,一般情况下我们并不启动补充线程。

removeAbandoned="true":如果说从连接池中获得连接使用后忘了关闭,这样连接池的连接就会逐渐达到maxActive直至连接池无法提供服务,而进行了这个设置的话当连接池连接数达到一定时便会启动连接回收

removeAbandonedTimeout="60": 活动时间超过60s的会被回收

logAbandoned="true" 回收连接的同时会打印日志

maxWait: 最大等待毫秒数,单位是ms,超过时间会出错误信息

initialSize: 连接池启动时创建的初始化连接数量(默认值为0)

testOnBorrow: 取得对象时是否进行验证,默认为false即不验证

testWhileIdle: 空闲时是否进行验证,默认为false即不验证(当使用dbcp时,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这是的连接实际是无效的数据库连接,很多网上的badcase分析也都是这个dbcp的bug导致。只要把这些属性设为true, 再提供validationQuery语句就可以保证数据库连接始终有效了)

timeBetweenEvictionRunsMillis="5000": 每5s运行一次空闲连接回收器
minEvictableIdleTimeMillis="60000":   池中的连接空闲1min后就被收回
validationQuery:  一个恒真验证语句,如"select 1"
 
 
 

八 重复记录相关查询的实战

1 查找表中多余的重复记录,重复记录是根据单个字段peopleId来判断

select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

3 查找表中多余的重复记录(多个字段)

select * from vitae a
where (a.peopleId, a.seq) in (select peopleId, seq from vitae group by peopleId, seq having count(*) > 1)

4 删除表中多余的重复记录(多个字段),只留有rowId最小的记录

delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5 查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

mysql 常见问题整理的更多相关文章

  1. Maven使用常见问题整理

    Maven使用常见问题整理  1.更新eclipse的classpath加入新依赖  1.在dependencyManagement里面加入包括版本在内的依赖信息,如:   <dependenc ...

  2. LoadRunner常见问题整理(转)

    首先要感谢群友的无私分享,才能得到这篇好的学习资料,整理得太好了,所以收藏保存,方便以后学习. 一:LoadRunner常见问题整理 1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消 ...

  3. [转]LoadRunner脚本录制常见问题整理

    LoadRunner脚本录制常见问题整理 1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面 ...

  4. MySQL基础整理(一)之SQL基础(未完成)

    大家好,我是浅墨竹染,以下是MySQL基础整理(一)之SQL基础 1.SQL简介 SQL(Structure Query Language)是一种结构化查询语言,是使用关系模型的数据库应用语言. 2. ...

  5. 30.Mysql常见问题和应用技巧

    30.Mysql常见问题和应用技巧30.1 忘记Mysql的root密码30.2 如何处理MyISAM存储引擎的表损坏 30.2.1 方法一:使用myisamchk工具 30.2.2 方法二:使用SQ ...

  6. MySQL 安全整理

    MySQL 安全整理 关闭外网的端口访问. 使用高位的端口号. 如果需要外网访问不给最高的权限. 如果需要外网访问也是绑定客户端. To be continued

  7. PHP调用mysql函数整理

    mysql函数整理 名称:mysql_connect() 用途:打开非持久的 MySQL 连接.如果成功,则返回一个 MySQL 连接标识,失败则返回 FALSE. 语法:mysql_connect( ...

  8. (转)【面试】【MySQL常见问题总结】【03】

    [常见面试问题总结目录>>>] [面试][MySQL常见问题总结][03] 2016-05-29 22:20 阅读(8244) 评论(2) [面试][MySQL常见问题总结][02] ...

  9. [转帖]kubernetes 常见问题整理

    kubernetes 常见问题整理 https://www.cnblogs.com/qingfeng2010/p/10642408.html 使用kubectl 命令报错 报错: [root@k8s- ...

随机推荐

  1. Hibernate 5 升级后 getProperties 错误

    升级到 Hibernate 5 后,提示有错误: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/uti ...

  2. HDU - 5528Count a * b 数学公式推导

    HDU - 5528Count a * b 照着这个写的,忘了哪个大佬博客里的了, 但很多初学者,像我一样可能不懂其中一些符号的意义,还有为什么可以这样推导,所以我自己又推导了一下,并用自己的观点解释 ...

  3. 数据结构实验之链表四:有序链表的归并(SDUT 2119)

    #include <bits/stdc++.h> using namespace std; struct node { int data; struct node *next; }; st ...

  4. python 生成金字塔

    num = eval(input("请输入一个整数:")) , num + ): , -): print(" ", end="\t") , ...

  5. sprintf简介

    sprintf 基本用法 输入一段有特点的字符串 #include <cstdio> #include <cstring> using namespace std; int m ...

  6. load加载层

    //eg1 var index = layer.load(); //eg2 var index = layer.load(1); //换了种风格 //eg3 var index = layer.loa ...

  7. jquery ajax缓存问题解决方法小结

    今天在做一个ajax数据提交功能开始利用get方式一直发现提交的数据都是一样,返回的数据也很久不刷新了,这个我知道是ajax缓存问题,后来在网上整理了一些ajax缓存问题解决方法,下面给大家分享一下. ...

  8. selenium的方法

    # Licensed to the Software Freedom Conservancy (SFC) under one # or more contributor license agreeme ...

  9. Leetcode题目62.不同路径(动态规划-中等)

    题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). ...

  10. Hbuilder用自有证书打包 ios App上架AppStore流程

    最近在用Hbuilder做跨平台开发,经过一番研究终于在苹果商店上架成功了一款产品!这款产品就很简单,直接用hbuilder打包好,然后上传到商店即可.这里参照ios app提交应用商店 这篇文章结合 ...