Tajo教程

Tajo SQL语句

Tajo SQL语句

在上一章中,您已经了解了如何在 Tajo 中创建表。本章介绍 Tajo 中的 SQL 语句。

创建表语句

在移动创建表之前,在 Tajo 安装目录路径中创建一个文本文件"students.csv"如下-
students.csv
Name Address Age Marks
Adam 23 New Street 21 90
Amit 12 Old Street 13 95
Bob 10 Cross Street 12 80
David 15 Express Avenue 12 85
Esha 20 Garden Street 13 50
Ganga 25 North Street 12 55
Jack 2 Park Street 12 60
Leena 24 South Street 12 70
Mary 5 West Street 12 75
Peter 16 Park Avenue 12 95
文件创建完成后,移至终端并一一启动Tajo服务器和shell。

创建数据库

使用以下命令创建一个新数据库-

查询

default> create database sampledb; 
OK
连接到现在创建的数据库"sampledb"。
default> \c sampledb 
You are now connected to database "sampledb" as user “user1”.
然后,在"sampledb"中创建一个表如下-

查询

sampledb>  create external table mytable(id int,name text,address text,age int,mark int) 
   using text with('text.delimiter' = ',') location ‘file:/Users/workspace/Tajo/students.csv’;

结果

以上查询将生成以下结果。
OK
到这里,外部表就创建好了。现在,您只需输入文件位置。如果您必须从 hdfs 分配表,请使用 hdfs 而不是文件。
接下来, "students.csv" 文件包含逗号分隔值。 text.delimiter 字段用‘,’分配。
您现在已经在"sampledb"中成功创建了"mytable"。

显示表格

要在 Tajo 中显示表格,请使用以下查询。

查询

sampledb> \d  
mytable  
sampledb> \d mytable

结果

以上查询将生成以下结果。
table name: sampledb.mytable 
table uri: file:/Users/workspace/Tajo/students.csv 
store type: TEXT 
number of rows: unknown 
volume: 261 B
Options: 
'timezone' = 'Asia/Kolkata' 
'text.null' = '\\N' 
'text.delimiter' = ','  
schema: 
id INT4 
name TEXT 
address TEXT 
age INT4 
mark INT4 

列表表

要获取表中的所有记录,请键入以下查询-

查询

sampledb> select * from mytable;

结果

以上查询将生成以下结果。
List Table

插入表语句

Tajo 使用以下语法在表中插入记录。

语法

create table table1 (col1 int8, col2 text, col3 text);   
--schema should be same for target table schema  
Insert overwrite into table1 select * from table2;  
                     (or)  
Insert overwrite into LOCATION '/dir/subdir' select * from table; 
Tajo 的插入语句类似于 SQL 的 INSERT INTO SELECT 语句。

查询

让我们创建一个表来覆盖现有表的表数据。
sampledb> create table test(sno int,name text,addr text,age int,mark int);  
OK 
sampledb> \d

结果

以上查询将生成以下结果。
mytable 
test

插入记录

要在"test"表中插入记录,请键入以下查询。

查询

sampledb> insert overwrite into test select * from mytable; 

结果

以上查询将生成以下结果。
Progress: 100%, response time: 0.518 sec
此处,"mytable"记录覆盖了"test"表。如果您不想创建"test"表,请立即分配物理路径位置,如插入查询的替代选项中所述。

获取记录

使用以下查询列出"test"表中的所有记录-

查询

sampledb> select * from test;

结果

以上查询将生成以下结果。
获取记录
此语句用于添加、删除或修改现有表的列。
要重命名表,请使用以下语法-
Alter table table1 RENAME TO table2;

查询

sampledb> alter table test rename to students;

结果

以上查询将生成以下结果。
OK
要检查更改的表名,请使用以下查询。
sampledb> \d  
mytable 
students
现在表"test"更改为"students"表。

添加列

要在"students"表中插入新列,请键入以下语法-
Alter table <table_name> ADD COLUMN <column_name> <data_type>

查询

sampledb> alter table students add column grade text; 

结果

以上查询将生成以下结果。
OK

设置属性

此属性用于更改表格的属性。

查询

sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
   'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ; 
OK
这里分配了压缩类型和编解码器属性。
要更改文本分隔符属性,请使用以下内容-

查询

ALTER TABLE students  SET PROPERTY ‘text.delimiter'=',';  
OK 

结果

以上查询将生成以下结果。
sampledb> \d students  
table name: sampledb.students 
table uri: file:/tmp/tajo-user1/warehouse/sampledb/students 
store type: TEXT 
number of rows: 10 
volume: 228 B 
Options: 
'compression.type' = 'RECORD' 
'timezone' = 'Asia/Kolkata' 
'text.null' = '\\N' 
'compression.codec' = 'org.apache.hadoop.io.compress.SnappyCodec' 
'text.delimiter' = ','  
schema: 
id INT4 
name TEXT 
addr TEXT 
age INT4 
mark INT4 
grade TEXT
以上结果表明使用"SET"属性更改了表的属性。

SELECT语句

SELECT 语句用于从数据库中选择数据。
Select 语句的语法如下-
SELECT [distinct [all]] * | <expression> [[AS] <alias>] [, ...] 
   [FROM <table reference> [[AS] <table alias name>] [, ...]] 
   [WHERE <condition>] 
   [GROUP BY <expression> [, ...]] 
   [HAVING <condition>] 
   [ORDER BY <expression> [ASC|DESC] [NULLS (FIRST|LAST)] [, …]]

Where 子句

Where 子句用于从表中过滤记录。

查询

sampledb> select * from mytable where id > 5;

结果

以上查询将生成以下结果。
Where Clause
查询返回id大于5的学生的记录。

查询

sampledb> select * from mytable where name = ‘Peter’; 

结果

以上查询将生成以下结果。
Progress: 100%, response time: 0.117 sec 
 
  id,  name,  address,   age  
-------------------------------
10,  Peter,  16 park avenue , 12 
结果仅过滤 Peter 的记录。

DISTINCT

表列可能包含重复值。 DISTINCT 关键字可用于仅返回不同(不同)的值。

语法

SELECT DISTINCT column1,column2 FROM table_name;

查询

sampledb> select distinct age from mytable; 

结果

以上查询将生成以下结果。
Progress: 100%, response time: 0.216 sec  
age 
-------------------------------
13 
12 
查询返回 mytable 中学生的不同年龄。

按条件分组

GROUP BY 子句与 SELECT 语句配合使用,将相同的数据分组。

语法

SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2;

查询

select age,sum(mark) as sumofmarks from mytable group by age;

结果

以上查询将生成以下结果。
age,  sumofmarks 
-------------------------------
13,  145 
12,  610
此处,"mytable"列有两种类型的年龄 — 12 和 13、现在查询按年龄对记录进行分组,并生成相应学生年龄的总分。

有条款

HAVING 子句使您能够指定条件来过滤哪些组结果出现在最终结果中。 WHERE 子句在选定的列上放置条件,而 HAVING 子句在 GROUP BY 子句创建的组上放置条件。

语法

SELECT column1, column2 FROM table1 GROUP BY column HAVING [ conditions ]

查询

sampledb> select age from mytable group by age  having  sum(mark) > 200; 

结果

以上查询将生成以下结果。
age 
-------------------------------
12 
查询按年龄对记录进行分组,当条件结果 sum(mark) > 200 时返回年龄。

按条件排序

ORDER BY 子句用于根据一列或多列按升序或降序对数据进行排序。 Tajo 数据库默认按升序对查询结果进行排序。

语法

SELECT column-list FROM table_name  
[WHERE condition]  
[ORDER BY column1, column2, .. columnN] [ASC | DESC]; 

查询

sampledb> select * from mytable where mark > 60 order by name desc; 

结果

以上查询将生成以下结果。
按条款排序
查询以降序返回分数大于60的学生姓名。

创建索引语句

CREATE INDEX 语句用于在表中创建索引。索引用于快速检索数据。当前版本仅支持存储在 HDFS 上的纯文本格式的索引。

语法

CREATE INDEX [ name ] ON table_name ( { column_name | ( expression ) }

查询

create index student_index on mytable(id);

结果

以上查询将生成以下结果。
id 
——————————————— 
要查看为列分配的索引,请键入以下查询。
default> \d mytable  
table name: default.mytable 
table uri: file:/Users/deiva/workspace/Tajo/students.csv 
store type: TEXT 
number of rows: unknown  
volume: 307 B 
Options: 
   'timezone' = 'Asia/Kolkata' 
   'text.null' = '\\N' 
   'text.delimiter' = ','  
schema: 
id INT4 
name TEXT 
address TEXT 
age INT4 
mark INT4   
Indexes:  
"student_index" TWO_LEVEL_BIN_TREE (id ASC nullS LAST ) 
这里,Tajo 中默认使用 TWO_LEVEL_BIN_TREE 方法。

删除表声明

Drop Table 语句用于从数据库中删除表。

语法

drop table table name;

查询

sampledb> drop table mytable;
要检查表是否已从表中删除,请键入以下查询。
sampledb> \d mytable;

结果

以上查询将生成以下结果。
ERROR: relation 'mytable' does not exist 
您还可以使用"\d"命令检查查询以列出可用的 Tajo 表。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4