在上一章中,您已了解如何在Tajo中创建表.本章介绍了Tajo中的SQL语句.
创建表语句
在移动创建表之前,创建一个文本文件"students.csv" "在Tajo安装目录路径中如下 :
students.csv
Id | Name | Address | 年龄 | 标记 |
---|---|---|---|---|
1 | Adam | 23 New Street | 21 | 90 |
2 | Amit | 12 Old Street | 13 | 95 |
3 | Bob | 10 Cross街道 | 12 | 80 |
4 | David | 15 Express Avenue | 12 | 85 |
5 | Esha | 20花园街 | 13 | 50 |
6 | Ganga | 25 North Street | 12 | 55 |
7 | Jack | 2 Park Street | 12 | 60 |
8 | Leena | 24 South Street | 12 | 70 |
9 | Mary | 5 West Street | 12 | 75 |
10 | Peter | 16 Park Avenue | 12 | 95 |
创建文件后,移动到终端并逐个启动Tajo服务器和shell.
创建D. atabase
使用以下命令创建新数据库 :
查询
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而不是file.
接下来,"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 BOptions: 'timezone' = 'Asia/Kolkata' 'text.null' = '\\N' 'text.delimiter' = ',' schema: id INT4 name TEXT address TEXT age INT4 mark INT4
列表
要获取表中的所有记录,请键入以下查询 :
查询
sampledb> select * from mytable;
结果
上述查询将生成以下结果.
插入表语句
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的insert语句类似于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"表中的所有记录 :
查询
sampledb> select * from test;
结果
以上查询将生成以下结果.
此语句用于添加,删除或修改现有表的列.
要重命名表,请使用以下语法 :
Alter table table1 RENAME TO table2;
查询
sampledb> alter table test rename to students;
结果
上述查询将产生以下结果.
OK
要检查更改的表名,请使用以下查询.
sampledb> \d mytable students
现在表"test"改为"学生"表.
添加列
要在"学生"表中插入新列,请键入以下语法 :
Alter tableADD COLUMN
查询
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 [distinct [all]] * |[[AS] ] [, ...] [FROM [[AS]
] [, ...]] [WHERE
] [GROUP BY [, ...]] [HAVING ] [ORDER BY [ASC|DESC] [NULLS (FIRST|LAST)] [, …]] Where子句
Where子句用于过滤表中的记录.
查询
sampledb> select * from mytable where id > 5;结果
上述查询将生成以下结果.
![]()
查询返回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关键字可用于仅返回不同(不同)的值.
语法
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 Clause
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查询按年龄对记录进行分组,并在条件结果总和(标记)>时返回年龄. 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语句用于从数据库中删除表.
语法
drop table table name;查询
sampledb> drop table mytable;要检查表是否已从表中删除,请输入以下查询.
sampledb> \d mytable;结果
上述查询将产生以下结果.
ERROR: relation 'mytable' does not exist您还可以使用"\d"命令检查查询列出可用的Tajo表.