对数据库事物的理解

什么是事物

事物通俗的来讲就是就是一组操作事件,可以类比于Java里面的原子操作。在一个事物中,要么全部成功,要么就是全部失败。

mysql中的事物

在Mysql的innodb中,事物的默认级别是 可重复读,在该级别下,事物可能出现幻读。出现幻读的情况是该引擎为行级锁,导致mysql在进行一个事物的时候只会锁定与该事物有关的几行。

示例如下:

阅读更多

mysql的一些总结

前言

今天突然有一个写sql的机会,但是是手写,不像之前那样可以在数据库上做测试。这突然让我感觉有的语法有点生疏了,所以乘着这个机会来做一个全部的梳理。

groupby和where的顺序:

今天是有两表做一个等值连接查询的,在这里应该是先where之后再进行group by,group by 是对where条件过滤之后再进行分组处理,所以where在前。

group by

阅读更多

MySql和时间相关的查询(二)

DATE_ADD():

这个函数可以将日期往前加上规定的年,月或者日,从而方便统计,例如需要统计本月的某些数据的话,一般来讲肯定是只需要大于本月月初即可,但是为了考虑程序的健壮性的话肯定是需要再加一个限制条件,比如说小于下个月1号。那么就需要一个一个DATE_ADD()函数:

1
2
3
4
5
6
SELECT
*
FROM
table
WHERE time_columns > CONCAT(LEFT(NOW() - INTERVAL 0 MONTH, 7), '-01')
AND time_columns < DATE_ADD(CURDATE()-DAY(CURDATE())+1,INTERVAL 1 MONTH);

这条sql便是求的本月的数据。同时在这里也对当前时间的函数进行一个对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2018-03-28 |
+------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-03-28 15:07:15 |
+---------------------+
1 row in set (0.00 sec)

mysql> select CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 15:07:39 |
+-----------+
1 row in set (0.00 sec)

阅读更多

在mysql5.7版本中使用groupby所需要注意的

什么是ONLY_FULL_GROUP_BY 模式

先看在mysql 5.7版本中的一个的group by,以下是这个数据库表:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select * from testgroupby;
+---------+-----------+------------+--------------+
| user_id | user_name | user_score | user_subject |
+---------+-----------+------------+--------------+
| 1 | 张三 | 99 | 语文 |
| 2 | 张三 | 90 | 数学 |
| 3 | 张三 | 80 | 英语 |
| 4 | 李四 | 99 | 语文 |
| 5 | 王五 | 85 | 语文 |
| 6 | 李四 | 91 | 数学 |
| 7 | 王五 | 100 | 英语 |
+---------+-----------+------------+--------------+
7 rows in set (0.00 sec)

这是一个学生成绩数据库表。那么在MySQL5.7版本中执行它的话是会出现一个error的。如下所示:

1
2
3
mysql> select * from testgroupby group by user_name;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'login.testgroupby.user_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

阅读更多

记一次sql和时间段查询有关的语句

前言

由于自己有点需求需要在mysql中按照时间段进行查询,而自己又对这些不太了解,所以趁着这次机会将mysql和时间段相关的查询语句做一个记录:

常用函数:

DATE_SUB()函数

DATE_SUB(date,INTERVAL expr type)这个函数的date是一个时间表达式,一般取得是数据库中的一个字段。后面的INTERVAL一般来讲是不变的,expr一般是一个时间段,代表过去的,比如是30天,那么这里就是30,若是60,这里就是60,type则表示的是一个时间属性(可能表达的不是很准确),如下:

阅读更多

记一次sql嵌套查询的使用方法

记一次sql嵌套查询的使用方法

一般来讲在sql中嵌套查询在where之后以便于查询范围的限制。
现在有一个情况就是就是现在嵌套查询的话是需要查询出结果值然后返回为一个字段。

思路:

思路一:既然需要返回的是一个字段,那么是需要一个嵌套查询,所以一般的表达式是:

select <表达式>(select<表达式>)as name这样作为一个查询。
首先在括号()里面的一个select语句是可以作为一个字段的,可以通过在后面加一个as 字段从而返回的是一个字段。、
那么这样书写sql之后便可以作为一个字段然后返回结果了。但是这样写有一个弊端,就是若没有groupby,则会导致查询出来的数据会有多余重复得。
类似下面这条sql:

阅读更多