自学内容网 自学内容网

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)!