[mysql]常用函数

104 阅读16分钟

图片.png

图片.png

create table

drop table

where

and or 逻辑运算符

distinct 去重复

between and

as 别名

like 查找类似值

order by 排序

insert 插入

update 更新

delete 删除

inner join 内连接

left join 左连接

right join 右连接

if 条件判断

case 多重条件判定

concat()

连接[2个]或者[多个]字符串,[as]构成一个新的字段
#以下是连接表中的2个字段,构成一个新的字段
select concat(create_time, ride_id) as aa ,
       evasion_env
   
from table
limit 10

#以下是连接表中的3个字段,构成一个新的字段
select concat(create_time, ride_id, driver_user_id) as aa ,
       evasion_env
  
from table
limit 10

#你也可以在concat()函数中,添加一些符号,除了表中的字段之外
select concat(create_time, '_', ride_id, driver_user_id) as aa ,
       evasion_env
  
from table
limit 10

注意:concat()函数的入参,不一定必须是string类型.
该函数是没有规定类型的,任何类型都行,不一定非得是字符串类型才能连接。

substring() 或者 substr()

截取字符串中的一部分,生成一个新的字段。
用户可以指定从第几个字符开始截取,同时可以指定截取的字符的数量。
select substring(create_time,1,10) as aa,
       evasion_env
  
from table
limit 10

substring(字段,1,10),这里的110,意思是从1开始截取,一共截取10个字符。
这一点,和python不太一样,python的下标index是从0开始的。
在mysql的substring()函数中,1就是代表字符串的第一个字符。

如果传入函数的长度,已经超过了字符串的总长度,不会报错,会返回整个字符串给你。

length()

获取字符穿的长度
select length(ride_id) as rideid_length 
from table 

lower()

把字符转成小写
select lower(字段) as aa
from table 

如果字段不是英文字母,不会报错,会返回原来的值,也就是说该函数没有起到任何作用。
如果字段中,既有阿拉伯数字,也有英文字母,那么该函数只会把其中英文字母转成小写的,数字则会保持

upper()

把字符串转成大写

trim()

MySQL的TRIM()函数是一个字符串函数,用于去除字符串中的指定前/后缀或同时去除字符串两端的指定字符。
TRIM()函数可以有不同数量的入参,具体取决于你想如何使用它。
下面列出了`TRIM()`函数的基本用法和对应的入参数量:

# 这种情况下,`TRIM()`会去除字符串`str`两端的空格,默认是空格
TRIM(str) 

TRIM(BOTH remstr FROM str) 
# 这里,remstr是你想要从字符串str两端去除的字符。
# BOTH是可选的,因为默认就是去除两端的字符。

除了使用`BOTH`,你还可以使用`LEADING`或`TRAILING`来指定只去除字符串一端的字符:
TRIM(LEADING remstr FROM str) # 只删除左边
TRIM(TRAILING remstr FROM str) # 只删除右边

总结:
在这些用法中,`TRIM()`函数实际上接受一到两个入参,具体取决于你是如何指定去除字符的方向和字符本身的。如果你只使用了一个参数(如`TRIM(str)`),那么MySQL默认去除字符串两端的空格。如果你使用了两个参数(如`TRIM(BOTH remstr FROM str)`),那么第一个参数指定了去除的方向(或默认为两端)和要去除的字符,第二个参数是要被处理的字符串。

replace

替换字符串中的某些部分
select replace('11111','1', '2') 
这里是把'1111'中的'1',替换为'2'

left(str,len)

返回字符串的左边部分。
MySQL的`LEFT()`函数是一个字符串函数,用于从字符串的左侧开始提取指定数量的字符。
这个函数非常有用,尤其是当你需要从一个较长的字符串中截取一部分时。

`str` 是你想要从中提取字符的原始字符串。
`len` 是你想要从`str`的左侧开始提取的字符数量。
如果`len`的值大于`str`的长度,`LEFT()`函数将返回`str`的完整内容。
如果`len`是负数,则`LEFT()`函数的结果是不确定的,具体行为可能依赖于MySQL的版本和配置。

select left('123456',1) as aa
得到的结果是'1'

select left('123456',2) as bb
得到的结果是‘12left()函数和substring()函数的区别是:
left()函数默认就是从字符串的最左边开始截取,用户只需要确定截取的字符的数量即可。
其实left(str,10) = substring(str,1,10),二者等价
substring()函数,用户可以指定2个参数,第一个是从第几个字符开始截取,第二个参数是一共截取多少个字符。

right

返回字符串的右边部分

reverse()

反转字符串

abs()

返回绝对值

ceil()

向上取整

floor()

 向下取整
 

round()

 四舍五入
 

mod()

 取余数
 

pow()

返回一个数的幂

exp()

返回e的指定次幂

log()

返回指定对数的自然对数

now()

select now(), ride_id
from ride
limit 100
返回当前的日期和时间, 格式是:2024-08-10 21:27:36

year(date)

month(date)

day(date)

curdate()

返回当前日期:2024-08-10

curtime()

返回当前时间: 21:28:28

group_concat()

`group_concat()` 是 SQL 中的一个聚合函数,主要用于将来自【多个行】的列值连接成一个字符串结果。
这个函数特别有用,当你想要将某个分组内的多个值合并成一个单独的字符串字段时。
`group_concat()` 函数在 MySQL、MariaDB、SQLite 和其他一些数据库系统中可用,
但在不同的数据库系统中,其具体的语法和可用选项可能有所不同。

默认是用‘逗号’连接
SELECT column_name, 
         GROUP_CONCAT(another_column_name ORDER BY another_column_name SEPARATOR 'separator') 
FROM table_name 
WHERE condition 
GROUP BY column_name;
  • another_column_name 是你想要合并的列名。

  • ORDER BY 子句是可选的,用于指定连接值的顺序。

  • SEPARATOR 是可选的,用于定义值之间的分隔符,默认是逗号(,)。

  • column_name 是你根据哪个列进行分组的列名。

    demo: 假设有一个名为 employees 的表,其中包含 department_id 和 name 两个字段,你想要为每个部门获取一个包含所有员工名字的字符串。

    sql

    SELECT department_id,
    GROUP_CONCAT(name ORDER BY name SEPARATOR ', ') AS employees
    FROM employees
    GROUP BY department_id;

    这将返回每个 department_id 对应的所有 name 值,用逗号和空格分隔,并作为 employees 列的一部分显示。

    注意事项

  • 默认情况下,group_concat() 函数的结果长度是有限制的(在 MySQL 中,默认限制是 1024 字节)。

  • 如果预计结果将超出这个限制,你应该在会话或全局级别调整 group_concat_max_len 系统变量的值。

  • 并非所有的数据库系统都支持 group_concat() 函数。例如,在 SQL Server 中,你会使用 STRING_AGG() 函数来达到类似的效果(从 SQL Server 2017 开始支持)。

  • 在使用 group_concat() 时,应注意其对性能的影响,尤其是在处理大量数据时。优化查询和数据库配置可以帮助减少这种影响。

count()

统计行数

sum()

返回数值列的总和

avg()

返回平均值

min()

返回最小值

max()

返回最大值

1/COALESCE()

该函数的作用就是处理null
可以传入多个参数,直到找到不是null的参数,然后返回。
如果所有的参数都是null,则最后返回null

主流数据库系统都支持COALESCE()函数,该函数主要用来进行空值处理.

其一般语法和参数如下所示:
COALESCE ( expression, value1, value2……, valuen ) 
COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。
COALESCE()函数将会返回包括expression在内的所有参数中的`第一个非空表达式`。

如果expression不为空值则返回expression;否则判断value1是否是空值,

如果value1不为空值则返回value1;否则判断value2是否是空值,

如果value2不为空值则返回value2;……以此类推,
如果所有的表达式都为空值,则返回NULL。 

例子:
我们将使用COALESCE()函数完成下面的功能,返回人员的“重要日期impordance_date”:

   select name,birthday,regday,
          COALESCE(birthday,regday,'2008-08-08') as impordance_date
   from basic_df
   
    --如果出生日期不为空则将出生日期做为“重要日期”,
    --如果出生日期为空,则判断注册日期是否为空,
    --如果注册日期不为空则将注册日期做为“重要日期”,
    --如果注册日期也为空则将“2008年8月8日”这个固定值做为“重要日期”。
    
    --该函数能用到的场景还是很多的,比如我们来确定一个人的最高学历
    --如果博士研究生不为空,则把博士研究生作为最高学历
    --如果博士研究生为空,则看硕士研究生,如果硕士研究生不为空,则把硕士研究生作为最高学历。
    --否则看本科,这样以此类推。。。。。

2/case when then else end

caseend 是搭配使用的,以case开头,一定以end结尾
when then else的意思是:
当某个字段等于某个值的时候,then怎么处理,else否则怎么处理
when then 可以连续使用

例子
   CASE 
       WHEN substr(join_date,6,2) in ('01','02','03') THEN ‘第一季度’
       WHEN substr(join_date,6,2) in ('04','05','06') THEN ‘第二季度’
       WHEN substr(join_date,6,2) in ('07','08','09') THEN ‘第三季度’
       ELSE ‘第四季度’
   END

3/cast() 转化数据类型

转换数据类型

cast(字段名 as 转换的类型 ),其中类型可以为:
char[(N)] 字符型 
varchar 字符型
date  日期型
time  时间型
datetime  日期和时间型
DECIMAL  float型
SIGNED  int
    例子
    例如表table1

    date
    2015-11-03 15:31:26

    select cast(date as signed) as date from table1;

    结果如下:
    date
    20151103153126\


    select cast(date as char) as date from table1;

    结果如下:
    date
    2015-11-03 15:31:26


    select cast(date as datetime) as date from table1;

    结果如下:

    date
    2015-11-03 15:31:26

    select cast(date as date) as date from table1;

    结果如下:
    date
    2015-11-03

    select cast(date as time) as date from table1;

    结果如下:
    date
    15:31:26


    这里date对应日期,time对应时间

4/round()函数

在mysql中,round函数用于数据的四舍五入,它有两种形式:
1round(x,d)  ,x指要处理的数,d是指保留几位小数
   这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为02round(x)  ,其实就是round(x,0),也就是默认d为0
下面是几个实例
1、查询: select round(1123.26723,2);
     结果:1123.27

2、查询: select round(1123.26723,1);
     结果: 1123.3

3、查询: select round(1123.26723,0);
     结果:1123

4、查询: select round(1123.26723,-1);
     结果: 1120

5、查询: select round(1123.26723,-2);
     结果:1100

5、查询: select round(1123.26723);
     结果:1123

5/往后偏移时间date_add()

基本语法是:date_add(date, interval num unit)
date_add()是一个函数
date表示你要进行偏移的时间,
interval是一个固定的参数,
num为数字,
unit表示你要加的单位,可以是second,minute,hour,day,month,year,都是单数,不是复数

比如:
   select  "2019-01-01" as col1,
          date_add("2019-01-01",interval 7 year) as col2,
          date_add("2019-01-01",interval 7 month) as col3 ,
          date_add("2019-01-01",interval 7 day) as col4 
   
  -- 以上,是往后偏移7年,7个月,7天,
  -- 不管数字num是一个还是多个,后面的单位unit都是单数
  
  select  "2019-01-01 01:01:01" as col1,
         date_add("2019-01-01 01:01:01",interval 7 hour) as col2,
         date_add("2019-01-01 01:01:01",interval 7 minute) as col3,
         date_add("2019-01-01 01:01:01",interval 7 second) as col4
         
  -- 如果单位是小时,分钟,秒,则前面对应的date必须是合适的数据

6/往后偏移时间 date_sub()

 基本语法是:date_sub(date,interval num unit)
 可以看到,date_sub()的格式和date_add()的格式相同。
 比如获取昨天的日期:
   在当前日期的基础上,减去1select date_sub( curdate(), interval 1 day );
  
获取昨天的日期,然后再往前推一个月:
   select date_sub( date_sub( curdate(), interval 1 day ),interval 1 month );
  
昨天日期再往前推一个月,然后取月末 :
  select  last_day(   date_sub( date_sub( curdate(), interval 1 day ),interval 1 month )  )
 
 
select   "2019-01-01" as col1,
    date_sub("2019-01-01",interval 7 year) as col2,
    date_sub("2019-01-01",interval 7 month) as col3,
    date_sub("2019-01-01",interval 7 day) as col4

7/2日期做差datediff()

 使用的datediff()函数,datediff用于返回两日期之间相差的天数,函数形式如下:
 datediff(end_date,start_date)
 我们是用end_date去减start_date的,及第一个参数-第二个参数,也就是大的日期在前面

 select datediff("2019-01-07","2019-01-01")
 通过运行上面的代码,会返回2019-01-072019-01-01之间的天数差,结果为6。
 
 mysql计算2个日期的差值和presto的函数不同

8/日期时间格式转换date_fromat()

 基本语法是:date_format( datetime,format )

select date_format("2019-12-25 22:47:37","%Y-%m-%d")
通过运行上面的代码,就会返回4位数的年、01-12的月、01-31的天,三者之间且用-分隔开来,即2019-12-25select date_format("2019-12-25 22:47:37","%H:%i:%S")
通过运行上面的代码就会返回00-23的小时、00-59的分、00-59的秒,三者之间用:分隔开来,即22:47:37

9/now() curdate() curtime()

获取当前日期和时间 now(),格式为xxxx-xx-xx xx:xx:xx
select now() 

获得当前日期 curdate(),格式为xxxx-xx-xx
select curdate() 

获取当前时间 curtime(),格式为xx:xx:xx
select curtime()

10/last_day()

 获得当前月份的最后一天
 last_day( curdate() )
 
 

11/获取当前的年,月,日,时,分,秒

select date( now() )
通过运行上面的代码,会得到与curdate()函数相同的结果。


我们也可以只获取日期中的年,使用的是year()函数,具体代码如下:
select year( now() )
通过运行上面的代码,最后得到的结果为2019。


我们也可以只获取日期中的月,使用的是month()函数,具体代码如下:
select month( now() )
通过运行上面的代码,最后得到的结果为12。


我们也可以只获取日期中的日,使用的是day()函数,具体代码如下:
select day( now() )
通过运行上面的代码,最后得到的结果为25。


我们除了有只获取当前时刻的日期的需求外,我们还有只获取当前时刻的时间需求。如果我们想只获取当前时刻的时间,只需要把只获取当前时刻日期的curdate()函数换成curtime()函数即可,具体代码如下:

select curtime()
通过运行上面的代码,就可以获取当前时刻的时间部分:22:47:37。

我们也可以先通过now()函数获取当前时刻的日期时间,然后再通过time()函数将日期时间转化为时间部分,具体代码如下:

select time( now() )
通过运行上面的代码,会得到与curdate()函数相同的结果。

我们也可以只获取时间中的小时,使用的是hour()函数,具体代码如下:

select hour( now() )
通过运行上面的代码,最后得到的结果为22。

我们也可以只获取时间中的分钟,使用的是minute()函数,具体代码如下:

select minute( now() )
通过运行上面的代码,最后得到的结果为47。

我们也可以只获取时间中的秒,使用的是second()函数,具体代码如下:

select second( now() )

12/add_months()

ADD_MONTHS(x, y)用于计算x加上y个月的结果。如果y是负数,就从x中减去y个月.
例子:
在200711日上加上13个月:
SELECT ADD_MONTHS('2007-01-01', 13)
结果:2008-02-01

13/concat(a,b)

该函数的作用是拼接字符串
比如select concat('山东省','临沂市') as location ;
结果是

count(1) count(*) count(字段)的区别

如果字段是主键,则count(字段)更快,不统计null值
如果表没有主键,则count(1) 比 count(*) 快

count(1) 和 count(*) 统计所以行数据的行,包括空行

有主键或联合主键的情况下,count(*)略比count(1)快一些。 
没有主键的情况下count(1)比count(*)快一些。 
如果表只有一个字段,则count(*)是最快的。

date_format(xxx,模式)

date_format() 函数用于以不同的格式显示日期/时间数据。

select date_format('2021-11-11','%Y-%m')
得到的结果是‘2021-11’

select date_format('2021-11-11','%Y-%M') 
得到的结果是‘2021-November’

获取建表语句

show create table 表名

添加字段

切记,只有是修改表的数据结构的操作,都是alter关键字
  alter table xxx
  add col_a varchar(50) not null comment 'xxxx' after ,
  add col_b varchar(50) not null comment 'xxxx' after ,
  add col_c varchar(50) not null comment 'xxxx' after ;

修改字段

  alter table xxx
  modify col_a varchar(50) comment 'xxxx' ,
  modify col_b varchar(50) comment 'xxxx' ,
  modify col_c varchar(50) comment 'xxx';
  

union 和 union all的区别

union 在上下合并的时候,去去除重复的行数据,然后按照一定的规则排序

union all在上下合并的时候,不会去除重复的行,合并前是100行,合并后还是100行。
        并且union all 也不会排序
        

因为union all少干了很多事情,所以速度比较快。
在实际的工作中,union all 用的比较多。