Greenplum(二)【SQL】

前言

        Greenplum 的剩余部分主要其实主要就是 DDL 和之前学的 MySQL 不大一样,毕竟 Greenplum 是基于 PostgreSQL 数据库的,不过那些 DML 和 MySQL、Hive 基本上大差不差,所以就没有必要浪费时间了。

1、DDL

1.1、库操作

1.1.1、创建数据库

语法

CREATE DATABASE name
[ [ WITH ] [ OWNER [=] db_owner ] -- 指定数据库所有者
   [ TEMPLATE [=] template ] -- 指定数据库模板(规范和约束),默认是 template1
   [ ENCODING [=] encoding ] -- 指定当前数据库的编码
   [ TABLESPACE [=] tablespace ]  -- 表的命名空间(默认是 pg_default)
   [CONNECTION LIMIT [=] connlimit ]  -- 限制当前数据库的最大连接数 -1代表无限制
]

案例

CREATE DATABASE my_db1
WITH OWNER gpadmin
ENCODING 'utf-8'
TABLESPACE pg_dafault
CONNECTION LIMIE 10;

1.1.2、切换数据库

如果是使用 PSQL 的 CLI 命令行的话,我们可以使用下面的命令来切换数据库:

\c my_db1

使用 DataGrip 只能通过下面的按钮来切换

 1.1.3、创建 schema

        schema 相当于是一种归类分组的作用,毕竟海量数据场景下,一个数据库下面可能有成千上万张表,Greenplum 在库和表之间添加了一层 schema 使得表可以更好被管理。

CREATE SCHEMA my_biz;
1.1.4、查询所有数据库

同样,如果在 PSQL 的 CLI 命令行的话可以通过下面的命令来查看所有数据库:

\l

也可以使用下面的 SQL 命令:

-- 显示所有的库
SELECT * FROM pg_database;

1.1.5、删除数据库

 如果要删除数据库,必须先离开该数据库(\c 切换到别的数据库)才能删除

DROP DATABASE my_db1;

 1.2、表操作

1.2.1、创建表

语法
CREATE [EXTERNAL] TABLE table_name( -- 创建外部表,建表的同时可以指定一个实际数据的路径(location 可以是linux,也可以是 HDFS)
 column1 datatype [NOT NULL] [DEFAULT] [CHECK] [UNIQUE], -- 字段约束
 column2 datatype,
 column3 datatype,
 .....
 columnN datatype,
 [PRIMARY KEY()] -- 指定当前主键
)[ WITH ()] -- 定义数据追加方式、压缩格式、压缩级别等
 [LOCATION()] -- 如果使用外部表才会配合使用这个关键字
 [FORMAT] -- 定义当前表的存储格式
 [COMMENT] -- 注释
 [PARTITION BY] -- 分区字段 同时也是创建分区表的关键字
 [DISTRIBUTE BY ()]; -- 指定分布数据的键值(比如使用哈希算法计算数据的存储位置)
内部表和外部表的区别

(1)内部表(Regular Tables)

数据存储:内部表的数据直接存储在 GreenPlum 数据库的数据文件中。这意味着数据被物理存储在数据库服务器上。

事务管理:内部表完全支持事务管理。这包括 ACID 属性(原子性、一致性、隔离性和持久性),确保数据完整性和可靠性。

索引和约束:你可以在内部表上创建索引和约束,这有助于提高查询性能和维护数据完整性。

管理和维护:内部表可以使用数据库的全部管理和维护功能,如备份和恢复。

适用性:适用于需要高性能查询和事务完整性的数据。

(2)外部表(External Tables)

数据存储:外部表的数据存储在数据库外部,如在文件系统、Hadoop HDFS 或任何可通过 SQL/MED(SQL Management of External Data)访问的数据源。外部表仅存储数据的元数据和位置信息。

事务管理:外部表不支持事务管理。它们主要用于读取和加载操作,不保证 ACID 属性。

索引和约束:由于数据实际存储在外部,你不能在外部表上创建索引或强制执行数据库级别的约束。

管理和维护:外部表的管理相对简单,因为它们只是对外部数据源的引用。备份和恢复通常不适用于外部表本身,而是应用于数据源。

适用性:适用于 ETL(Extract, Transform, Load)操作,即从外部数据源提取数据,然后可能将其转换和加载到内部表中进行进一步处理。

案例

        创建外部表这里使用的数据源是 linux 文件系统下的一个 csv文件,需要我们使用 Greenplum 为该路径开启一个 gpfdist 服务: 

-- -d指定数据所在目录 -p 指定端口
gpfdist -d ./ -p 8081 &
-- 创建内部表
CREATE TABLE doctor(
    doctor_id serial primary key ,
    name varchar(100),
    department varchar(100),
    hire_date date
);

INSERT INTO doctor (name, department, hire_date) VALUES
    ('小美','护士','2024-07-08'),
    ('二狗','呼吸内科','2024-07-08'),
    ('铁蛋','骨科','2024-07-08');

DROP EXTERNAL TABLE supplier;
-- 外部表
CREATE EXTERNAL TABLE supplier(
    id varchar(10),
    name varchar(20),
    job varchar(20),
    birthday varchar(20)
    )
LOCATION ('gpfdist://hadoop102:8081/patient.csv')
FORMAT 'CSV';

-- 查询外部表
SELECT * FROM supplier;

查询结果

  

1.2.2、修改表

修改表名
ALTER TABLE table_name RENAME TO new_name;
增加/修改/替换列信息
-- 新增列
ALTER TABLE doctor ADD COLUMN addr varchar(20);
-- 更新列名
ALTER TABLE doctor  RENAME addr TO address;
-- 更新列数据类型
ALTER TABLE doctor ALTER COLUMN age TYPE int;
-- 删除列信息
ALTER TABLE doctor DROP COLUMN address;

1.2.3、清空表

注意:只能清除内部表,但是不能清除外部表 

TRUNCATE TABLE doctor;

1.2.4、删除表

DROP [EXTERNAL] TABLE table_name;

2、DML

2.1、数据导入

2.1.1、copy 方式

语法

COPY table_name FROM file_path DELIMITER sep;

创建内部表并准备数据:

CREATE TABLE student(
    name varchar(20),
    department varchar(20),
    age int
);

导入并查询(这里的文件路径为主节点的文件路径,上面的外部表数据源虽然也在主节点但是需要通过 gpfdist 协议,和这里不一样):

COPY student FROM '/home/gpadmin/software/test/student.csv' DELIMITER ',';

SELECT * FROM student;

查询结果:

 

2.1.2、通过查询向表中查询数据

INSERT INTO student
SELECT name,job AS department,0 AS age FROM supplier;

2.1.3、通过查询语句创建并加载数据

CREATE TABLE student2 AS SELECT * FROM student;

2.2、数据导出

COPY student2 TO '/home/gpadmin/software/test/student.txt';

2.3、数据更新和删除

 2.3.1、更新数据

UPDATE student2 SET age = 18,name = 'test' WHERE age = 0;

2.3.2、删除数据

DELETE FROM student2 WHERE age = 20;

总结 

        剩下的一些查询语句已经在 MySQL、HQL 中练习很多了,这里不再浪费时间了,下去之后多花点时间练练 SQL 题就OK了。

        关于 Greenplum 再深入的内容比如分布式事务、数据备份与迁移等资料网上比较少,之后慢慢精进。

相关推荐

  1. SQL注入(

    2024-07-13 02:36:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 02:36:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 02:36:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 02:36:01       57 阅读
  4. Python语言-面向对象

    2024-07-13 02:36:01       68 阅读

热门阅读

  1. 如何在Linux系统下安装Anaconda

    2024-07-13 02:36:01       21 阅读
  2. LeetCode 1351, 1, 208

    2024-07-13 02:36:01       22 阅读
  3. 【C++精华铺】13.STL stack 和 STL queue 模拟实现

    2024-07-13 02:36:01       20 阅读
  4. MySQL8之mysql-community-server的作用

    2024-07-13 02:36:01       18 阅读