CentOS6.7手动安装MySQL5.6

时间是越来越紧张了呀,所以也没有这么更新博客了,最近在学习linux的基本操作,先装个mysql试试呗。

先选择从oracle官网下载安装包来安装,详细步骤参看:mysql官方下载安装教程(centos)

下面只说关键步骤和坑,以为记录:

1、下载mysql安装包,使用 lrzsz 工具上传到服务器,然后使用 tar xzvf 解压到 /usr/local 下,并创建软连接

ln -s /usr/local/mysql-5.6.38 /usr/local/mysql

2、添加用户与组,并更改刚才解压的文件的权属

groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql mysql-5.6.38

3、安装数据库

cd /usr/local/mysql/scripts
./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql_data

解释:basedir为mysql的安装地址,datadir为mysql数据存放地址
继续阅读

通过Java连接mysql对反斜杠“\”转义的测试

在java中,反斜杠“\”转义是“\”,因此表示一个“\”要使用“\\”,如果是正则表达式,那么表示一个“\”需要用“\\\\”,在mysql中,反斜杠转义依然是“\”,和java相同。

现在问题是:如果mysql中一个字段的内容包含反斜杠,然后通过java连接mysql去筛选这个字段所在的条目,要怎么写才能将该字段筛选出来呢?下面就是一个实验:

1,先建立测试数据:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
insert into test (name) values ('\\'), ('\\\\');

向数据库中插入2条数据,name的值分别是“\”和“\\”。

2,使用jdbc连接mysql,然后测试筛选条件:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
PreparedStatement pstmt = conn.prepareStatement("select * from test where *条件"); // “*条件”见下文
pstmt.setString(1, "*筛选值"); // “*筛选值”见下文
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
	System.out.println(rs.getString("name"));
}

继续阅读

MySQL联表删除语法

之前写到联表更新,那么有没有联表删除呢?

答案也是有的,下面将是代码记录:

假设有2张表:
1,user表,字段为:id,user_name
2,user_role表,字段为:id,role_name,user_id
关联关系是 user.id = user_role.user_id

现要删除某一条user表的数据以及该user对应的user_role表中的数据,那么用下面的sql就可以实现这个目的了:

delete u, u_r from user u, user_role u_r 
where u.id = ? and u.id = u.user_id

上述sql中,u是user的别名,u_r是user_role的别名,from语句前面要附上别名,这个别名是用于指定删除哪张表数据的,如果只有u或者u_r,那么仅删除对应的那张表上的数据。

MySQL联表更新语法

之前写代码操作数据库,如果遇到需要同时更新两张表时,我会采用在同一个事务中使用2句sql语句分别进行更新。其实,这种需要发送2句sql语句的方法效率相对来说是比较低的,有没有只用1句sql语句就可以完成这个操作的呢?

答案是有的,下面将是代码记录:

假设有2张表:
1,user表,字段为:id,user_name
2,user_role表,字段为:id,role_name,user_id
关联关系是 user.id = user_role.user_id

现要更改某一条user表的数据的的user_name字段以及该user对应的user_role表中的数据的role_name字段,那么用下面的sql就可以实现这个目的了:

update user, user_role set 
	user.user_name = ?, user_role.role_name = ?  
where user.id = ? and user.id = user_role.user_id

SQL中的转义字符

之前写了篇文章《Oracle转义字符》,说到了Oracle中单引号“’”的转义字符是单引号“’”,那么其他的特殊字符的转义字符又是什么呢,如模糊查询的占位符“%”,“_”等。

经过测试,在Oracle中不能再使用单引号“’”来转义“%”,“_”了,而是用反斜杠“\”,不仅如此,还要声明反斜杠“\”是转义字符。

假设表为tb,字段为col,要在col中查询包含“%”或“_”字符的字段,sql如下:

-- Oracle

select * from tb where col like '%\%%' or col like '%\_%' escape '\'

sql中“escape”表明声明反斜杠“\”为转义字符,紧接在“\”后的“%”就表示“%”符号,而左右两边的“%”表示模糊查询占位符。

注意:“%”,“_”作为占位符只会出现在where之后,如果是select ‘%’ from dual就不用转义了。

而MySQL中也是大同小异,不过MySQL不用写“escape”了,直接使用反斜杠“\”就可以了。

继续阅读

Java修道之路:MySQL排名(优化)

之前有写到MySQL排名,见《Java修道之路:MySQL排名》,这篇文章中的sql语句写的很繁琐,分别嵌套了2个相同的子查询,也就是说运行这段sql会重复同样的查询2次,如果数据量很大,是很不合适的。当时我并不知道如何使用一个子查询完成工作,但是我隐约的感觉肯定可以只用一个子查询就能搞定…

这不,前几天正好有个同事写排名sql,我就看了下,果然不出所料,思路是完全一样,但同事就只使用了一个子查询就搞定了,细细读之,果然精炼,自己也试了下,又学到一个好东西,下面贴出sql,供参考也供留存:

连续重复排名:

-- 连续重复排名(精炼算法,只是用一个子查询)
select
	T.*,
	if (
		score = @LAST_SCORE,
		@LAST_ROW,
		@LAST_ROW := @LAST_ROW + 1
	) as RANK,
	@LAST_SCORE,
	@LAST_SCORE := score
from
	(select * from score order by score desc, id) as T,
	(select @LAST_ROW := 0, @LAST_SCORE := null) as RECORD

继续阅读

MySQL区分大小写查询

MySQL数据库写sql时,字段和语句都不区分大小写,但是字段内容是否区分大小写呢?让我来试试:

创建一张表table,设置一个字段column,类型varchar。设置还有个Collation参数,据网上说的,如果设置为“_ci”结尾就不区分大小写,如果为“_bin”结尾就会区分大小写,先选择“_ci”吧。

创建数据A和a,sql语句:select * from table where column = ‘a’,这时结果是“A”和“a”,也就是说都被搜出来了,这个时候可以使用这条sql:select * from table where column collate gbk_bin = ‘A’,这样就只搜出了“A”。

那么将collation设置为“_bin”结尾想搜出忽略大小写的结果呢?下面这条sql:select * from table where column collate gbk_chinese_ci = ‘A’,这样就只搜出了“A”。

分享一个MySQL行列转换的方法

面试的时候,面试官要求写一个mysql行列转换的方法,当时,真不知道该怎么做,结果还是写了一个方法,建表,一条一条的转过去…真是煞费苦心呢…不过面试官也没有要求要怎么做,只要实现就欧啦,哈哈,这不…哈哈哈

好了,进入正题,今天在写一个sql,觉得好复杂,于是问了旁边一个大神,大神一看,诶,这涉及到行列转换…当时,我突然一个激灵,什么意思,怎么转,于是就有了下面的方法!

先看题,有张表如下图:

MySQL行列转换 - 列表

通过无论什么方法…转换成下面的列表,也就是行列转换,最好是SQL和JAVA都写出来!!!

MySQL行列转换 - 列表

继续阅读

Java修道之路:Java实现排名

前一篇文章《Java修道之路:MySQL排名》写了如何用SQL来实现排名,这里想用java写一下排名算法,其实主要是想了解下两种方法的耗时,因为之前有同事说SQL的耗时会比Java少,所以想测试一下。

这里先说结果,我写的方法,测出来的结果,Java会比SQL快,也许是我的SQL写得并不优导致的,但是SQL一旦成形,就可以直接套用,使用比较方便,速度呢,1万条数据耗时相差无几,10万条数据(2个字段)耗时相差也就600毫秒左右。

继续阅读

Java修道之路:MySQL排名

mysql没有oracle那种排名函数,就只有自己实现,要么用sql,要么用java。

前几天研究了下sql的写法,贴出来,怕忘了可以瞄上一眼。

这里用到了mysql的自定义变量,写法如 @rank := 0,就是设置变量rank初始值为0。

为了测试sql,要有数据,用存储过程添加了1万条数据,花了大概13秒钟吧。

在公司测试的是10万条数据,花了110多秒钟吧,具体记不得了…

好了,下面开始贴代码:

1,随机生成1万条数据的sql,表只有两个字段:id和score,id自增,score随机0~100

-- 创建存储过程
drop procedure if exists proc;
create procedure proc() 
begin 
	declare i int;
	set i = 0;
	while i < 10000 do 
		insert into score values (null, format(rand() * 100, 0));
		set i = i + 1;
	end while;
end;

-- 执行存储过程
call proc();

继续阅读

Java自学之路:日期和时间处理(1) 之 MySQL数据库的日期和时间处理

假设MySQL数据库里面有一个字段叫“date”,存放了日期(年月日)和时间(时分秒)的日期类型,如“2015-07-18 14:03:34”。

那么我们怎么取出来呢?如果你还在用 rs.getDate(column) 那么就继续看看吧!

假设我们已经做好了数据库连接[数据库连接教程见这里],并获得了 ResultSet rs,那么使用如下代码就可以获得date数据了:

import java.sql.Timestamp;
Timestamp ts = rs.getTimestamp("date");
System.out.println(ts.toString());
// 结果是:2015-07-18 14:03:34.0

这样“date”中的数据就被保存在了 ts 中,格式为“yyyy-MM-dd HH:mm:ss.S”(字母意义参见下表,详见API文档 java.text.SimpleDateFormat),文章开始假设的时间显示就是“2015-07-18 14:03:34.0”。 继续阅读

Java自学之路:连接MySQL数据库

当然,是在eclipse中使用~

1、eclipse引入JDBC jar包:mysql-connector-java-x.jar,eclipse的方法如下:
loadExternalArchive
2、引入驱动
Class.forName("com.mysql.jdbc.Driver");
     建立链接()
Connection conn = DiverManager.getConnection(
                 "jdbc:mysql://localhost/database",
                 "root",
                 "root");

上面代码.getConnection()里面有三个参数:数据库URL/数据库名称(”jdbc:mysql://localhost/database”),数据库用户名(”root”),数据库用户密码(”root”),可以先设置成private static final String,然后再调用,方便以后代码的维护。

继续阅读

MySQL 5.5.19编译安装

最近在搞MySQL的东西,使用ubuntu,以前每次都是apt-get来安装的MySQL,但是于某天看到某公共环境中使用的MySQL是5.5.19的,而且安装目录附近还看到了源码,再看另一个某公共环境,也是用的5.5.19源码编译的,顿时我就不淡定了,最近因为这个平台来搞MySQL,怎么说个人环境中使用的MySQL也要和公共环境的保持一致吧。网上找方法,大多坑爹,有部份说的东西也有缺有漏,最后我终于琢磨出来了。

继续阅读