• [其他问题] PGXC_STAT_ACTIVITY中 stmt_type=RELEASE,RELEASE表示是什么类型的操作,比如有哪些
    PGXC_STAT_ACTIVITY中 stmt_type=RELEASE,RELEASE表示是什么类型的操作,比如有哪些
  • GaussDB数据库基础函数介绍-下
    接上一篇,本节继续介绍GaussDB数据库常用基础函数GaussDB常用基础函数介绍与示例5、范围函数在GaussDB数据库中,范围函数是指用于处理数据库范围的函数。以下是一些常见的数据库范围函数:--numrange(numeric, numeric, [text])--描述:表示一个范围。--返回类型:范围元素类型--lower(anyrange)--描述:范围的下界。--返回类型:范围元素类型--upper(anyrange)--描述:范围的上界--返回类型:范围元素类型--isempty(anyrange)--描述:范围是否为空--返回类型:BooleanSELECT numrange(1,2.5) AS RESULT1,numrange(1,2.5, '()') AS RESULT2,lower(numrange(1,2.5)) AS RESULT3,upper(numrange(1,2.5)) AS RESULT4,isempty(numrange(1,2.5)) AS RESULT5 ;6、窗口函数在GaussDB数据库中,窗口函数是指用于处理窗口(例如表的行级别或列级别)的函数。这些函数通常用于查询、更新和排序数据,以确保数据的正确性和完整性。列存表目前只支持rank(expression)和row_number(expression)两个函数。窗口函数与OVER语句一起使用。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号。窗口函数中的order by后面必须跟字段名,若order by后面跟数字,该数字会被按照常量处理,因此对目标列没有起到排序的作用。以下是一些常见的数据库窗口函数:--RANK()--描述:RANK函数为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。--返回值类型:BIGINT--ROW_NUMBER()--描述:ROW_NUMBER函数为各组内值生成连续排序序号,其中,相同的值其序号也不相同。--返回值类型:BIGINT7、聚集函数在GaussDB数据库中,数据库聚集函数是指用于对数据库中的数据进行聚合计算的函数。这些函数通常用于处理大量数据,例如表中的行数据。以下是一些常见的数据库聚集函数:--sum(expression)--描述:所有输入行的expression总和。--返回类型: 通常情况下输入数据类型和输出数据类型是相同的,但以下情况会发生类型转换:--对于SMALLINT或INT输入,输出类型为BIGINT。--对于BIGINT输入,输出类型为NUMBER 。--对于浮点数输入,输出类型为DOUBLE PRECISION。--max(expression)、min(expression)--描述:所有输入行中expression的最大值、最小值。--参数类型:任意数组、数值、字符串、日期/时间类型。--返回类型:与参数数据类型相同--avg(expression)--描述:所有输入值的均值(算术平均)。--返回类型:对于任何整数类型输入,结果都是NUMBER类型。对于任何浮点输入,结果都是DOUBLE PRECISION类型。否则和输入数据类型相同。--count(expression) 描述:返回表中满足expression不为NULL的行数。 count(*) 描述:返回表中的记录行数。--返回类型:BIGINTselect sum(column1),max(column1),min(column1),avg(column1),count(column1),count(*) from test1--array_agg(expression)--描述:将所有输入值(包括空)连接成一个数组。--返回类型:参数类型的数组--string_agg(expression, delimiter)--描述:将输入值连接成为一个字符串,用分隔符分开。--返回类型:和参数数据类型相同。select array_agg(column1),string_agg(column1,'|') from test1--listagg(expression [, delimiter]) WITHIN GROUP(ORDER BY order-list)--描述:将聚集列数据按WITHIN GROUP指定的排序方式排列,并用delimiter指定的分隔符拼接成一个字符串。--expression:必选。指定聚集列名或基于列的有效表达式,不支持DISTINCT关键字和VARIADIC参数。--delimiter:可选。指定分隔符,可以是字符串常数或基于分组列的确定性表达式,缺省时表示分隔符为空。--order-list:必选。指定分组内的排序方式。--返回类型:textselect column1,listagg(column2,'|') within group(order by column1) from test1 group by column1;8、安全函数在GaussDB数据库中,安全函数是指用于提高数据库安全性的函数。这些函数通常用于检查和处理数据库操作时可能出现的数据安全情况,例如加密等。以下是一些常见的数据库安全函数:--gs_encrypt_aes128(encryptstr,keystr)--描述:使用基于keystr派生出的密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为8~16字节,并且至少包含大写字母、小写字母、数字和特殊字符中的三种字符。--支持的加密数据类型:目前数据库支持的数值类型,字符类型,二进制类型中的RAW,日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。--返回值类型:text--返回值长度:至少为92字节,不超过4*[(Len+68)/3]字节,其中Len为加密前数据长度(单位为字节)。--说明:由于该函数的执行过程需要传入口令,为了安全起见,gsql工具不会将包含该函数名字样的SQL记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。--gs_decrypt_aes128(decryptstr,keystr)--描述:使用基于keystr派生出的密钥对decrypt字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正确解密。keystr不得为空。--说明:此函数需要结合gs_encrypt_aes128加密函数共同使用。--返回值类型:text--加密SELECT gs_encrypt_aes128('123','P@ssw0rd');--解密select gs_decrypt_aes128('XG09Q6u9VOBUf+eWC6/COTR3PX+AYm+G6vcMbdqjG8muGsGYplPdXP2vPVFRyU+vGLUHtbNWaxnpAO+6pGKSq9bLsIU=','P@ssw0rd')--gs_encrypt(encryptstr,keystr, encrypttype)--描述:根据encrypttype,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为8~16字节,至少包含3种字符(大写字母、小写字母、数字、特殊字符), encrypttype可以是aes128或sm4。--返回值类型:text--说明:由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将包含该函数名字样的SQL记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。--gs_decrypt(decryptstr,keystr,decrypttype)--描述:根据decrypttype,以keystr为密钥对decrypt字符串进行解密,返回解密后的字符串。--解密使用的decrypttype 及keystr必须保证与加密时使用的encrypttype 及keystr一致才能正常解密。keystr不得为空。decrypttype可以是aes128或sm4。--此函数需要结合gs_encrypt加密函数共同使用。--返回值类型:text--说明:由于该函数的执行过程需要传入解密口令,为了安全起见,gsql工具不会将包含该函数名字样的SQL记录入执行历史;即无法在gsql里通过上下翻页功能找到该函数的执行历史。SELECT gs_encrypt('123','P@ssw0rd','sm4'),gs_encrypt('123','P@ssw0rd','aes128');select gs_decrypt('h4NdduY5s7++5Qp7m1pgdgKORQ==','P@ssw0rd','sm4'),gs_decrypt('roBb4Wg/GjiW9g6gfpth7+ZliaCoYI+/nQd5FruETUpnOcj2veZ3gulEyxLnGh02tUj1/mdL4NJPaeNi3WAskdTs3wU=','P@ssw0rd','aes128');9、系统信息函数在GaussDB数据库中,主要是包含数据库相关的信息,例如数据库系统版本信息、状态信息、用户信息等,这些系统信息函数通常用于数据库管理系统中,用于管理和监控数据库的运行状态和性能指标。以下是一些常见的数据库系统信息函数:--current_catalog--描述:当前数据库的名称(在标准SQL中称"catalog")。--返回值类型:name--current_database()--描述:当前数据库的名称。--返回值类型:name--current_schema()--描述:当前模式的名称。--返回值类型:name--备注:current_schema返回在搜索路径中第一个顺位有效的模式名。(如果搜索路径为空则返回NULL,没有有效的模式名也返回NULL)。如果创建表或者其他命名对象时没有声明目标模式,则将使用这些对象的模式。SELECT current_catalog,current_database(),current_schema();--current_user--描述:当前执行环境下的用户名。--返回值类型:name--备注:current_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过SET ROLE改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。--definer_current_user--描述:当前执行环境下的用户名。--返回值类型:name--备注:大多数情况下definer_current_user和current_user结果相同,但在存储过程中执行该函数会返回定义当前存储过程的用户名。select current_user,definer_current_user();--inet_client_addr()--描述:连接的远端地址。inet_client_addr返回当前客户端的IP地址。--说明:此函数只有在远程连接模式下有效。--返回值类型:inet--inet_client_port()--描述:连接的远端端口。inet_client_port返回当前客户端的端口号。--说明:此函数只有在远程连接模式下有效。--返回值类型:int--inet_server_addr()--描述:连接的本地地址。inet_server_addr返回服务器接收当前连接用的IP地址。--说明:此函数只有在远程连接模式下有效。--返回值类型:inet--inet_server_port()--描述:连接的本地端口。inet_server_port返回接收当前连接的端口号。如果是通过Unix-domain socket连接的,则所有这些函数都返回NULL。--说明:此函数只有在远程连接模式下有效。--返回值类型:intSELECT inet_client_addr(),inet_server_port(),inet_server_addr(),inet_server_port();--pg_postmaster_start_time()--描述:服务器启动时间。pg_postmaster_start_time返回服务器启动时的timestamp with time zone。--返回值类型:timestamp with time zoneselect pg_postmaster_start_time() ;--opengauss_version()--描述:引用的openGauss内核版本信息。--返回值类型:text--version()--描述:版本信息。version返回一个描述服务器版本信息的字符串。--返回值类型:text--getdatabaseencoding()--描述:获取数据库编码方式。--返回值类型:nameselect opengauss_version(),version(),getdatabaseencoding();--session_user--描述:会话用户名。--返回值类型:name--备注:session_user通常是连接当前数据库的初始用户,不过系统管理员可以用SET SESSION AUTHORIZATION修改这个设置。--user--描述:等价于current_user。--返回值类型:name--getpgusername()--描述:获取数据库用户名。--返回值类型:nameSELECT session_user,user,current_user;--pg_get_tabledef(table_name)--描述:根据table_name获取表定义。--返回类型:text--备注:pg_get_tabledef重构出表定义的CREATE语句,包含了表定义本身、索引信息、comments信息。--对于表对象依赖的group、schema、tablespace、server等信息,需要用户自己去创建,表定义里不会有这些对象的创建语句。--pg_get_viewdef(view_name)--描述:为视图获取底层的SELECT命令select * from pg_get_tabledef('test1'),pg_get_viewdef('test1_view');--has_any_column_privilege(user, table, privilege)--描述:指定用户是否有访问表任何列的权限。--返回类型:Boolean--has_any_column_privilege(table, privilege)--描述:当前用户是否有访问表任何列的权限,合法参数类型见表2。--返回类型:Boolean--has_column_privilege(user, table, column, privilege)--描述:指定用户是否有访问列的权限。--返回类型:Boolean--has_column_privilege(table, column, privilege)--描述:当前用户是否有访问列的权限,合法参数类型见表3。--返回类型:Boolean--以上的table、column 可以替换成database、function、schema、sequence、tablespace等对象--参数privilege:SELECT:允许对表的指定列执行SELECT语句。 INSERT:允许对表的指定列执行INSERT语句。UPDATE:允许对表的指定列执行UPDATE语句。--REFERENCES:允许创建一个外键约束。COMMENT:允许对表的指定列执行COMMENT语句。select has_any_column_privilege('root','test1','select'),has_any_column_privilege('test1','select')10、动态脱敏函数在GaussDB数据库中,动态脱敏函数是指根据用户输入的查询条件动态生成敏感信息,并进行脱敏处理的函数。这些函数通常用于对用户输入的敏感数据进行脱敏处理,以保护数据的安全性和隐私性。以下是一些常见的数据库动态脱敏函数:--creditcardmasking(col text, letter char default 'x')--描述:将col字符串后四位之前的数字使用letter替换。--参数:待替换的字符串、替换字符。--返回值类型:text--alldigitsmasking(col text, letter char default '0')--描述:将col字符串中出现的数字使用letter替换。--参数:待替换的字符串、替换字符。--返回值类型:text--randommasking(col text)--描述:将col字符串中的字符随机化。--参数:待替换的字符串、替换字符。--返回值类型:text--shufflemasking(col text)--描述:将col字符串中的字符乱序排列。--参数:待替换的字符串、替换字符。--返回值类型:textselect creditcardmasking('15021750702', '*'),alldigitsmasking('123abc','0'),randommasking('123abc'),shufflemasking('123abc');本次介绍到此结束, 更多函数可参考官网资料文档~ 欢迎大家交流、学习!https://support.huaweicloud.com/opengauss/index.html
  • GaussDB数据库基础函数介绍-上
    前言函数是数据库中最基本的组成部分之一,它们用于定义和操作数据库中的表格、记录、索引和视图等对象。在数据库中,函数的作用非常重要,因为它们可以实现数据的复杂操作,如查询、更新、删除和排序等。作为华为自主创新研发的分布式关系型云数据库,GaussDB也拥有强大的函数支持体系。 本文主要从:数字操作函数、时间和日期处理函数、类型转换函数、数组函数、范围函数、窗口函数、聚集函数、安全函数、系统信息函数、动态脱敏函数等方面作一个简单介绍。一、函数在数据库中的作用首先,我们先来了解一下函数在数据库中的作用:实现数据的复杂操作:函数可以用于实现数据的复杂操作,如查询、更新、删除和排序等,从而提高了数据库的操作效率。提高程序的可读性:函数可以用于定义复杂的SQL语句,从而使得程序的代码更加简洁明了。这有助于提高程序的可读性,使得代码更容易被他人理解和维护。提高程序的效率:函数可以用于减少重复编写程序段的工作量,从而提高程序的编译和运行效率。此外,函数还可以减少网络传输的数据量,从而提高程序的运行效率。支持标准组件式编程:函数可以用于实现标准组件式编程,从而提高程序的可重用性、共享性和可移植性。支持算法设计的基本要求:函数可以用于实现算法设计的基本要求,如正确性、可读性、健壮性、效率和低存储量需求。这些要求可以通过函数来实现,从而使得程序更加健壮、高效和可靠。二、GaussDB常用基础函数介绍与示例1、数字操作函数在GaussDB数据库中,数字操作函数是指用于执行数字操作的函数,例如加减乘除、取余、幂运算等。这些函数通常在数学、计算机科学和工程学等领域中使用,用于处理数字数据和执行数字操作。以下是一些常见的数字操作函数:--abs(x)--描述:绝对值。--返回值类型:和输入相同。SELECT abs(-17.4);--ceil(x)--描述:不小于参数的最小的整数。--返回值类型:整数。select ceil(42.3),ceil(-42.3)--div(y numeric, x numeric)--描述:y除以x的商的整数部分。--返回值类型:numericselect div(10,4)--floor(x)--描述:不大于参数的最大整数。--返回值类型:与输入相同。select floor(-42.3),floor(42.3)--random()--描述:0.0到1.0之间的随机数。--返回值类型:double precisionselect random(),random()--multiply(x double precision or text, y double precision or text)--描述:x和y的乘积。--返回值类型:double precisionselect multiply('4.0',3),multiply(4,'3.0')--mod(x,y)--描述:x/y的余数(模) ,如果x是0,则返回y。--返回值类型:与参数类型相同。select mod(10,3),mod(0,2)--round(x)--描述:离输入参数最近的整数。--返回值类型:与输入相同。select round(-10.9),round(10.1)--round(v numeric, s int)--描述:保留小数点后s位,s后一位进行四舍五入。--返回值类型:numericselect round(0.123456,2),round(10.654321,1)--trunc(x)--描述:截断(取整数部分)。--返回值类型:与输入相同。SELECT trunc(10.23)--trunc(v numeric, s int)--描述:截断为s位小数。--返回值类型:numericSELECT trunc(10.123456,2),trunc(10.654321,1)2、时间和日期处理函数在GaussDB数据库中,时间和日期处理函数用于处理和操作日期和时间相关的数据。这些函数包括获取当前日期和时间的函数、将日期和时间转换为数字格式的函数、处理日期和时间的函数等。用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。以下是一些常见的数据库时间和日期处理函数:--age(timestamp, timestamp)--描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。--返回值类型:interval--age(timestamp)--描述:当前时间和参数相减,入参可以带或者不带timezone。--返回值类型:intervalSELECT age(timestamp '2023-04-19', timestamp '1988-08-13'),age(timestamp '1988-08-13');--clock_timestamp()--描述:实时时钟的当前时间戳。volatile函数,每次扫描都会取最新的时间戳,因此在一次查询中每次调用结果不相同。--返回值类型:timestamp with time zone--current_time--描述:当前时间。--返回值类型:time with time zone--current_date--描述:当前日期。--返回值类型:date--current_timestamp--描述:当前日期及时间。语句级别时间,同一个语句内返回结果不变。--返回值类型:timestamp with time zoneselect clock_timestamp(),current_time,current_date,current_timestamp--date_part(text, timestamp)--描述:获取日期或者时间值中子域的值,例如年或者小时的值。--等效于extract(field from timestamp)。--timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。--返回值类型:double precision--date_part(text, interval)--描述:获取月份的值。如果大于12,则取与12的模。等效于extract(field from timestamp)。--返回值类型:double precisionSELECT date_part('hour', timestamp '2023-04-19 18:30:40'),date_part('month', interval '2 years 3 months');--date_trunc(text, timestamp)--描述:截取到参数text指定的精度。--返回值类型:interval、timestamp with time zone、timestamp without time zone--trunc(timestamp)--描述:默认按天截取。--trunc(arg1, arg2)--描述:截取到arg2指定的精度。--arg1类型:interval、timestamp with time zone、timestamp without time zone--arg2类型:text--返回值类型:interval、timestamp with time zone、timestamp without time zoneSELECT date_trunc('hour', timestamp '2023-04-16 20:38:40'),trunc(timestamp '2023-04-16 20:38:40'),trunc(timestamp '2023-04-16 20:38:40', 'minute');--isfinite(date)--描述:测试是否为有效日期。--返回值类型:Boolean--isfinite(timestamp)--描述:测试判断是否为有效时间。--返回值类型:BooleanSELECT isfinite(date '2023-04-19'),isfinite(timestamp '2023-4-19 21:28:30');--localtime--描述:当前时间。--返回值类型:time--localtimestamp--描述:当前日期及时间。--返回值类型:timestamp--now()--描述:当前日期及时间。事务级别时间,同一个事务内返回结果相同。--返回值类型:timestamp with time zone--timenow()--描述:当前日期及时间。--返回值类型:timestamp with time zoneselect localtime,localtimestamp,now(),timenow();--add_months(d,n)--描述:用于计算时间点d再加上n个月的时间。--d:timestamp类型的值,以及可以隐式转换为timestamp类型的值。--n:INTEGER类型的值,以及可以隐式转换为INTEGER类型的值。--返回值类型:timestampSELECT add_months(to_date('2023-4-19', 'yyyy-mm-dd'), 11);3、类型转换函数在GaussDB数据库中,类型转换函数是指用于将数据库中的数据类型转换为其他数据类型的函数。这些函数通常用于处理不同类型的数据,例如将整数转换为浮点数、将字符串转换为数字等。以下是一些常见的数据库类型转换函数:--cast(x as y)--描述:类型转换函数,将x转换成y指定的类型。SELECT cast('20-Apr-2023' as timestamp),cast('20230420' as timestamp),cast('20230420' as int);--cast(x as y)--to_char (datetime/interval [, fmt])--描述:将一个DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE或者TIMESTAMP WITH LOCAL TIME ZONE类型的DATETIME或者INTERVAL值按照fmt指定的格式转换为VARCHAR类型。--可选参数fmt可以为以下几类:日期、时间、星期、季度和世纪。每类都可以有不同的模板,模板之间可以合理组合,常见的模板有:HH、MM、SS、YYYY、MM、DD。--模板可以有修饰词,常用的修饰词是FM,可以用来抑制前导的零或尾随的空白。--返回值类型:varcharSELECT to_char(current_timestamp,'HH12:MI:SS'),to_char(current_timestamp,'yyyymmdd'),to_char(current_timestamp,'dd-mm-yyyy');--to_char (numeric/smallint/integer/bigint/double precision/real[, fmt])--描述:将一个整型或者浮点类型的值转换为指定格式的字符串。--可选参数fmt可以为以下几类:十进制字符、“分组”符、正负号和货币符号,每类都可以有不同的模板,模板之间可以合理组合,常见的模板有:9、0、,(千分隔符)、.(小数点)。--模板可以有类似FM的修饰词,但FM不抑制由模板0指定而输出的0。--要将整型类型的值转换成对应16进制值的字符串,使用模板X或x。--返回值类型:varcharSELECT to_char(9527,'9,999'),to_char(9527.0,'9,999.999');--to_char (string)--描述:将CHAR、VARCHAR、VARCHAR2、CLOB类型转换为VARCHAR类型。--如使用该函数对CLOB类型进行转换,且待转换CLOB类型的值超出目标类型的范围,则返回错误。--返回值类型:varcharSELECT to_char('9527');--to_date(text)--描述:将文本类型的值转换为指定格式的时间戳。--返回值类型:timestamp without time zone--to_date(text, text)--描述:将字符串类型的值转换为指定格式的日期。--返回值类型:timestamp without time zoneSELECT to_date('2023-04-20'),to_date('20 Apr 2023', 'DD Mon YYYY');4、数组函数在GaussDB数据库中,数组函数是指用于操作数组的函数,例如插入、删除、修改、排序等。这些函数通常用于处理大量数据,例如表中的行数据。以下是一些常见的数据库数组函数:--array_append(anyarray, anyelement)--描述:向数组末尾添加元素,只支持一维数组。--返回类型:anyarray--array_prepend(anyelement, anyarray)--描述:向数组开头添加元素,只支持一维数组。--返回类型:anyarraySELECT array_append(ARRAY[1,2], 3) as result1 ,array_prepend(1,ARRAY[2,3]) as result2;--array_cat(anyarray, anyarray)--描述:连接两个数组,支持多维数组。--返回类型:anyarray--array_union(anyarray, anyarray)--描述:连接两个数组,只支持一维数组。--返回类型:anyarray--array_union_distinct(anyarray, anyarray)--描述:连接两个数组,并去重,只支持一维数组。--返回类型:anyarray--array_intersect(anyarray, anyarray)--描述:两个数组取交集,只支持一维数组。--返回类型:anyarraySELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) AS RESULT1,array_union(ARRAY[1,2,3], ARRAY[3,4,5]) AS RESULT2,array_union_distinct(ARRAY[1,2,3], ARRAY[3,4,5]) AS RESULT3,array_intersect(ARRAY[1,2,3], ARRAY[3,4,5]) AS RESULT4;--array_delete(anyarray)--描述:清空数组中的元素并返回一个同类型的空数组。--返回类型:anyarray--array_deleteidx(anyarray, int)--描述:从数组中删除指定下标的元素并返回剩余元素组成的数组。--返回类型:anyarray--array_trim(anyarray, int)--描述:从数组尾部删除指定个数个元素。--返回类型:anyarraySELECT array_delete(ARRAY[1,8,3,7]) AS RESULT1,array_deleteidx(ARRAY[1,2,3,4,5], 1) AS RESULT2,array_trim(ARRAY[1,8,3,7],1) AS RESULT4;由于篇幅缘故,剩余“5.范围函数、6.窗口函数、7.聚集函数、8.安全函数、9.系统信息函数、10.动态脱敏函数”部分见下一篇《 GaussDB数据库基础函数介绍-下》
  • [技术解读] 再识华为云数据库——GaussDB
    《再识华为云数据库——GaussDB》一、前言华为云数据库 GaussDB是一款拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务。同时具有PB级海量数据存储、实时高效访问、自动化运维等特点,广泛应用于金融、电信、物流、电商、政体等行业,成为行业最受欢迎的企业级数据库之一。GaussDB在经过多年的优化和升级,目前已经发展成为华为云的核心产品之一。其先进的技术架构和优秀的性能表现,在国际和国内市场上都赢得了良好的口碑和市场占有率。未来随着云计算技术和大数据应用不断发展,GaussDB将在市场竞争中不断突破创新,提升性能表现和可靠性,满足更多用户的需求。同时,GaussDB还将继续加强与其他华为云的产品的协同,进一步推进数字化转型和智能化建设。二、GaussDB: 立足创新与自研,助力企业核心数据安全高效上云云数据库GaussDB,一方面拥抱并兼容MySQL等生态,另一方面打造自己的openGauss生态,主要面向政企客户,强调高性能、高可靠、高安全等方面诉求。同时,打造数据库结构+ 应用+数据一站式迁移工具方案,让客户选型安心、迁移放心、管理省心,目前已经规模应用在金融、电 信、泛政府、能源、交通、互联网等各行业。1、选型:全业务场景、全开放生态、安全可信2、迁移:数据库结构+应用+数据一站式迁移3、管理:无缝协同上层应用,三、GaussDB: 基于华为openGauss开放生态打造的 金融级分布式数据库1、定位为企业级云分布式数据库,架构上着重构筑传统数据库的企业级能力和互联网分布式数据库的高扩展和高可用能力2、方案优势:高可用:同城AZ内节点故障,RPO=0,RTO<60s;保证数据0丢失。两地三中心异地容灾方案,跨Region数据实时灾备混合负载高性能:支持高吞吐强一致性事务能力,鲲鹏2路服务器,32节点1500万tpmC高扩展性:1000+计算节点在线扩展,卓越线性比高安全:业界首个纯软全密态数据库技术,实现数据从传输、计算到存储的全程加密全栈软硬自研可控,生态可控:业界领先的存储+网络+计算+openGauss自研开放生态3、案例:G行A、B类核心业务商用GaussDB1)此业务通过三个阶段完成切换:第一阶段,商密公文系统投产;第二阶段,贵金属业务投产;第三阶段,个人网上银行业务投产。AS Is(切换前的现状):To Be(切换后的状态):2)方案优势:高可用:同城单Region多AZ互联支持同城双活,金融级支持三层组网的管控高可用部署方案性能线性扩展:支持集群水平扩展,基本联机性能与Oracle持平弹性部署:部署实例及应用要快速响应业务需求,数据库支持容器化部署四、GaussDB(for MySQL): 基于开源生态打造的企业级自研云原生数据库1、存算分离,业界领先架构,释放华为软硬结合技术积累。2、方案优势:巅峰性能:多层级并行计算+NDP近数据计算下推,TPCH场景性能可达友商34倍海量存储高可靠:DB-inside分布式存储,由开源2T扩展至128T,存储三副本,秒级备份Serverless极致弹性:首创分布式行锁及remote log cache技术,支持16个主节点扩展,线性比达0.7。独创OCC&PCC混合并发控制技术,支持高并发下事务冲突无失败回滚极致安全:计划内停机RTO=0,计划外停机RTO< 10秒。两地三中心架构,跨Region数据实时灾备生态友好:100%兼容MySQL 8.0五、DRS+UGO:数据库结构+应用+数据一站式迁移1、DRS:数据同步黑科技加持,全场景安心迁移2、UGO:一键迁移数据库对象,消除异构数据库迁移忧虑3、案例:永安保险商用GaussDB(for MySQL)+DRS1)核心诉求: 搬迁某主流商业数据库2)解决方案:全栈工具链切换商业数据库+专家服务。 超预期4倍+满足客户诉求六、GaussDB NoSQL:国内首家,业内领先多模非关系型数据库服务1、独创的ALL-PRIMARY技术:多写,RPO=0,分钟级节点扩容2、方案优势极致弹性:存算分离架构,分钟级快速扩展,扩容过程中性能无抖动;自动负载均衡读 写,业务无感访问。极致高可靠:多活多写,容忍最大N-1节点故障;容灾集群实时复制。极致高可用:存储层节点故障,TB级数据分钟级副本重建;极速备份,时间点还原相比原生NoSQL:故障切换时间: 快20倍、数据备份时间: 快10倍、节点扩容时间: 快20倍、性能:优1.5倍3、案例:GaussDB NoSQL助力天地图提供最佳用户体验1)解决方案:GaussDB(for Mongo)提供在线地图的瓦片数据处理服务2)客户价值保障业务稳定连续:客户业务无需任何改造,17TB海量数据迁移仅需2天、故障秒级转移,客户业务无感知、支持96TB的海量数据处理能力助力降本增效:性能相比社区版提升3倍以上、新业务上线速度提高2倍、数据更新效率提高5倍、成本为友商同规格的一半七、补充说明如何选择符合业务发展的数据库?——华为云数据库为用户提供灵活、方便、低成本的上云解决方案,全场景业务,全开放生态,让核心数据安全上云、稳定高效处理与分析。1、关系型数据库云数据库 GaussDB(自主创新):应用于金融、电信、政府等行业关键核心系统,高性能场景云数据库 GaussDB(for MySQL)(自主创新):中大型企业生产系统(高性能,大数据容量),例如金融、互联网等云数据库 RDS for MySQL:开源MySQL业务上云,享受云数据库的安全、弹性、高可用,降低企业TCO云数据库RDS for PostgreSQL:开源PostgreSQL业务上云,享受云数据库的安全、弹性、高可用,降低企业TCO云数据库RDS for SQL Server:企业用户微软生态上云,支持高可靠数据业务需求2、非关系型数据库云数据库 GaussDB(for Mongo)(自主创新):应用于游戏(装备、道具)、泛互联场景云数据库 GaussDB(for Cassandra)自主创新:泛互联网日志数据存储(并发写入量大,存储容量高)、工业互联网数据存储(写入规模大、存储容量大)云数据库 GaussDB(for Influx)自主创新:工业互联网时序数据、用户银行流水数据、物联网数据存储(时序)云数据库 GaussDB(for Redis)自主创新:Key-Value存储模式,可用于互联网场景文档数据库服务 DDS:兼容MongoDB协议,应用于游戏(装备、道具)、泛互联网场景3、数据库生态工具&中间件数据复制服务 DRS:用于数据库在线迁移和数据库实时同步数据管理服务 DAS:数据库一站式开发,DBA智能运维,企业流程审批,享受便捷、智能、安全、高效的数据库管理手段数据库和应用迁移 UGO:异构数据库迁移,数据库对象DDL的SQL转化和应用SQL转化分布式数据库中间件 DDM:配套RDS for MySQL的分库分表场景更多精彩内容参见官网资料:cid:link_1前期 《企业级分布式数据库 - GaussDB介绍》 参见:cid:link_0
  • [技术解读] GaussDB数据库事务介绍
    一、前言随着大数据和互联网技术的不断发展,数据库管理系统的作用越来越重要,实现数据的快速读写以及保证数据的安全性和完整性成为企业在选择数据库技术时最为关注的问题之一。事务是保证数据一致性和完整性的关键机制之一,因此事务管理在数据库技术中占据了极为重要的位置。在这里我们将着重介绍华为云数据库GaussDB对事务的支持及管理,包括事务应用场景、事务管理、事务语句、事务隔离、事务监控等内容。二、GaussDB事务的定义及应用场景事务是数据库系统中的一个重要概念,通俗来讲,事务就是一组数据库操作看成一个整体,这个整体要么全部执行成功,要么全部撤销。事务可以应用在并发访问数据库时,保持数据的一致性。一些常见的应用场景包括转账操作、订单修改、银行交易等。在这些场景中,事务的功能是保证操作的原子性,即要么全部执行成功,数据库的值正确地更新,即处于一个“一致状态”,要么出现异常或系统故障,全部回滚至操作前的状态,以保证数据的准确性和完整性。GaussDB支持ACID事务,即原子性、一致性、隔离性和持久性。在GaussDB中,事务是指一组数据库操作,这些操作要么全部成功,要么全部失败。当一个事务提交时,所有的修改都会被永久保存。如果事务失败,则所有的修改都会被回滚,数据库状态会被还原到事务开始前的状态。GaussDB还支持分布式事务(集群事务),可以涉及到多个节点的事务(本次不做重点介绍)。原子性(Atomicity):事务是数据库的逻辑工作单位,事务中的操作,要么都做, 要么都不做。一致性(Consistency):事务的执行结果必须是使数据库从一个一致性状态转到另一 个一致性状态。隔离性(Isolation):数据库中一个事务的执行不能被其他事务干扰。即一个事务 的内部操作及使用的数据对其他事务是隔离的,并发执行的 各个事务不能相互干扰。持久性(Durability):事务一旦提交,对数据库中数据的改变是永久的。提交后的 操作或者故障不会对事务的操作结果产生任何影响。三、GaussDB事务的管理事务管理是指在使用数据库系统时,对事务的开启、提交、回滚、保存点、分布式事务等进行管理:启动事务:GaussDB通过START TRANSACTION和BEGIN语法启动事务设置事务:GaussDB通过SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务提交事务:GaussDB通过COMMIT或者END可完成提交事务的功能,即提交事务的所有操作回滚事务:回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销存储过程本身就处于一个事务中,开始调用最外围存储过程时会自动开启一个事务,在调用结束时自动提交或者发生异常时回滚。除了系统自动的事务控制外,也可以使用COMMIT/ROLLBACK来控制存储过程中的事务。在存储过程中调用COMMIT/ROLLBACK命令,将提交/回滚当前事务并自动开启一个新的事务,后续的所有操作都会在此新事务中运行。示例1:启动一个事务--以默认方式启动事务。START TRANSACTION;SELECT * FROM tpcds.reason;END;--以默认方式启动事务。BEGIN;SELECT * FROM tpcds.reason;END;--以隔离级别为READ COMMITTED,读/写方式启动事务。START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;SELECT * FROM tpcds.reason;COMMIT;示例2:设置事务--开启一个事务,设置事务的隔离级别为READ COMMITTED,访问模式为READ ONLY。START TRANSACTION;SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY;COMMIT;示例3:支持在PLSQL的存储过程内使用COMMIT/ROLLBACK。CREATE TABLE EXAMPLE1(COL1 INT);CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE()ASBEGINFOR i IN 0..20 LOOPINSERT INTO EXAMPLE1(COL1) VALUES (i);IF i % 2 = 0 THENCOMMIT;ELSEROLLBACK;END IF;END LOOP;END;/运行结果:在GaussDB中,控制管理事务可以采用两个方法:原子性和隔离性。原子性指一组操作要么全部执行,要么全部不执行。隔离性指一个事务的操作不受其他事务干扰,保证并发执行时数据的一致性。更多事务管理过程中的使用场景(支持/不支持调用的上下文环境),请参见官网示例:cid:link_0四、GaussDB事务语句事务语句可以看作是在事务中执行的一组语句,常见的事务语句有insert、update、delete等。GaussDB支持事务语句,事务语句组合成一组原子性、隔离性和一致性的操作。例如,下面的所有查询都包含在同一个事务小片中。如果有任何一个查询失败,整个事务将回滚。以下是事务语句的例子:BEGIN;SELECT balance FROM account WHERE id = 1 FOR UPDATE;UPDATE account SET balance = balance - 100 WHERE id = 1;COMMIT;五、GaussDB事务隔离GaussDB支持的事务隔离级别包括:Read Uncommitted(读未提交)、Read Committed(读提交)、Repeatable Read(重复读)、Serializable(序列化,Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不建议使用)。语法:{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION }{ ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }| { READ WRITE | READ ONLY } } [, ...]1. Read Uncommitted 隔离级别:最低的隔离级别,它允许提交了但尚未被写入磁盘的事务修改的数据被其他事务所读取。SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;2. Read Committed 隔离级别:这个级别保证一个事务所见到的数据,要么是提交事务所修改的(已经将数据更新至磁盘),要么就是其他提交事务所修改的。SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;3. Repeatable Read 隔离级别:保证在一个事务内重复执行的查询返回的结果集是一样的。特别地,在这个级别的情况下,在事务中第一次读表时就会自动获取到所有被查询记录的共享锁,直到关闭连接为止。SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ;4. Serializable 隔离级别:这个级别最高,实现方法是对数据进行锁定,以保证在写操作(INSERT、DELETE 和 UPDATE 等)期间数据不会被访问。SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;六、GaussDB事务监控事务监控是指对事务进行实时的监控,包括事务的状态、执行时间、执行语句、执行结果等。事务监控可以对数据库操作进行记录和追踪,包括事务开始和结束的时间、事务中执行的语句、事务提交或回滚的状态等。可以通过这些信息来监控事务的执行情况,优化性能和调整配置。华为云数据库GaussDB支持ACID事务,事务隔离级别支持读已提交、可重复读、序列化三种,并具有分布式事务支持功能。在实际应用中,GaussDB的事务机制可适用于金融账务、电商订单、物流管理等多种场景。例如,在电商订单场景中,可以在一个事务中包含插入订单、更新库存、生成支付信息等相关操作,确保这些操作全部成功或全部失败,而不会出现其中某个操作提交,其他操作失败的情况。而在日常开发中,要注意对事务的合理使用,避免在一个事务中执行过多的操作,尽可能缩小事务的范围,减少事务的执行时间,从而提高系统的并发性能。事务监控可以对数据库操作进行记录和追踪,包括事务开始和结束的时间、事务中执行的语句、事务提交或回滚的状态等。可以通过这些信息来监控事务的执行情况,优化性能和调整配置。以下是事务监控的示例:1. 查看活动事务信息(PG_PREPARED_XACTS视图显示当前准备好进行两阶段提交的事务的信息)select * from pg_prepared_xacts;2. 查看事务状态(PG_STAT_ACTIVITY视图显示和当前用户查询相关的信息。)select pid, datname, usename, query, query_start, state from pg_stat_activity where state != 'idle' and state != 'idle in transaction';七、总结事务是保证数据一致性和完整性的核心机制之一,对于一个数据库来说,事务的支持和管理是必须的。GaussDB通过支持手动和自动管理事务、事务隔离级别以及事务监控等功能,满足了企业对数据一致性和完整性的需求。在日常开发中,需要特别注意事务的控制和隔离,以保证事务的正确执行,从而提高数据的可靠性和安全性。本文介绍到此结束,更多操作可在实际应用中参考官方文档。
  • [技术解读] 《GaussDB数据类型介绍》
    目录:一、GaussDB 数据库二、数据类型概念及特点三、常用数据类型1、常用字符串类型介绍2、布尔类型3、数值类型4、日期/时间类型四、数据类型选择建议附:GaussDB数据库涉及的数据类型一、GaussDB 数据库GaussDB是华为基于openGauss自研生态推出的云化企业级分布式关系型数据库,它支持多种数据类型,包括数值、字符、日期等。在使用GaussDB时,可能需要进行数据类型转换,以满足不同的需求。本文将以示例的形式罗列并介绍一些常见的数据类型转换方法等。二、数据类型概念及特点数据类型是一组值的集合以及定义在这个值集上的一组操作。GaussDB数据库是由表的集合组成的,而各表中的列定义了该表,每一列都属于一种数据类型,GaussDB根据数据类型有相应函数对其内容进行操作,例如GaussDB可对数值型数据进行加、减、乘、除操作等。数据类型是用来定义数据存储格式和数据范围的规范。每种数据类型都有自己的特点和适用范围,它们在数据库中的作用主要有以下几点:存储数据:数据库中的每个字段都必须指定数据类型,这样才能确定它们在数据库中的存储格式。不同的数据类型使用不同的存储方式,例如整型会以二进制形式存储,而字符型则以ASCII码或Unicode编码形式存储。约束数据范围:数据类型可以限制某个字段存储的数据范围,例如整型只能存储整数值,小数型只能存储浮点数等。这样可以确保数据的准确性和完整性,防止非法值进入数据库。提高查询效率:数据库在查询数据时会根据字段的数据类型进行优化,例如对整型字段的查询会比对字符型字段的查询更快,因为整型字段的数据存储格式更简单,计算也更快。降低存储空间:不同的数据类型使用不同的存储方式,一些数据类型可以在存储时减少存储空间的占用。例如使用整型可以减少存储空间的占用,因为整型在存储时只需要占用4个字节,而字符型则需要占用更多的存储空间。提高数据安全性:数据类型可以帮助数据库对数据进行有效的过滤和验证,限制不合法的数据输入,增强数据的安全性和可靠性。综上所述,数据类型在数据库中扮演着极为重要的角色,它们不仅仅用于存储数据,还可以提高查询效率、降低存储空间、提高数据安全性等。数据库开发人员在设计数据库时必须充分了解各种数据类型的特点和使用场景,合理选用数据类型,才能保证数据库的高效性和稳定性。三、常用数据类型1、常用字符串类型介绍在进行字段设计时,需要根据数据特征选择相应的数据类型。字符串类型在使用时比较容易混淆,下表罗列了GaussDB中常见的字符串类型。1)常用字符串类型2)示例--创建表。CREATE TABLE t_char_type(column1 VARCHAR(5))DISTRIBUTE BY HASH (column1);--插入数据。INSERT INTO t_char_type VALUES ('ok');--插入的数据长度超过类型规定的长度报错。INSERT INTO t_char_type VALUES ('too long');ERROR: value too long for type character varying(5)CONTEXT: referenced column: column1--明确类型的长度,超过数据类型长度后会自动截断。INSERT INTO t_char_type VALUES ('too long'::varchar(5));--查询数据。SELECT column1, char_length(column1) FROM t_char_type;column1 | char_length---------+-------------ok | 2too l | 5(2 rows)2、布尔类型1)说明“真”值的有效文本值是:TRUE、't'、'true'、'y'、'yes'、'1'以及所有非0整数。“假”值的有效文本值是:FALSE、'f'、'false'、'n'、'no'、'0'、0。使用TRUE和FALSE是比较规范的用法(也是SQL兼容的用法)。2)示例--创建表。CREATE TABLE t_bool_type(column1 BOOLEAN,column2 TEXT)DISTRIBUTE BY HASH(column2);--插入数据。INSERT INTO t_bool_type VALUES (TRUE, 'one');INSERT INTO t_bool_type VALUES (FALSE, 'two');--查看数据。SELECT * FROM t_bool_type;column1 | column2---------+---------t | onef | two(2 rows)SELECT * FROM t_bool_type WHERE column1 = 't';column1 | column2---------+---------t | one(1 row)3、数值类型1) 整数类型TINYINT、SMALLINT、INTEGER和BIGINT类型存储各种范围的数字,也就是整数。试图存储超出范围以外的数值将会导致错误。常用的类型是INTEGER,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。2)示例--创建具有TINYINT,INTEGER,BIGINT类型数据的表。openGauss=# CREATE TABLE t_int_type(column1 TINYINT,column2 TINYINT,column3 INTEGER,column4 BIGINT);--插入数据。openGauss=# INSERT INTO int_type_t2 VALUES(100, 10, 1000, 10000);--查看数据。openGauss=# SELECT * FROM int_type_t2;column1 | column2 | column3 | column4-----------+----------+------------+-------100 | 10 | 1000 | 10000(1 row)4、日期/时间类型1)日期输入说明:日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。日期的文本输入需要加单引号包围,语法:type [ ( p ) ] 'value',可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。2)时间段输入说明:reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外,文本输入需要加单引号。四、数据类型选择建议选择数据类型,在字段设计时,基于查询效率的考虑,一般遵循以下原则:选择数值类型时,在满足业务精度的情况下,选择数据类型的优先级从高到低依次为整数、浮点数、NUMERIC。使用一致的数据类型,当多个表存在逻辑关系时,表示同一含义的字段应该使用相同的数据类型。对于字符串数据,建议使用变长字符串数据类型,并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数,避免超出最大长度时出现字符截断现象。除非明确知道数据类型为固定长度字符串,否则,不建议使用CHAR(n)、BPCHAR(n)、NCHAR(n)、CHARACTER(n)。索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。尽量使用执行效率比较高的数据类型,一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。尽量使用短字段的数据类型:长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。附:GaussDB数据库涉及的数据类型“数值类型、货币类型、布尔类型、字符类型、二进制类型、日期/时间类型、几何类型、网络地址类型、位串类型、文本搜索类型、UUID类型、JSON/JSONB类型、HLL数据类型、范围类型、对象标识符类型、伪类型、列存表支持的数据类型、账本数据库使用的数据类型”。详见官方文档:cid:link_0以上就是本期的内容,欢迎大家测试、交流!
  • [技术解读] GaussDB数据库SQL系列-复合查询
    一、前言在这篇文章中,我们将探讨在GaussDB数据库中使用复合查询的技术。复合查询是SQL查询的一个高级特性,它允许用户通过结合多个简单查询来执行更复杂的数据检索操作。这种查询通常涉及使用UNION、INTERSECT、EXCEPT等SQL关键字,以及子查询和连接操作。掌握复合查询对于高效利用GaussDB进行复杂数据分析非常重要。我们将通过具体示例演示如何构建和执行这些复合查询,从而提供更深入的数据洞察。二、复合查询基础:复合查询是SQL中一种强大的工具,用于结合多个独立查询结果以形成一个单一的查询结果。在GaussDB数据库中,您可以通过以下操作符来执行复合查询:UNION:合并两个或多个查询结果为一个结果集。它会删除重复的行。INTERSECT:返回两个查询共有的记录。EXCEPT:从第一个查询结果中减去第二个查询结果中的记录。三、实际应用示例使用UNION合并查询结果:合并employees和sales表中的不同字段。SELECT name FROM employeesUNIONSELECT product FROM sales;使用INTERSECT找出共同元素:假设我们有另一个销售数据表sales2,找出两个销售表中共同销售的产品。sales2:SELECT product FROM salesINTERSECTSELECT product FROM sales2;INTERSECT替代: 使用INNER JOIN实现与INTERSECT相同的功能。使用EXCEPT排除特定结果:SELECT sales.productFROM salesINNER JOIN sales2 ON sales.product = sales2.product;找出employees表中存在但在sales表中未销售的产品。SELECT name FROM employeesEXCEPTSELECT product FROM sales;EXCEPT替代: 使用LEFT JOIN和WHERE子句检查NULL值,实现与EXCEPT相同的功能。SELECT sales.productFROM salesLEFT JOIN sales2 ON sales.product = sales2.productWHERE sales2.product IS NULL;四、高级技巧子查询实例:在WHERE子句中使用子查询:找出销售额超过平均销售额的产品。SELECT product FROM salesWHERE amount > (SELECT AVG(amount) FROM sales);JOIN的应用:使用INNER JOIN:结合employees和sales表,找出所有员工及其对应的销售记录。SELECT e.name, s.product, s.amountFROM employees eINNER JOIN sales s ON e.id = s.id;使用LEFT JOIN:显示所有员工,即使他们没有对应的销售记录。SELECT e.name, s.product, s.amountFROM employees eLEFT JOIN sales s ON e.id = s.id;五、总结通过探索复合查询,包括使用UNION、INTERSECT、EXCEPT以及高级技巧如子查询和各类JOIN操作,我们可以看到GaussDB在处理复杂数据查询方面的强大能力。这些技术为用户提供了灵活和高效处理大规模和多样化数据的工具。掌握这些高级查询技能对于进行深入的数据分析至关重要,能够显著提升在GaussDB中进行数据处理和分析的效率和准确性。作者:崔文
  • [技术解读] 深度优先遍历与广度优先遍历:探索图与树的策略
    在计算机科学中,图和树的数据结构是解决复杂问题的基石。遍历这些结构是理解和操作它们的基础步骤。两种基本的遍历策略——深度优先遍历(Depth-First Search, DFS)和广度优先遍历(Breadth-First Search, BFS)——为我们提供了探索这些结构的不同视角。本文将深入探讨这两种遍历方法的概念、实现方式、应用场景以及它们之间的区别。1. 深度优先遍历(DFS)概念深度优先遍历是一种算法,它沿着树的深度遍历节点,尽可能深地探索每个分支,直到到达叶子节点,然后回溯以探索其他分支。形象地说,DFS像是探洞者,深入一个洞穴直到尽头,再返回上一层寻找其他未探索的路径。实现DFS可以通过递归或栈实现。递归方法自然符合深度探索的思路,每进入一个子节点就相当于递归调用一次。使用栈实现时,从根节点开始,将其入栈,然后不断访问栈顶节点的子节点,并将子节点压入栈,直到无子节点可访问时出栈,继续访问栈中的下一个节点。应用拓扑排序:确定项目依赖顺序。回溯算法:解决八皇后、迷宫等问题。图的连通性判断:判断图是否为连通图。2. 广度优先遍历(BFS)概念广度优先遍历则是从根节点开始,先访问所有相邻的节点,然后访问下一层的节点,以此类推,一层一层地遍历。形象地说,BFS像是一队搜索者,从起点出发,一行行地探索,确保同一层的所有节点都被访问后才进入下一层。实现BFS通常借助队列来实现。从根节点开始,将其放入队列中,然后从队列中取出节点并访问它,接着将该节点的所有未访问过的邻接节点加入队列。重复这一过程,直到队列为空。应用最短路径问题:在无权图中找到两个节点间的最短路径。社交网络分析:查找两个人之间的最短联系链。游戏AI:实现简单的路径寻找或迷宫求解。3. 深度优先与广度优先的区别访问顺序:DFS倾向于先探索深度,而BFS则倾向于先探索宽度。空间复杂度:由于DFS可以用递归或栈实现,当树或图的深度很大时,DFS的空间复杂度较高;而BFS因使用队列,其空间复杂度主要取决于树的最大宽度。应用场景:DFS适用于寻找目标节点或检测环的存在,而BFS更适用于寻找最短路径问题。实现难度:递归形式的DFS代码简洁,但理解递归调用栈可能较难;BFS的迭代实现直观,易于理解。
  • [技术干货] GaussDB(for MySQL) 模拟银行核心数据库,从模型设计到SQL实操,沉浸式DBA体验
    GaussDB(for MySQL) 模拟银行核心数据库,从模型设计到SQL实操,沉浸式DBA体验实验目标本实验指导书以金融行业为场景,设计数据库模型,并使用华为云GaussDB(for MySQL)构建金融场景下的数据库,通过对数据库中的对象之一表的创建,掌握基础SQL语法,体验对表中数据的增删改查。注意:实验结束后务必一定要删除实例,以防止继续扣费!(操作方式在最后!)前置条件1.  登录华为云账号,并完成实名认证 登录cid:link_1,进入华为云官网,输入账号及密码,登录。2. 点击链接/扫码完成报名,领取华为云资源代金券(仅限200名,先到先得!)3. 开通华为云GaussDB(for MySQL)数据库资源:3.1 点击购买云数据库GaussDB(for MySQL)资源选择购买规格如下:计费模式:按需付费区域:华北-北京四可用区类型:单可用区性能规格:通用型CPU架构:x86;2vCPUs|8GB管理员密码:自行设置其余各项默认,点击“立即购买”,确认后“提交”3.2 提交后“返回云数据库GaussDB(for MySQL)列表”等待创建完成(大约需要十分钟)实验概览实验任务要求请按照要求,完成以下实验任务:4. 初始化数据库4.1  登录数据库4.2  输入用户名和密码,测试连接后登录 4.3  点击“新建数据库”,自定义数据库名称,例finance,后确认4.4  点击“SQL查询”进入SQL交互页面5. 创建表操作5.1 删除表client:输入以下代码,点击“执行SQL(F8)”DROP TABLE IF EXISTS client;5.2 创建表client:输入以下代码,点击“执行SQL(F8)”CREATE TABLE client( c_id INT PRIMARY KEY, c_name VARCHAR(100) NOT NULL, c_mail CHAR(30) UNIQUE, c_id_card CHAR(20) UNIQUE NOT NULL, c_phone CHAR(20) UNIQUE NOT NULL, c_password CHAR(20) NOT NULL);6. 插入表client数据6.1  输入以下SQL语句,点击“执行SQL(F8)”,插入客户信息数据INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (1,'张一','zhangyi@huawei.com','340211199301010001','18815650001','gaussdb_001');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (2,'张二','zhanger@huawei.com','340211199301010002','18815650002','gaussdb_002');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (3,'张三','zhangsan@huawei.com','340211199301010003','18815650003','gaussdb_003');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (4,'张四','zhangsi@huawei.com','340211199301010004','18815650004','gaussdb_004');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (5,'张五','zhangwu@huawei.com','340211199301010005','18815650005','gaussdb_005');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (6,'张六','zhangliu@huawei.com','340211199301010006','18815650006','gaussdb_006');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (7,'张七','zhangqi@huawei.com','340211199301010007','18815650007','gaussdb_007');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (8,'张八','zhangba@huawei.com','340211199301010008','18815650008','gaussdb_008');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (9,'张九','zhangjiu@huawei.com','340211199301010009','18815650009','gaussdb_009');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (10,'李一','liyi@huawei.com','340211199301010010','18815650010','gaussdb_010');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (11,'李二','lier@huawei.com','340211199301010011','18815650011','gaussdb_011');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (12,'李三','lisan@huawei.com','340211199301010012','18815650012','gaussdb_012');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (13,'李四','lisi@huawei.com','340211199301010013','18815650013','gaussdb_013');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (14,'李五','liwu@huawei.com','340211199301010014','18815650014','gaussdb_014');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (15,'李六','liliu@huawei.com','340211199301010015','18815650015','gaussdb_015');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (16,'李七','liqi@huawei.com','340211199301010016','18815650016','gaussdb_016');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (17,'李八','liba@huawei.com','340211199301010017','18815650017','gaussdb_017');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (18,'李九','lijiu@huawei.com','340211199301010018','18815650018','gaussdb_018');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (19,'王一','wangyi@huawei.com','340211199301010019','18815650019','gaussdb_019');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (20,'王二','wanger@huawei.com','340211199301010020','18815650020','gaussdb_020');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (21,'王三','wangsan@huawei.com','340211199301010021','18815650021','gaussdb_021');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (22,'王四','wangsi@huawei.com','340211199301010022','18815650022','gaussdb_022');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (23,'王五','wangwu@huawei.com','340211199301010023','18815650023','gaussdb_023');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (24,'王六','wangliu@huawei.com','340211199301010024','18815650024','gaussdb_024');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (25,'王七','wangqi@huawei.com','340211199301010025','18815650025','gaussdb_025');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (26,'王八','wangba@huawei.com','340211199301010026','18815650026','gaussdb_026');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (27,'王九','wangjiu@huawei.com','340211199301010027','18815650027','gaussdb_027');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (28,'钱一','qianyi@huawei.com','340211199301010028','18815650028','gaussdb_028');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (29,'钱二','qianer@huawei.com','340211199301010029','18815650029','gaussdb_029');INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (30,'钱三','qiansan@huawei.com','340211199301010030','18815650030','gaussdb_030');6.2  输入以下SQL语句,点击“执行SQL(F8)”,查询插入结果select count(*) from client;结果如下:6.3 点击“库管理”,选择“打开表”,可以看到刚刚创建的表7. 在表client中增加一条数据INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (31,'李丽','lili@huawei.com','340211199301010031','18815650031','gaussdb_031');刷新之后表中出现新增的数据新用户连接数据库8. 新用户的创建和授权:8.1 创建用户dbuser,密码为Gauss#3demoCREATE USER 'dbuser'@'%' IDENTIFIED BY 'Gauss#3demo';8.2 给用户dbuser授予finance数据库下对象的查询权限GRANT SELECT ON finance.* TO 'dbuser'@'%';flush privileges;8.3 在DAS登录数据库界面中,点击“新增数据库登录”,选择数据库引擎为GaussDB(for MySQL),选择对应购买的实例。输入用户名为dbuser,密码为Gauss#3demo。点击“立即新增”,如下图:数据库列表中选择finance数据库,点击“SQL查询”。8.4 访问finance数据库的表client。进入finance数据库,并在SQL窗口中敲击如下SQL语句。select * from finance. client;结果如下:删除数据库实例(务必)9. 返回“云数据库GaussDB(for MySQL)控制台”,点击“更多”,选择“删除实例”按照指引完成删除实例
  • [运维管理] DWS 那个版本实现了在线增删CN不影响业务?
    DWS 那个版本实现了在线增删CN不影响业务?
  • [技术解读] GaussDB数据库中的MERGE INTO介绍
    GaussDB数据库中的MERGE INTO介绍一、前言随着数据量的爆炸性增长,数据库管理系统(DBMS)的功能和性能要求也在不断提升。GaussDB 作为一款先进的关系型数据库管理系统,其 MERGE INTO 语句在数据整合、更新操作中发挥了重要作用。MERGE INTO 语句允许用户在单次操作中执行插入和更新操作,大大提高了数据处理效率。本文将举例为大家讲述 GaussDB 中 MERGE INTO 语句的使用。二、GaussDB MERGE INTO 语句的原理概述1、MERGE INTO 语句原理GaussDB 的 MERGE INTO 语句是基于 SQL 标准的,通过单个SQL语句实现了数据的UPDATE和INSERT操作。该语句在执行时,会根据指定的条件比较源表和目标表的数据。当源表和目标表中数据针对关联条件可以匹配上时,则进行UPDATE操作;当源表和目标表中数据针对关联条件无法匹配时,则进行INSERT操作。这种操作方式减少了数据传输的开销,避免多次执行,提高了数据处理的效率。2、MERGE INTO 的语法MERGE [/*+ plan_hint */] INTO table_name [ partition_clause ] [ [ AS ] alias ]USING { { table_name | view_name } | subquery } [ [ AS ] alias ]ON ( condition )[WHEN MATCHED THENUPDATE SET { column_name = { expression | subquery | DEFAULT } |( column_name [, ...] ) = ( { expression | subquery | DEFAULT } [, ...] ) } [, ...][ WHERE condition ]][WHEN NOT MATCHED THENINSERT { DEFAULT VALUES |[ ( column_name [, ...] ) ] VALUES ( { expression | subquery | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }];where partition_clause can be:PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } |SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) }NOTICE: 'partition_clause' is only avaliable in CENTRALIZED mode!NOTICE: 'subquery' in the UPDATE and INSERT clauses are only avaliable in CENTRALIZED mode!3、语法解释权限:进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。plan_hint子句:可选,以/*+ */的形式在MERGE关键字后,用于对MERGE对应的语句块生成的计划进行hint调优INTO talbe_name:指定正在更新或插入的目标表。USING子句:指定源表,源表可以为表、视图或子查询。ON子句:关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。WHEN MATCHED / WHEN NOT MATCHED子句:不支持INSERT子句中包含多个VALUES。WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。DEFAULT:用对应字段的缺省值填充该字段。如果没有缺省值,则为NULL。WHERE condition:UPDATE子句和INSERT子句的条件,只有在条件满足时才进行更新操作,可缺省。不支持WHERE条件中引用系统列。三、GaussDB MERGE INTO 语句的应用场景MERGE INTO 语句在多种场景中都有广泛的应用。例如,在数据迁移过程中,可以使用 MERGE INTO 语句将源数据库中的数据迁移到目标数据库,同时保证数据的完整性和一致性。此外,在数据整合、ETL过程、实时数据处理等场景中,MERGE INTO 语句都能发挥其高效的数据处理能力。四、GaussDB MERGE INTO 语句的示例1、示例场景举例假设我们有两个表:source_table 和 target_table。source_table 包含最新的销售数据,而 target_table 存储历史销售数据。我们的目标是更新 target_table 中的销售数据,并插入新的销售记录。2、示例实现过程以下是使用 GaussDB MERGE INTO 语句的实现示例1)创建两个实验表,并初始化测试数据--创建测试表target_table,存储历史销售数据CREATE TABLE public.target_table(product_id VARCHAR(20),product_name VARCHAR(20),sales_sum_number INT,sales_sum_amount MONEY,create_date VARCHAR(8),update_date VARCHAR(8));--插入测试数据INSERT INTO public.target_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date,update_date) VALUES('P1001','books',100,1000,'20240101','30001231');INSERT INTO public.target_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date,update_date) VALUES('P1002','pens',200,400,'20240102','30001231');--创建测试表source_table,包含最新的销售数据CREATE TABLE public.source_table(product_id VARCHAR(20),product_name VARCHAR(20),sales_sum_number INT,sales_sum_amount MONEY,create_date VARCHAR(8));--插入测试数据INSERT INTO public.source_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date) VALUES('P1001','books',50,500,'20240103');INSERT INTO public.source_table(product_id,product_name,sales_sum_number,sales_sum_amount,create_date) VALUES('P1003','toys',100,1000,'20240103');--查看结果SELECT * FROM public.target_table;SELECT * FROM public.source_table;2)更新 target_table 中的销售数据,并插入新的销售记录。--更新 target_table 中的销售数据,并插入新的销售记录。MERGE INTO target_table AS tUSING source_table AS sON (t.product_id = s.product_id)WHEN MATCHED THENUPDATE SET t.sales_sum_number=t.sales_sum_number + s.sales_sum_number,t.sales_sum_amount = t.sales_sum_amount + s.sales_sum_amount,t.update_date = s.create_dateWHEN NOT MATCHED THENINSERT (product_id,product_name,sales_sum_number,sales_sum_amount,create_date,update_date) VALUES (s.product_id,s.product_name,s.sales_sum_number,s.sales_sum_amount,s.create_date,'30001231');--查看执行结果SELECT * FROM public.target_table;3)查看并比对执行结果更新之前的目标表target_table:源表source_table:更新之后的目标表target_table:上述示例中,我们通过 MERGE INTO 语句将 source_table 中的销售数据与 target_table 中的数据进行匹配。在目标中,产品“P1001”销售数量增加了50,销售金额增加了500,更新日期更新为源表中的创建日期。产品“P1002”的销售数据没有变化。产品“P1003”作为一条新的销售数据插入到了历史表(目标表)中。这样,我们就轻松地将最新的销售数据整合到 target_table 中,同时保持数据的完整性和一致性。特别说明:在实际业务操作时,需要提前做好规划,确保执行的准确定、数据的准确性以及数据的安全性,同时做好各个环节的备份等操作。五、小结MERGE INTO 语句在GaussDB数据库中是一个非常好用、方便的SQL工具。同时,在数据处理工作中起着非常重要的作用,它能够提高数据处理效率,简化数据处理流程,满足各种数据处理需求。本文通过在GaussDB数据库中模拟了一则简单的示例为大家进行了讲解,希望可以帮助读者更好的理解与使用。——结束
  • [互动交流] 同样一个文件,上传到同样服务器的OBS和上传到同样服务器配置的GaussDB数据库,哪个速度更快。
    同样一个文件,上传到同样服务器的OBS和上传到同样服务器配置的GaussDB数据库,哪个速度更快。
  • [技术解读] GaussDB数据类型转换介绍
    一、数据类型转换场景数据类型转换在实际应用中非常常见。GaussDB作为一款企业级分布式关系型数据库,在实际业务场景使用中,也会避免不了数据类型的转换。以下是一些数据类型转换的应用场景:数据清洗与转换:在数据分析和处理中,经常需要对数据进行清洗和转换,例如将文本数据转换为数字格式,将日期格式转换为文本格式等。数据格式化:在输出数据时,需要将数据格式化为合适的格式,例如将数字格式化为货币格式、百分比格式等。数据计算:在进行数据计算时,需要对数据类型进行转换,例如将整数类型的数据转换为浮点数类型的数据,以便进行精确的计算或处理。数据存储:在将数据存储到数据库中时,需要将不同类型的数据转换为数据库支持的数据类型,以便正确地存储和查询数据。数据传输:在数据传输过程中,需要将不同类型的数据转换为相同的数据类型,以便正确地传输数据。总之,数据类型转换在数据处理、数据分析、数据存储和数据传输等领域都有广泛的应用。二、数据类型转换及示例在SQL语言中,每个数据都与一个决定其行为和用法的数据类型相关。GaussDB提供一个可扩展的数据类型系统,该系统比其它SQL实现更具通用性和灵活性。因而,GaussDB中大多数类型转换是由通用规则来管理的。数据库中允许有些数据类型进行隐式类型转换(赋值、函数调用的参数等),有些数据类型间不允许进行隐式数据类型转换,可尝试使用GaussDB提供的类型转换函数。1、cast(value AS type) 描述:CAST进行数据类型强转。如果有必要,可以将值显式转换为指定类型。1)整型转浮点型SELECT CAST(1 AS FLOAT8); -- 将整数 1 转换为浮点数2)浮点型转整型SELECT CAST(3.14 AS INT4); -- 将浮点数 3.14 转换为整数 33)布尔型转整型使用 CAST 函数将布尔型数据转换为整型数据,其中 TRUE 转换为 1,FALSE 转换为 0,例如:SELECT CAST(TRUE AS INT4),CAST(FALSE AS INT4); -- 将布尔型数据 TRUE 转换为整数 1;将布尔型数据 FALSE 转换为整数 02、to_date(text)描述:将文本类型的值转换为指定格式的时间戳。格式一:无分隔符日期,如20230314,需要包括完整的年月日。格式二:带分隔符日期,如2023-03-14,分隔符可以是单个任意非数字字符。SELECT TO_DATE('20230314'),TO_DATE('2023-03-14');3、to_date(text,format)描述:将字符串类型的值转换为指定格式的日期。SELECT TO_DATE('14 MAR 2023', 'DD MON YYYY'),TO_DATE('20230314','YYYYMMDD'); 4、to_char(datetime, format)描述:日期时间型转字符型。SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS'); -- 将当前日期时间型数据转换为字符型数据,格式为 'YYYY-MM-DD HH24:MI:SS'5、to_char(string)描述:将CHAR、VARCHAR、VARCHAR2、CLOB类型转换为VARCHAR类型。SELECT TO_CHAR(1110)6、CASE 表达式布尔型转字符型,使用 CASE 表达式将布尔型数据转换为字符型数据,例如:1)SELECT CASE WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END; -- 将布尔型数据 TRUE 转换为字符型数据 'TRUE'2)SELECT CASE WHEN FALSE THEN 'TRUE' ELSE 'FALSE' END; -- 将布尔型数据 FALSE 转换为字符型数据 'FALSE'三、 小结数据类型转换是将一种数据类型转换为另一种数据类型的过程。在中,我们经常需要对数据类型进行转换以满足代码的需求。 在很多编程语言中,数据类型转换可以分为隐式转换和显式转换两种类型。 隐式转换是指在代码中进行赋值、运算或比较等操作时,编程语言会自动对数据类型进行转换,以保证操作的正确性和合法性。GaussDB支持多种数据类型转换,以下是GaussDB中常用的数据类型转换方式:隐式转换:GaussDB支持隐式转换,即在表达式中,如果不同数据类型的操作数参与运算,GaussDB会自动将其中一个数据类型转换为另一个数据类型,以满足运算要求。例如,如果一个整型数值与一个浮点型数值进行运算,GaussDB会将整数转换为浮点数再进行运算。显式转换:GaussDB中支持使用CAST函数进行显式转换。CAST函数可将一个数据类型的值转换为另一个数据类型的值。例如,使用CAST函数将一个字符串类型转换为整型类型。数字转换:GaussDB支持将数字类型转换为其他数字类型,例如将整型转换为小数型、将小数型转换为整型等。字符串转换:GaussDB支持将字符串类型转换为其他数据类型,例如将字符串转换为整型、将字符串转换为日期类型等。日期转换:GaussDB支持将日期类型转换为其他日期类型,例如将日期转换为时间类型、将时间类型转换为日期类型等。布尔型转换:GaussDB支持将布尔型数据转换为其他数据类型,例如将布尔型转换为整型、将布尔型转换为字符串类型等。……需要注意的是,在进行数据类型转换时,应该考虑出现的数据精度、数据溢出、数据失真等问题,同时也要避免数据类型不兼容造成的错误。当然了,数据类型转换也会影响查询效率和性能,需要根据实际业务需求和数据量大小进行优化和调整。以上示例到此结束,更多类型转换可参考官网文档,欢迎大家测试、交流。
  • GaussDB数据类型介绍
    《GaussDB数据类型介绍》目录:一、GaussDB 数据库二、数据类型概念及特点三、常用数据类型1、常用字符串类型介绍2、布尔类型3、数值类型4、日期/时间类型四、数据类型选择建议附:GaussDB数据库涉及的数据类型一、GaussDB 数据库GaussDB是华为基于openGauss自研生态推出的云化企业级分布式关系型数据库,它支持多种数据类型,包括数值、字符、日期等。在使用GaussDB时,可能需要进行数据类型转换,以满足不同的需求。本文将以示例的形式罗列并介绍一些常见的数据类型转换方法等。二、数据类型概念及特点数据类型是一组值的集合以及定义在这个值集上的一组操作。GaussDB数据库是由表的集合组成的,而各表中的列定义了该表,每一列都属于一种数据类型,GaussDB根据数据类型有相应函数对其内容进行操作,例如GaussDB可对数值型数据进行加、减、乘、除操作等。数据类型是用来定义数据存储格式和数据范围的规范。每种数据类型都有自己的特点和适用范围,它们在数据库中的作用主要有以下几点:存储数据:数据库中的每个字段都必须指定数据类型,这样才能确定它们在数据库中的存储格式。不同的数据类型使用不同的存储方式,例如整型会以二进制形式存储,而字符型则以ASCII码或Unicode编码形式存储。约束数据范围:数据类型可以限制某个字段存储的数据范围,例如整型只能存储整数值,小数型只能存储浮点数等。这样可以确保数据的准确性和完整性,防止非法值进入数据库。提高查询效率:数据库在查询数据时会根据字段的数据类型进行优化,例如对整型字段的查询会比对字符型字段的查询更快,因为整型字段的数据存储格式更简单,计算也更快。降低存储空间:不同的数据类型使用不同的存储方式,一些数据类型可以在存储时减少存储空间的占用。例如使用整型可以减少存储空间的占用,因为整型在存储时只需要占用4个字节,而字符型则需要占用更多的存储空间。提高数据安全性:数据类型可以帮助数据库对数据进行有效的过滤和验证,限制不合法的数据输入,增强数据的安全性和可靠性。综上所述,数据类型在数据库中扮演着极为重要的角色,它们不仅仅用于存储数据,还可以提高查询效率、降低存储空间、提高数据安全性等。数据库开发人员在设计数据库时必须充分了解各种数据类型的特点和使用场景,合理选用数据类型,才能保证数据库的高效性和稳定性。三、常用数据类型1、常用字符串类型介绍在进行字段设计时,需要根据数据特征选择相应的数据类型。字符串类型在使用时比较容易混淆,下表罗列了GaussDB中常见的字符串类型。1)常用字符串类型2)示例--创建表。CREATE TABLE t_char_type(column1 VARCHAR(5))DISTRIBUTE BY HASH (column1);--插入数据。INSERT INTO t_char_type VALUES ('ok');--插入的数据长度超过类型规定的长度报错。INSERT INTO t_char_type VALUES ('too long');ERROR: value too long for type character varying(5)CONTEXT: referenced column: column1--明确类型的长度,超过数据类型长度后会自动截断。INSERT INTO t_char_type VALUES ('too long'::varchar(5));--查询数据。SELECT column1, char_length(column1) FROM t_char_type;column1 | char_length---------+-------------ok | 2too l | 5(2 rows)2、布尔类型1)说明“真”值的有效文本值是:TRUE、't'、'true'、'y'、'yes'、'1'以及所有非0整数。“假”值的有效文本值是:FALSE、'f'、'false'、'n'、'no'、'0'、0。使用TRUE和FALSE是比较规范的用法(也是SQL兼容的用法)。2)示例--创建表。CREATE TABLE t_bool_type(column1 BOOLEAN,column2 TEXT)DISTRIBUTE BY HASH(column2);--插入数据。INSERT INTO t_bool_type VALUES (TRUE, 'one');INSERT INTO t_bool_type VALUES (FALSE, 'two');--查看数据。SELECT * FROM t_bool_type;column1 | column2---------+---------t | onef | two(2 rows)SELECT * FROM t_bool_type WHERE column1 = 't';column1 | column2---------+---------t | one(1 row)3、数值类型1) 整数类型TINYINT、SMALLINT、INTEGER和BIGINT类型存储各种范围的数字,也就是整数。试图存储超出范围以外的数值将会导致错误。常用的类型是INTEGER,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。2)示例--创建具有TINYINT,INTEGER,BIGINT类型数据的表。openGauss=# CREATE TABLE t_int_type(column1 TINYINT,column2 TINYINT,column3 INTEGER,column4 BIGINT);--插入数据。openGauss=# INSERT INTO int_type_t2 VALUES(100, 10, 1000, 10000);--查看数据。openGauss=# SELECT * FROM int_type_t2;column1 | column2 | column3 | column4-----------+----------+------------+-------100 | 10 | 1000 | 10000(1 row)4、日期/时间类型1)日期输入说明:日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。日期的文本输入需要加单引号包围,语法:type [ ( p ) ] 'value',可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。2)时间段输入说明:reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外,文本输入需要加单引号。四、数据类型选择建议选择数据类型,在字段设计时,基于查询效率的考虑,一般遵循以下原则:选择数值类型时,在满足业务精度的情况下,选择数据类型的优先级从高到低依次为整数、浮点数、NUMERIC。使用一致的数据类型,当多个表存在逻辑关系时,表示同一含义的字段应该使用相同的数据类型。对于字符串数据,建议使用变长字符串数据类型,并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数,避免超出最大长度时出现字符截断现象。除非明确知道数据类型为固定长度字符串,否则,不建议使用CHAR(n)、BPCHAR(n)、NCHAR(n)、CHARACTER(n)。索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。尽量使用执行效率比较高的数据类型,一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。尽量使用短字段的数据类型:长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。附:GaussDB数据库涉及的数据类型“数值类型、货币类型、布尔类型、字符类型、二进制类型、日期/时间类型、几何类型、网络地址类型、位串类型、文本搜索类型、UUID类型、JSON/JSONB类型、HLL数据类型、范围类型、对象标识符类型、伪类型、列存表支持的数据类型、账本数据库使用的数据类型”。详见官方文档:cid:link_0以上就是本期的内容,欢迎大家测试、交流!
  • [问题求助] Gauss数据库中的存储过程有没有类似Oracle中sys.dbms_job.submit()后台提交作业的功能?
    如果是pgsql模式,是否同样要像在postgreSQL数据库那样额外安装pg_cron和pgAgent扩展?
总条数:1672 到第 页
上滑加载中