數據庫實驗 華為數據庫


華為數據庫實驗

代碼倉庫:https://github.com/SKPrimin/HomeWork/tree/main/SQLSever/華為數據庫實驗

1.1.4 創建數據表

根據C銀行的場景描述,本實驗分別針對客戶(client),銀行卡(bank_card),理財產品(finance168s_product),保險(insurance),基金(fund)和資產(property)創建相應的表。具體的實驗步驟如下所示:

步驟 1創建金融數據庫finance168。

切換到omm用戶,以操作系統用戶omm登錄數據庫主節點。

su - omm

啟動數據庫服務

gs_om -t start

使用gsql工具登陸數據庫。

gsql -d postgres -p 26000 -r

創建數據庫finance168。

CREATE DATABASE finance168 ENCODING 'UTF8' template = template0;

image-20210706194409023

連接finance168數據庫。

\connect finance168

創建名為finance168的schema,並設置finance168為當前的schema。

CREATE SCHEMA finance168;

將默認搜索路徑設為finance168。

SET search_path TO finance168;

image-20210706194552560

步驟 2客戶信息表的創建。
在SQL編輯框中輸入如下語句,創建客戶信息表client。
刪除表client。

DROP TABLE IF EXISTS finance168.client;

創建表client。

CREATE TABLE finance168.client
(
        c_id INT PRIMARY KEY,
        c_name VARCHAR(100) NOT NULL,
        c_mail CHAR(30) UNIQUE,
        c_id_card CHAR(20) UNIQUE NOT NULL,
        c_phone CHAR(20) UNIQUE NOT NULL,
        c_password CHAR(20) NOT NULL
);

image-20210706194703483

步驟 3銀行卡信息表的創建。
在SQL編輯框中輸入如下語句,創建銀行卡信息表bank_card。
刪除表bank_card。

DROP TABLE IF EXISTS finance168.bank_card;

創建表bank_card。

CREATE TABLE finance168.bank_card
(
        b_number CHAR(30) PRIMARY KEY,
        b_type CHAR(20),
        b_c_id INT NOT NULL
);

image-20210706194750710

步驟 4理財產品信息表的創建。
創建理財產品信息表finance168s_product。
刪除表finance168s_product。

DROP TABLE IF EXISTS finance168.finance168s_product;

創建表finance168s_product。

CREATE TABLE finance168.finance168s_product
(
        p_name VARCHAR(100) NOT NULL,
        p_id INT PRIMARY KEY,
        p_description VARCHAR(4000),
        p_amount INT,
        p_year INT
);

image-20210706194822335

步驟 5保險信息表的創建。
在SQL編輯框中輸入如下語句,創建保險信息表insurance。
刪除表insurance。

DROP TABLE IF EXISTS finance168.insurance;

創建表insurance。

CREATE TABLE finance168.insurance
(
        i_name VARCHAR(100) NOT NULL,
        i_id INT PRIMARY KEY,
        i_amount INT,
        i_person CHAR(20),
        i_year INT,
        i_project VARCHAR(200)
);

image-20210706194856886

步驟 6基金信息表的創建。
在SQL編輯框中輸入如下語句,創建保險信息表fund。
刪除表fund。

DROP TABLE IF EXISTS finance168.fund;

創建表fund。

CREATE TABLE finance168.fund
(
        f_name VARCHAR(100) NOT NULL,
        f_id INT PRIMARY KEY,
        f_type CHAR(20),
        f_amount INT,
        risk_level CHAR(20) NOT NULL,
        f_manager INT NOT NULL
);

image-20210706194929486

步驟 7資產信息表的創建。
在SQL編輯框中輸入如下語句,創建資產信息表property。
刪除表property。

DROP TABLE IF EXISTS finance168.property;

創建表property。

CREATE TABLE finance168.property
(
        pro_id INT PRIMARY KEY,
pro_c_id INT NOT NULL,
        pro_pif_id INT NOT NULL,
        pro_type INT NOT NULL,
        pro_status CHAR(20),
        pro_quantity INT,
        pro_income INT,
        pro_purchase_time DATE
);

image-20210706194957466

1.1.5 插入表數據

為了實現對表數據的相關操作,本實驗需要以執行SQL語句的方式對金融數據庫的相關表插入部分數據。
步驟 1對client表進行數據初始化。
執行insert操作。

INSERT INTO finance168.client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (1,'張一','zhangyi@huawei.com','340211199301010001','18815650001','gaussdb_001');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (2,'張二','zhanger@huawei.com','340211199301010002','18815650002','gaussdb_002');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (3,'張三','zhangsan@huawei.com','340211199301010003','18815650003','gaussdb_003');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (4,'張四','zhangsi@huawei.com','340211199301010004','18815650004','gaussdb_004');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (5,'張五','zhangwu@huawei.com','340211199301010005','18815650005','gaussdb_005');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (6,'張六','zhangliu@huawei.com','340211199301010006','18815650006','gaussdb_006');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (7,'張七','zhangqi@huawei.com','340211199301010007','18815650007','gaussdb_007');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (8,'張八','zhangba@huawei.com','340211199301010008','18815650008','gaussdb_008');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (9,'張九','zhangjiu@huawei.com','340211199301010009','18815650009','gaussdb_009');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (10,'李一','liyi@huawei.com','340211199301010010','18815650010','gaussdb_010');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (11,'李二','lier@huawei.com','340211199301010011','18815650011','gaussdb_011');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (12,'李三','lisan@huawei.com','340211199301010012','18815650012','gaussdb_012');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (13,'李四','lisi@huawei.com','340211199301010013','18815650013','gaussdb_013');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (14,'李五','liwu@huawei.com','340211199301010014','18815650014','gaussdb_014');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (15,'李六','liliu@huawei.com','340211199301010015','18815650015','gaussdb_015');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (16,'李七','liqi@huawei.com','340211199301010016','18815650016','gaussdb_016');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (17,'李八','liba@huawei.com','340211199301010017','18815650017','gaussdb_017');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (18,'李九','lijiu@huawei.com','340211199301010018','18815650018','gaussdb_018');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (19,'王一','wangyi@huawei.com','340211199301010019','18815650019','gaussdb_019');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (20,'王二','wanger@huawei.com','340211199301010020','18815650020','gaussdb_020');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (21,'王三','wangsan@huawei.com','340211199301010021','18815650021','gaussdb_021');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (22,'王四','wangsi@huawei.com','340211199301010022','18815650022','gaussdb_022');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (23,'王五','wangwu@huawei.com','340211199301010023','18815650023','gaussdb_023');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (24,'王六','wangliu@huawei.com','340211199301010024','18815650024','gaussdb_024');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (25,'王七','wangqi@huawei.com','340211199301010025','18815650025','gaussdb_025');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (26,'王八','wangba@huawei.com','340211199301010026','18815650026','gaussdb_026');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (27,'王九','wangjiu@huawei.com','340211199301010027','18815650027','gaussdb_027');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (28,'錢一','qianyi@huawei.com','340211199301010028','18815650028','gaussdb_028');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (29,'錢二','qianer@huawei.com','340211199301010029','18815650029','gaussdb_029');
INSERT INTO client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (30,'錢三','qiansan@huawei.com','340211199301010030','18815650030','gaussdb_030');

查詢插入結果。

select count(*) from finance168.client;

結果為:

image-20210706195049170

步驟 2對bank_card表進行數據初始化。
執行insert操作。

INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000001','信用卡',1);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000002','信用卡',3);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000003','信用卡',5);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000004','信用卡',7);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000005','信用卡',9);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000006','信用卡',10);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000007','信用卡',12);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000008','信用卡',14);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000009','信用卡',16);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000010','信用卡',18);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000011','儲蓄卡',19);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000012','儲蓄卡',21);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000013','儲蓄卡',7);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000014','儲蓄卡',23);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000015','儲蓄卡',24);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000016','儲蓄卡',3);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000017','儲蓄卡',26);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000018','儲蓄卡',27);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000019','儲蓄卡',12);
INSERT INTO finance168.bank_card(b_number,b_type,b_c_id) VALUES ('6222021302020000020','儲蓄卡',29);

查詢插入結果。

select count(*) from finance168.bank_card;

結果為:

image-20210706195119825

步驟 3對finance168s_product表進行數據初始化。
執行insert操作。

INSERT INTO finance168.finance168s_product(p_name,p_id,p_description,p_amount,p_year) VALUES ('債券',1,'以國債、金融債、央行票據、企業債為主要投資方向的銀行理財產品。',50000,6);
INSERT INTO finance168.finance168s_product(p_name,p_id,p_description,p_amount,p_year) VALUES ('信貸資產',2,'一般指銀行作為委托人將通過發行理財產品募集資金委托給信托公司,信托公司作為受托人成立信托計划,將信托資產購買理財產品發售銀行或第三方信貸資產。',50000,6);
INSERT INTO finance168.finance168s_product(p_name,p_id,p_description,p_amount,p_year) VALUES ('股票',3,'與股票掛鈎的理財產品。目前市場上主要以港股掛鈎居多',50000,6);
INSERT INTO finance168.finance168s_product(p_name,p_id,p_description,p_amount,p_year) VALUES ('大宗商品',4,'與大宗商品期貨掛鈎的理財產品。目前市場上主要以掛鈎黃金、石油、農產品的理財產品居多。',50000,6);

查詢插入結果。

select count(*) from finance168.finance168s_product;

結果為:

image-20210706195213050

步驟 4對insurance表進行數據初始化。
執行insert操作。

INSERT INTO finance168.insurance(i_name,i_id,i_amount,i_person,i_year,i_project) VALUES ('健康保險',1,2000,'老人',30,'平安保險');
INSERT INTO finance168.insurance(i_name,i_id,i_amount,i_person,i_year,i_project) VALUES ('人壽保險',2,3000,'老人',30,'平安保險');
INSERT INTO finance168.insurance(i_name,i_id,i_amount,i_person,i_year,i_project) VALUES ('意外保險',3,5000,'所有人',30,'平安保險');
INSERT INTO finance168.insurance(i_name,i_id,i_amount,i_person,i_year,i_project) VALUES ('醫療保險',4,2000,'所有人',30,'平安保險');
INSERT INTO finance168.insurance(i_name,i_id,i_amount,i_person,i_year,i_project) VALUES ('財產損失保險',5,1500,'中年人',30,'平安保險');

查詢插入結果。

select count(*) from finance168.insurance;

結果為:
image-20210706195258295
步驟 5對fund表進行數據初始化。
執行insert操作。

INSERT INTO finance168.fund(f_name,f_id,f_type,f_amount,risk_level,f_manager) VALUES ('股票',1,'股票型',10000,'高',1);
INSERT INTO finance168.fund(f_name,f_id,f_type,f_amount,risk_level,f_manager) VALUES ('投資',2,'債券型',10000,'中',2);
INSERT INTO finance168.fund(f_name,f_id,f_type,f_amount,risk_level,f_manager) VALUES ('國債',3,'貨幣型',10000,'低',3);
INSERT INTO finance168.fund(f_name,f_id,f_type,f_amount,risk_level,f_manager) VALUES ('滬深300指數',4,'指數型',10000,'中',4);

查詢插入結果。

select count(*) from finance168.fund;

結果為:
image-20210706195328120
步驟 6對property表進行數據初始化。
執行insert操作。

INSERT INTO finance168.property(pro_id,pro_c_id,pro_pif_id,pro_type,pro_status,pro_quantity,pro_income,pro_purchase_time) VALUES (1,5,1,1,'可用',4,8000,'2018-07-01');
INSERT INTO finance168.property(pro_id,pro_c_id,pro_pif_id,pro_type,pro_status,pro_quantity,pro_income,pro_purchase_time) VALUES (2,10,2,2,'可用',4,8000,'2018-07-01');
INSERT INTO finance168.property(pro_id,pro_c_id,pro_pif_id,pro_type,pro_status,pro_quantity,pro_income,pro_purchase_time) VALUES (3,15,3,3,'可用',4,8000,'2018-07-01');
INSERT INTO finance168.property(pro_id,pro_c_id,pro_pif_id,pro_type,pro_status,pro_quantity,pro_income,pro_purchase_time) VALUES (4,20,4,1,'凍結',4,8000,'2018-07-01');

查詢插入結果。

select count(*) from finance168.property;

結果為:
image-20210706195408608

1.1.6 手工插入一條數據

當C銀行有新的信息需要加入數據庫時,系統需要在對應的數據表中手動插入一條新的數據。因此,針對主鍵屬性定義的場景,介紹如何手動插入一條數據。
步驟 1在金融數據庫的客戶信息表中添加一個客戶的信息。(屬性沖突的場景)
c_id_card和c_phone非唯一。

INSERT INTO finance168.client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (31,'李麗','lili@huawei.com','340211199301010005','18815650005','gaussdb_005');

錯誤信息如下:duplicate key value violates unique constraint "client_c_id_card_key"

image-20210706195444113

說明:由於在表的創建過程中,實驗定義了c_id_card和c_phone為唯一且非空(UNIQUE NOT NULL),所以當表中存在時,插入數據失敗。
步驟 2在金融數據庫的客戶信息表中添加一個客戶的信息。(插入成功的場景)。
插入成功的示例。

INSERT INTO finance168.client(c_id,c_name,c_mail,c_id_card,c_phone,c_password) VALUES (31,'李麗','lili@huawei.com','340211199301010031','18815650031','gaussdb_031');

image-20210706195543438

1.1.7 添加約束

步驟 1對表添加外鍵約束,在銀行信息表和資產信息表中,都存在每個銀行卡必須有一個持卡者、每份資產必須都有一個資產擁有者這樣的對應關系。因此針對這種對應關系,創建外鍵約束。
給表bank_card添加外鍵約束

ALTER TABLE finance168.bank_card ADD CONSTRAINT fk_c_id FOREIGN KEY (b_c_id) REFERENCES finance168.client(c_id) ON DELETE CASCADE;

給表property添加外鍵約束

ALTER TABLE finance168.property ADD CONSTRAINT fk_pro_c_id FOREIGN KEY (pro_c_id) REFERENCES finance168.client(c_id) ON DELETE CASCADE;

image-20210706195621642

備注:
銀行卡信息表中的b_c_id與客戶信息表中的c_id一致,且每個銀行卡都必須有一個持卡者。
在進行表刪除時,需要先刪除bank_card表,再刪除client表,因為兩個表存在約束。
資產信息表中的pro_c_id與客戶信息表中的c_id一致,且每一份資產都必須有一個資產擁有者。
在進行表刪除時,需要先刪除property表,再刪除client表,因為兩個表存在約束。

步驟 2在理財產品表、保險信息表和基金信息表中,都存在金額這個屬性,在現實生活中,金額不會存在負數。因此針對表中金額的屬性,增加大於0的約束條件。
為finance168s_product表的p_amount列添加大於等於0的約束。

ALTER table finance168.finance168s_product ADD CONSTRAINT c_p_mount CHECK (p_amount >=0);

image-20210706195652050

步驟 3嘗試手工插入一條金額小於0的記錄。

INSERT INTO finance168.finance168s_product(p_name,p_id,p_description,p_amount,p_year) VALUES ('信貸資產',10,'一般指銀行作為委托人將通過發行理財產品募集資金委托給信托公司,信托公司作為受托人成立信托計划,將信托資產購買理財產品發售銀行或第三方信貸資產。',-10,6);

執行失敗,失敗原因:new row for relation "finance168s_product" violates check constraint "c_p_mount"。

image-20210706195721944

步驟 4向fund表添加約束。
為fund表的f_amount列添加大於等於0的約束。

ALTER table finance168.fund ADD CONSTRAINT c_f_mount CHECK (f_amount >=0);

步驟 5向insurance表添加約束。
為insurance表的i_amount列添加大於等於0的約束。

ALTER table finance168.insurance ADD CONSTRAINT c_i_mount CHECK (i_amount >=0);

image-20210706195815615

1.1.8 查詢數據

在本章的金融數據庫實驗中,主要目的是為了讓讀者學習到更深一層的查詢操作,讓學習者能夠更深入的去了解openGauss數據庫的復雜操作。
步驟 1單表查詢。
查詢銀行卡信息表。

SELECT b_number,b_type FROM finance168.bank_card;

結果如下:
image-20210706195837019
步驟 2條件查詢。
查詢資產信息中‘可用’的資產數據。

select * from finance168.property where pro_status='可用';

結果如下:

image-20210706195908637

步驟 3聚合查詢。
查詢用戶表中有多少個用戶。

SELECT count(*) FROM finance168.client;

結果如下:

image-20210706200257790

查詢銀行卡信息表中,儲蓄卡和信用卡的個數。

SELECT b_type,COUNT(*) FROM finance168.bank_card GROUP BY b_type;

結果如下:
image-20210706200326182
查詢保險信息表中,保險金額的平均值。

SELECT AVG(i_amount) FROM finance168.insurance;

結果如下:

image-20210706200344980

查詢保險信息表中保險金額的最大值和最小值所對應的險種和金額。

select i_name,i_amount from finance168.insurance where i_amount in (select max(i_amount) from finance168.insurance)
union
select i_name,i_amount from finance168.insurance where i_amount in (select min(i_amount) from finance168.insurance);

結果如下:
image-20210706200407067
步驟 4連接查詢。
(1)半連接。
查詢用戶編號在銀行卡表中出現的用戶的編號,用戶姓名和身份證。

SELECT c_id,c_name,c_id_card FROM finance168.client WHERE EXISTS (SELECT * FROM finance168.bank_card WHERE client.c_id = bank_card.b_c_id);

結果如下:
image-20210706200425979
備注:半連接是一種特殊的連接類型,在SQL中沒有指定的關鍵字,通過在WHERE后面使用IN或EXISTS子查詢實現。當IN/EXISTS右側的多行滿足子查詢的條件時,主查詢也只返回一行與EXISTS子查詢匹配的行,而不是復制左側的行。
(2)反連接。
查詢銀行卡號不是'622202130202000001'(表示未知)的用戶的編號,姓名和身份證。

SELECT c_id,c_name,c_id_card FROM finance168.client WHERE c_id NOT IN (SELECT b_c_id FROM finance168.bank_card WHERE b_number LIKE '622202130202000001_');

結果如下:
image-20210706200627966

備注:反連接是一種特殊的連接類型,在SQL中沒有指定的關鍵字,通過在WHERE后面使用 NOT IN或NOT EXISTS子查詢實現。返回所有不滿足條件的行。這個關系的概念跟半連接相反。
步驟 5子查詢。
通過子查詢,查詢保險產品中保險金額大於平均值的保險名稱和適用人群。

SELECT i1.i_name,i1.i_amount,i1.i_person FROM finance168.insurance i1 WHERE i_amount > (SELECT avg(i_amount) FROM finance168.insurance i2);

結果如下:
image-20210706200843804
步驟 6ORDER BY和GROUP BY。
(1)ORDER BY子句。
按照保額降序查詢保險編號大於2的保險名稱,保額和適用人群。

SELECT i_name,i_amount,i_person FROM finance168.insurance WHERE i_id>2 ORDER BY i_amount DESC;

結果如下:
image-20210706201042140
(2)GROUP BY子句。
查詢各理財產品信息總數,按照p_year分組。

SELECT p_year,count(p_id) FROM finance168.finance168s_product GROUP BY p_year;

結果如下:
image-20210706201020562
步驟 7HAVING和WITH AS。
(1)HAVING子句。
查詢保險金額統計數量等於2的適用人群數。

SELECT i_person,count(i_amount) FROM finance168.insurance GROUP BY i_person HAVING count(i_amount)=2;

結果如下:
image-20210706201103606
備注:HAVING子句依附於GROUP BY子句而存在。
(2)WITH AS子句。
使用WITH AS查詢基金信息表。

WITH temp AS (SELECT f_name,ln(f_amount) FROM finance168.fund ORDER BY f_manager DESC) SELECT * FROM temp;

結果如下:
image-20210706201122749
備注:該語句為定義一個SQL片段,該SQL片段會被整個SQL語句用到。
可以使SQL語句的可讀性更高。存儲SQL片段的表與基本表不同,是一個虛表。數據庫不存放對應的定義和數據,這些數據仍存放在原來的基本表中。若基本表中的數據發生變化,從存儲SQL片段的表中查詢出的數據也隨之改變。

1.1.9 視圖

視圖是一個虛擬表,是sql的查詢結果,其內容由查詢定義。對於來自多張關聯表的復雜查詢,就不得不使用十分復雜的SQL語句進行查詢,造成極差的體驗感。使用視圖之后,可以極大的簡化操作,使用視圖不需要關心相應表的結構、關聯條件等。
步驟 1創建視圖。
針對“查詢用戶編號在銀行卡表中出現的用戶的編號,用戶姓名和身份證” 的查詢,創建視圖。

CREATE VIEW finance168.v_client as SELECT c_id,c_name,c_id_card FROM finance168.client WHERE EXISTS (SELECT * FROM finance168.bank_card WHERE client.c_id = bank_card.b_c_id); 

使用視圖進行查詢。

SELECT * FROM finance168.v_client;

結果如下:
image-20210706201151191
步驟 2修改視圖內容
修改視圖,在原有查詢的基礎上,過濾出信用卡用戶。

CREATE OR REPLACE VIEW finance168.v_client as SELECT c_id,c_name,c_id_card FROM finance168.client WHERE EXISTS (SELECT * FROM finance168.bank_card WHERE client.c_id = bank_card.b_c_id and bank_card.b_type='信用卡');

使用視圖進行查詢。

select * from finance168.v_client;

結果如下:
image-20210706201221643
步驟 3修改視圖名稱。

ALTER VIEW finance168.v_client RENAME TO v_client_new;

步驟 4刪除視圖。
將v_client視圖刪除,刪除視圖不影響基表。

DROP VIEW finance168.v_client_new;

image-20210706201257321

1.1.10 索引

步驟 1創建索引。
在普通表property上創建索引。

CREATE INDEX finance168.idx_property ON finance168.property(pro_c_id DESC,pro_income,pro_purchase_time);

結果如下:

image-20210706201319614
步驟 2重命名索引。
在普通表property上重建及重命名索引。
重建索引。

DROP INDEX finance168.idx_property;
CREATE INDEX finance168.idx_property ON finance168.property(pro_c_id DESC,pro_income,pro_purchase_time);

重命名索引。

ALTER INDEX finance168.idx_property RENAME TO idx_property_temp;

步驟 3刪除索引。
刪除索引idx_property_temp。

DROP INDEX finance168.idx_property_temp;

image-20210706201423120

1.1.11 數據的修改和刪除

步驟 1修改數據。
修改/更新銀行卡信息表中b_c_id小於10和客戶信息表中c_id相同的記錄的b_type字段。
查看表數據。

SELECT * FROM finance168.bank_card where b_c_id<10 ORDER BY b_c_id;

結果如下:
image-20210706201444882
開始更新數據:

UPDATE finance168.bank_card SET bank_card.b_type='借記卡' from finance168.client where bank_card.b_c_id = client.c_id and bank_card.b_c_id<10;

重新查詢數據情況。

SELECT * FROM finance168.bank_card ORDER BY b_c_id;

結果如下:
image-20210706201516461
步驟 2刪除指定數據。
刪除基金信息表中編號小於3的行。
刪除前查詢結果。

SELECT * FROM finance168.fund;

結果如下:
image-20210706201535553
開始刪除數據:

DELETE FROM finance168.fund WHERE f_id<3;

查詢刪除結果。

SELECT * FROM finance168.fund;

結果如下:
image-20210706201617602
步驟 3退出數據庫

\q

1.1.12 新用戶的創建和授權

在本章中,假設C銀行的某新員工想要在自己的用戶下去訪問sys用戶下的金融數據庫,則該員工需要向sys申請添加相關權限,具體操作如下:
步驟 1連接數據庫

gsql -d postgres -p 26000 -r

步驟 2連接數據庫后,進入SQL命令界面。創建用戶dbuser,密碼為Gauss#3demo。

CREATE USER dbuser IDENTIFIED BY 'Gauss#3demo';

步驟 3切換到finance168數據庫,給用戶dbuser授予finance168數據庫下bank_card表的查詢和插入權限,並將SCHEMA的權限也授予dbuser用戶。

\connect finance168;
GRANT SELECT,INSERT ON finance168.bank_card TO dbuser;
GRANT ALL ON SCHEMA finance168 to dbuser;

步驟 4退出數據庫:

\q

image-20210706201733985

1.1.13 新用戶連接數據庫

步驟 1在gsql登錄數據庫,使用新用戶連接。
使用操作系統omm用戶在新的窗口登陸並執行以下命令,並輸入對應的密碼(如:Gauss#3demo)。

gsql -d finance168 -U dbuser -p 26000 -r

步驟 2訪問finance168數據庫的表bank_card。

select * from finance168. bank_card where b_c_id<10;

結果如下:
image-20210706201818568
步驟 3退出數據庫:

\q

1.1.14 刪除Schema

步驟 1使用管理員用戶登陸finance168數據庫。
通過gsql來登錄finance168數據庫,新建session。

gsql -d finance168 -p 26000 -r

步驟 2使用“\dn”查看數據庫下的schema。

\dn

image-20210706201853625
步驟 3設置默認查詢為finance168。

set search_path to finance168;

步驟 4使用“\dt”命令可以看到在finance168中的對象。

\dt                               

image-20210706201927845
步驟 5使用DROP SCHEMA 命令刪除finance168會有報錯,因為finance168下存在對象。

DROP SCHEMA finance168;

報錯如下:
image-20210706201943597
步驟 6使用DROP SCHEMA…..CASCADE刪除,會將finance168連同下的對象一起刪除。

DROP SCHEMA finance168 CASCADE;

結果如下:
image-20210706202004848
步驟 7使用“\dt”命令可以看到在finance168和public中的對象,對象已刪除。

\dt  

image-20210706202025693
步驟 8退出數據庫:

postgres=#\q


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM