数据库函数与数据库备份

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 数据库函数与数据库备份

数据库函数

为了简化操作,数据库提供了大量的函数给程序员使用(比如你想输入当前时间,可以调用now()函数)

函数可以出现的位置:插入语句的values()中,更新语句中,删除语句中,查询语句中。

CASE表达式

相当于java中swtich语句

语法

    SELECT 
        CASE [字段,值] 
            WHEN 判断条件1 
                THEN 希望的到的值1
            WHEN 判断条件2 
                THEN 希望的到的值2
            ELSE 前面条件都没有满足情况下得到的值 
        END as 别名
    FROM table_name;


字符串函数

函数:concat(s1,s2...sn)    -- 常用。效果同使用 || 拼接字符串
描述:字符串 s1,s2 等多个字符串合并为一个字符串
实例:select concat("abc","-","def")

函数:trim(str) | ltrim(str) | rtrim(str)    -- 常用
描述:字符串去掉两侧的空格 | 字符串去掉左侧的空格 | 字符串去掉右侧的空格
实例:select trim("   数据   ")

函数:replace(s,s1,s2)    -- 常用
描述:将字符串s中的s1字符替换成s2字符
实例:select replace("abc","b","x");

函数:substr(s, start, length)    -- 常用
描述:从字符串 s 的 start 位置截取长度为 length 的子字符串
注意:索引从1开始(包含头)
实例:select substr("abcdefg",2,3);

函数:ucase(s) | upper(s)
描述:将字符串转换为大写
实例:select ucase("aaa")

函数:lcase(s) | lower(s)
描述:将字符串转换为小写
实例:select lcase("aaa")

函数:char_length(str)
描述:返回字符串 str 的字符数
实例:select char_length("hello,树先生");

函数:length(str)
描述:返回字符串 s 的字节数
(一个中文字符占3个字节 中文标点占3个字节 英文字符和英文标点都占一个字节)
实例:select length("hello,树先生");

函数:locate(s1,s)
描述:从字符串 s 中获取 s1 的开始位置
注意:索引从1开始
实例:select locate("l","hello");

函数:strcmp(str1,str2)
描述:比较字符串大小,左大于右边返回1,左等于右边返回0,左小于于右边返回-1,
实例:select strcmp("a","b");


数值函数

描述:四舍五入
函数:round(x)  -- 常用。四舍五入成整数
函数:round(x,d)  -- x指要处理的数,d是指保留几位小数
实例:round(1.5)

函数:ceil(x) | floor(x)  --常用
描述:向上(下)取整
实例:ceil(1.2)   floor(1.2)

函数:truncate(x,y)
描述:将X按照D长度在小数点后按照位数直接进行截取。-- MySQL数据库
实例:truncate(1.23456,2);

函数:substring(string [from int] [for int])
描述:抽取子字串。-- Postgresql数据库
实例:substring('Thomas' from 2 for 3)

函数:abs(x)
描述:返回 x 的绝对值  
实例:abs(-1)  -- 负变正

函数:mod(x,y)
描述:返回x mod y的结果,取余
实例:mod(10,9)  -- 余数:1

描述:返回 0 到 1 的随机数
-- MySQL
函数:rand()
-- Postgresql
函数:random()
-- Oracle
函数:dbms_random.value()
函数:dbms_random.value(a,b)    -- a为下限,b为上限,生成下限到上限之间的随机数,但不包含上限


聚合函数

常用于group by从句的select查询中

avg(col)    -- 返回指定列的平均值

count(col)    -- 返回指定列中非null值的个数

min(col)    -- 返回指定列的最小值

max(col)    -- 返回指定列的最大值

sum(col)    -- 返回指定列的所有值之和

-- 返回由属于一组的列值使用逗号进行隔开拼接组合而成的结果
group_concat(col)    -- MySQL
wm_concat()            -- Oracle
string_agg(字段,',')    -- Postgresql


高阶函数

多列记录聚合为一列记录

Oracle数据库

-- LISTAGG()函数:将多列记录聚合为一列记录,可以指定分隔符
-- 语法:
listagg(measure_expr,delimiter) within group (order by order_by_clause);
-- 解释:
measure_expr     -- 可以是基于任何列的表达式
delimiter         -- 分隔符,不填默认为NULL(即没有分隔符)
order_by_clause -- 决定了列值的拼接顺序
-- 示例
select listagg(name,’,’)within group(order by id) from test;
select id,listagg(name,’,’)within group(order by id) from test group by id;


-- vm_concat()函数:将多列记录聚合为一列记录,以 , 分隔
-- 示例:
select id,to_char(wm_concat(name)) as name from test group by id;
-- 注意:
--         1.在10g以及11g中该函数可以正常使用,但是在10g和11g中需要注意的是,vm_concat返回的数据类型是不同的
--         详见:https://blog.csdn.net/baoyuhang0/article/details/110160431
--         2.Oracle不建议使用vm_concat函数,该函数为系统内部使用。Oracle建议使用分析函数LISTAGG来代替vm_concat函数的使用

MySQL数据库

-- group_concat()函数:将多列记录聚合为一列记录,可以指定分隔符
-- 语法:
group_concat([distinct] 要连接的字段 [order by asc/desc 排序字段] [, '分隔符'])
-- 示例:以id分组,把name字段的值打印在一行,逗号分隔(默认)
select id, group_concat(name) from aa group by id;
-- 示例:以id分组,把name字段的值打印在一行,分号分隔
select id, group_concat(name separator ';') from aa group by id;
-- 示例:以id分组,把去冗余的name字段的值打印在一行
select id, group_concat(distinct name) from aa group by id;
-- 示例:以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序
select id,group_concat(name order by name desc) from aa group by id;

PostgreSQL数据库

-- string_agg()函数:将多列记录聚合为一列记录,必须指定分隔符
-- 语法:
string_agg(expression, '分隔符' [order by asc/desc 排序字段])
-- 示例:
select string_agg(name,’,’) from test group by id;
select deptno, string_agg(name,’,’ order by name desc) from test group by deptno;
-- 注意:
-- 注意的是:
--         1.order by 语句需要写在分隔符的后面,这是PostgreSql的语句;
--         2.order by 后面的字段不受整个语句的 group by 语句后面的字段的限制,可以是ename,可以ssal等等,只是不同字段的排序ename的合并顺序会随之改变;


空值的转换

Oracle数据库

-- NVL()函数:实现空值的转换
-- 语法:
NVL(string1, replace_with)
-- 解释:
--         当第一个参数(string1)为空时,返回第二个参数(replace_with)
--         当第一个参数(string1)不为空时,则返回第一个参数(string1)
-- 注意:NVL()函数的第一个参数和第二个参数类型必须相同,或者可以由隐式转换得到

-- 拓展:NVL2()函数
-- 语法:
NVL2(E1, E2, E3)
-- 解释:当E1为NULL时,返回E3;当E1不为NULL时,返回E2。

MySQL数据库

-- IFNULL()函数
-- 语法:
IFNULL(expr1, expr2)
-- 解释:
--        如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2
--         IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境

PostgreSQL数据库

-- coalesce()函数
-- 语法:
coalesce(expr1, expr2)
-- 解释:
--         如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2

<be/>

获取两个日期的时间间隔

Oracle数据库

extract(second from date1-date2)

MySQL数据库

-- datediff()函数:获取两个日期的时间间隔
-- 语法:
datediff(date1, date2)
-- 解释:
    --    返回 date1 - date2 的天数(只取日期部分计算)

PostgreSQL数据库

-- age()函数:对时间进行计算,得到interval。使用extract epoch对interval 转换得到秒。
-- 使用示例:
extract(epoch from age(TO_TIMESTAMP('2016-01-01', 'YYYY-MM-DD'), TO_TIMESTAMP('2015-03-01', 'YYYY-MM-DD')))
extract(epoch from date1-date2)


MySQL数据库

菜鸟教程:https://www.runoob.com/mysql/mysql-functions.html

日期函数

函数:now() | curdate() | curtime()  --常用
描述:获取系统当前日期时间、日期、时间
实例:select now()   select curdate()   select curtime()

函数:adddate(date,n) | subdate(date,n) --常用
描述:计算起始日期 date 加(减) n 天的日期
实例:select adddate(now(),7);  select subdate(now(),7)

函数:datediff(d1,d2)   --常用
描述:计算日期之间相隔的天数
实例:select datediff(now(),"1989-10-02");

函数:date_format(d,f)  --常用
描述:按表达式f的要求显示日期 d
实例:select date_format(now(),"%Y-%m-%d %H:%i:%s %p");

函数:year(date) | month(date) | day(date)
描述:从日期中选择出年、月、日
实例:select year(now())   select month(now())   select day(now())

函数:last_day(date)
描述:返回月份的最后一天
实例:select last_day(now())

函数:quarter(date)
描述:返回日期 date 是第几季节,返回 1 到 4
实例:select quarter(now())


IF 表达式

相当于java中三元运算符

语法

SELECT IF(1 > 0,'真','假') from 表名;


Oracle数据库

日期函数

-- 获取系统当前时间
sysdate
-- 实例
select sysdate from dual;

-- 获取系统当前时间并格式化为字符串
to_char(sysdate,'yyyy-MM-dd HH24:mi:ss')

-- 把字符串解析成时间
to_date('2015-08-12 15:53:37','yyyy-MM-dd HH24:mi:ss)

-- 当前时间减去7分钟
select sysdate - interval '7' minute from dual
-- 表示当前时间减去7小时
select sysdate - interval '7' hour from dual
-- 表示当前时间减去7年
select sysdate - interval '7' year from dual 
-- 时间转换中字符的意义 
表示year的:
y         表示年的最后一位
yy         表示年的最后2位
yyy     表示年的最后3位
yyyy     用4位数表示年

表示month的:
mm         用2位数字表示月 
mon     用简写形式, 比如:11月 或者 nov 
month     用全称, 比如:11月 或者 november

表示day的:
dd         表示当月第几天
ddd     表示当年第几天
dy         当周第几天,简写, 比如:星期五 或者 fri
day     当周第几天,全称, 比如:星期五 或者 friday

表示hour的:
hh HH HH12    表示小时 12进制
hh24 HH24     表示小时 24小时

表示minute的:
mi         2位数表示分钟

表示second的:
ss         2位数表示秒 60进制

表示季度的:
q         1位数表示季度 (1-4)

表示周的:
w        表示当月月的第几周
ww         用来表示当年第几周 w用来表示当月第几周。


decode函数

decode(条件, 值1, 返回值1, 值2, 返回值2, … 值n, 返回值n, 缺省值)

-- 含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF

MySQL和Postgresql数据库没有decode函数,可用CASE表达式替代。


Postgresql数据库

日期函数

-- 返回当前实际的时间,即使在同一个 SQL 语句中也可能返回不同的值
clock_timestamp()

-- 获取当前事务开始的完整时间,包括时区,秒也保留到了6位小数。在同一个事务期间,多次调用相同的函数将会返回相同的值
now()
current_timestamp
transaction_timestamp()
-- 实例。得到的结果:'2014-12-24 09:28:31.545145+08'
select now();

-- 只显示当前的时间,不包括日期
current_time 
-- 实例
select current_time;

-- 只显示当前的日期,不包括小时等信息
current_date
-- 实例    
select current_date;

-- 获取系统当前时间戳并格式化为字符串
to_char(clock_timestamp(),'yyyy-MM-dd HH24:mi:ss')
 
-- 把时间戳转换成字符串
to_timestamp('2014-12-24 09:28:31', 'yyyy-MM-dd HH24:mi:ss')


if 表达式

-- 示例1
DO
$do$
BEGIN
IF (SELECT count(1) AS num FROM orders) = 0
THEN
    DELETE FROM orders;
ELSE 
   INSERT INTO orders VALUES (1,2,3);
END IF;
END;
$do$;

-- 示例2
DO
$do$
BEGIN
IF EXISTS (SELECT 1 FROM orders) 
THEN
   DELETE FROM orders;
ELSE 
   INSERT INTO orders VALUES (1,2,3);
END IF;
END;
$do$;

for 循环

for...in 循环

  • 这种形式的 for 会创建一个在一个整数范围上迭代的循环。
  • 变量 name 会自动定义为类型 integer,并且只在循环内存在(任何该变量名的现有定义在此循环内都将被忽略)。
  • 给出范围上下界的两个表达式在进入循环的时候计算一次。
  • 如果没有指定BY子句,迭代步长为 1,否则步长是BY中指定的值,该值也只在循环进入时计算一次。如
  • 果指定了 REVERSE,那么在每次迭代后步长值会被减除而不是增加。

语法:

[ <> ] FOR target IN query LOOP
statements
END LOOP [ label ];

示例:

FOR i IN 1..10 LOOP
-- 我在循环中将取值 1,2,3,4,5,6,7,8,9,10
END LOOP;

FOR i IN REVERSE 10..1 LOOP
-- 我在循环中将取值 10,9,8,7,6,5,4,3,2,1
END LOOP;

FOR i IN REVERSE 10..1 BY 2 LOOP
-- 我在循环中将取值 10,8,6,4,2
END LOOP;

数组循环。示例:

create or replace function test_for_in() returns void as $$
DECLARE
    tmp_arr varchar ARRAY:= ARRAY['a', 'b'];
BEGIN
    FOR i IN 1...array_length(tmp_arr, 1)
    LOOP
        update user set age='15' where name=tmp_arr[i]
    END LOOP;
END;
$$ LANGUAGE plpgsql;

-- 测试
select test_for_in();

通过一个查询的结果进行迭代并且操纵相应的数据。语法:

[ <> ] FOR target IN query LOOP
statements
END LOOP [ label ];

示例:

create or replace function test_for_in() returns int as $$
DECLARE
    cddm record;
BEGIN
    RAISE NOTICE 'reading jcb_cddm...';
    FOR cddm IN SELECT * FROM jcb_cddm limit 5 
    LOOP
        RAISE NOTICE '场地代码为:%,场地名称为 %', cddm.dm, quote_ident(cddm.mc);
    END LOOP;
    return 1;
END;
$$ LANGUAGE plpgsql;


数据备份与还原

mysqldump:MySQL数据库备份

mysqldump命令是MySQL数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中。

语法格式:

mysqldump [选项] 数据库名 [表名] > 脚本名
mysqldump [选项] --数据库名 [选项 表名] > 脚本名
mysqldump [选项] --all-databases [选项]  > 脚本名

# 常用参数:
    -h, --host        服务器IP地址
    -P. --port        服务器端口号
    -u, --user        MySQL 用户名
    -p, --pasword    MySQL 密码
    --databases            指定要备份的数据库
    --all-databases        备份mysql服务器上的所有数据库
    --compact        压缩模式,产生更少的输出
    --comments        添加注释信息
    --complete-insert    输出完成的插入语句
    --lock-tables        备份前,锁定所有数据库表
    --no-create-db/--no-create-info        禁止生成创建数据库语句
    --force            当出现错误时仍然继续备份操作
    --default-character-set        指定默认字符集
    --add-locks        备份数据库表时锁定数据库表
    --ignore-table    备份数据时库排除某表

参考实例:

# 导出整个数据库:
mysqldump -u linuxcool -p smgp_apps_linuxcool > linuxcool.sql
# 导出指定的数据库:
mysqldump -u linuxcool -p smgp_apps_linuxcool users > linuxcool_users.sql
# 备份指定数据库指定表(多个表以空格间隔)
mysqldump -uroot -p  mysql db event > /backup/mysqldump/2table.sql
# 导出一个数据库结构:
mysqldump -u linuxcool -p -d --add-drop-table smgp_apps_linuxcool > linuxcool_db.sql
# 备份指定数据库排除某些表
mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.sql

备份还原命令:

mysqladmin -uroot -p create db_name 
mysql -u root -p password db_name < /backup/mysqldump/db_name.db

# 注:在导入备份数据库前,db_name如果没有,是需要创建的; 而且与db_name.db中数据库名是一样的才可以导入。

k8s部署 定时备份mysql数据库及还原命令:

# 创建定时任务
crontab -e
# 定时任务(每天0点执行):
0 0 * * * /usr/local/bin/kubectl exec `/usr/local/bin/kubectl get po | grep mysql | awk '{print $1}'` -- mysqldump -u user -p password db_name > /root/mysql-bak/`date + \%d`.sql 2>&1

# 注:2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了~.sql。那么标准错误也会输出到~.sql文件里

# 还原命令:
/usr/local/bin/kubectl exec `/usr/local/bin/kubectl get po | grep mysql | awk '{print $1}'` -- mysql -u user -p password db_name < /root/mysql-bak/`date + \%d`.sql
相关文章
|
9月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
70 0
|
3月前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
3月前
|
SQL 测试技术 数据库
|
4月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
9月前
|
SQL 存储 关系型数据库
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
475 0
|
6月前
|
SQL 数据处理 数据库
|
6月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
698 0
|
8月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础第二篇(函数)
MySQL数据库基础第二篇(函数)
|
8月前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
63 5
|
9月前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)

热门文章

最新文章