1 Mysql的注释
2 NULL值映射为其它的值
3 使用内置日期函数获取MySQL今天的日期
4 MySQL间隔值来执行日期和时间算术运算
5 选择第n个最高纪录
6 查询选择随机记录
7 模拟row_number函数
8 REGEX:基于正则表达式的搜索
9 比较相同表中的连续行
10 MySQL变量
11 删除表中重复行
12 查找表中的重复行
13 比较两个表不同的数据
1 注释
1.1 不可执行注释
--
#
/* */
1.2 可执行注释
/*! MySQL-specific code */
2 NULL值映射为其他的值
在数据库表中,您可能会存储包含NULL值的数据。但是如果以报表的形式向用户呈现数据时,显示NULL值是没有意义的。要使报告更可读和可理解,必须显示NULL值作为其他有意义的值,如未知,缺失或不可用(N/A)。可以使用IF函数做到这一点。
IF函数的语法如下:
IF(exp,exp_result1,exp_result2);
如果exp计算结果为TRUE(当exp <> 0和exp <> NULL)时,IF函数返回exp_result1的值,否则返回exp_result2的值。
实例:
SELECT
customername, state, country
FROM
customers
ORDER BY country;
结果:
使用NULL值映射
SELECT
customername, IF(state IS NULL, 'N/A', state) state, country
FROM
customers
ORDER BY country;
结果:
3使用内置日期函数获取MySQL今天的日期
3.1 CURDATE()
函数
3.2 Now()函数
3.3 获取明天日期,interval用法4节会介绍
4 MySQL间隔值来执行日期和时间算术运算
MySQL间隔值主要用于日期和时间计算。要创建间隔值,请使用以下表达式:INTERVAL expr unit
INTERVAL关键字是确定间隔值的expr,unit指定间隔单位的单位。
加一天
减一天
4.1 计算时间间隔使用DATEDIFF函数
我们计算每条记录的时间和2018-07-06的时间间隔
5选择第n个最高纪录
使用MAX或MIN函数可以轻松选择数据库表中最高或最低的记录。但是,选择第n个最高纪录有点棘手。
选择第n个最高记录,需要执行以下步骤:
- 首先,得到n个最高记录,并按升序排列。第n个最高记录是结果集中的最后一个记录。
- 然后,按顺序对结果集进行排序,并获得第一个结果集。
SELECT
*
FROM
table_name
ORDER BY column_name DESC
LIMIT n - 1, 1;
查询返回n-1行之后的第一行,以便获得第n个最高记录。
实例:
Limit N 获取前N条数据,limit N,n 获取的是N条之后的前N条数据
我们获取前5条数据,以及获取第5条数据
6查询选择随机记录
有时,必须从表中选择随机记录,例如:
(1) 在博客中选择一些随机的帖子,并在侧边栏中显示。
(2) 选择一个随机报价来显示“当天的报价”小部件。
(3) 在画廊中选择随机图片,并将其用作精选照片。
5.1 使用ORDER BY RAND()选择随机记录
SELECT
*
FROM
tbl
ORDER BY RAND()
LIMIT 1;
让我们更详细地查看上面的查询语句 -
- RAND()函数为表中的每一行生成一个随机值。
- ORDER BY子句通过RAND()函数生成的随机数对表中的所有行进行排序。
- LIMIT子句选择随机排序的结果集中的第一行。
5.2 使用INNER JOIN子句选择随机记录
生成随机数的方式设计到排序,表大的话速度就比较慢了。该技术要求您要选择随机记录的表具有自动增量主键字段,并且序列中没有间隙。
以下查询根据主键列生成随机数:
SELECT
ROUND(RAND() * ( SELECT
MAX(id)
FROM
table)) as id;
我们可以通过上述查询返回的结果集连接表,如下所示:
SELECT
t.*
FROM
table AS t
JOIN
(SELECT
ROUND(RAND() * (SELECT
MAX(id)
FROM
table )) AS id
) AS x
WHERE
t.id >= x.id
LIMIT 1;
7 模拟row_number
函数
row_number是一个排序函数,返回一行的顺序号,从第一行的1开始。经常想使用row_number函数来生成特定的报告。
MySQL不提供像SQL Server,Oracle那样的row_number函数。 幸运的是,MySQL提供了可用于模拟row_number函数的会话变量。
SET @row_number = 0;
SELECT
(@row_number:=@row_number + 1) AS num, firstName, lastName
FROM
employees
LIMIT 5;
· 在第一个语句中,定义了一个名为row_number的变量,并将其值设置为0。 row_number是由@前缀指示的会话变量。
· 在第二个语句中,从employees表中查询选择了数据,并将row_number变量的值增加到每行的1。LIMIT子句用于约束一些返回的行,在这种情况下,它被设置为5
8 REGEX:基于正则表达式的搜索
使用正则表达式的优点是,不限于在LIKE运算符中基于具有百分号(%)和下划线(_)的固定模式搜索字符串。 使用正则表达式,有更多的元字符来构造灵活的模式。
正则表达式的缩写是regex或regexp
下面说明了WHERE子句中REGEXP运算符的语法:
SELECT
column_list
FROM
table_name
WHERE
string_column REGEXP pattern;
此语句执行string_column与模式pattern匹配。
如果string_column中的值与模式pattern匹配,则WHERE子句中的表达式将返回1,否则返回0。
实例:假设想找出名字以字母A,B或C开头的产品。可以使用SELECT语句中的正则表达式如下:
9比较相同表中的连续行
可以使用自连接来比较连续的行
INNER JOIN子句g2.id = g1.id + 1中的条件允许您将当前行与inventory表中的下一行进行比较,当然,假设id列中没有间隙。
如果无法避免差距,您可以创建一个附加列,例如seq来维护行的顺序,以便应用此技术。
10 MySQL变量
有时候,您希望将值从SQL语句传递给另一个SQL语句。为此,您可将该值存储在第一个语句中的MySQL用户定义的变量中,并在随后的语句中引用它。
要创建用户定义的变量,请使用格式@variable_name,其中variable_name
有两种方法可以将值分配给用户定义的变量。
第一种方法是使用SET语句如下:
SET @variable_name := value;
您可以使用:=或=作为SET语句中的赋值运算符。 例如,该语句将数字100分配给变量@counter。
SET @counter := 100;
为变量分配值的第二种方法是使用SELECT语句。 在这种情况下,您必须使用:=赋值运算符,因为在SELECT语句中,MySQL将=运算符视为相等运算符。SELECT @variable_name := value;
11 删除表中重复行
使用DELETE JOIN语句删除重复的行
以下语句删除重复的行并保持最高的ID:
DELETE t1 FROM contacts t1
INNER JOIN
contacts t2
WHERE
t1.id < t2.id AND t1.email = t2.email;
删除表中重复数据
删除之后:
12查找表中的重复行
在基于一列的表中找到重复值,则使用以下语句:
SELECT
col,
COUNT(col)
FROM
table_name
GROUP BY col
HAVING COUNT(col) > 1;
如果表中出现多个值,则该值将被视为重复。在这个语句中,使用COUNT函数的GROUP BY子句来计算指定列(col)的值。HAVING子句中的条件仅包含值count大于1的行,这些行是重复的行。
13 比较两个表不同的数据
首先,使用UNION语句来组合两个表中的行; 仅包含需要比较的列。返回的结果集用于比较。
SELECT t1.pk, t1.c1
FROM t1
UNION ALL
SELECT t2.pk, t2.c1
FROM t2
第二步,根据需要比较的主键和列分组记录。如果需要比较的列中的值相同,则COUNT(*)返回2,否则COUNT(*)返回1。
请参阅以下查询:
SELECT pk, c1
FROM
(
SELECT t1.pk, t1.c1
FROM t1
UNION ALL
SELECT t2.pk, t2.c1
FROM t2
) t
GROUP BY pk, c1
HAVING COUNT(*) = 1
ORDER BY pk
如果比较中涉及的列中的值相同,则不返回任何行。
实例
通过id和title进行分组,组内成员大于1的都是两个表中共有的