一 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. Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...

  2. 解决 go get golang.org/x/* 拉取失败问题

    go get -u -v golang.org/x/text 有时候会因为网络问题,导致失败. 在不用代理的情况下,可以使用以下方案. golang.org,他们在github上有一个镜像库 以 go ...

  3. [CTS2019]珍珠——二项式反演

    [CTS2019]珍珠 考虑实际上,统计多少种染色方案,使得出现次数为奇数的颜色数<=n-2*m 其实看起来很像生成函数了 n很大?感觉生成函数会比较整齐,考虑生成函数能否把n放到数值的位置,而 ...

  4. Python,初次见面请多指教

    特点 1.可读性强: 可读性远比听上去重要的多得多.一个程序会被反复的修改,可读性强意味着让你可以在更短的时间内学习和记忆,直接提高生产率. 2.简洁,简洁,简洁: 研究证明,程序员每天可编写的有效代 ...

  5. [BTS] BizTalk WCF-SQL Adapter 高级应用

    9102年岁尾,41岁的我居然还在搞 BizTalk,感觉就是一种悲伤. 国内用户少之又少,能坚持一直在使用的“忠实”用户那就更少了. 不是它不好用,而是微软全线转向云服务,这个产品也已经快10年没有 ...

  6. Arcgis python输出当前窗口

    import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") mxdfile=arcpy.GetParameterAsText(0 ...

  7. php 设置error_reporting(0)和ini_set('display_errors', 0)之后,还是显示错误

    php 5.4 apache 2.2 关闭错误报告和错误显示 依然会显示错误 按照我的理解,error_reporting(0)之后就应该不会显示错误了,这是怎么回事? 后来我又试着在php.ini者 ...

  8. DOS 获取硬盘序列号

    DOS命令行操作: 使用diskpart命令,Win+R键运行cmd,进入命令行界面:       1.diskpart       2.list disk 查看有几块硬盘       3.selec ...

  9. 微信小程序之状态管理A

    其实这个标题 不是很对 主要是最近小程序项目中 有这么一个状态 所有商品都共用一个商品详情页面  大概就是这样子  为了公司 保险起见,一些展示的内容已经处理 但是无伤大雅 就是这么两个按钮 左侧粉色 ...

  10. DeepLearningBook(中文版)书PDF

    介绍深度学历基础理论.模型和应用.(738页). 第一部分 应用数学与机器学习基础,包括深度学习需要用到的线性代数.概率与信息论.数值计算.机器学习等内容. 第二部分 深度网络:现代实践,包括深度前馈 ...