Phoenix SQL总结
建表语句
--建表
create table if not exists "student"(
id varchar primary key,
name varchar
)
--插入数据
upsert into "student"(id,name) values("1001","zhangsan");
upsert into "student"(id,name) values("1002","lisi");
upsert into "student"(id,name) values("1003","wangwu");
upsert into "student"(id,name) values("1004","zhaoliu");
upsert into "student"(id,name) values("1005","xiaobei");
upsert into "student"(id,name) values("1006","xiaoxiao");
upsert into "student"(id,name) values("1007","xiaohao");
CRUD
增删改
--增加数据
upsert into tablename(primary key name,col1,col2...) values(primary key value,col1 value,col2 value...)
upsert into "student"(id,name) values("1008","haohao")
--修改数据
upsert into tablename(primary key name,col1,col2...) values(primary key value,col1 value,col2 value...)
upsert into "student"(id,name) values("1001","xiaozhang")
--删除数据
delete from tablename where col1=value;
drop table tablename;
delete from "student" where id='1007';
drop table "student";
查
--基本查询
select id,name from student;
--表左联接
select s.id,s.name from student s
left join student t
on s.id = t.id
--表右联接
select s.id,s.name from student s
right join student t
on s.id = t.id
--表内联接
select s.id,s.name from student s
inner join student t
on s.id = t.id
映射
为什么要使用映射?
在Hbase中直接创建的表,Phoenix不会直接显示出来,需要借助映射建立一张中间表,映射Hbase和phoenix里的数据. 该操作类似于Hive中的外部表
视图映射
建立视图时,需把phoenix视图名称和hbasetablename名称对应即可
---1.在Hbase中建立一张表并插入数据
create 'fruit','info'
put 'fruit','1001','info:name','apple'
---2.在Phoenix里建立视图
create view "fruit"(id varchar primary key,"info"."name" varchar);
---3.在Phoenix里查看是否建立成功
!table
---4.查询该视图表,就会对应显示Hbase里的数据
select * from fruit;
视图映射注意事项
- 视图映射表是只读的,作用是吧hbase里的fruit表映射到了phoenix
- 视图只能用作查询,不能用作修改
- 视图可以只映射部分数据
- 当我们不希望对数据进行修改操作时,可以考虑使用视图映射
表映射
上面提到了视图映射的使用,可视图映射只能对数据进行查询操作,如果想修改原表数据,则需使用表映射,使用表映射时,只需在视图映射建表语句的基础之上,在末尾添加column_encoded_bytes=0,该属性的意思是不对Hbase的表中数据做序列化操作,
---1.在Hbase中建立一张表并插入数据
create 'fruit','info'
put 'fruit','1001','info:name','apple'
---2.在Phoenix里建立视图
create view "fruit"(id varchar primary key,"info"."name" varchar) column_encoded_bytes=0;
---3.在Phoenix里查看是否建立成功
!table
---4.更改数据
upsert into "fruit" values('1001','org')
---5.查询该视图表,就会对应显示Hbase里的数据
select * from fruit;
思考:为什么有表映射还要使用视图映射?
- 使用视图映射数据为只读,更安全
- 使用表映射数据可读写,更方便
二级索引
使用索引可以提高查询速度,但会占用更大的空间
全局索引
全局索引介绍:
1)查询时select后只能包含索引列
2)使用全局索引查询时,如果 能从索引表出数据,绝对不会去原表查询
3)写操作比较多的表效率会很低,因为写数据时要更新索引表
--创建全局索引的语法
create index 索引名称 on 表名 (索引列)
--创建多级索引的语法
create index 索引名称 on 表名 (索引列1,索引列2)
--删除索引的语法
drop index 索引名称 on 原表名;
--建立包含其他列的索引
create index 索引名称 on 原表名(索引列) include(包含的列1,包含的列2);
--使用include后,使用索引查询数据时可以吧include的关联的数据一起查出来
本地全局索引
本地索引介绍
1)本地索引适合写操作比较多的场景
2)本地索引的实现方法,就是在原表内新加了一列主键
3)使用本地索引查询数据时,会先通过索引列找到对应列的主键,然后通过主键进行范围筛选
--创建本地索引的语法
create local 索引名 on 原表(索引列)
--删除索引的语法
drop index 索引名称 on 原表名;
本地索引和全局索引的区别
1) 本地索引适合修改写入场景多的表
全局索引适合查询场景较多的表
2) 空间代价
全局高,本地低
3) 插入修改
本地块,全局慢
4)查询速度
全局快,本地慢