华东15选5不开奖

【sql server数据库教程】

sql server数据库

结构化查询语言(Structured Query Language)简称SQL(发音:/?es kju? ?el/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系?#24120;?#21516;时也是数据库脚本文件的扩展名。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

1986年10月,美国国家标准协会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国?#26102;?#20934;组织的支持下成为国?#26102;?#20934;。不过各种通行的数据库系统在其实践过程中?#32423;許QL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

本sql server数据库教程由网站开发教程网整理发布,如有侵权或不足的地方请联系站长。

1.DDL语句

1.1创建表

格式:

CREATE TABLE [IF NOT EXISTS] table_name
[(col_name primitive_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[partition_def]
[STORED AS file_format]
[AS select_statement]

CREATE TABLE [IF NOT EXISTS] table_name
LIKE existing_table_name

参数?#24471;鰨?br /> partition_def

: PARTITION BY part_type (col_name) [(part_body [,part_body,...])]

part_body

: PARTITION part_name VALUES LESS THAN (const)

PARTITION DEFAULT

: PARTITION part_name VALUES IN (const[,const,...])

part_type

: RANGE
| LIST

file_format

: formatfile [compress]

primitive_type

: TINYINT - 1 byte integer
| SMALLINT - 2 byte integer
| INT - 4 byte integer
| BIGINT - 8 byte integer
| BOOLEAN - TRUE/FALSE
| FLOAT - single precision
| DOUBLE - Double precision
| STRING - sequence of characters in a specified set

建议:
整型尽量用bigint,浮点型尽量用double,避免在隐式转换的时候出现一些小问题。

?#24471;鰨?br /> 1、如果没有指定if not exists,则创建的表如果已经存在,会返回错误,如果指定了if not exists,则不会返回错误。
2、目前支持range、list分区。range分区定义时,分区的less than 的参数?#24403;?#39035;按照?#26377;?#21040;大的顺序排列,分区字段必须是表字段。
3、如果使用like,则创建的表使用已有表的定义。注意:仅建议源表和目标表都为内表的情况下使用。
4、用户必须有创建表的权限。
5、分区时,如果分区定义带有负数,那么负数必须使用单引号,例如: partition p1 values in (1,'-1')。

注意事项:
1、分区只能在定义的时候指定,表建好以后,无法将不带分区的表转变为带分区的表, 分区列一旦指定以后将无法改变。
2、如果所建的表带有default分区,那么在插入数据时,那些没有命中已知分区的数据,会放到default分区中,当后来add分区后,default分区中的数据并不会被自动移入对应的分区。因此,使用default分区可能带来一些意外的结果。比如用户没有建立abc这个分区,向表中插入abc分区的数据,会使数据存放在default分区中。这时,用户使用from tablename partition(abc) p?#20063;壞接?#35813;属于abc分区的数据,但是通过select * From tablename又可以查到。为了避免在何种情况,可以删除default分区,这样在插入数据时,发?#32622;?#26377;对应的分区,就会认为是脏数据而报错。

举例:
1、创建一个带分区的表,表的存储按照腾讯数据仓库结构化的方式

CREATE TABLE
Ptestformat
(a TINYINT, b SMALLINT, c int, d BIGINT , e FLOAT , f DOUBLE , g STRING )
partition by list(a)
(partition default)
STORED AS FORMATFILE;

2、创建一个表pv2,与page_view的定义相似:

Create table pv2 like page_view;

3、使用Create table as功能创建表
CREATE TABLE ctas1 as select key k, value from src limit 10;
(Create table as select)功能允许用户根据select语句?#21019;?#24314;表,并将select语句的结果集插入到新建立的表中。
(1)select语句可以是目前所支持的任意形式。
(2)用户可以通过列别名的方式指定新创建表的列名。如果未指定,则新创建的表的schema是从select语句中自动探测的。
注意: 新创建的表暂时不支持分区。

1.2删除表

格式: drop table <TABname>
?#24471;鰨?删除指定的表,如果表不存在,也返回成功。 用户必须有删除表的权限。
举例: 删除表t,则为Drop table t。

1.3清空表

格式: truncate table <TABname>
?#24471;鰨?删除指定表的数据,如果表不存在,并不报错。用户必须有删除表的权限。
举例: 删除表t,则为truncate table t;

1.4增加分区

增加一级分区一级分区range partition:
ALTER TABLE <TABname> ADD PARTITION par_name VALUES LESS THAN (const)
一级分区list partition:
ALTER TABLE <TABname> ADD PARTITION par_name VALUES IN (const,...)
增加default partition:
ALTER TABLE <TABname> ADD default PARTITION;
?#24471;鰨?在分区表上增加新的分区,用户需要对表有alter的权限。
注意事项:
1、如果表在创建时没有定义一级分区,则不能增加一级分区。
2、default是默认分区的分区名,不能改变,不能用于其他分区的分区名。
3、增加分区只是增加了元数据和目录,数据与分区的一致性需要用户去保证,例如如果新增加的分区的数据以前都在default分区中,则需要用户执行

Insert table TABname select  t.* from TABname partition(default) t来把数据导入到新的分区中。

4、腾讯数据仓库支持的分区的个数,每一级最多为65536个。如果一级的表的分区多于65536,那么可能是您的数据模型设计有问题,或者需要清除一些老分区。
举例:
表定义

create table kv (key int,value string)
partition by range(key)
(
partition default
);

增加一个分区存放key值小于100的记录:
alter table kv add partition less_100 values less than (100);

1.5删除分区

格式:删除一级分区ALTER TABLE <TABname> DROP PARTITION <par_name>
?#24471;鰨?#21024;除不存在的分区,返回成功。应用应该对这个表有alter的权限。
注意:这个SQL语句将删除分区的定义和数据。
举例: 删除分区p2,alter table test drop partition (p2);

1.6清空分区

格式:清空一个一级分区, ALTER TABLE <TABname> TRUNCATE PARTITION <(par_name)>
?#24471;鰨?删除分区中的数据,保留分区元数据。用户需要对表有delete权限。
举例: 清除test表p1分区,Alter table test truncate partition(p1)

1.7表重命名

格式: ALTER TABLE <old_name> RENAME TO <new_name>;
?#24471;鰨?重命名表,如果新名已经被使用,则表错。 用户须对表有alter权限。
举例: 重命名表test为newtest,Alter table test rename to newtest

1.8更改comment

格式:

COMMENT ON TABLE tblname is 'the new comment';
COMMENT ON TABLE tblname is NULL;
COMMENT ON VIEW viewname is 'the new comment';
COMMENT ON VIEW viewname is NULL;
COMMENT ON COLUMN columnname is 'the new comment';
COMMENT ON COLUMN columnname is NULL;

?#24471;鰨?br /> 1、用户不指定数据库时,默认修改的是当前数据库的表或视图。
2、列名的指定形式为tbl.col,view.col。也可以在前面指定数据库名。
3、当is关键词之后是字符串时,是将comment修改为新的comment;如果是null,则是删除指定comment。
4、用户须对表或视?#21152;衋lter权限。
注意: 在更改表或视图的comment时,要留意自己要修改的是表还是视图。

1.9增加、修改字段

格式:

ALTER TABLE <TABname> ADD COLUMNS (col_name data_type [COMMENT col_comment],...)
ALTER TABLE <TABname> CHANGE [COLUMN] col_old_name col_new_name [column_type] [COMMENT col_comment]

?#24471;鰨?br /> 1、对内表中的分区字段和索引字段不允许修改schema
2、增加字段的功能,只能加在表的末尾
3、减少列和替换所有列(replace)功能暂时不支持
4、关于修改字段数据类型的类型转换规则,参考下表:

       Tinyint	Smal..	Int	Float	Bigint	Double 	String
Tiny.. ------ ------ ------ ------ Direct Direct Direct
Smal.. ------ ------ ------ ------ Direct Direct Direct
Int ------ ------ ------ ------ Direct Direct Direct
Float ------ ------ ------ ------ Direct Direct Direct
Bigint ------ ------ ------ ------ Direct Direct Direct
Double ------ ------ ------ ------ Direct Direct Direct
String ------ ------ ------ ------ ------ ------ ------

备注:
1、Boolean类型不支持类型修改
2、任何类型不能转换为四?#20013;?#31867;型:Tinyint Smallint Int Float
3、String类型不允许转为任何类型
4、Float或者double类型转为bigint类型,如果Float或者double数值超过bigint表达?#27573;В?#21017;转为bigint的最大值或者最小值(根据mysql的标准)
5、bigint转为double类型,在理论上会产生极少数的精度损失,经过评估,认为这样的损失是可以接受的。
6、在进行数据类型转换的时候,不会修改实际数据,?#26377;?#31867;型转为大类型以后,不会发生数据错误,在double和bigint之间进行相互转换的时候,当double转为bigint以后可能会发生一定的精度损失,如果转换回来成double,原来的数据将完全复原。(这一点和Oracle以及mysql的处理有一定的区别)。
7、用户必须对表有alter权限。

注意: hive官方版本支持所有字段的替换操作(replace功能),tod目前不开放这个功能。
举例:
1、给表增加两个int型字段key1和key2,alter table test add columns (key1 int,key2 int);
2、修改列名,alter table test change column key1 key_1;
3、修改列类型,alter table test change key_1 key_1 bigint;
4、修改列名以及列类型,alter table test change key_1 key1 string;

1.10创建/更新视图

格式:CREATE [OR REPLACE] VIEW [IF NOT EXISTS] view_name AS SELECT ...;
?#24471;鰨篛R REPLACE和IF NOT EXISTS不能同时使用。
举例:create or replace view view1 as select * from table1;

1.11删除视图

格式: DROP VIEW view_name;

1.12显示函数

格式:show functions [func_name]
?#24471;鰨?#22914;果不带参数,则列举出系统支持的所有函数和算子,包括用户自定义的,如果带参数,则将参数看为正则表达式,“.”代表一个字符,"*"代表匹配任意个星号之前的字符,参数必须带引号。如 show functions "a.*"返回所有a开始的函数。
举例:
1、显示所有内建函数和自定义函数,Show functions;
2、显示所有函数名以a开始的函数,Show functions "a.*";

1.13显示内置函数的信息

格式: describe function [extended] <func_name>;
?#24471;鰨?加上extended后会显示更详细的用法
举例: 显示abs求绝对值函数的?#24471;?br />

describe function abs
结果:
abs(x) - returns the absolute value of x

显示更详细的用法

describe function extended abs
结果:
abs(x) - returns the absolute value of x

Example:

> SELECT abs(0) FROM src LIMIT 1;
0
> SELECT abs(-5) FROM src LIMIT 1;
5

1.14查看当前数据库中的表

格式:show tables [identifier_with_wildcards]
?#24471;鰨?#22914;果不带参数,返回当前数据库的默认表。如果带参数,则参数中可以带*,|等正则匹配符号,*匹配任意字符,|匹配可选字符串,参数必须带引号,单引号双引号都可。
举例:
1、显示当前数据库下的所有表,Show tables;
2、显示当前数据库下名字由a开始的所有表,Show tables 'a*';

1.15查看表的分区信息

格式:show partitions <table_name>
?#24471;鰨?#20998;别显示第一层分区和第二层分区的分区名,如果不存在分区或者不存在第二层分区,则不显示。
举例:显示表test的分区情况,Show partitions test;

1.16获得表的元数据信息

格式:DESCRIBE [EXTENDED] <table_name>[DOT col_name]
?#24471;鰨?#22914;果不带EXTENDED,则只返回表的列信息,或者指定的列信息,如果带有EXTENDED,则除了返回上面的信息,还会返回表的元数据信息。
举例:
显示表kv的表字段信息

describe kv
结果:
key int
value string
key2 int
key3 int

显示表kv的详细信息

describe extended kv
结果:
key int
value string
key2 int
key3 int

Detailed Table Information Table(tableName:kv, dbName:dcl_auto_test, owner:root, createTime:1354953791, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:key, type:int, comment:null), FieldSchema(name:value, type:string, comment:null), FieldSchema(name:key2, type:int, comment:null), FieldSchema(name:key3, type:int, comment:null)], inputFormat:StorageEngineClient.FormatStorageInputFormat, outputFormat:StorageEngineClient.FormatStorageHiveOutputFormat, compressed:true, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:StorageEngineClient.FormatStorageSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), priPartition:null, subPartition:null, parameters:{type=format}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE, vtables:null)
只返回某一列的信息对表create table map_test (key map<int,string>);
想获得key这个字段的信息 describe map_test.key
结果: key map<int,string> from deserializer

1.17获得列名中包含指定表达式的列定义信息

格式: DESCRIBE <table_name> where column_name contains "regexp";
?#24471;鰨?regexp为正则表达式。
举例:
显示表kv的表字段信息

describe kv
结果:
key int
value string
key2 int
key3 int

显示表kv中列名中包含key的列信息

describe kv where column_name contains "key.*";
结果:
key int
key2 int
key3 int

1.18SHOW CREATE TABLE

格式: SHOW CREATE TABLE <table_name>
?#24471;鰨?获得指定表的定义语句,包含建表语句中以下字段(某些字段只有在使用这个功能时才会有):
1、表名
2、表的字段
3、表的分区定义
4、自定义的分隔符
5、存储格式(Store as)
6、列存储定义
7、是否压缩
8、Charset
9、索引
注意: 除了上面列出的字段,其他的暂不支持。

1.19SHOW VERSION

格式:SHOW VERSION
?#24471;鰨?#35813;命令显示当前使用的查询引擎版本号,也可以在命令行下使用hive -v

1.20SHOW ROWCOUNT

格式: SHOW ROWCOUNT [extended] tablename [PARTITION(partitionname)][, SUBPARTITION(subpartitionname)][, PARTITION(partitionname,subpartitionname)]
?#24471;鰨?该命令查看表的记录数或者分区的记录数(暂时只支持结构化表)。加extended参数会打印该表的详细信息(每个分区的记录数都会打印出来,hash分区不会打印具体信息),也可以指定一个具体的分区来查看。
举例:
show rowcount hash_table4 partition(par_name1);
show rowcount extended hash_table4;

2.DML语句

2.1Insert语句

格式: INSERT [OVERWRITE] TABLE tablename1[COLUMNLIST] select_statement1 FROM from_statement
多插入语句:

FROM from_statement
INSERT [OVERWRITE] TABLE tablename1[COLUMNLIST] select_statement1
[INSERT [OVERWRITE] TABLE tablename2[COLUMNLIST] select_statement2] ...
COLUMNLIST : (col1 { , coli }*)

插入多行常量数据:
INSERT [OVERWRITE] INTO tablename[COLUMNLIST] VALUES (cnst1{,cnsti}*),(cnst1{,cnsti}*)*
?#24471;鰨?br /> 将查询语句的执行结果插入到指定的表中,支持多条insert子句在一条语句中。 如果目标表是分区表,则结果会自动插入到对应分区中
注意:
1、如果使用overwrite方式,则目标表中的所有数据将被先删除(如果目标表是分区表,则所有的分区将被清空),然后再插入新的数据。
2、尽量使用多insert子句的方式,可以减少了数据的扫描,提高运行效率。如果使用指定列插入的方式,必须保证被插入列(被插入表后面跟着的小括号内的字段列表)与插入列(select后面的字段列表)一一对应:字段数目相同,并且字段类型一一相同。
3、插入多行数据,需要注意的是,插入的每行数据需要和表中的列对应,包括字段数目和,字段类型的匹配。目前只支持常量的插入,不支?#25351;?#26434;类型数据,不支持函数插入。如果需要插入NULL,需要显示的使用NULL关键字,或者使用insertcolumns指定需要插入的列,而没有指定的列为空,不支持""或者作为NULL输入。
举例:
将表a和b的链接结果插入到表test中去
Insert overwrite table test select * from a join b on(a.key = b.key);
将查询结果插入到test和test2表中

From a join (select * from b where b > 10)c on(a.key = c.key)
Insert overwrite table test select a.key ,c.value
Insert overwrite table test2 select a.key,c.key;
insert columns:
Insert overwrite table tablename(a, b) select a, b from tbl2;
insert values:
Insert into tablename(a,b) values(1,'a'),(2,'b');

2.2Update语句

?#24471;鰨?br /> UPDATE table_name [PARTITION (partname) tabalias]? SET col_name= expr [, col_name= expr ]* [WHERE where_definition]?
Update操作的基本语法如上,从指定的table_name表中,使用表达式expr更新列col_name,set后面可以跟多个col表达式(用逗号分隔开),但不支持多层嵌套,也不支持多表连接。Where表达式子句为可选项,如果有则表示只对其中部分数据进行update,where子句只可能有一个,对前面多个set语句?#21152;行Аhere子句中不可使用exist等带子查询的表达式。如果是分区表则必须显式指定分区,不支持同时指定多个分区。在处理分区表的时候update不支持对分区字段进行update。
注意:
1、update暂不支持多列累计运算的功能。比如set a=a+1,b=a和set b=a,a=a+1在这里的结果是一样的,跟先后顺序无关,这和传统的数据库可能有所不同。 如果出现set a=1,a=2这种重复?#25345;?#30340;情况,只处理最后一次?#25345;怠?如果set的数据类型如目标列不一致,数据会被置为null。
2、update目前还没有锁机制来保证并发性,需要用户注意,对于update、delete、select并发操作同一张表的时候(同时对一张表做读和写操作),一定要保证这些操作是串行的,否则可能引发正在运行的select操作失败。只并行select操作同一张表是没有问题的。

2.2Delete语句

?#24471;鰨?br /> 支持三种删除数据的方式:
1、对于非分区表,通过Delete语句的方式支持记录级的删除。
2、对于分区表,支持分区级的删除。
3、可以参考update,?#21019;?#21040;删除数据的目的。
Delete语句用于非分区表中的记录删除,语法如下:
DELETE FROM <table_name> [WHERE where_definition]
table_name表中有些?#26032;?#36275;由where_definition给定的条件,DELETE用于删除这些行。
如果编写的DELETE语句中没有WHERE子句,将删除表中所有的行。
使用Delete语句时需要注意以下几点:
1、如果被删除的表正在被使用,Delete操作的原子性无法保证,用户最好在确保表在未使用时进行Delete操作。对于update、delete操作同一张表的时候,一定要保证这些操作是串行的,否则可能引发正在运行的select操作失败。只并行select操作同一张表是没有问题的。
2、Delete语句中的where_definition如果使用exists,则只能使用单个exists,也不能使用and语句和其他条件一起使用。
3、Delete语句中的where_definition如果使用exists,不能使用not

3.DQL语句

3.1Select语句

格式:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]

?#24471;鰨?br /> 1、一个select语句可以是一个union all或者subquery的子句例如:
select * from (select * from a union all select * from b) sub
2、table_reference指定数据的输入,它可以是一个表,也可以是一个join结构,也可以是子查询。
3、支持列名是正则表达式,例如:SELECT `(ds|hr)?+.+` FROM sales
4、可以在from子句中显式指定分区名减少扫描数据: 用户可以在SELECT语句中,显示指定访问哪个分区,格式如下:
FROM table_name PARTITION(pri_part_name[,sub_part_name]) alias
例如要访问test2表中的defaut一级分区中的内容:
SELECT key,value FROM test2 PARTITION (default) t;
注意:
1、在from子句中显式指定分区时,必须指定别名。例如:
SELECT key,value FROM test2 PARTITION (default) t;
不能写成 SELECT key,value FROM test2 PARTITION (default);
2、目前只有From后面可以跟select子查询,select_expr,where条件中不支持子查询。
举例:
取得test的表内容 Select * from test;
取得test数据的记录个数 Select count(1)from test;
返回10条groupby后的结果 Select key count(distinct value)from test group by key limit 10;

3.2Having子句

?#24471;鰨?br /> ANSI规范和Oracle均不支持在Having子句中引用<select list>中的alias,所以如下语句: SELECT city, AVG(age) as age FROM users GROUP BY city HAVING age > 20; 是错误的,需要改写成: SELECT city, AVG(age) as age FROM users GROUP BY city HAVING AVG(age) > 20;

3.3Order by子句(带limit)

格式:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
ORDER BY col_list
LIMIT number

?#24471;鰨?br /> 目前带limit的order by语句通过在每一个Map取topN,在Reduce阶段将#Map×N条记录拉到同一台机器做排序,从而完成数据的取前Top N的操作。可以实现数据的排序后取前N的操作。 SELECT key, value FROM src ORDER BY key LIMIT N; Order by +limit 中limit值的设置:默认limit的最大值为1024,当sql中的limit值大于设置的最大值时,会在语法检查中报错并有如下提示: FAILED: Error in semantic analysis: line 1:42 Limit value is Too BIG for ORDER BY(Default Max Limit:1024)。

3.4group by子句

?#24471;鰨?br /> 支持group by,支持一条语句中包含多个聚集函数,如:

SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(1), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;

注意:
1、目前不支持一条语句含有多个对不同列的dinstinct聚集函数例如下面的语句暂时不支持:

INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip)
FROM pv_users
GROUP BY pv_users.gender;

这个功能在下一个版本将支持。
2、支持一条语句多group by,对于这样的语句将做优化,它的运行效?#24335;?#27604;?#25945;?#39640;。

FROM pv_users
INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count(DISTINCT pv_users.userid)
GROUP BY pv_users.gender
INSERT OVERWRITE DIRECTORY '/user/facebook/tmp/pv_age_sum'
SELECT pv_users.age, count(DISTINCT pv_users.userid)
GROUP BY pv_users.age;

3.5join操作

格式: join_table:

table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} OUTER JOIN table_reference join_condition

table_reference:

table_factor

| join_table

table_factor:

tbl_name [alias]
| table_subquery alias
| ( table_references )

join_condition:

ON equality_expression ( AND equality_expression )*

equality_expression:

expression = expression

目前只支持等值链接,例如SELECT a.* FROM a JOIN b ON (a.id = b.id)
和 SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department)
都是合法的但是 SELECT a.* FROM a JOIN b ON (a.id <> b.id)不是合法的。
支持多表链接,如SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
?#24471;鰨?[left|right|full] outer join目前outer不能省略。但在SQL标准中,outer是可选的,有outer和没有outer语义是等价的。
注:?#26377;?#33021;上?#27492;怠?#24038;外连接(左表不可以是小表)和右外连接(右表不可以是小表)功能。

3.6Union [All]操作

格式:

SELECT *
FROM (
select_statement
UNION [ALL]
select_statement
) unionResult

?#24471;鰨?目前支持union all操作和去重的union操作。SQL中不包含all关键字则表示为去重union,将对结果集做去重操作。
注意:
1、union [all]链接起来的select子句,不能有别名,例如上面的select_statement不需要别名。
2、union [all]整体必须有别名,例如上面的unionResult,外层select可以将unionResult当作临时表,引用它的列。
3、每个select_statement选出的列,可以有别名,但是腾讯数据仓库会以UNION [ALL]的第一个select子句的列名或者别名作为unionResult的列名,供外层引用。
举例:
Union后进行join操作

SELECT u.id, actions.date
FROM (
SELECT av.uid AS uid, av.date AS date
FROM action_video av
WHERE av.date = '2008-06-03'
UNION ALL
SELECT ac.uid AS uid, ac.date AS date
FROM action_comment ac
WHERE ac.date = '2008-06-03'
) actions JOIN users u ON (u.id = actions.uid)

3.7多维分析(ROLLUP、CUBE、grouping函数)

格式:

SELECT selectClause
FROM fromClause
WHERE whereClause ?
GROUP BY groupbyClause
HAVING havingClause?
...

?#24471;鰨?在上面的格式中,带问号的子句和用省略号代替的子句,可有可无。
1、ROLLUP对groupbyClause进行扩展,可以令SELECT语句根据分组的维度计算多层小计,并计算总计。位于ROLLUP中的只能是普通列(可以是包含不普通列的算式)或者前者的组合。 ROLLUP的一般用法为: group by [groupby_list,] rollup(groupby_list),[groupby_list]
例如, group by rollup(time,region,department)
2、CUBE子句也是对GROUP BY进行扩展,返回CUBE中所有列组合的小计信息,同时,在最后显示总计信息。位于CUBE中的只能是普通列(可以是包含不普通列的算式)或者前者的组合。 CUBE的一般用法为: group by [groupby_list,] cube (groupby_list),[groupby_list]
例如, group by expr1, cube(expr2, expr3)
3、GROUPINGSETS子句也是对GROUP BY进行扩展,返回GROUPINGSETS中每个分组的分组聚合。位于GROUPINGSETS中的只能是普通列(可以是包含不普通列的算式)或者前者的组合。 GROUPINGSETS的一般用法为: group by [groupby_list,] GROUPINGSETS(groupby_list),[groupby_list]
注意:
此功能在qev1.0r025版本以后提供,如要使用需要打开如下开关set hive.optimize.cuberollup=true
例如, group by expr1, GROUPINGSETS(expr2, expr3)
4、使用ROLLUP或CUBE中的一个列作为参数,grouping函数在遇到ROLL UP和CUBE生成的NULL值时,返回1。就是说,如果这一列是个小计或总计时,grouping返回1,否则返回0。grouping函数只能在使用ROLLUP或CUBE的查询中使用。grouping函数一般出现在select子句中,也可以出现在having子句中。形如:

select ..., [grouping(column in groupby_list) ... ]
...
group by ...{CUBE | ROLLUP} (groupby_list)

例如,

select ...,grouping(expr1),...
...
group by ...CUBE(expr1,...)...
...

5.此外,与ORACLE类似,支持在ROLLUP中使用括号将部分普通列组?#26174;?#19968;起,作为一个整体。只是语法略有不同。ORACLE中允许使用括号直接将列组?#26174;?#19968;起,由于语法冲突问题,需要用户在括号外增加一个group关键词。例如: ROLLUP (year, group(quarter, month), day)意味着:

group by year, quarter, month, day +
group by year, quarter, month +
group by year +
总计

注意:
1、为了避免出错,特别是在有非select、from、group by、where、having子句的情况下,最好用as 给select列起别名,并在那些子句中使用别名,但这不是强制性的,而是与其他SQL的惯例一致。
2、考虑到含义存疑,多维分析暂不支持select distinct。
3、当使用group把多个普通列组?#26174;?#19968;起时,不允许group的多层嵌套,当然也不允许在group中嵌套cube或rollup。
4、多维分析不支持SELECT *。

华东15选5不开奖