2虽画、openGauss數(shù)據(jù)庫(kù)SQL基本語(yǔ)法
SQL 語(yǔ)法主要分為三個(gè)類(lèi)型DDL寂呛、DML叫倍、DCL,對(duì)應(yīng)13個(gè)動(dòng)詞:
DDL(data definition language)數(shù)據(jù)定義語(yǔ)言妒御,用戶(hù)定義和管理sql數(shù)據(jù)庫(kù)中所有對(duì)象的語(yǔ)言。 主要命令:create骤素、alter、drop等
DML(data manipulation language)數(shù)據(jù)操作語(yǔ)言愚屁。 主要命令:select济竹、update、insert霎槐、delete等
DCL(date control language)數(shù)據(jù)庫(kù)控制功能送浊。主要命令:grant、deny丘跌、revoke袭景、commit唁桩、savepoint、rollback等
常見(jiàn)語(yǔ)法示例耸棒,主要包括: 創(chuàng)建用戶(hù)荒澡、創(chuàng)建和管理數(shù)據(jù)庫(kù)、創(chuàng)建表与殃、插入數(shù)據(jù)单山、更新數(shù)據(jù)、查看數(shù)據(jù)幅疼、刪除數(shù)據(jù)等
創(chuàng)建用戶(hù)(CREATE USER)
--創(chuàng)建用戶(hù)jim米奸,登錄密碼為xxxxxxxxx。
openGauss=# CREATE USER jim PASSWORD 'xxxxxxxxx';
說(shuō)明:必須至少8個(gè)字符爽篷,且至少包含3種字符(要符合常規(guī)密碼安全度設(shè)置要求)悴晰。
--下面語(yǔ)句與上面的等價(jià)。
openGauss=# CREATE USER kim IDENTIFIED BY 'xxxxxxxxx';
--如果創(chuàng)建有“創(chuàng)建數(shù)據(jù)庫(kù)”權(quán)限的用戶(hù)狼忱,則需要加CREATEDB關(guān)鍵字膨疏。
openGauss=# CREATE USER dim CREATEDB PASSWORD 'xxxxxxxxx';
--將用戶(hù)jim的登錄密碼由xxxxxxxxx修改為Abcd@123。
openGauss=# ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'xxxxxxxxx';
說(shuō)明:新密碼不能使用之前用過(guò)的密碼钻弄。
--為用戶(hù)jim追加CREATEROLE權(quán)限佃却。
openGauss=# ALTER USER jim CREATEROLE;
--將enable_seqscan的值設(shè)置為on, 設(shè)置成功后窘俺,在下一會(huì)話(huà)中生效饲帅。
openGauss=# ALTER USER jim SET enable_seqscan TO on;
--重置jim的enable_seqscan參數(shù)。
openGauss=# ALTER USER jim RESET enable_seqscan;
--鎖定jim帳戶(hù)瘤泪。
openGauss=# ALTER USER jim ACCOUNT LOCK;
--刪除用戶(hù)灶泵。
openGauss=# DROP USER kim CASCADE;
openGauss=# DROP USER jim CASCADE;
openGauss=# DROP USER dim CASCADE;
說(shuō)明:CASCADE,刪除用戶(hù)關(guān)聯(lián)的所有對(duì)象。
創(chuàng)建和管理數(shù)據(jù)庫(kù)
--使用如下命令創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)db_tpcc对途。
openGauss=# CREATE DATABASE db_tpcc;
--查看數(shù)據(jù)庫(kù)
使用\l元命令查看數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)庫(kù)列表赦邻。
openGauss=# \l
使用如下命令通過(guò)系統(tǒng)表pg_database查詢(xún)數(shù)據(jù)庫(kù)列表。
openGauss=# SELECT datname FROM pg_database;
注:數(shù)據(jù)庫(kù)名稱(chēng)遵循SQL標(biāo)識(shí)符的一般規(guī)則实檀。當(dāng)前角色自動(dòng)成為此新數(shù)據(jù)庫(kù)的所有者惶洲。
如果一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)用于承載相互獨(dú)立的用戶(hù)和項(xiàng)目,建議把它們放在不同的數(shù)據(jù)庫(kù)里膳犹。
如果項(xiàng)目或者用戶(hù)是相互關(guān)聯(lián)的恬吕,并且可以相互使用對(duì)方的資源,則應(yīng)該把它們放在同一個(gè)數(shù)據(jù)庫(kù)里须床,但可以規(guī)劃在不同的模式中铐料。模式只是一個(gè)純粹的邏輯結(jié)構(gòu),某個(gè)模式的訪問(wèn)權(quán)限由權(quán)限系統(tǒng)模塊控制。
創(chuàng)建數(shù)據(jù)庫(kù)時(shí)钠惩,若數(shù)據(jù)庫(kù)名稱(chēng)長(zhǎng)度超過(guò)63字節(jié)柒凉,server端會(huì)對(duì)數(shù)據(jù)庫(kù)名稱(chēng)進(jìn)行截?cái)啵A羟?3個(gè)字節(jié)妻柒,因此建議數(shù)據(jù)庫(kù)名稱(chēng)長(zhǎng)度不要超過(guò)63個(gè)字節(jié)扛拨。
--修改數(shù)據(jù)庫(kù)
用戶(hù)可以使用如下命令修改數(shù)據(jù)庫(kù)屬性(比如:owner、名稱(chēng)和默認(rèn)的配置屬性)举塔。
使用以下命令為數(shù)據(jù)庫(kù)設(shè)置默認(rèn)的模式搜索路徑十艾。
openGauss=# ALTER DATABASE db_tpcc SET search_path TO pa_catalog,public;
--使用如下命令為數(shù)據(jù)庫(kù)重新命名械馆。
openGauss=# ALTER DATABASE db_tpcc RENAME TO human_tpcds;
--刪除數(shù)據(jù)庫(kù)
用戶(hù)可以使用DROP DATABASE命令刪除數(shù)據(jù)庫(kù)备畦。這個(gè)命令刪除了數(shù)據(jù)庫(kù)中的系統(tǒng)目錄射窒,并且刪除了磁盤(pán)上帶有數(shù)據(jù)的數(shù)據(jù)庫(kù)目錄。用戶(hù)必須是數(shù)據(jù)庫(kù)的owner或者系統(tǒng)管理員才能刪除數(shù)據(jù)庫(kù)芽丹。當(dāng)有人連接數(shù)據(jù)庫(kù)時(shí)北启,刪除操作會(huì)失敗。刪除數(shù)據(jù)庫(kù)時(shí)請(qǐng)先連接到其他的數(shù)據(jù)庫(kù)拔第。
使用如下命令刪除數(shù)據(jù)庫(kù):
openGauss=# DROP DATABASE db_tpcc;
創(chuàng)建表(CREATE TABLE)
--表是建立在數(shù)據(jù)庫(kù)中的咕村,在不同的數(shù)據(jù)庫(kù)中可以存放相同的表。甚至可以通過(guò)使用模式在同一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建相同名稱(chēng)的表蚊俺。創(chuàng)建表前請(qǐng)先規(guī)劃存儲(chǔ)模型懈涛。
openGauss=# CREATE TABLE customer_t1
(
c_customer_sk integer,
c_customer_id char(5),
c_first_name char(6),
c_last_name char(8)
);
當(dāng)結(jié)果顯示為如下信息,則表示創(chuàng)建成功泳猬。
CREATE TABLE
其中c_customer_sk 批钠、c_customer_id、c_first_name和c_last_name是表的字段名得封,integer埋心、char(5)、char(6)和char(8)分別是這四字段名稱(chēng)的類(lèi)型忙上。
向表中插入數(shù)據(jù)
--向表中插入數(shù)據(jù)前拷呆,意味著表已創(chuàng)建成功。
向表customer_t1中插入一行:
數(shù)據(jù)值是按照這些字段在表中出現(xiàn)的順序列出的疫粥,并且用逗號(hào)分隔洋腮。通常數(shù)據(jù)值是文本(常量),但也允許使用標(biāo)量表達(dá)式手形。
openGauss=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');
如果用戶(hù)已經(jīng)知道表中字段的順序,也可無(wú)需列出表中的字段悯恍。例如以下命令與上面的命令效果相同库糠。
openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace');
如果用戶(hù)不知道所有字段的數(shù)值,可以忽略其中的一些。沒(méi)有數(shù)值的字段將被填充為字段的缺省值瞬欧。例如:
openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');
openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello');
用戶(hù)也可以對(duì)獨(dú)立的字段或者整個(gè)行明確缺省值:
openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);
openGauss=# INSERT INTO customer_t1 DEFAULT VALUES;
如果需要在表中插入多行贷屎,請(qǐng)使用以下命令:
openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES
(6885, 'maps', 'Joes'),
(4321, 'tpcds', 'Lily'),
(9527, 'world', 'James');
如果需要向表中插入多條數(shù)據(jù),除此命令外艘虎,也可以多次執(zhí)行插入一行數(shù)據(jù)命令實(shí)現(xiàn)唉侄。但是建議使用此命令可以提升效率。
如果從指定表插入數(shù)據(jù)到當(dāng)前表野建,例如在數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)表customer_t1的備份表customer_t2属划,現(xiàn)在需要將表customer_t1中的數(shù)據(jù)插入到表customer_t2中,則可以執(zhí)行如下命令候生。
openGauss=# CREATE TABLE customer_t2
(
c_customer_sk integer,
c_customer_id char(5),
c_first_name char(6),
c_last_name char(8)
);
openGauss=# INSERT INTO customer_t2 SELECT * FROM customer_t1;
從指定表插入數(shù)據(jù)到當(dāng)前表時(shí)同眯,若指定表與當(dāng)前表對(duì)應(yīng)的字段數(shù)據(jù)類(lèi)型之間不存在隱式轉(zhuǎn)換,則這兩種數(shù)據(jù)類(lèi)型必須相同唯鸭。
刪除備份表
openGauss=# DROP TABLE customer_t2 CASCADE;
在刪除表的時(shí)候须蜗,若當(dāng)前需刪除的表與其他表有依賴(lài)關(guān)系,需先刪除關(guān)聯(lián)的表目溉,然后再刪除當(dāng)前表明肮。
更新表中數(shù)據(jù)
修改已經(jīng)存儲(chǔ)在數(shù)據(jù)庫(kù)中數(shù)據(jù)的行為叫做更新。用戶(hù)可以更新單獨(dú)一行缭付,所有行或者指定的部分行柿估。還可以獨(dú)立更新每個(gè)字段,而其他字段則不受影響蛉腌。
使用UPDATE命令更新現(xiàn)有行官份,需要提供以下三種信息:
- 表的名稱(chēng)和要更新的字段名
- 字段的新值
- 要更新哪些行
SQL通常不會(huì)為數(shù)據(jù)行提供唯一標(biāo)識(shí),因此無(wú)法直接聲明需要更新哪一行烙丛。但是可以通過(guò)聲明一個(gè)被更新的行必須滿(mǎn)足的條件舅巷。只有在表里存在主鍵的時(shí)候,才可以通過(guò)主鍵指定一個(gè)獨(dú)立的行河咽。
建立表和插入數(shù)據(jù)的步驟請(qǐng)參考創(chuàng)建表和向表中插入數(shù)據(jù)钠右。
需要將表customer_t1中c_customer_sk為9527的地域重新定義為9876:
openGauss=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527;
這里的表名稱(chēng)也可以使用模式名修飾,否則會(huì)從默認(rèn)的模式路徑找到這個(gè)表忘蟹。SET后面緊跟字段和新的字段值飒房。新的字段值不僅可以是常量,也可以是變量表達(dá)式媚值。
比如狠毯,把所有c_customer_sk的值增加100:
openGauss=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100;
在這里省略了WHERE子句,表示表中的所有行都要被更新褥芒。如果出現(xiàn)了WHERE子句嚼松,那么只有匹配其條件的行才會(huì)被更新。
在SET子句中的等號(hào)是一個(gè)賦值,而在WHERE子句中的等號(hào)是比較献酗。WHERE條件不一定是相等測(cè)試寝受,許多其他的操作符也可以使用。
用戶(hù)可以在一個(gè)UPDATE命令中更新更多的字段罕偎,方法是在SET子句中列出更多賦值很澄,比如:
openGauss=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;
批量更新或刪除數(shù)據(jù)后,會(huì)在數(shù)據(jù)文件中產(chǎn)生大量的刪除標(biāo)記颜及,查詢(xún)過(guò)程中標(biāo)記刪除的數(shù)據(jù)也是需要掃描的甩苛。故多次批量更新/刪除后,標(biāo)記刪除的數(shù)據(jù)量過(guò)大會(huì)嚴(yán)重影響查詢(xún)的性能器予。建議在批量更新/刪除業(yè)務(wù)會(huì)反復(fù)執(zhí)行的場(chǎng)景下浪藻,定期執(zhí)行VACUUM FULL以保持查詢(xún)性能。
查看數(shù)據(jù)
使用系統(tǒng)表pg_tables查詢(xún)數(shù)據(jù)庫(kù)所有表的信息乾翔。
openGauss=# SELECT * FROM pg_tables;
使用gsql的\d+命令查詢(xún)表的屬性爱葵。
openGauss=# \d+ customer_t1;
執(zhí)行如下命令查詢(xún)表customer_t1的數(shù)據(jù)量。
openGauss=# SELECT count(*) FROM customer_t1;
執(zhí)行如下命令查詢(xún)表customer_t1的所有數(shù)據(jù)反浓。
openGauss=# SELECT * FROM customer_t1;
說(shuō)明:插數(shù)據(jù)時(shí)萌丈,沒(méi)有數(shù)值的字段將被填充為字段的缺省值。
執(zhí)行如下命令只查詢(xún)字段c_customer_sk的數(shù)據(jù)雷则。
openGauss=# SELECT c_customer_sk FROM customer_t1;
執(zhí)行如下命令過(guò)濾字段c_customer_sk的重復(fù)數(shù)據(jù)辆雾。
openGauss=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1;
執(zhí)行如下命令查詢(xún)字段c_customer_sk為3869的所有數(shù)據(jù)。
openGauss=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869;
執(zhí)行如下命令按照字段c_customer_sk進(jìn)行排序月劈。
openGauss=# SELECT * FROM customer_t1 ORDER BY c_customer_sk;
刪除表中數(shù)據(jù)
在使用表的過(guò)程中度迂,可能會(huì)需要?jiǎng)h除已過(guò)期的數(shù)據(jù),刪除數(shù)據(jù)必須從表中整行的刪除猜揪。
SQL不能直接訪問(wèn)獨(dú)立的行惭墓,只能通過(guò)聲明被刪除行匹配的條件進(jìn)行。如果表中有一個(gè)主鍵而姐,用戶(hù)可以指定準(zhǔn)確的行腊凶。用戶(hù)可以刪除匹配條件的一組行或者一次刪除表中的所有行。
使用DELETE命令刪除行拴念,如果刪除表customer_t1中所有c_customer_sk為3869的記錄:
openGauss=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869;
如果執(zhí)行如下命令之一钧萍,會(huì)刪除表中所有的行。
openGauss=# DELETE FROM customer_t1;
或
openGauss=# TRUNCATE TABLE customer_t1;
全表刪除的場(chǎng)景下政鼠,建議使用truncate风瘦,不建議使用delete。
刪除創(chuàng)建的表:
openGauss=# DROP TABLE customer_t1;
三公般、參考資料:
1.openGauss官方文檔3.0.0 開(kāi)發(fā)指南:
https://www.opengauss.org/zh/docs/3.0.0/docs/Developerguide/Developerguide.html