分类
MySql SQL 笔记

实现 MySQL Top 函数【原创】

需求:查询数据,根据字段分组,取出分组后每组的前N条记录。
如果是在SQL Server中,可以使用top,取前N条记录。但是在MySQL是不支持的。网上说的比较多的是用limit N,虽然可以取到前N条,但那是分组后的N条,不是每组N条数据,所以不符合需求,排除。还有一种是使用union把多个结果连接起来,这种方法需要提前知道有分多少组,而且不适合分组太多的场景,排除。

我的实现思路:
1.查出分组后的数据。
2.使用原表数据和分组后的数据连接起来。
3.按组生成序列(从0开始)。
4.根据序列编号做为条件,找出前N条数据。

分类
MySql SQL 笔记

从SQL查询结果随机取一条数据

最近工作中会涉及复杂的SQL语句,还是挺有意思的。以前想写没有应用场景,现在正好可以多锻炼锻炼。我觉得在实际开发中,程序代码并不是最难的,最难的还是SQL。SQL逻辑性最强,而且还要很清楚表设计,业务场景。特别是复杂的业条场景下提炼数据,要考虑到功能,性能,是否会锁表。
需求:有一张表保存诺干条广告信息。当APP启动时,根据登录用户所在的区域,随机取出一条广告返回,作为启动页。

数据库:MySQL
刚开始,我的做法是:

select floor(max(startPageId) * rand()) from ghome.ghome_startpage_info where 1=1 and status!='00';

startPageId是自动增长的Integer型
其他where条件不贴出来了。这句意思是,查询符合条件的数据,根据 max 函数找出结果最大的,乘以 rand 函数随机生成的一个小于1的数,再用 floor 去掉小数位。得出一个 randId。

分类
MySql

MySQL事务与锁

好久没认真看数据库这块了,工作后主要凭经验和规范避免事务与锁的问题,想想还是有必要整理一下的。工作时间很多都花在沟通上。条理清晰地把一个东西表达出来,让对方准确接收信息,是一项必不可少的核心能力。本篇所有资料都收集于网上,末尾贴出参考链接。

一、事务的基本要素(ACID)

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

分类
Linux MySql

CentOS 7 安装 MySQL 5.7

因为开源问题,CentOS 7 yum源用MariaDB取代MySQL。对于使用者来说,开不开源其次,MySQL毕竟有商业支持,就像使用OracleJDK还是OpenJDK一样,争论毫无意义。废话不多说,在CentOS 7安装MySQL步聚如下:
1.安装源
rpm -hiv http://repo.mysql.com/mysql57-community-release-el7.rpm
2.更新源
yum update
这个时候会系统会提示用MySQL替换MariaDB。
3.安装MySQL
yum install mysql mysql-server
安装完成。原以为很顺利,结果出了一系列小问题。

分类
MySql Windows 笔记

MySQL 5.7 for Windows 安装

近日,MySQL最新GA版本到5.7了。MySQL从5.6开始,官方的windows版本是一个zip,即使单独下载mis安装文件,安装后也没有设置向导工具。要想把MySQL安装并注册为系统服务,需要费一翻功夫。以前安装过MySQL 5.6 for Windows,以为会一切很顺利,结果搞了好久……
在Linux下,MySQL5.6编译需要使用的cmake,这里主要讲windows下的安装方法。

我所使用的版本是当前最新GA版:5.7.9,下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.9-winx64.zip
1.下载完成后解压到任意目录。我这里是:D:\Dev\mysql
2.修改D:\Dev\mysql目录下的my-default.ini文件名为my.ini,然后编辑。