0
点赞
收藏
分享

微信扫一扫

2 Mysql高级技巧


​​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;

结果:

2 Mysql高级技巧_获得行号

使用NULL值映射

SELECT

customername, IF(state IS NULL, 'N/A', state) state, country

FROM

customers

ORDER BY country;

结果:

2 Mysql高级技巧_数据库表比较_02

3使用内置日期函数获取MySQL今天的日期

3.1 ​​CURDATE()​​函数

2 Mysql高级技巧_结果集_03

3.2 Now()函数

2 Mysql高级技巧_MySQL_04

 

3.3 获取明天日期,interval用法4节会介绍

2 Mysql高级技巧_删除重复行_05

4 MySQL间隔值来执行日期和时间算术运算

MySQL间隔值主要用于日期和时间计算。要创建间隔值,请使用以下表达式:INTERVAL expr unit

INTERVAL关键字是确定间隔值的expr,unit指定间隔单位的单位。

加一天

2 Mysql高级技巧_数据库表比较_06

减一天

2 Mysql高级技巧_MySQL_07

4.1 计算时间间隔使用DATEDIFF函数

我们计算每条记录的时间和2018-07-06的时间间隔

2 Mysql高级技巧_获得行号_08

2 Mysql高级技巧_数据库表比较_09

5选择第n个最高纪录

使用​​MAX​​​或​​MIN​​函数可以轻松选择数据库表中最高或最低的记录。但是,选择第n个最高纪录有点棘手。

选择第n个最高记录,需要执行以下步骤:

  1. 首先,得到n个最高记录,并按升序排列。第n个最高记录是结果集中的最后一个记录。
  2. 然后,按顺序对结果集进行排序,并获得第一个结果集。

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条数据

2 Mysql高级技巧_删除重复行_10

2 Mysql高级技巧_删除重复行_11

6查询选择随机记录

有时,必须从表中选择随机记录,例如:

(1) 在博客中选择一些随机的帖子,并在侧边栏中显示。

(2) 选择一个随机报价来显示“当天的报价”小部件。

(3) 在画廊中选择随机图片,并将其用作精选照片。

5.1 使用ORDER BY RAND()选择随机记录

SELECT

*

FROM

tbl

ORDER BY RAND()

LIMIT 1;

让我们更详细地查看上面的查询语句 -

  • RAND()函数为表中的每一行生成一个随机值。
  • ​​ORDER BY​​子句通过RAND()函数生成的随机数对表中的所有行进行排序。
  • ​​LIMIT​​子句选择随机排序的结果集中的第一行。

2 Mysql高级技巧_数据库表比较_12

5.2 使用INNER JOIN子句选择随机记录

生成随机数的方式设计到排序,表大的话速度就比较慢了。该技术要求您要选择随机记录的表具有自动增量主键字段,并且序列中没有间隙。

以下查询根据主键列生成随机数:

SELECT

ROUND(RAND() * ( SELECT

MAX(id)

FROM

table)) as id;

2 Mysql高级技巧_结果集_13

我们可以通过上述查询返回的结果集​​连接​​表,如下所示:

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;

2 Mysql高级技巧_获得行号_14

·  在第一个语句中,定义了一个名为row_number的变量,并将其值设置为0。 row_number是由@前缀指示的会话变量。

·  在第二个语句中,从employees表中查询选择了数据,并将row_number变量的值增加到每行的1。LIMIT子句用于约束一些返回的行,在这种情况下,它被设置为5

8 REGEX:基于正则表达式的搜索

使用正则表达式的优点是,不限于在​​LIKE​​运算符中基于具有百分号(%)和下划线(_)的固定模式搜索字符串。 使用正则表达式,有更多的元字符来构造灵活的模式。

正则表达式的缩写是regex或regexp

2 Mysql高级技巧_结果集_15

下面说明了​​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语句​​中的正则表达式如下:

2 Mysql高级技巧_数据库表比较_16

9比较相同表中的连续行  

可以使用自连接来比较连续的行

2 Mysql高级技巧_MySQL_17

2 Mysql高级技巧_结果集_18

​​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;

删除表中重复数据

2 Mysql高级技巧_获得行号_19

删除之后:

2 Mysql高级技巧_数据库表比较_20

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

如果比较中涉及的列中的值相同,则不返回任何行。

实例

2 Mysql高级技巧_MySQL_21

2 Mysql高级技巧_获得行号_22

2 Mysql高级技巧_删除重复行_23

通过id和title进行分组,组内成员大于1的都是两个表中共有的

2 Mysql高级技巧_删除重复行_24

 

 

 

 

举报

相关推荐

MySQL高级--2

高级SQL技巧

CSS 高级技巧

vue 高级技巧

CSS高级技巧

高级Sql 技巧

mysql高级语句2存储过程

高级 SQL 技巧详解

0 条评论