【sql server數據庫教程】

sql server數據庫

結構化查詢語言(Structured Query Language)簡稱SQL(發音:/?es kju? ?el/ "S-Q-L"),是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統;同時也是數據庫腳本文件的擴展名。

結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的接口。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。

1986年10月,美國國家標準協會對SQL進行規范后,以此作為關系式數據庫管理系統的標準語言(ANSI X3. 135-1986),1987年得到國際標準組織的支持下成為國際標準。不過各種通行的數據庫系統在其實踐過程中都對SQL規范作了某些編改和擴充。所以,實際上不同數據庫系統之間的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

參數說明:
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,避免在隱式轉換的時候出現一些小問題。

說明:
1、如果沒有指定if not exists,則創建的表如果已經存在,會返回錯誤,如果指定了if not exists,則不會返回錯誤。
2、目前支持range、list分區。range分區定義時,分區的less than 的參數值必須按照從小到大的順序排列,分區字段必須是表字段。
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找不到應該屬于abc分區的數據,但是通過select * From tablename又可以查到。為了避免在何種情況,可以刪除default分區,這樣在插入數據時,發現沒有對應的分區,就會認為是臟數據而報錯。

舉例:
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語句來創建表,并將select語句的結果集插入到新建立的表中。
(1)select語句可以是目前所支持的任意形式。
(2)用戶可以通過列別名的方式指定新創建表的列名。如果未指定,則新創建的表的schema是從select語句中自動探測的。
注意: 新創建的表暫時不支持分區。

1.2刪除表

格式: drop table <TABname>
說明: 刪除指定的表,如果表不存在,也返回成功。 用戶必須有刪除表的權限。
舉例: 刪除表t,則為Drop table t。

1.3清空表

格式: truncate table <TABname>
說明: 刪除指定表的數據,如果表不存在,并不報錯。用戶必須有刪除表的權限。
舉例: 刪除表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;
說明: 在分區表上增加新的分區,用戶需要對表有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>
說明:刪除不存在的分區,返回成功。應用應該對這個表有alter的權限。
注意:這個SQL語句將刪除分區的定義和數據。
舉例: 刪除分區p2,alter table test drop partition (p2);

1.6清空分區

格式:清空一個一級分區, ALTER TABLE <TABname> TRUNCATE PARTITION <(par_name)>
說明: 刪除分區中的數據,保留分區元數據。用戶需要對表有delete權限。
舉例: 清除test表p1分區,Alter table test truncate partition(p1)

1.7表重命名

格式: ALTER TABLE <old_name> RENAME TO <new_name>;
說明: 重命名表,如果新名已經被使用,則表錯。 用戶須對表有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;

說明:
1、用戶不指定數據庫時,默認修改的是當前數據庫的表或視圖。
2、列名的指定形式為tbl.col,view.col。也可以在前面指定數據庫名。
3、當is關鍵詞之后是字符串時,是將comment修改為新的comment;如果是null,則是刪除指定comment。
4、用戶須對表或視圖有alter權限。
注意: 在更改表或視圖的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]

說明:
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、任何類型不能轉換為四種小類型:Tinyint Smallint Int Float
3、String類型不允許轉為任何類型
4、Float或者double類型轉為bigint類型,如果Float或者double數值超過bigint表達范圍,則轉為bigint的最大值或者最小值(根據mysql的標準)
5、bigint轉為double類型,在理論上會產生極少數的精度損失,經過評估,認為這樣的損失是可以接受的。
6、在進行數據類型轉換的時候,不會修改實際數據,從小類型轉為大類型以后,不會發生數據錯誤,在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 ...;
說明:OR 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]
說明:如果不帶參數,則列舉出系統支持的所有函數和算子,包括用戶自定義的,如果帶參數,則將參數看為正則表達式,“.”代表一個字符,"*"代表匹配任意個星號之前的字符,參數必須帶引號。如 show functions "a.*"返回所有a開始的函數。
舉例:
1、顯示所有內建函數和自定義函數,Show functions;
2、顯示所有函數名以a開始的函數,Show functions "a.*";

1.13顯示內置函數的信息

格式: describe function [extended] <func_name>;
說明: 加上extended后會顯示更詳細的用法
舉例: 顯示abs求絕對值函數的說明

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]
說明:如果不帶參數,返回當前數據庫的默認表。如果帶參數,則參數中可以帶*,|等正則匹配符號,*匹配任意字符,|匹配可選字符串,參數必須帶引號,單引號雙引號都可。
舉例:
1、顯示當前數據庫下的所有表,Show tables;
2、顯示當前數據庫下名字由a開始的所有表,Show tables 'a*';

1.15查看表的分區信息

格式:show partitions <table_name>
說明:分別顯示第一層分區和第二層分區的分區名,如果不存在分區或者不存在第二層分區,則不顯示。
舉例:顯示表test的分區情況,Show partitions test;

1.16獲得表的元數據信息

格式:DESCRIBE [EXTENDED] <table_name>[DOT col_name]
說明:如果不帶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";
說明: 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>
說明: 獲得指定表的定義語句,包含建表語句中以下字段(某些字段只有在使用這個功能時才會有):
1、表名
2、表的字段
3、表的分區定義
4、自定義的分隔符
5、存儲格式(Store as)
6、列存儲定義
7、是否壓縮
8、Charset
9、索引
注意: 除了上面列出的字段,其他的暫不支持。

1.19SHOW VERSION

格式:SHOW VERSION
說明:該命令顯示當前使用的查詢引擎版本號,也可以在命令行下使用hive -v

1.20SHOW ROWCOUNT

格式: SHOW ROWCOUNT [extended] tablename [PARTITION(partitionname)][, SUBPARTITION(subpartitionname)][, PARTITION(partitionname,subpartitionname)]
說明: 該命令查看表的記錄數或者分區的記錄數(暫時只支持結構化表)。加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}*)*
說明:
將查詢語句的執行結果插入到指定的表中,支持多條insert子句在一條語句中。 如果目標表是分區表,則結果會自動插入到對應分區中
注意:
1、如果使用overwrite方式,則目標表中的所有數據將被先刪除(如果目標表是分區表,則所有的分區將被清空),然后再插入新的數據。
2、盡量使用多insert子句的方式,可以減少了數據的掃描,提高運行效率。如果使用指定列插入的方式,必須保證被插入列(被插入表后面跟著的小括號內的字段列表)與插入列(select后面的字段列表)一一對應:字段數目相同,并且字段類型一一相同。
3、插入多行數據,需要注意的是,插入的每行數據需要和表中的列對應,包括字段數目和,字段類型的匹配。目前只支持常量的插入,不支持復雜類型數據,不支持函數插入。如果需要插入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語句

說明:
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語句都有效。where子句中不可使用exist等帶子查詢的表達式。如果是分區表則必須顯式指定分區,不支持同時指定多個分區。在處理分區表的時候update不支持對分區字段進行update。
注意:
1、update暫不支持多列累計運算的功能。比如set a=a+1,b=a和set b=a,a=a+1在這里的結果是一樣的,跟先后順序無關,這和傳統的數據庫可能有所不同。 如果出現set a=1,a=2這種重復賦值的情況,只處理最后一次賦值。 如果set的數據類型如目標列不一致,數據會被置為null。
2、update目前還沒有鎖機制來保證并發性,需要用戶注意,對于update、delete、select并發操作同一張表的時候(同時對一張表做讀和寫操作),一定要保證這些操作是串行的,否則可能引發正在運行的select操作失敗。只并行select操作同一張表是沒有問題的。

2.2Delete語句

說明:
支持三種刪除數據的方式:
1、對于非分區表,通過Delete語句的方式支持記錄級的刪除。
2、對于分區表,支持分區級的刪除。
3、可以參考update,來達到刪除數據的目的。
Delete語句用于非分區表中的記錄刪除,語法如下:
DELETE FROM <table_name> [WHERE where_definition]
table_name表中有些行滿足由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]

說明:
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子句

說明:
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

說明:
目前帶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子句

說明:
支持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,對于這樣的語句將做優化,它的運行效率將比兩條高。

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)
說明: [left|right|full] outer join目前outer不能省略。但在SQL標準中,outer是可選的,有outer和沒有outer語義是等價的。
注:從性能上來說、左外連接(左表不可以是小表)和右外連接(右表不可以是小表)功能。

3.6Union [All]操作

格式:

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

說明: 目前支持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?
...

說明: 在上面的格式中,帶問號的子句和用省略號代替的子句,可有可無。
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中使用括號將部分普通列組合在一起,作為一個整體。只是語法略有不同。ORACLE中允許使用括號直接將列組合在一起,由于語法沖突問題,需要用戶在括號外增加一個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把多個普通列組合在一起時,不允許group的多層嵌套,當然也不允許在group中嵌套cube或rollup。
4、多維分析不支持SELECT *。

江苏时时彩正规吗