精华内容
下载资源
问答
  • postgresql 复合数据类型的使用方法

    千次阅读 2017-11-28 11:04:30
    postgresq 数据库的数据类型分为4种:基本数据类型、复合数据类型、域以及伪类型 基本类型:数据库内置数据类型,例如integer、char、varchar等 复合数据类型:需要用户自定义,所谓复合就是把多个基本类型融合在...

    postgresq 数据库的数据类型分为4种:基本数据类型、复合数据类型、域以及伪类型

    基本类型:数据库内置数据类型,例如integer、char、varchar等

    复合数据类型:需要用户自定义,所谓复合就是把多个基本类型融合在一起使用,复合类型的字段实际上就是一个特殊的数组

    域:一种特殊的基本数据类型,由基本数据类型加上约束条件构成

    伪类型:“伪”说明它不是真正的数据类型,这些数据类型不能作为表的列类型,只能作为函数的参数或返回值的数据类型


    好了,下面说说这个复合数据类型如何使用:

    首先创建一个复合类型:

    create type s_type as (
    	id integer,
    	name varchar,
    	addr text
    );

    创建该类型的表:

    create table s_table (
    	student s_type
    );

    插入数据:

    insert into s_table values ((1,'zhangsan','陕西省'));

    查询数据:

    select * from s_table;                  //查询全部
    select (student).name from s_table;     //查询student字段的name值

    展开全文
  • PL/SQL复合数据类型包括:PL/SQL记录、PL/SQL表(索引表)、嵌套表、可变长数组。 复合数据类型的说明在本博客的《PL/SQL数据类型》中有详述,这里对复合数据类型所使用到的方法做专题分析。
    Oracle PL/SQL集合数据类型专题:
    


    一、什么是PL/SQL集合数据类型
    PL/SQL复合数据类型包括:PL/SQL记录、PL/SQL集合(分为PL/SQL表(别名索引表)、嵌套表、VARRAY)。
    其中PL/SQL集合数据类型是指符合数据类型中的PL/SQL集合。


    复合数据类型的说明在本博客的《PLSQL数据类型》中有详述,这里只对PL/SQL集合数据类型的一系列特有操作与应用做讲述。




    二、PL/SQL集合的多级集合调用应用
    说明:多级集合是指嵌套了集合类型的集合类型,从而实现多维数组功能,9i后支持。


    1)多级PL/SQL表(索引表)
    说明:如果多维数组元素个数没有限制,可以使用多级PL/SQL表和嵌套表。
    Declare
    Type al_table_type is table of int index by binary_integer; --定义一维table
    Type nal_table_type is table of al_table_type index by binary_integer;--定义二维table集合
    Nv1 nal_table_type;
    Begin
    Nv1(1)(1):=10; 
    Nv1(1)(2):=5;                                                                                                
    Nv1(2)(1):=100; 
    Nv1(2)(2):=50;
    Dbms_output.put_line(‘显示二维数组所有元素’);
    For I in 1..nv1.count loop
      For j in 1..nu1(i).count loop
        Dbms_output.put_line(i||’,’||j||’shi’||nv1(i)(j));
      End loop;
    End loop;
    End;


    2)多级嵌套表
    Declare
    Type al_table_type is table of int;--定义一维嵌套表
    Type nal_table_type is table of al_table_type;--定义二维嵌套表集合
    Nv1 nal_table_typer :=nal_table_typer (al_table_type(2,4),al_table_type(5,73));
    Begin
    Dbms_output.put_line(‘显示二维数组所有元素’);
    For I in 1..nv1.count loop
      For j in 1..nv1(i).count loop
        Dbms_output.put_line(i||’,’||j||’shi’||nv1(i)(j));
      End loop;
    End loop;
    End;


    3)多级VARRAY
    Declare
    Type al_varray_type is varray(10) of int;--定义一维varray
    Type nal_varray_type is varray(10) of al_varray_type;--定义二维varray集合
    nvl nal_varray_type:= nal_varray_type(
    al_varray_type(58,100,102);
    al_varray_type(55,6,73);
    al_varray_type(2,4);
    begin
    dbms_output.put_line(‘显示二维数组所有元素’);
    for i in 1..nv1.count loop
      for j in 1..nv1.count loop
        Dbms_output.put_line(i||’,’||j||’shi’||nv1(i)(j));
      End loop;
    End loop;
    End;




    三、集合数据类型的方法
    说明:复合数据类型中PL/SQL集合类型所特有的集合方法,集合方法是Oracle所提供用于操纵集合变量的内置函数或过程。
    方法包含EXISTS、COUNT、LIMIT、FIRST、NEXT、PRIOR和NEXT是函数,EXTEND、TRIM和DELETE是过程。


    1、exists方法
    说明:确定特定的PL/SQL表元素是否存在,如果集合元素存在,则返回true;如果不存在,则返回false
    例子:
    declare
    type ename_table_type is table of emp.ename%type;
    ename_table ename_table_type;
    begin
    if ename_table.exsts(1) then
    ename_table(1):='scott';
    else
    dbms_output.put_line('必须初始化集合元素');


    2、count方法
    说明:返回当前集合变量中的元素总个数。
    declare
    type aneme_table_type is table of emp.ename%type index by binary_integer;
    ename_table ename_table_type;
    begin
    ename_table(-5):='aa';
    ename_table(1):='b';
    ename_table(10):='bk';
    dbms_output.put_line(ename_table.count);
    end;


    3、limit方法
    说明:返回集合元素的最大元素个数。因为嵌套表和索引表的元素个数没有限制,所以调用方法会返回NULL;而对于VARRAY会返回最大元素个数。
    declare
    type aneme_table_type is varray(20) of emp.ename%type;
    ename_table ename_table_type:=ename_table_type('mary');
    begin
    dbms_output.put_line(ename_table_type.limit);
    end;


    4、first和last方法
    说明:返回集合第一个、最后一个元素的下标。
    declare
    type aneme_table_type is table of emp.ename%type index by binary_integer;
    ename_table ename_table_type;
    begin
    ename_table(-5):='aa';
    ename_table(1):='b';
    ename_table(10):='bk';
    dbms_output.put_line(ename_table.first);
    dbms_output.put_line(ename_table.last);
    end;


    5、prior和next方法
    说明:返回当前集合元素的前一个元素和下一个元素


    举例:
    declare
    type ename_table_type is table of emp.ename%type index by benary_integer; --PL/SQL表
    ett ename_table_type;
    begin
    et(-5):='scott';
    et(1):='smith';
    st(5):='mary';
    dbms_output.put_line('元素1的前一个元素值:' || et(et.prior(1))); --结果是scott
    dbms_output.put_line('元素1的后一个元素值:' || et(et.next(1))); --结果是mary
    end;


    6、extend方法
    说明:为集合变量增加元素,只适用于嵌套表和VARRAY。
    格式:extend 添加一个null元素
    extend(n) 添加n个null元素
    extend(n,i) 添加n个值与第i个元素相同的元素


    举例:
    declare
    type id_table_type is table of number(6); --嵌套表
    idt id_table_type:=id_table_type(1,2,5); --声明并初始化3个元素
    begin
    if idt.exists(4) then --判读第四个元素是否存在
    dbms_output.put_line('元素值:' || idt(no));
    else
    dbms_output.put_line('元素未初始化'); --结果
    end if;
    idt.extend(999); --添加999个空元素
    dbms_output.put_line('第一个元素是:' || idt(idt.first)); --结果为1
    dbms_output.put_line('最后一个元素是:' || nvl(to_char(idt(idt.first)),'null')); --结果为null
    dbms_output.put_line('元素总数为:' || idt.count); --结果为1002
    end;


    7、trim方法
    说明:从集合尾部删除元素,只适用于嵌套表和VARRAY。
    格式:trim 删除一个元素
    trim(n) 删除n个


    举例:
    declare
    type id_array_type is varray(30) of number(6); --可变长数组
    iat id_array_type:=id_array_type('A','B','C','D','E','F','G','H','I','J','K','L');
    begin
    dbms_output.put_line('元素总数为:' || iat.count); --结果为12
    dbms_output.put_line('最大元素个数:' || iat.limit); --结果是30
    iat.trim(5);
    dbms_output.put_line('最后一个元素:' || iat(iat.last)); --结果是G
    end;


    8、delete方法
    说明:删除集合元素,只适用于嵌套表和索引表。
    格式:delete 删除全部元素
    delete(n) 删除第N个元素
    delete(m,n) 删除除集合变量中m~n之间的所有元素


    举例:
    declare
    type id_table_type is table of number(6) index by binary_integer; --PL/SQL表
    itt id_table_type;
    begin
    for i in 1..10000 loop
    itt(i):=i;
    end loop;
    for j in 1..itt.count loop
    if mod(j,2)=0 then
    id.delete(j); --余数为0则删除该元素
    end if;
    end loop;
    end;




    四、集合数据类型的赋值。
    当使用嵌套表和VARRAY时,通过执行insert、update、fetch、select,赋值语句,用可以将一个集合的数据赋值给另外一个集合。
    从Oracle10g开始,给嵌套表赋值时,还可以用set、multiset union、multiset intersect、multiset except等集合操作符。
    其中set用于取消嵌套表中的重复值,multiset union用于取得2个嵌套表的并集(带有distinct可以取消重复结果)
    multiset intersect取得2个嵌套表的交集,multiset except取得2个嵌套表的差集。


    1、将一个集合的数据赋值给另外一个集合
    说明:当使用赋值语句(:=)或sql语句将源集合中的数据赋值给目标集合时,会自动清除模板集合原有数据再赋值。
    注意:当进行集合赋值时,源集合和目标集合的数据类型必须一致。
    declare
    type name_varray_type is varray(4) of varchar2(10);
    name_array1 name_varray_type;
    name_array2 name_varray_type;
    begin
    name_array1:=name_varray_type('scott','smith');
    name_array2:=name_varray_type('a','a','a','a','a');
    dbms_output.put('2的原数据:');
    for i in 1..name_array2.count loop
    dbms_output.put(name_array2(i));
    end loop;
    dbms_output.new_line;
    name_array2:=name_array1;
    dbms_output.put('2的新数据:');
    for i in 1..name_array2.count loop
    dbms_output.put(name_array2(i));
    end loop;
    dbms_output.new_line;
    end;


    2、给集合符NULL值
    说明:在清空集合变量的所有数据时,既可以使用集合delete和trim,也可以讲一个null集合变量赋给目标集合变量。
    declare
    type name_varray_type is varray(4) of varchar2(10);
    name_array1 name_varray_type;
    name_array2 name_varray_type;
    begin
    name_array1:=name_varray_type('scott','smith');
    dbms_output.put('2的原数据个数'||name_array1.count);
    name_array1:=name_array2;
    --dbms_output.put('2的新数据个数'||name_array1.count);
    end;


    3、使用集合操作符给嵌套表赋值
    说明:10g开始,允许将多个嵌套表的结果组合到某个嵌套表中,通过使用ANSI集合操作符(set,multiset union,
    multiset intersect,multiset except)实现。


    1)、set操作符
    说明:用于去掉嵌套表中的重复值。
    declare
    type nt_table_type is table of number;
    nt_table nt_table_type:=nt_table_type(2,4,3,1,2);
    result nt_table_type;
    begin
    result:=set(nt_table);
    dbms_output.put('result:');
    for i in 1..result.count loop
    dbms_output.put(' '||result(1));
    end loop;
    dbms_output.new_line;
    end;


    2)、multiset union和multiset union distinct操作符
    说明:multiset union取得2个嵌套表的并集,保留重复项;multiset union distinct去掉重复。
    declare 
    type nt_table_type is table of numberr;
    nt1 nt_table_type:=nt_table_type(1,2,3);
    nt2 nt_table_type:=nt_table_type(3,4,5);
    result nt_table_type;
    begin
    result:=nt1 multiset union nt2;
    dbms_output.put('resilt:');
    for i in 1..result.count loop
    dbms_output.put(' '||result(i));
    end loop;
    dbms_output.new_line;
    end;


    3)、multiset intersect操作符
    说明:取得2个嵌套表的交集。
    declare 
    type nt_table_type is table of numberr;
    nt1 nt_table_type:=nt_table_type(1,2,3);
    nt2 nt_table_type:=nt_table_type(3,4,5);
    result nt_table_type;
    begin
    result:=nt1 multiset intersect nt2;
    dbms_output.put('resilt:');
    for i in 1..result.count loop
    dbms_output.put(' '||result(i));
    end loop;
    dbms_output.new_line;
    end;


    4)、multiset except操作符
    说明:取两个嵌套表变量的差集。
    declare 
    type nt_table_type is table of numberr;
    nt1 nt_table_type:=nt_table_type(1,2,3);
    nt2 nt_table_type:=nt_table_type(3,4,5);
    result nt_table_type;
    begin
    result:=nt1 multiset except nt2;
    dbms_output.put('resilt:');
    for i in 1..result.count loop
    dbms_output.put(' '||result(i));
    end loop;
    dbms_output.new_line;
    end;




    五、集合数据类型的比较
    说明:用于比较两个集合变量是否相同。
    10g后新增集合比较操作符包括:
    CARDINALITY(返回嵌套表变量的元素个数),
    SUBMULTISET OF(确定一个嵌套表是否为领一个嵌套表的子集),
    MEMBER OF(检测特定数据是否为嵌套表元素),
    IS A SET(检测嵌套表是否包含重复的元素),
    IS EMPTY(检测嵌套表是否为null)等。


    1、检测集合是否为null
    说明:is null使用于嵌套表或VARRAY变量;is empty只使用于嵌套表。
    declare
    type name_array_type is varray(3) of varchar2(10);
    name_array nane_array_type;
    begin
    --if name_array is empty then
    if name_array is null then
    dbms_output.put_line('未初始化');
    end if;
    end;


    2、比较嵌套表是否相同
    说明:使用=和!=比较嵌套表是否相同,只能用于嵌套表。
    declare
    type name_table_type is table of varchar2(10);
    name_table1 name_table_type;
    name_table2 name_table_type;
    begin
    name_table1:=name_table_type('scott');
    name_table2:=name_table_tyoe('smith');
    if name_table1=name_table2 then
    dbms_output.put_line('相同');
    else
    dbms_output.put_line('不同');
    end if;
    end;


    3、在嵌套表上使用ANSI集合操作符
    说明:这些操作符只适用于嵌套表。


    1)、CARDINALITY
    说明:也可以称为函数,返回嵌套表变量的元素个数。
    declare
    type nt_table_type is table of number;
    nt1 nt_table_tyoe:=nt_table_type(1,2,3,1);
    begin
    dbms_output.put_line('元素个数'||CARDINALITY(nt1));
    end;


    2)、SUBMULTISET OF
    说明:用于确定一个嵌套表是否为另一个嵌套表的子集。
    declare
    type nt_table_type is table of number;
    nt1 nt_table_type:=nt_table_type(1,2,3);
    nt2 nt_table_type:=nt_table_type(1,2,3);
    begin
    if nt1 submiltiset of nt2 then
    dbms_output.put_line('nt1是nt2的子集');
    end if;
    end;


    3)、MEMBER OF
    说明:检测特定数据是否为嵌套表的元素。
    declare
    type nt_table_type is table of number;
    nt1 nt_table_tyoe:=nt_table_tyoe(1,2,3,5);
    v1 number:=2;
    begin
    if v1 member of nt1 then
    dbms_output.put_line('v1是nt1的元素');
    end if;
    end;


    4)、IS A SET
    说明:用于检测嵌套表是否包含重复的元素值。
    declare
    type nt_table_type is table of number;\
    ot1 nt_table_type:=nt_table_type(1,2,3,5);
    begin
    if nt1 is a set then
    dbms_output.put_line('嵌套表nt1无重复值');
    end if;
    end;




    六、集合数据类型的批量绑定
    说明:9i新增,是指执行单次SQL操作能传递所有集合的数据,当在select、insert、update、delete
    语句上处理批量数据时,通过批量绑定,可以极大加快数据处理速度。
    批量绑定用bult collect子句和forall语句完成,其中bult collect子句用于取得批量数据,
    该子句只能用于select语句、fetch语句、dml返回子句中;而forall语句值适用于执行批量DML操作。


    1、使用与不使用批量绑定的区别


    1)、不适用批量绑定
    说明:9i之前,为了将多个集合元素插入到数据库表,必须要使用循环完成。
    例子:以索引表为例
    declare
    type id_table_type id table of number(6) index by binary_integer;
    type name_table_type is table of varchar2(10) index by binary_integer;
    id_table id_table_type;
    name_table name_table_type;
    start_time number(10);
    end_time number(10);
    begin
    for i in 1..5000 loop
    id_table(i):=i;
    name_table(i):='Name'||to_char(i);
    end loop;
    start_time:=dbms_utility.get_time;
    for i in 1..id_table.count loop
    insert into demo values(id_table(i),name_table(i));
    end loop;
    end_time:=dbms_utility.get_time;
    dbms_output.put_line('总时间'||to_char((end_time-start_time)/100));
    end;


    2)、使用批量绑定
    declare
    type id_table_type id table of number(6) index by binary_integer;
    type name_table_type is table of varchar2(10) index by binary_integer;
    id_table id_table_type;
    name_table name_table_type;
    start_time number(10);
    end_time number(10);
    begin
    for i in 1..5000 loop
    id_table(i):=i;
    name_table(i):='Name'||to_char(i);
    end loop;
    start_time:=dbms_utility.get_time;
    --批量绑定的使用开始
    forall i in 1..id_table.count
    insert into demo values(id_table(i),name_table(i));
    --批量绑定的使用结束
    end_time:=dbms_utility.get_time;
    dbms_output.put_line('总时间'||to_char((end_time-start_time)/100));
    end;


    2、FORALL语句
    说明:当要在PL/SQL中执行批量insert、update、delete操作,可以使用forall语句。
    9i前forall语句必须是连续的元素;10g后通过增加indices of子句和values of子句,可以使用不连续的集合元素。
    注意:for语句时循环语句,forall不是循环语句。如下面语法,9i只有语法一,10g后新增了语法二、三。


    语法一:forall i in lower_bound..upper_bound sql_statement;
    其中,i是隐含定义的整数变量(将作为集合元素下标被引用),lower_bound和upper_bound是集合元素上下界。


    语法二:forall i in indices of collection [between lower_bound and upper_bound] sql_statement;
    其中,indices of指定只取对应于collection集合元素下标的i值。


    语法三:forall i in values of index_collection sql_statement;
    其中,values of指定i值从集合变量index_collection中取得。


    1)、DML语句上使用批量绑定
    说明:使用批量绑定为数据库表插入数据时,首先需要给集合元素赋值,然后使用forall语句执行批量绑定插入操作。
    declare
    type id_table_type id table of number(6) index by binary_integer;
    type name_table_type is table of varchar2(10) index by binary_integer;
    id_table id_table_type;
    name_table name_table_type;
    begin
    for i in 1..50 loop
    id_table(i):=i;
    name_table(i):='Name'||to_char(i);
    end loop;
    forall i in 1..id_table.count
    insert into demo values(id_table(i),name_table(i));
    update demo set name=name_table(i) where id=id_table(i);
    delete from demo where id=id_table(i);
    commit;
    end;


    2)、FORALL语句中使用部分集合连续的元素
    说明:上面说到的都是集合的所有元素,forall可以使用部分元素。
    declare
    type id_table_type id table of number(6) index by binary_integer;
    id_table id_table_type;
    begin
    for i in 1..50 loop
    id_table(i):=i;
    end loop;
    forall i in 8..10
    insert into demo values(id_table(i),name_table(i));
    commit;
    end;


    3)、forall语句上使用indices of子句
    说明:indices of子句是10g新增,用于跳过集合中的null元素。
    declare
    type id_table_tyoe is table of number(6);
    id_table id_table_type;
    begin
    id_table:=id_table_type(1,null,3,null,5);
    forall i in indicrs of id_table
    delete from demo where id=id_table(i);
    end;


    4)、forall语句上使用values of子句
    说明:values of子句是10g新增,用于从其他集合中取得集合下标的值。
    declare
    type id_table_type is table of demo.id%type;
    type name_table_type is table of demo.name%type;
    id_table id_table_type;
    name_table name_table_type;
    type index_pointer_type is table of pls_integer;
    index_pointer index_pointer_type;
    begin
    select * bulk collect into id_table,name_table from demo;
    index_pointer:=index_pointer_type(6,8,10);
    forall i in values of index_pointer
    insert into new_demo_table2 values(id_table(i),name_table(i));
    end;
    --结果是向表中插入了6 8 10的数据


    5)、forall语句上使用SQL%BULK_ROWCOUNT属性
    说明:专门为forall语句提供的属性,用于取得执行批量绑定是第i个元素所作用的行数。
    declare
    type dno_table_type is table of number(3);
    dno_table dno_table_type:=dno_table_type(10,20);
    begin
    forall i in 1..dno_table.count
    update emp set sal=sal*1.1 where deptno=dno_table(i);
    dbms_output.put_line('第2个元素更新的行数:'||SQL%BULK_ROWCOUNT(2));
    end;


    3、BULK COLLECT子句
    说明:用于取得批量数据,将批量数据存放到PL/SQL集合变量中,只用于select into、fetch into和dml返回子句中。
    语法:。。。BULK COLLECT into collection_name[,collection_name]。。。
    其中,collection_name指定存放的集合变量名


    1)、在select into语句中使用bulk collect
    说明:9i前,select into必须且只能返回1行数据,否者抛异常,9i开始通过在elect into使用bulk collect子句可以
    一次将select语句的多行结果检索到集合变量。
    declare
    type emp_table_type is table of emp%rowtype index by binary_integer;
    emp_table emp_table_type;
    begin
    select * bulk collect into emp_table from emp where deptno=&no;
    for i in 1..emp_table.count loop
    dnms_output.put_line('emp_table(i).ename');
    end;


    2)、在DML的返回子句中使用bulk collect子句
    说明:为了取得DML操作所改变的数据,可以使用returning子句;为了取得DML所作用的多行数据,需要使用bulk collect子句。
    declare
    type ename_table_type is table of emp.ename%type;
    ename_table ename_table_type;
    begin
    delete from emp where deptnp=&no returning ename bulk collect into ename_table;
    dbms_output.put('雇员名:');
    for i in 1..ename_table.count loop
    dbms_output.put(ename_table(i));
    end loop;
    end;




    展开全文
  • Clickhouse 复合数据类型

    千次阅读 2020-06-09 21:54:59
    Clickhouse提供了4种复合数据类型 数组Array,元祖tuple,枚举Enum,嵌套Nest。 这些类型是其他数据库原生不具备的特性,拥有了这些复合类型,clickhouse的数据模型表达能力更强了。 1.Array 2.Tuple 3.Enum 4....

    Clickhouse提供了4种复合数据类型 数组Array,元祖tuple,枚举Enum,嵌套Nest。

    这些类型是其他数据库原生不具备的特性,拥有了这些复合类型,clickhouse的数据模型表达能力更强了。

    1.Array

    hadoop101 :) select array(1,2.0,256) as x,toTypeName(x);
    
    ┌─x─────────┬─toTypeName([1, 2., 256])─┐
    │ [1,2,256] │ Array(Float64)           │
    └───────────┴──────────────────────────┘
    数组查询时候不需要主动声明数据数据类型,clickhouse可以自己推断数据类型.推断的依据:
    以最小存储代价为原则 即使用最小可表达的数据类型。
    
    hadoop101 :) select [10,200,2000.0,null] as x,toTypeName(x);
    
    SELECT 
        [10, 200, 2000., NULL] AS x, 
        toTypeName(x)
    
    ┌─x──────────────────┬─toTypeName([10, 200, 2000., NULL])─┐
    │ [10,200,2000,NULL] │ Array(Nullable(Float64))           │
    └────────────────────┴────────────────────────────────────┘
    
    1 rows in set. Elapsed: 0.009 sec. 
    
    若数组元素中存在NULL元素则元素类型将变为Nullable
    在同一数组内可以包含多种数据类型,但是数据类型必须要兼容。
    
    定义表的时候数组需要明确指定元素类型:
    create table Array(
    id UInt64,
    typename Array(String)
    )engine = Memory;
    

    2.Tuple

    Tuple 元祖类型由1--N个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间要求兼容。
    元祖 同样支持类型推断,推断依据仍然是以最小存储代价为原则。常规方式是tuple(T)。
    
    
    hadoop101 :) select tuple(100,'027','wuhan',now()) as x,toTypeName(x);
    
    SELECT 
        (100, '027', 'wuhan', now()) AS x, 
        toTypeName(x)
    
    ┌─x─────────────────────────────────────────┬─toTypeName(tuple(100, '027', 'wuhan', now()))─┐
    │ (100,'027','wuhan','2020-06-10 11:57:33') │ Tuple(UInt8, String, String, DateTime)        │
    └───────────────────────────────────────────┴───────────────────────────────────────────────┘
    
    1 rows in set. Elapsed: 0.020 sec. 
    
    hadoop101 :) select (110,'010','beijing',now(),null) as x,toTypeName(x);
    
    SELECT 
        (110, '010', 'beijing', now(), NULL) AS x, 
        toTypeName(x)
    
    ┌─x────────────────────────────────────────────────┬─toTypeName(tuple(110, '010', 'beijing', now(), NULL))─────┐
    │ (110,'010','beijing','2020-06-10 11:58:47',NULL) │ Tuple(UInt8, String, String, DateTime, Nullable(Nothing)) │
    └──────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘
    
    1 rows in set. Elapsed: 0.003 sec. 
    在表定义的时候元组也需要明确指定数据类型:
    create table Tuple(
    kv Tuple(Int8,String,String,Datetime)
    )ENGINE=Memory;
    
    在数据写入的过程中数据类型要和定义的严格匹配。
    

    3.Enum

    枚举类型,是一种在定义常量的时候经常会使用的数据类型。提供Enum8和Enum16 两种数据类型,除了取值不同之外别无二致。
    枚举固定使用(String,Int) 这种kV键值对的形式定义数据。
    Enum8对应于(String :Int8)
    Enum16对应于(String :Int16)
    
    在定义Enum类型时候:
    1.Key 和Value是不允许重复的,要保证唯一性
    2.Key 和Value的值都不允许为Null,但是Key允许为空字符串。
    在写入枚举类型数据的时候可以只写入Key字符串部分。
    3.数据写入的过程会对照枚举集合项的内容逐一检查,若key字符串不在集合中则会抛出异常。
    
    create table Enum(
    Season Enum8 (Spring=1,Summer=2,Fall=3,Winter=4)
    )ENGINE=Memory;
    
    insert into Enum values('Summer');
    
    Enum 类型完全可以使用String来替代,在某些场景下出于性能的考虑,Enum更加使用。
    Enum的Key 是String类型,但是对枚举的所有操作如排序,分组,去重,过滤,会使用Int类型的Value.

    4.Nest

    嵌套类型本质是一种多维数组的结构。嵌套表中的每个字段都是一个数组,并且行与行之间的数组长度无须对齐。
    
    嵌套表的定义:
    
    hadoop101 :) create table nested(username String,age UInt8,sex UInt8,address Nested(id UInt8,addr String)) Engine=Memory;
    
    CREATE TABLE nested
    (
        `username` String, 
        `age` UInt8, 
        `sex` UInt8, 
        `address` Nested(
        id UInt8, 
        addr String)
    )
    ENGINE = Memory
    
    
    数据插入:
    hadoop101 :) insert into nested values('clickhouse',4,1,[100,101,102],['Russia Moscow','China Beijing','China Wuhan']);
    
    INSERT INTO nested VALUES
    
    Ok.
    
    1 rows in set. Elapsed: 0.002 sec. 
    
    
    
    hadoop101 :) select * from nested;
    
    SELECT *
    FROM nested
    
    ┌─username───┬─age─┬─sex─┬─address.id────┬─address.addr────────────────────────────────────┐
    │ clickhouse │   4 │   1 │ [100,101,102] │ ['Russia Moscow','China Beijing','China Wuhan'] │
    └────────────┴─────┴─────┴───────────────┴─────────────────────────────────────────────────┘
    
    1 rows in set. Elapsed: 0.003 sec. 
    
    访问嵌套表的内容:
    hadoop101 :) select address.id,address.addr from nested;
    
    SELECT 
        address.id, 
        address.addr
    FROM nested
    
    ┌─address.id────┬─address.addr────────────────────────────────────┐
    │ [100,101,102] │ ['Russia Moscow','China Beijing','China Wuhan'] │
    └───────────────┴─────────────────────────────────────────────────┘
    
    1 rows in set. Elapsed: 0.002 sec. 
    

     

    展开全文
  • 数仓工具—Hive复合数据类型(9)

    万次阅读 2020-12-25 22:50:21
    除了使用`string`之外的基础数据类型,Hive中的列支持使用struct, map, array,union_type 等复合数据类型。 复合类型是指array、map、struct和uniontype,一般在企业中使用 array和map会比较多一些。

    复合数据类型

    除了使用string之外的基础数据类型,Hive中的还支持使用struct, map, array,uniontype 等复合数据类型。一般在企业中使用 arraye和map会比较多一些。

    数据类型 描述 语法示例
    STRUCT 和C语言中的struct或者"对象"类似,都可以通过"点"符号访问元素内容。 struct{‘John’, ‘Doe’}
    MAP MAP是一组键-值对元素集合,使用key可以访问元素。 map(‘fisrt’, ‘John’, ‘last’, ‘Doe’)
    ARRAY 数组是一组具有相同数据类型和名称的变量的集合。 Array(‘John’, ‘Doe’)

    1. Array类型

    ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由[‘apple’,‘orange’,‘mango’]组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;

    创建数据库表,以array作为数据类型

    create table person(
    展开全文
  • 1PL/SQL记录类型和表类型都是用户自定义的复合数据类型 2记录类型可以存储多个字段值,类似表的一行数据 3记录类型与数据库的行结构非常相似,使用记录类型的变量可以存储由多个列值组成的一行数据。 4.类似于%...
  • 数据库数据类型学习总结

    千次阅读 2016-08-04 17:22:28
    SQLite 数据类型总结 http://www.cnblogs.com/bpasser/archive/2011/11/02/2233455.html 1。严格地说,SQLite 没有数据类型。SQLite 使用动态数据类型,即:数据的 类型取决于数据本身,而不是它的容器(字段) 2...
  • PL/SQL中复合数据类型与游标 一.复合数据类型 1.定义: 复合变量类型不是数据库中已经存在的数据类型,因此复合变量在声明类型之前,首先要创建复合类型,复合类型创建后可以多次被使用。 2.复合数据类型...
  • ORACLE数据库数据类型

    千次阅读 2019-11-28 17:51:42
    1、字符类型 • CHAR:一个定长字符串,当位数不足自动用空格填充来达到其最大长度。如非NULL的CHAR(12)总是包含12字节信息。CHAR字段最多可以存储2,000字节的 信息。 • VARCHAR2:目前这也是VARCHAR 的同义词。这...
  • Hive复合数据类型array,map,struct的使用

    千次阅读 2016-12-27 12:20:40
    1.array的用法 2.map的用法 ...Hive中复合数据类型Array,Map,Struct的操作 The following functions construct instances of complex types. Constructor Function Operands Descript...
  • 前提前边一篇文章详细分析了如何在Windows10系统下搭建ClickHouse的开发环境,接着需要详细学习一下此数据库的数据定义,包括数据类型、DDL和DML。ClickHouse作为...
  • 小结-JAVA中的复合数据类型

    千次阅读 2014-08-22 17:42:55
    2006-11-14 19:08:45| 分类: 默认分类 | 标签:复合数据类型 java |举报|字号 订阅 索引 同简单数据类型的定义一样,Java虚拟机(JVM)还定义了索引(reference)这种数据类型。索引类型可以...
  • MySQL 数据库应用实战教程慕课版刘刚 苑超影 编著第2章 MySQL数据类型本章要点数值类型 字符串类型 日期时间类型 复合类型 如何选取数据类型 小结 MySQL数据库是用来存储数据的它可以存储姓名性别身高年龄出生日期...
  • 第2章MySQL数据类型 MySQL 数据库应用实战教 MySQL 数据类型 课程名称 项目名称 程慕课版 MySQL 数据类型 任务名称 课时 2 项目性质 演示性 验证性 设计性 综合性 授课班级 授课日期 授课地点 能力目标 具备正确选取...
  • pl/sql入门第二章--复合数据类型

    千次阅读 2006-06-01 15:00:00
     PL/SQL 记录 记录是PL/SQL的一种复合数据结构,scalar数据类型和其他数据类型只是简单的在包一级进行预定义,但复合数据类型在使用前必须被定义,记录之所以被称为复合数据类型是因为他由域这种由数据元素的逻辑...
  • PAGE PAGE 3 第2章MySQL数据类型 课程名称 MySQL数据库应用实战教程慕课版 项目名称 MySQL数据类型 任务名称 MySQL数据类型 课时 2 项目性质 演示性 验证性 设计性 综合性 授课班级 授课日期 授课地点 教学目标 能力...
  • Redis学习笔记(二)-四种复合数据类型

    千次阅读 2016-07-05 21:12:54
    Redis学习笔记(二)-四种高级数据类型继续上次的进行,第一篇重要学习了Redis的一些基本概念和基本操作语句,对Redis有了一个大概的认识,并且会简单使用,第一篇中忘记说明Redis的安装方法,这个很简单,上官网下载...
  •  PL/SQL 记录 记录是PL/SQL的一种复合数据结构,scalar数据类型和其他数据类型只是简单的在包一级进行预定义,但复合数据类型在使用前必须被定义,记录之所以被称为复合数据类型是因为他由域这种由数据元素的逻辑...
  • PL/SQL-2 复合数据类型

    千次阅读 2012-03-09 10:00:48
    -------------------------------------------------------------------------- *****************************************************************...第二部分:复合数据类型 ***********************************
  • 数据库表asm_device_config_info如下: CREATE TABLE `asm_device_config_info` ( `asmModel` varchar(32) NOT NULL COMMENT '自助机型号', `deviceType` varchar(32) NOT NULL COMMENT '外设类型', `device...
  • 文章目录数值类型:整数类型:浮点型:日期类型:字符串类型:枚举类型与集合类型: 数值类型: 整数类型: tinyint 默认有符号,[unsigned]代表无符号,超出范围显示最大范围。 语法: tinyint[(m)] ...
  • 页面查询数据数据库数据不一致

    千次阅读 2013-08-24 21:33:08
    页面查询数据数据库数据不一致遇到的两种情况: 1.hibernate 使用中 表CARD_SIGN,CARDSIGNID为主键,因需求需要将此表主键变更为复合主键在原有主键字段的基础上又增加了一个字段CARDTYPE作为复合主键。此时使用...
  • 数据类型 表的基本概念 数值类型 日期时间类型 字符串类型 复合类型 二进制类型 选择合适的数据类型;1. 表的基本概念 数据库与表之间的关系数据库是由各种数据表组成的数据表是数据库中最重要的对象用来存储和操作...
  • MySql Oracle SqlServer三大数据库数据类型列表   MySql数据类型   数据类型 描述 字节 推荐使用 SMALLINT 整数,从-32000到 +32000范围 2 存储相对...
  • MySQL_数据库数据类型(data type)介绍

    千次阅读 2015-04-01 16:34:46
    MySQL_数据库数据类型(data type)介绍 mysql数据库数据类型(data type)分以下几种:数值类型,字符串类型  一、数值类型 MySQL 的数值类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子...
  • ClickHouse数据类型

    千次阅读 2020-09-27 14:41:30
    文章目录ClickHouse数据类型基础类型数值类型整数浮点数Decimal字符串类型StringFixedStringUUID时间类型DateDateTimeDateTime64复合类型数组元组枚举嵌套特殊类型NullableDomain参考文档 ClickHouse数据类型 ...
  • 一、数据类型 概念:一个值的集合和定义在这个值集上一组操作的的总称。 (一个值的集合怎么理解呢,比如在C语言中,char类型数据范围是:-127~128,。而一组操作可以理解为类型所支持的操作方式,比如int和char类型...
  • 复合类型

    2011-04-19 21:00:00
    复合类型复合变量 复合变量可以将...PL/SQL提供了两种类型的复合数据类型: 记录类型 在记录类型中可以存储多个标量值,与数据库中的行相似 记录表类型 允许用户在程序代码中使用”表”,以便存储多个行的数据。它只
  • 在遵守关系数据库第3范式的基础上,基于Oracle的支持,采用了非第1范式的对象数据类型――嵌套表,建立了对象一关系数据库,并利用UML语言完成数据库逻辑建模。根据应用需求定义了用户视图,制定了数据规范、约束、...
  • PostgreSQL 数据类型

    千次阅读 2017-11-06 20:13:06
    PostgreSQL 数据类型 ...PostgreSQL 的数据类型被分为四种,分别是基本数据类型、复合数据类型、域和伪类型。    基本数据类型是数据库内置的数据类型,包括integer、char、varchar等数据类型。表6-1列出了Postg
  • MySQL数据库面试题(2020最新版)

    万次阅读 多人点赞 2020-03-10 17:20:40
    数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,463
精华内容 30,585
关键字:

复合数据类型数据库