3-KSQL
查看KSQL帮助
在我们使用命令行来对KES进行操作的时候,我们一般是使用KSQL命令行工具来对KES进行操作
学习一个命令的使用方法,是必然少不了我们去查看它的帮助文档
[kingbase@node1 ~]$ ksql --help
ksql是Kingbase 的交互式客户端工具。
使用方法:
ksql [选项]... [数据库名称 [用户名]]
......
添加中文字符集的环境变量
export LANG=zh_CN.UTF-8
ksql连接参数
参数 | 解释 |
---|---|
-h | 后跟服务器的监听IP或主机名(不指定-h时,默认以socket方式登录) |
-p | 连接服务器的监听端口号(不指定-p时,默认端口号为54321,也可以设置KINGBASE_PORT环境变量) |
-U | 连接指定数据库的用户名 |
-W | 强制输入密码 |
ksql通用参数
参数 | 解释 |
---|---|
-c | 指定连接数据库后执行的单行命令,执行完成后自动退出数据库连接(也就是说后面执行一个sql语句) |
-d | 指定连接时登录的数据库 |
-f | 指定连接数据库时的执行脚本,执行完成后自动退出数据库连接 |
-l | 查看有哪些数据库 |
-V | 查看数据库的版本 |
-? | 查看帮助信息 |
ksql输入输出信息
参数 | 解释 |
---|---|
-H | 以html的格式来展示输出信息 |
-E | 展示元命令所执行的sql语句 |
-t | 不输出字段名 |
-x | 查询的结果为纵向展示 |
-q | 不输出登录提示信息 |
-o | 将命令输出的结果保存到指定的文件中 |
查看KSQL元命令的帮助
什么是元命令?
ksql提供了一组以""开头的快捷命令,被称为ksql命令
同时还可以搭配通配符"*“或”?“提高查询效率;使用选项"S"显示系统对象;使用选项”+"显示跟加丰富的信息
在ksql中也存在着tab键补全命令;也可以通过设置环境变量的设置,能够快速地登录数据库
介绍实验
下载本次实验案例的初始化脚本,下载位置在/install/EXAM_v0.11.sql
使用system用户登录test数据库
[kingbase@node1 ~]$ ksql -d test -U system//test表示数据库名,system表示用户名
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=#
执行初始化脚本
test=# \i /install/EXAM_v0.11.sql//"\"表示元命令,i表示input导入
KSQL连接到数据库
使用local socket方式登录数据库
lcoal socket是不会去进行tcp/ip三次握手的过程,所以我们在数据库内部是查看不到客户端登录服务器的IP地址
[kingbase@node1 ~]$ ksql -d test -U system
test=# SELECT inet_client_addr(),inet_client_port();//查看不到客户端登录服务器的ip地址
inet_client_addr | inet_client_port
------------------+------------------
|
(1 行记录)
使用TCP/IP方式登录数据库
使用-h选项登录数据库,并查看当前会话的客户端IP和端口
[kingbase@node1 ~]$ ksql -h 192.168.40.111 -p 54321 -d test -U system
用户 system 的口令:
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# SELECT inet_client_addr(),inet_client_port();
inet_client_addr | inet_client_port
------------------+------------------
192.168.40.111 | 29640
(1 行记录)
使用连接字符串方式登录数据库并查看当前会话的客户端IP和端口
[kingbase@node1 ~]$ ksql 'hostaddr=192.168.40.111 port=54321 user=system dbname=test'
用户 system 的口令:
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# SELECT inet_client_addr(),inet_client_port();
inet_client_addr | inet_client_port
------------------+------------------
192.168.40.111 | 29644
(1 行记录)
KSQL引用环境变量进行快速登录
[kingbase@node1 ~]$ export KINGBASE_HOST=192.168.40.111
[kingbase@node1 ~]$ export KINGBASE_PORT=54321
[kingbase@node1 ~]$ export KINGBASE_DATABASE=test
[kingbase@node1 ~]$ export KINGBASE_USER=system
test=# SELECT inet_client_addr(),inet_client_port();
inet_client_addr | inet_client_port
------------------+------------------
192.168.40.111 | 29652
(1 行记录)
在KSQL中切换登录用户和数据库
在切换的过程中,我们主要是使用"\c"表示change
切换用户
在ksql中格式:\c - user01
"-"表示保持当前的数据库,user01表示切换dao用户user01
test=# \c - user01
用户 user01 的口令:
您现在已经连接到数据库 "test",用户 "user01".
切换数据库
只切换数据库而不切换用户,可以不用跟用户名
test=# \c db01
您现在已经连接到数据库 "db01",用户 "system".
查看连接的身份信息
使用元命令conninfo即可查看连接的身份信息
test=# \conninfo
以用户 "system" 的身份, 在主机"192.168.40.111", 端口"54321"连接到数据库 "test"
同时切换用户和数据库
同时切换用户和数据库,可以在\c后跟完整的用户和数据库信息
db01=# \c test user01
用户 user01 的口令:
您现在已经连接到数据库 "test",用户 "user01".
执行SQL的几种方式
交互式执行SQL
交互式的意思就是用户执行一条SQL语句,数据库则会返回一条结果
首先使用system用户登录到test数据库
[kingbase@node1 ~]$ ksql test system
用户 system 的口令:
ksql (V8.0)
输入 "help" 来获取帮助信息.
查看exam.course表的数据
test=# SELECT * FROM exam.course;
cno | cname | clevel | pass_mark
-----+-------+----------+-----------
10 | KCA | junior | 70
20 | KCP | middle | 70
30 | KCM | advanced | 70
(3 行记录)
非交互式执行SQL
单条SQL语句
非交互式就是执行一条SQL语句后就退出了SQL中,进入到操作系统中;如下
在操作系统中使用"-c"选项登录test数据库查看exam.course表
"-c"选项表示执行一个单一的命令
[kingbase@node1 ~]$ ksql -d test -U system -p 54321 -c 'SELECT * FROM exam.course;'
用户 system 的口令:
cno | cname | clevel | pass_mark
-----+-------+----------+-----------
10 | KCA | junior | 70
20 | KCP | middle | 70
30 | KCM | advanced | 70
(3 行记录)
成批的SQL语句
生成一个sql脚本
[kingbase@node1 ~]$ cat /tmp/test.sql
SELECT * FROM exam.course;
SELECT * FROM exam.instructor;
使用kysql -f执行脚本
[kingbase@node1 ~]$ ksql -d test -U system -p 54321 -f /tmp/test.sql
用户 system 的口令:
cno | cname | clevel | pass_mark
-----+-------+----------+-----------
10 | KCA | junior | 70
20 | KCP | middle | 70
30 | KCM | advanced | 70
(3 行记录)
ino | iname | title
-----+--------------+-------------------------
101 | Li Nan | Senior Instructor
102 | Zhang San | Intermediate Instructor
103 | Liu Wei | Intermediate Instructor
104 | Ma Tao | Intermediate Instructor
105 | Yang Juan | Intermediate Instructor
106 | Sun Yang | Intermediate Instructor
107 | Deng Feilong | Intermediate Instructor
(7 行记录)
使用元命令/i执行脚本
\i后跟脚本在物理机上的路径
test-# \i /tmp/test.sql
cno | cname | clevel | pass_mark
-----+-------+----------+-----------
10 | KCA | junior | 70
20 | KCP | middle | 70
30 | KCM | advanced | 70
(3 行记录)
ino | iname | title
-----+--------------+-------------------------
101 | Li Nan | Senior Instructor
102 | Zhang San | Intermediate Instructor
103 | Liu Wei | Intermediate Instructor
104 | Ma Tao | Intermediate Instructor
105 | Yang Juan | Intermediate Instructor
106 | Sun Yang | Intermediate Instructor
107 | Deng Feilong | Intermediate Instructor
(7 行记录)
KSQL常用元命令
查看数据库信息
直接使用"\l"是横向显示
test-# \l
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限
-----------+--------+----------+-------------+-------------+-------------------
db01 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
kingbase | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
security | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system +
| | | | | system=CTc/system
template1 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system +
| | | | | system=CTc/system
test | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/system +
| | | | | system=CTc/system+
| | | | | user01=c/system
(6 行记录)
查看某一数据库的详细信息,即纵向显示数据库信息
test-# \x
扩展显示已打开.
test-# \l test
数据库列表
-[ RECORD 1 ]---------------
名称 | test
拥有者 | system
字元编码 | UTF8
校对规则 | zh_CN.UTF-8
Ctype | zh_CN.UTF-8
存取权限 | =Tc/system +
| system=CTc/system+
| user01=c/system
查看表和视图的信息
在做这个操作之前,记得再次输入一个"\x"将刚刚的扩展显示关闭
查看test数据库表里的表和视图信息
test-# \d
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+-------------------------+--------+--------
public | sys_stat_statements | 视图 | system
public | sys_stat_statements_all | 视图 | system
public | t01 | 数据表 | system
(3 行记录)
通过元命令后的"+"符号来查看跟详细的信息
test-# \d+
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+-------------------------+--------+--------+---------+------
public | sys_stat_statements | 视图 | system | 0 bytes |
public | sys_stat_statements_all | 视图 | system | 0 bytes |
public | t01 | 数据表 | system | 16 kB |
(3 行记录)
查看表的详细信息
查看与exam有关的表
test-# \dt+ exam.*
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+--------------------+--------+--------+------------+--------------
exam | course | 数据表 | system | 8192 bytes | 课程表
exam | instructor | 数据表 | system | 8192 bytes | 讲师表
exam | instructor_history | 数据表 | system | 8192 bytes | 已离职讲师表
exam | score | 数据表 | system | 8192 bytes | 成绩表
exam | student | 数据表 | system | 8192 bytes | 学员表
(5 行记录)
查看与exam有关的索引
test-# \di exam.*
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 数据表
----------+------------+------+--------+------------
exam | cno_pk | 索引 | system | course
exam | id_no_uk | 索引 | system | student
exam | ino_pk | 索引 | system | instructor
exam | phone_uk | 索引 | system | student
exam | score_pk | 索引 | system | score
exam | sno_cno_pk | 索引 | system | student
(6 行记录)
查看与exam有关的视图
test-# \dv exam.*
关联列表
架构模式 | 名称 | 类型 | 拥有者
----------+---------------------+------+--------
exam | v_score_information | 视图 | system
(1 行记录)
查看exam.course表的概要信息
test-# \dt+ exam.course
关联列表
架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述
----------+--------+--------+--------+------------+--------
exam | course | 数据表 | system | 8192 bytes | 课程表
(1 行记录)
查看exam.course表的详细信息,也叫做查看结构
test-# \d exam.course
数据表 "exam.course"
栏位 | 类型 | 校对规则 | 可空的 | 预设
-----------+----------------------------+----------+----------+------
cno | numeric(2,0) | | not null |
cname | character varying(30 char) | | not null |
clevel | character varying(13 char) | | |
pass_mark | numeric(5,0) | | not null |
索引:
"cno_pk" PRIMARY KEY, btree (cno)
检查约束限制
"pass_mark_ck" CHECK (pass_mark > 0::numeric)
由引用:
TABLE "exam.score" CONSTRAINT "cno_fk" FOREIGN KEY (cno) REFERENCES exam.course(cno)
查看模式的信息(数据库下存放表的那个地方:模式)
test-# \dn
架构模式列表
名称 | 拥有者
------------------+--------
anon | system
dbms_sql | system
exam | system
public | system
src_restrict | system
sysaudit | system
sysmac | system
xlog_record_read | system
(8 行记录)
test-# \dnS//查看没有显示出来的系统模式
架构模式列表
名称 | 拥有者
--------------------+--------
anon | system
dbms_sql | system
exam | system
information_schema | system
pg_bitmapindex | system
pg_catalog | system
pg_temp_1 | system
pg_toast | system
pg_toast_temp_1 | system
public | system
src_restrict | system
sys | system
sys_catalog | system
sysaudit | system
sysmac | system
xlog_record_read | system
(16 行记录)
查看用户和角色
test-# \du
角色列表
角色名称 | 属性 | 成员属于
----------+--------------------------------------------+----------
sao | 没有继承 | {}
sso | 没有继承 | {}
system | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
user01 | 10个连接 | {}
使用元命令实现异构数据库数据交换
使用KSQL的copy命令和\copy命令,能在异构数据库之间进行数据交换
什么叫做异构数据库的数据交换,就是将一个表导出成csv文件后,还可以将csv文件再导到另一个数据库内
或者导入到KES的其他操作系统的版本
导出表数据库到csv文件
先查看exam.course表的内容
test=# SELECT * FROM exam.course;
cno | cname | clevel | pass_mark
-----+-------+----------+-----------
10 | KCA | junior | 70
20 | KCP | middle | 70
30 | KCM | advanced | 70
(3 行记录)
使用\copy…to…来拷贝文件
将exam.course拷贝成csv文件在/tmp/course.csv
test=# \copy exam.course to '/tmp/course.csv' csv//“/tmp/course.csv”表示拷贝路径。"csv"表示文件格式
COPY 3//拷贝了三个条数据
可以使用元命令来使用操作系统上的cat命令来查看/tmp/course.csv上的内容;如下
! [命令] 在 shell中执行命令或启动一个交互式shell
并且可以看到csv文件是以","文件分割的
test=# \! cat /tmp/course.csv
10,KCA,junior,70
20,KCP,middle,70
30,KCM,advanced,70
当我们不写文件的格式时,默认会产生一个txt文件,并且可以看到txt文件是以Tab键隔开的
test=# \copy exam.course to '/tmp/course.txt'
COPY 3
test=# \! cat /tmp/course.txt
10KCAjunior70
20KCPmiddle70
30KCMadvanced70
\copy还支持拷贝成二进制的格式
test=# \copy public.course to /tmp/course.dat binary
COPY 3
test=# \! cat /tmp/course.dat
PGCOPY
ÿ
KCAjunior
F
KCPmiddle
F
KCadvanced
Fÿÿtest=#
将csv文件导入到public模式下
首先我们需要创建一个public模式
test=# create table public.course//创建一个新表,表名为course,位于public模式下
test-# as select * from exam.course where 1=0; //使得public模式下的course表的结构与exam模式下的public表一致
test=# select * from public.course;
cno | cname | clevel | pass_mark
-----+-------+--------+-----------
(0 行记录)
使用\copy…from…将/tmp/course.csv拷回到public.course中
test=# \copy public.course from /tmp/course.csv csv
COPY 3
test=# select * from public.course
test-# ;
cno | cname | clevel | pass_mark
-----+-------+----------+-----------
10 | KCA | junior | 70
20 | KCP | middle | 70
30 | KCM | advanced | 70
copy和\copy
copy | \copy |
---|---|
在服务器端执行,写入或者读取的文件只能保存到服务器上 | 可以在客户端和服务器上执行,写入或者读取的文件能保存到服务器和客户端上 |
必须是超级用户才能使用(system)使用\conninfo查看当前的身份信息 | 一般用户都可以使用 |
性能比\copy更好,建议在数据库非常繁忙的时候执行copy操作 | 性能比copy差 |
使用超级用户(system)执行copy
test=# copy exam.student to '/tmp/student.csv' csv
test-# ;
COPY 8
使用普通用户执行copy,将会显示权限不够的报错
test=> copy exam.student to '/tmp/stduent2.csv' csv;
错误: 对模式 exam 权限不够
原文地址:https://blog.csdn.net/2401_83604604/article/details/143792638
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!