前沿拓展:
alter table
column是列 添加、修改、刪除列時(shí)用到
constraint是約束,比如default、check等
PostgreSQL 是最靈活的數(shù)據(jù)庫(kù)之一,并且它是開(kāi)源的。
數(shù)據(jù)庫(kù)是以一種有組織且靈活的方式存儲(chǔ)信息的工具。電子表格在本質(zhì)上就是一個(gè)數(shù)據(jù)庫(kù),但是圖形化應(yīng)用程序這一限制使得大多數(shù)的電子表格應(yīng)用程序?qū)Τ绦騿T毫無(wú)用處。隨著 邊緣計(jì)算和物聯(lián)網(wǎng)設(shè)備成為重要的平臺(tái),開(kāi)發(fā)者們需要更有效且輕量級(jí)的方法,來(lái)存儲(chǔ)、處理、查詢大量的數(shù)據(jù)。我最愛(ài)的一種組合是使用Lua 連接 
ostgreSQL 數(shù)據(jù)庫(kù)。無(wú)論你使用什么編程語(yǔ)言,PostgreSQL 一定是數(shù)據(jù)庫(kù)的絕佳選擇,但是在使用 PostgreSQL 之前,第一你需要知道一些基本的東西。
安裝 PostgreSQL
在 Linux 上安裝 PostgreSQL,要使用你的軟件庫(kù)。在 Fedora,CentOS,Megeia 等類似的 Linux 版本上使用命令:
$ sudo dnf install postgresql postgresql-server
在 Debian, Linux Mint, Elementary 等類似的 Linux 版本上使用命令:
$ sudo apt install postgresql postgresql-contrib
在 macOs 和 Windows 上,可以從官網(wǎng) postgresql.org下載安裝包。
配置 PostgreSQL
大多數(shù)發(fā)行版安裝 PostgreSQL 數(shù)據(jù)庫(kù)時(shí)沒(méi)有啟動(dòng)它,但是為你提供了一個(gè)腳本或 systemd 服務(wù),能夠可靠地啟動(dòng) PostgreSQL。但是,在啟動(dòng) PostgreSQL 之前,必須創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群。
Fedora
在 Fedora,CentOS 等類似的版本上,PostgreSQL 安裝包中提供了一個(gè) PostgreSQL 配置腳本。運(yùn)行這個(gè)腳本,可以進(jìn)行簡(jiǎn)單地配置:
$ sudo /usr/bin/postgresql-setup –initdb
[sudo] password:
* Initializing database in ‘/var/lib/pgsql/data’
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Debian
在基于 Debian 的發(fā)行版上,在安裝 Postgres 的過(guò)程中,配置會(huì)通過(guò) apt自動(dòng)完成。
其他版本
最后,如果你是在其他版本上運(yùn)行的,那么你可以直接使用 PostgreSQL 提供的一些工具。initdb命令會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群,但是這個(gè)命令必須在postgres用戶下運(yùn)行,你可以使用sudo來(lái)暫時(shí)地成為postgres用戶:
$ sudo -u postgres
“initdb -D /var/lib/pgsql/data
–locale en_US.UTF-8 –auth md5 –pwprompt”
運(yùn)行 PostgreSQL
現(xiàn)在,數(shù)據(jù)庫(kù)集群已經(jīng)存在了,使用 initdb的輸出中提供給你的命令或者使用 systemd 啟動(dòng) PostgreSQL 服務(wù)器:
$ sudo systemctl start postgresql
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶
使用 createuser命令來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶。postgres用戶是 Postgres 安裝的超級(jí)用戶。
$ sudo -u postgres createuser –interactive –password bogus
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password:
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
使用 createdb命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。在這個(gè)例子中,我創(chuàng)建了數(shù)據(jù)庫(kù)exampledb,并把該數(shù)據(jù)庫(kù)的擁有者分配給用戶bogus。
$ createdb exampledb –owner bogus
與 PostgreSQL 交互
你可以使用 psql命令來(lái)與 PostgreSQL 中的數(shù)據(jù)庫(kù)進(jìn)行交互。這個(gè)命令提供了一個(gè)交互界面,所以你可以用它來(lái)查看和更新你的數(shù)據(jù)庫(kù)。你需要指定要使用的用戶和數(shù)據(jù)庫(kù),來(lái)連接到一個(gè)數(shù)據(jù)庫(kù)。
$ psql –user bogus exampledb
psql (XX.Y)
Type “help” for help.
exampledb=>
創(chuàng)建一個(gè)表
數(shù)據(jù)庫(kù)包含很多表。這些表可以可視化為表格,有很多行(在數(shù)據(jù)庫(kù)中稱為 記錄)和很多列。行和列的交集稱為字段。
結(jié)構(gòu)化查詢語(yǔ)言(SQL)是以它提供的內(nèi)容而命名的,它能提供可預(yù)測(cè)且一致的語(yǔ)法,來(lái)查詢數(shù)據(jù)庫(kù)內(nèi)容,從而收到有用的結(jié)果。
目前,你的數(shù)據(jù)庫(kù)是空的,沒(méi)有任何的表。你可以用 CREATE語(yǔ)句來(lái)創(chuàng)建一個(gè)表。結(jié)合使用IF NOT EXISTS是很有用的,它可以避免破壞現(xiàn)有的表。
在你創(chuàng)建一個(gè)表之前,想想看你希望這個(gè)表包含哪一種數(shù)據(jù)(在 SQL 術(shù)語(yǔ)中稱為“數(shù)據(jù)類型”)。在這個(gè)例子中,我創(chuàng)建了一個(gè)表,包含兩列,有唯一標(biāo)識(shí)符的一列和最多九個(gè)字符的可變長(zhǎng)的一列。
exampledb=> CREATE TABLE IF NOT EXISTS my_sample_table(
exampledb(> id SERIAL,
exampledb(> wordlist VARCHAR(9) NOT NULL
);
關(guān)鍵字 SERIAL并不是一個(gè)數(shù)據(jù)類型。SERIAL是PostgreSQL 中的一個(gè)特殊的標(biāo)記,它可以創(chuàng)建一個(gè)自動(dòng)遞增的整數(shù)字段。關(guān)鍵字VARCHAR是一個(gè)數(shù)據(jù)類型,表示限制內(nèi)字符數(shù)的可變字符。在此例中,我指定了最多 9 個(gè)字符。PostgreSQL 中有很多數(shù)據(jù)類型,因此請(qǐng)參閱項(xiàng)目文檔以獲取選項(xiàng)列表。
插入數(shù)據(jù)
你可以使用 INSERT語(yǔ)句來(lái)給你的新表插入一些樣本數(shù)據(jù):
exampledb=> INSERT INTO my_sample_table (wordlist) VALUES (‘Alice’);
INSERT 0 1
如果你嘗試在 wordlist域中輸入超過(guò) 9 個(gè)字符,則數(shù)據(jù)輸入將會(huì)失?。?/p>
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
ERROR: VALUE too long FOR TYPE CHARACTER VARYING(9)
改變表或者列
當(dāng)你需要改變一個(gè)域的定義時(shí),你可以使用 ALTER這一 SQL 關(guān)鍵字。例如,如果你想改變wordlist域中最多只能有 9 個(gè)字符的限制,你可以重新設(shè)置這個(gè)數(shù)據(jù)類型。
exampledb=> ALTER TABLE my_sample_table
ALTER COLUMN wordlist SET DATA TYPE VARCHAR(10);
ALTER TABLE
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
INSERT 0 1
查詢表中的內(nèi)容
SQL 是一種查詢語(yǔ)言,因此你可以通過(guò)查詢來(lái)查看數(shù)據(jù)庫(kù)的內(nèi)容。查詢可以是很簡(jiǎn)單的,也可以涉及連接多個(gè)不同表之間的復(fù)雜關(guān)系。要查看表中的所有內(nèi)容,請(qǐng)使用 SELECT關(guān)鍵字和*(*是通配符):
exampledb=> SELECT * FROM my_sample_table;
id | wordlist
—-+————
1 | Alice
2 | Bob
3 | Alexandria
(3 ROWS)
更多數(shù)據(jù)
PostgreSQL 可以處理很多數(shù)據(jù),但是對(duì)于任何數(shù)據(jù)庫(kù)來(lái)說(shuō),關(guān)鍵之處在于你是如何設(shè)計(jì)你的數(shù)據(jù)庫(kù)的,以及數(shù)據(jù)存儲(chǔ)下來(lái)之后你是怎么查詢數(shù)據(jù)的。在 OECD.org上可以找到一個(gè)相對(duì)較大的公共數(shù)據(jù)集,你可以使用它來(lái)嘗試一些先進(jìn)的數(shù)據(jù)庫(kù)技術(shù)。
第一,將數(shù)據(jù)下載為逗號(hào)分隔值格式(CSV)的文件,并將文件另存為 Downloads文件夾中的land-cover.csv。
在文本編輯器或電子表格應(yīng)用程序中瀏覽數(shù)據(jù),來(lái)了解有哪些列,以及每列包含哪些類型的數(shù)據(jù)。仔細(xì)查看數(shù)據(jù),并留意錯(cuò)誤情況。例如,COU列指的是國(guó)家代碼,例如AUS表示澳大利亞和GRC表示希臘,在奇怪的BRIICS之前,這一列的值通常是 3 個(gè)字符。
在你理解了這些數(shù)據(jù)項(xiàng)后,你就可以準(zhǔn)備一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)了。
$ createdb landcoverdb –owner bogus
$ psql –user bogus landcoverdb
landcoverdb=> create table land_cover(
country_code varchar(6),
country_name varchar(76),
**all_subnational_region_code varchar(5),
**all_subnational_region_name varchar(14),
large_subnational_region_code varchar(17),
large_subnational_region_name varchar(44),
measure_code varchar(13),
measure_name varchar(29),
land_cover_class_code varchar(17),
land_cover_class_name varchar(19),
year_code integer,
year_value integer,
unit_code varchar(3),
unit_name varchar(17),
power_code integer,
power_name varchar(9),
reference_period_code varchar(1),
reference_period_name varchar(1),
value float(8),
flag_codes varchar(1),
flag_names varchar(1));
引入數(shù)據(jù)
Postgres 可以使用特殊的元命令 copy來(lái)直接引入 CSV 數(shù)據(jù):
landcoverdb=> copy land_cover from ‘~/land-cover.csv’ with csv header delimiter ‘,’
COPY 22113
插入了 22113 條記錄。這是一個(gè)很好的開(kāi)始!
查詢數(shù)據(jù)
用 SELECT語(yǔ)句可以查詢這 22113 條記錄的所有列,此外 PostgreSQL 將輸出通過(guò)管道傳輸?shù)狡聊簧?,因此你可以輕松地滾動(dòng)鼠標(biāo)來(lái)查看輸出的結(jié)果。更進(jìn)一步,你可以使用高級(jí) SQL 語(yǔ)句,來(lái)獲得一些有用的視圖。
landcoverdb=> SELECT
lcm.country_name,
lcm.year_value,
SUM(lcm.value) sum_value
FROM land_cover lcm
JOIN (
SELECT
country_name,
large_subnational_region_name,
**all_subnational_region_name,
MAX(year_value) max_year_value
FROM land_cover
GROUP BY country_name,
large_subnational_region_name,
**all_subnational_region_name
) AS lcmyv
ON
lcm.country_name = lcmyv.country_name AND
lcm.large_subnational_region_name = lcmyv.large_subnational_region_name AND
lcm.**all_subnational_region_name = lcmyv.**all_subnational_region_name AND
lcm.year_value = lcmyv.max_year_value
GROUP BY lcm.country_name,
lcm.large_subnational_region_name,
lcm.**all_subnational_region_name,
lcm.year_value
ORDER BY country_name,
year_value;
下面是樣例的一些輸出:
—————+————+————
Afghanistan | 2019 | 743.48425
Albania | 2019 | 128.82532
Algeria | 2019 | 2417.3281
American Samoa | 2019 | 100.2007
Andorra | 2019 | 100.45613
Angola | 2019 | 1354.2192
Anguilla | 2019 | 100.078514
Antarctica | 2019 | 12561.907
[…]
SQL 是一種很豐富的語(yǔ)言,超出了本文的討論范圍。通讀 SQL 的內(nèi)容,看看你是否可以對(duì)上面的查詢語(yǔ)句進(jìn)行修改,以提供不同的數(shù)據(jù)集。
拓展數(shù)據(jù)庫(kù)
PostgreSQL 是偉大的開(kāi)源數(shù)據(jù)庫(kù)之一。有了它,你可以為結(jié)構(gòu)化數(shù)據(jù)設(shè)計(jì)存儲(chǔ)庫(kù),第二使用 SQL 以不同的方式查詢它,以便能夠獲得有關(guān)該數(shù)據(jù)的新視角。PostgreSQL 也能與許多語(yǔ)言集成,包括 Python、Lua、Groovy、Java 等,因此無(wú)論你使用什么工具集,你都可以充分利用好這個(gè)出色的數(shù)據(jù)庫(kù)。
via: https://opensource.com/article/22/9/drop-your-database-for-postgresql
作者:Seth Kenlon選題:lkxed譯者:chai001125校對(duì):wxy
本文由 LCTT原創(chuàng)編譯,Linux**榮譽(yù)推出
拓展知識(shí):
前沿拓展:
alter table
column是列 添加、修改、刪除列時(shí)用到
constraint是約束,比如default、check等
PostgreSQL 是最靈活的數(shù)據(jù)庫(kù)之一,并且它是開(kāi)源的。
數(shù)據(jù)庫(kù)是以一種有組織且靈活的方式存儲(chǔ)信息的工具。電子表格在本質(zhì)上就是一個(gè)數(shù)據(jù)庫(kù),但是圖形化應(yīng)用程序這一限制使得大多數(shù)的電子表格應(yīng)用程序?qū)Τ绦騿T毫無(wú)用處。隨著 邊緣計(jì)算和物聯(lián)網(wǎng)設(shè)備成為重要的平臺(tái),開(kāi)發(fā)者們需要更有效且輕量級(jí)的方法,來(lái)存儲(chǔ)、處理、查詢大量的數(shù)據(jù)。我最愛(ài)的一種組合是使用Lua 連接 
ostgreSQL 數(shù)據(jù)庫(kù)。無(wú)論你使用什么編程語(yǔ)言,PostgreSQL 一定是數(shù)據(jù)庫(kù)的絕佳選擇,但是在使用 PostgreSQL 之前,第一你需要知道一些基本的東西。
安裝 PostgreSQL
在 Linux 上安裝 PostgreSQL,要使用你的軟件庫(kù)。在 Fedora,CentOS,Megeia 等類似的 Linux 版本上使用命令:
$ sudo dnf install postgresql postgresql-server
在 Debian, Linux Mint, Elementary 等類似的 Linux 版本上使用命令:
$ sudo apt install postgresql postgresql-contrib
在 macOs 和 Windows 上,可以從官網(wǎng) postgresql.org下載安裝包。
配置 PostgreSQL
大多數(shù)發(fā)行版安裝 PostgreSQL 數(shù)據(jù)庫(kù)時(shí)沒(méi)有啟動(dòng)它,但是為你提供了一個(gè)腳本或 systemd 服務(wù),能夠可靠地啟動(dòng) PostgreSQL。但是,在啟動(dòng) PostgreSQL 之前,必須創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群。
Fedora
在 Fedora,CentOS 等類似的版本上,PostgreSQL 安裝包中提供了一個(gè) PostgreSQL 配置腳本。運(yùn)行這個(gè)腳本,可以進(jìn)行簡(jiǎn)單地配置:
$ sudo /usr/bin/postgresql-setup –initdb
[sudo] password:
* Initializing database in ‘/var/lib/pgsql/data’
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Debian
在基于 Debian 的發(fā)行版上,在安裝 Postgres 的過(guò)程中,配置會(huì)通過(guò) apt自動(dòng)完成。
其他版本
最后,如果你是在其他版本上運(yùn)行的,那么你可以直接使用 PostgreSQL 提供的一些工具。initdb命令會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群,但是這個(gè)命令必須在postgres用戶下運(yùn)行,你可以使用sudo來(lái)暫時(shí)地成為postgres用戶:
$ sudo -u postgres
“initdb -D /var/lib/pgsql/data
–locale en_US.UTF-8 –auth md5 –pwprompt”
運(yùn)行 PostgreSQL
現(xiàn)在,數(shù)據(jù)庫(kù)集群已經(jīng)存在了,使用 initdb的輸出中提供給你的命令或者使用 systemd 啟動(dòng) PostgreSQL 服務(wù)器:
$ sudo systemctl start postgresql
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶
使用 createuser命令來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶。postgres用戶是 Postgres 安裝的超級(jí)用戶。
$ sudo -u postgres createuser –interactive –password bogus
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password:
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
使用 createdb命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。在這個(gè)例子中,我創(chuàng)建了數(shù)據(jù)庫(kù)exampledb,并把該數(shù)據(jù)庫(kù)的擁有者分配給用戶bogus。
$ createdb exampledb –owner bogus
與 PostgreSQL 交互
你可以使用 psql命令來(lái)與 PostgreSQL 中的數(shù)據(jù)庫(kù)進(jìn)行交互。這個(gè)命令提供了一個(gè)交互界面,所以你可以用它來(lái)查看和更新你的數(shù)據(jù)庫(kù)。你需要指定要使用的用戶和數(shù)據(jù)庫(kù),來(lái)連接到一個(gè)數(shù)據(jù)庫(kù)。
$ psql –user bogus exampledb
psql (XX.Y)
Type “help” for help.
exampledb=>
創(chuàng)建一個(gè)表
數(shù)據(jù)庫(kù)包含很多表。這些表可以可視化為表格,有很多行(在數(shù)據(jù)庫(kù)中稱為 記錄)和很多列。行和列的交集稱為字段。
結(jié)構(gòu)化查詢語(yǔ)言(SQL)是以它提供的內(nèi)容而命名的,它能提供可預(yù)測(cè)且一致的語(yǔ)法,來(lái)查詢數(shù)據(jù)庫(kù)內(nèi)容,從而收到有用的結(jié)果。
目前,你的數(shù)據(jù)庫(kù)是空的,沒(méi)有任何的表。你可以用 CREATE語(yǔ)句來(lái)創(chuàng)建一個(gè)表。結(jié)合使用IF NOT EXISTS是很有用的,它可以避免破壞現(xiàn)有的表。
在你創(chuàng)建一個(gè)表之前,想想看你希望這個(gè)表包含哪一種數(shù)據(jù)(在 SQL 術(shù)語(yǔ)中稱為“數(shù)據(jù)類型”)。在這個(gè)例子中,我創(chuàng)建了一個(gè)表,包含兩列,有唯一標(biāo)識(shí)符的一列和最多九個(gè)字符的可變長(zhǎng)的一列。
exampledb=> CREATE TABLE IF NOT EXISTS my_sample_table(
exampledb(> id SERIAL,
exampledb(> wordlist VARCHAR(9) NOT NULL
);
關(guān)鍵字 SERIAL并不是一個(gè)數(shù)據(jù)類型。SERIAL是PostgreSQL 中的一個(gè)特殊的標(biāo)記,它可以創(chuàng)建一個(gè)自動(dòng)遞增的整數(shù)字段。關(guān)鍵字VARCHAR是一個(gè)數(shù)據(jù)類型,表示限制內(nèi)字符數(shù)的可變字符。在此例中,我指定了最多 9 個(gè)字符。PostgreSQL 中有很多數(shù)據(jù)類型,因此請(qǐng)參閱項(xiàng)目文檔以獲取選項(xiàng)列表。
插入數(shù)據(jù)
你可以使用 INSERT語(yǔ)句來(lái)給你的新表插入一些樣本數(shù)據(jù):
exampledb=> INSERT INTO my_sample_table (wordlist) VALUES (‘Alice’);
INSERT 0 1
如果你嘗試在 wordlist域中輸入超過(guò) 9 個(gè)字符,則數(shù)據(jù)輸入將會(huì)失?。?/p>
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
ERROR: VALUE too long FOR TYPE CHARACTER VARYING(9)
改變表或者列
當(dāng)你需要改變一個(gè)域的定義時(shí),你可以使用 ALTER這一 SQL 關(guān)鍵字。例如,如果你想改變wordlist域中最多只能有 9 個(gè)字符的限制,你可以重新設(shè)置這個(gè)數(shù)據(jù)類型。
exampledb=> ALTER TABLE my_sample_table
ALTER COLUMN wordlist SET DATA TYPE VARCHAR(10);
ALTER TABLE
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
INSERT 0 1
查詢表中的內(nèi)容
SQL 是一種查詢語(yǔ)言,因此你可以通過(guò)查詢來(lái)查看數(shù)據(jù)庫(kù)的內(nèi)容。查詢可以是很簡(jiǎn)單的,也可以涉及連接多個(gè)不同表之間的復(fù)雜關(guān)系。要查看表中的所有內(nèi)容,請(qǐng)使用 SELECT關(guān)鍵字和*(*是通配符):
exampledb=> SELECT * FROM my_sample_table;
id | wordlist
—-+————
1 | Alice
2 | Bob
3 | Alexandria
(3 ROWS)
更多數(shù)據(jù)
PostgreSQL 可以處理很多數(shù)據(jù),但是對(duì)于任何數(shù)據(jù)庫(kù)來(lái)說(shuō),關(guān)鍵之處在于你是如何設(shè)計(jì)你的數(shù)據(jù)庫(kù)的,以及數(shù)據(jù)存儲(chǔ)下來(lái)之后你是怎么查詢數(shù)據(jù)的。在 OECD.org上可以找到一個(gè)相對(duì)較大的公共數(shù)據(jù)集,你可以使用它來(lái)嘗試一些先進(jìn)的數(shù)據(jù)庫(kù)技術(shù)。
第一,將數(shù)據(jù)下載為逗號(hào)分隔值格式(CSV)的文件,并將文件另存為 Downloads文件夾中的land-cover.csv。
在文本編輯器或電子表格應(yīng)用程序中瀏覽數(shù)據(jù),來(lái)了解有哪些列,以及每列包含哪些類型的數(shù)據(jù)。仔細(xì)查看數(shù)據(jù),并留意錯(cuò)誤情況。例如,COU列指的是國(guó)家代碼,例如AUS表示澳大利亞和GRC表示希臘,在奇怪的BRIICS之前,這一列的值通常是 3 個(gè)字符。
在你理解了這些數(shù)據(jù)項(xiàng)后,你就可以準(zhǔn)備一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)了。
$ createdb landcoverdb –owner bogus
$ psql –user bogus landcoverdb
landcoverdb=> create table land_cover(
country_code varchar(6),
country_name varchar(76),
**all_subnational_region_code varchar(5),
**all_subnational_region_name varchar(14),
large_subnational_region_code varchar(17),
large_subnational_region_name varchar(44),
measure_code varchar(13),
measure_name varchar(29),
land_cover_class_code varchar(17),
land_cover_class_name varchar(19),
year_code integer,
year_value integer,
unit_code varchar(3),
unit_name varchar(17),
power_code integer,
power_name varchar(9),
reference_period_code varchar(1),
reference_period_name varchar(1),
value float(8),
flag_codes varchar(1),
flag_names varchar(1));
引入數(shù)據(jù)
Postgres 可以使用特殊的元命令 copy來(lái)直接引入 CSV 數(shù)據(jù):
landcoverdb=> copy land_cover from ‘~/land-cover.csv’ with csv header delimiter ‘,’
COPY 22113
插入了 22113 條記錄。這是一個(gè)很好的開(kāi)始!
查詢數(shù)據(jù)
用 SELECT語(yǔ)句可以查詢這 22113 條記錄的所有列,此外 PostgreSQL 將輸出通過(guò)管道傳輸?shù)狡聊簧?,因此你可以輕松地滾動(dòng)鼠標(biāo)來(lái)查看輸出的結(jié)果。更進(jìn)一步,你可以使用高級(jí) SQL 語(yǔ)句,來(lái)獲得一些有用的視圖。
landcoverdb=> SELECT
lcm.country_name,
lcm.year_value,
SUM(lcm.value) sum_value
FROM land_cover lcm
JOIN (
SELECT
country_name,
large_subnational_region_name,
**all_subnational_region_name,
MAX(year_value) max_year_value
FROM land_cover
GROUP BY country_name,
large_subnational_region_name,
**all_subnational_region_name
) AS lcmyv
ON
lcm.country_name = lcmyv.country_name AND
lcm.large_subnational_region_name = lcmyv.large_subnational_region_name AND
lcm.**all_subnational_region_name = lcmyv.**all_subnational_region_name AND
lcm.year_value = lcmyv.max_year_value
GROUP BY lcm.country_name,
lcm.large_subnational_region_name,
lcm.**all_subnational_region_name,
lcm.year_value
ORDER BY country_name,
year_value;
下面是樣例的一些輸出:
—————+————+————
Afghanistan | 2019 | 743.48425
Albania | 2019 | 128.82532
Algeria | 2019 | 2417.3281
American Samoa | 2019 | 100.2007
Andorra | 2019 | 100.45613
Angola | 2019 | 1354.2192
Anguilla | 2019 | 100.078514
Antarctica | 2019 | 12561.907
[…]
SQL 是一種很豐富的語(yǔ)言,超出了本文的討論范圍。通讀 SQL 的內(nèi)容,看看你是否可以對(duì)上面的查詢語(yǔ)句進(jìn)行修改,以提供不同的數(shù)據(jù)集。
拓展數(shù)據(jù)庫(kù)
PostgreSQL 是偉大的開(kāi)源數(shù)據(jù)庫(kù)之一。有了它,你可以為結(jié)構(gòu)化數(shù)據(jù)設(shè)計(jì)存儲(chǔ)庫(kù),第二使用 SQL 以不同的方式查詢它,以便能夠獲得有關(guān)該數(shù)據(jù)的新視角。PostgreSQL 也能與許多語(yǔ)言集成,包括 Python、Lua、Groovy、Java 等,因此無(wú)論你使用什么工具集,你都可以充分利用好這個(gè)出色的數(shù)據(jù)庫(kù)。
via: https://opensource.com/article/22/9/drop-your-database-for-postgresql
作者:Seth Kenlon選題:lkxed譯者:chai001125校對(duì):wxy
本文由 LCTT原創(chuàng)編譯,Linux**榮譽(yù)推出
拓展知識(shí):
前沿拓展:
alter table
column是列 添加、修改、刪除列時(shí)用到
constraint是約束,比如default、check等
PostgreSQL 是最靈活的數(shù)據(jù)庫(kù)之一,并且它是開(kāi)源的。
數(shù)據(jù)庫(kù)是以一種有組織且靈活的方式存儲(chǔ)信息的工具。電子表格在本質(zhì)上就是一個(gè)數(shù)據(jù)庫(kù),但是圖形化應(yīng)用程序這一限制使得大多數(shù)的電子表格應(yīng)用程序?qū)Τ绦騿T毫無(wú)用處。隨著 邊緣計(jì)算和物聯(lián)網(wǎng)設(shè)備成為重要的平臺(tái),開(kāi)發(fā)者們需要更有效且輕量級(jí)的方法,來(lái)存儲(chǔ)、處理、查詢大量的數(shù)據(jù)。我最愛(ài)的一種組合是使用Lua 連接 
ostgreSQL 數(shù)據(jù)庫(kù)。無(wú)論你使用什么編程語(yǔ)言,PostgreSQL 一定是數(shù)據(jù)庫(kù)的絕佳選擇,但是在使用 PostgreSQL 之前,第一你需要知道一些基本的東西。
安裝 PostgreSQL
在 Linux 上安裝 PostgreSQL,要使用你的軟件庫(kù)。在 Fedora,CentOS,Megeia 等類似的 Linux 版本上使用命令:
$ sudo dnf install postgresql postgresql-server
在 Debian, Linux Mint, Elementary 等類似的 Linux 版本上使用命令:
$ sudo apt install postgresql postgresql-contrib
在 macOs 和 Windows 上,可以從官網(wǎng) postgresql.org下載安裝包。
配置 PostgreSQL
大多數(shù)發(fā)行版安裝 PostgreSQL 數(shù)據(jù)庫(kù)時(shí)沒(méi)有啟動(dòng)它,但是為你提供了一個(gè)腳本或 systemd 服務(wù),能夠可靠地啟動(dòng) PostgreSQL。但是,在啟動(dòng) PostgreSQL 之前,必須創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群。
Fedora
在 Fedora,CentOS 等類似的版本上,PostgreSQL 安裝包中提供了一個(gè) PostgreSQL 配置腳本。運(yùn)行這個(gè)腳本,可以進(jìn)行簡(jiǎn)單地配置:
$ sudo /usr/bin/postgresql-setup –initdb
[sudo] password:
* Initializing database in ‘/var/lib/pgsql/data’
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Debian
在基于 Debian 的發(fā)行版上,在安裝 Postgres 的過(guò)程中,配置會(huì)通過(guò) apt自動(dòng)完成。
其他版本
最后,如果你是在其他版本上運(yùn)行的,那么你可以直接使用 PostgreSQL 提供的一些工具。initdb命令會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群,但是這個(gè)命令必須在postgres用戶下運(yùn)行,你可以使用sudo來(lái)暫時(shí)地成為postgres用戶:
$ sudo -u postgres
“initdb -D /var/lib/pgsql/data
–locale en_US.UTF-8 –auth md5 –pwprompt”
運(yùn)行 PostgreSQL
現(xiàn)在,數(shù)據(jù)庫(kù)集群已經(jīng)存在了,使用 initdb的輸出中提供給你的命令或者使用 systemd 啟動(dòng) PostgreSQL 服務(wù)器:
$ sudo systemctl start postgresql
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶
使用 createuser命令來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶。postgres用戶是 Postgres 安裝的超級(jí)用戶。
$ sudo -u postgres createuser –interactive –password bogus
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password:
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
使用 createdb命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。在這個(gè)例子中,我創(chuàng)建了數(shù)據(jù)庫(kù)exampledb,并把該數(shù)據(jù)庫(kù)的擁有者分配給用戶bogus。
$ createdb exampledb –owner bogus
與 PostgreSQL 交互
你可以使用 psql命令來(lái)與 PostgreSQL 中的數(shù)據(jù)庫(kù)進(jìn)行交互。這個(gè)命令提供了一個(gè)交互界面,所以你可以用它來(lái)查看和更新你的數(shù)據(jù)庫(kù)。你需要指定要使用的用戶和數(shù)據(jù)庫(kù),來(lái)連接到一個(gè)數(shù)據(jù)庫(kù)。
$ psql –user bogus exampledb
psql (XX.Y)
Type “help” for help.
exampledb=>
創(chuàng)建一個(gè)表
數(shù)據(jù)庫(kù)包含很多表。這些表可以可視化為表格,有很多行(在數(shù)據(jù)庫(kù)中稱為 記錄)和很多列。行和列的交集稱為字段。
結(jié)構(gòu)化查詢語(yǔ)言(SQL)是以它提供的內(nèi)容而命名的,它能提供可預(yù)測(cè)且一致的語(yǔ)法,來(lái)查詢數(shù)據(jù)庫(kù)內(nèi)容,從而收到有用的結(jié)果。
目前,你的數(shù)據(jù)庫(kù)是空的,沒(méi)有任何的表。你可以用 CREATE語(yǔ)句來(lái)創(chuàng)建一個(gè)表。結(jié)合使用IF NOT EXISTS是很有用的,它可以避免破壞現(xiàn)有的表。
在你創(chuàng)建一個(gè)表之前,想想看你希望這個(gè)表包含哪一種數(shù)據(jù)(在 SQL 術(shù)語(yǔ)中稱為“數(shù)據(jù)類型”)。在這個(gè)例子中,我創(chuàng)建了一個(gè)表,包含兩列,有唯一標(biāo)識(shí)符的一列和最多九個(gè)字符的可變長(zhǎng)的一列。
exampledb=> CREATE TABLE IF NOT EXISTS my_sample_table(
exampledb(> id SERIAL,
exampledb(> wordlist VARCHAR(9) NOT NULL
);
關(guān)鍵字 SERIAL并不是一個(gè)數(shù)據(jù)類型。SERIAL是PostgreSQL 中的一個(gè)特殊的標(biāo)記,它可以創(chuàng)建一個(gè)自動(dòng)遞增的整數(shù)字段。關(guān)鍵字VARCHAR是一個(gè)數(shù)據(jù)類型,表示限制內(nèi)字符數(shù)的可變字符。在此例中,我指定了最多 9 個(gè)字符。PostgreSQL 中有很多數(shù)據(jù)類型,因此請(qǐng)參閱項(xiàng)目文檔以獲取選項(xiàng)列表。
插入數(shù)據(jù)
你可以使用 INSERT語(yǔ)句來(lái)給你的新表插入一些樣本數(shù)據(jù):
exampledb=> INSERT INTO my_sample_table (wordlist) VALUES (‘Alice’);
INSERT 0 1
如果你嘗試在 wordlist域中輸入超過(guò) 9 個(gè)字符,則數(shù)據(jù)輸入將會(huì)失?。?/p>
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
ERROR: VALUE too long FOR TYPE CHARACTER VARYING(9)
改變表或者列
當(dāng)你需要改變一個(gè)域的定義時(shí),你可以使用 ALTER這一 SQL 關(guān)鍵字。例如,如果你想改變wordlist域中最多只能有 9 個(gè)字符的限制,你可以重新設(shè)置這個(gè)數(shù)據(jù)類型。
exampledb=> ALTER TABLE my_sample_table
ALTER COLUMN wordlist SET DATA TYPE VARCHAR(10);
ALTER TABLE
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
INSERT 0 1
查詢表中的內(nèi)容
SQL 是一種查詢語(yǔ)言,因此你可以通過(guò)查詢來(lái)查看數(shù)據(jù)庫(kù)的內(nèi)容。查詢可以是很簡(jiǎn)單的,也可以涉及連接多個(gè)不同表之間的復(fù)雜關(guān)系。要查看表中的所有內(nèi)容,請(qǐng)使用 SELECT關(guān)鍵字和*(*是通配符):
exampledb=> SELECT * FROM my_sample_table;
id | wordlist
—-+————
1 | Alice
2 | Bob
3 | Alexandria
(3 ROWS)
更多數(shù)據(jù)
PostgreSQL 可以處理很多數(shù)據(jù),但是對(duì)于任何數(shù)據(jù)庫(kù)來(lái)說(shuō),關(guān)鍵之處在于你是如何設(shè)計(jì)你的數(shù)據(jù)庫(kù)的,以及數(shù)據(jù)存儲(chǔ)下來(lái)之后你是怎么查詢數(shù)據(jù)的。在 OECD.org上可以找到一個(gè)相對(duì)較大的公共數(shù)據(jù)集,你可以使用它來(lái)嘗試一些先進(jìn)的數(shù)據(jù)庫(kù)技術(shù)。
第一,將數(shù)據(jù)下載為逗號(hào)分隔值格式(CSV)的文件,并將文件另存為 Downloads文件夾中的land-cover.csv。
在文本編輯器或電子表格應(yīng)用程序中瀏覽數(shù)據(jù),來(lái)了解有哪些列,以及每列包含哪些類型的數(shù)據(jù)。仔細(xì)查看數(shù)據(jù),并留意錯(cuò)誤情況。例如,COU列指的是國(guó)家代碼,例如AUS表示澳大利亞和GRC表示希臘,在奇怪的BRIICS之前,這一列的值通常是 3 個(gè)字符。
在你理解了這些數(shù)據(jù)項(xiàng)后,你就可以準(zhǔn)備一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)了。
$ createdb landcoverdb –owner bogus
$ psql –user bogus landcoverdb
landcoverdb=> create table land_cover(
country_code varchar(6),
country_name varchar(76),
**all_subnational_region_code varchar(5),
**all_subnational_region_name varchar(14),
large_subnational_region_code varchar(17),
large_subnational_region_name varchar(44),
measure_code varchar(13),
measure_name varchar(29),
land_cover_class_code varchar(17),
land_cover_class_name varchar(19),
year_code integer,
year_value integer,
unit_code varchar(3),
unit_name varchar(17),
power_code integer,
power_name varchar(9),
reference_period_code varchar(1),
reference_period_name varchar(1),
value float(8),
flag_codes varchar(1),
flag_names varchar(1));
引入數(shù)據(jù)
Postgres 可以使用特殊的元命令 copy來(lái)直接引入 CSV 數(shù)據(jù):
landcoverdb=> copy land_cover from ‘~/land-cover.csv’ with csv header delimiter ‘,’
COPY 22113
插入了 22113 條記錄。這是一個(gè)很好的開(kāi)始!
查詢數(shù)據(jù)
用 SELECT語(yǔ)句可以查詢這 22113 條記錄的所有列,此外 PostgreSQL 將輸出通過(guò)管道傳輸?shù)狡聊簧?,因此你可以輕松地滾動(dòng)鼠標(biāo)來(lái)查看輸出的結(jié)果。更進(jìn)一步,你可以使用高級(jí) SQL 語(yǔ)句,來(lái)獲得一些有用的視圖。
landcoverdb=> SELECT
lcm.country_name,
lcm.year_value,
SUM(lcm.value) sum_value
FROM land_cover lcm
JOIN (
SELECT
country_name,
large_subnational_region_name,
**all_subnational_region_name,
MAX(year_value) max_year_value
FROM land_cover
GROUP BY country_name,
large_subnational_region_name,
**all_subnational_region_name
) AS lcmyv
ON
lcm.country_name = lcmyv.country_name AND
lcm.large_subnational_region_name = lcmyv.large_subnational_region_name AND
lcm.**all_subnational_region_name = lcmyv.**all_subnational_region_name AND
lcm.year_value = lcmyv.max_year_value
GROUP BY lcm.country_name,
lcm.large_subnational_region_name,
lcm.**all_subnational_region_name,
lcm.year_value
ORDER BY country_name,
year_value;
下面是樣例的一些輸出:
—————+————+————
Afghanistan | 2019 | 743.48425
Albania | 2019 | 128.82532
Algeria | 2019 | 2417.3281
American Samoa | 2019 | 100.2007
Andorra | 2019 | 100.45613
Angola | 2019 | 1354.2192
Anguilla | 2019 | 100.078514
Antarctica | 2019 | 12561.907
[…]
SQL 是一種很豐富的語(yǔ)言,超出了本文的討論范圍。通讀 SQL 的內(nèi)容,看看你是否可以對(duì)上面的查詢語(yǔ)句進(jìn)行修改,以提供不同的數(shù)據(jù)集。
拓展數(shù)據(jù)庫(kù)
PostgreSQL 是偉大的開(kāi)源數(shù)據(jù)庫(kù)之一。有了它,你可以為結(jié)構(gòu)化數(shù)據(jù)設(shè)計(jì)存儲(chǔ)庫(kù),第二使用 SQL 以不同的方式查詢它,以便能夠獲得有關(guān)該數(shù)據(jù)的新視角。PostgreSQL 也能與許多語(yǔ)言集成,包括 Python、Lua、Groovy、Java 等,因此無(wú)論你使用什么工具集,你都可以充分利用好這個(gè)出色的數(shù)據(jù)庫(kù)。
via: https://opensource.com/article/22/9/drop-your-database-for-postgresql
作者:Seth Kenlon選題:lkxed譯者:chai001125校對(duì):wxy
本文由 LCTT原創(chuàng)編譯,Linux**榮譽(yù)推出
拓展知識(shí):
前沿拓展:
alter table
column是列 添加、修改、刪除列時(shí)用到
constraint是約束,比如default、check等
PostgreSQL 是最靈活的數(shù)據(jù)庫(kù)之一,并且它是開(kāi)源的。
數(shù)據(jù)庫(kù)是以一種有組織且靈活的方式存儲(chǔ)信息的工具。電子表格在本質(zhì)上就是一個(gè)數(shù)據(jù)庫(kù),但是圖形化應(yīng)用程序這一限制使得大多數(shù)的電子表格應(yīng)用程序?qū)Τ绦騿T毫無(wú)用處。隨著 邊緣計(jì)算和物聯(lián)網(wǎng)設(shè)備成為重要的平臺(tái),開(kāi)發(fā)者們需要更有效且輕量級(jí)的方法,來(lái)存儲(chǔ)、處理、查詢大量的數(shù)據(jù)。我最愛(ài)的一種組合是使用Lua 連接 
ostgreSQL 數(shù)據(jù)庫(kù)。無(wú)論你使用什么編程語(yǔ)言,PostgreSQL 一定是數(shù)據(jù)庫(kù)的絕佳選擇,但是在使用 PostgreSQL 之前,第一你需要知道一些基本的東西。
安裝 PostgreSQL
在 Linux 上安裝 PostgreSQL,要使用你的軟件庫(kù)。在 Fedora,CentOS,Megeia 等類似的 Linux 版本上使用命令:
$ sudo dnf install postgresql postgresql-server
在 Debian, Linux Mint, Elementary 等類似的 Linux 版本上使用命令:
$ sudo apt install postgresql postgresql-contrib
在 macOs 和 Windows 上,可以從官網(wǎng) postgresql.org下載安裝包。
配置 PostgreSQL
大多數(shù)發(fā)行版安裝 PostgreSQL 數(shù)據(jù)庫(kù)時(shí)沒(méi)有啟動(dòng)它,但是為你提供了一個(gè)腳本或 systemd 服務(wù),能夠可靠地啟動(dòng) PostgreSQL。但是,在啟動(dòng) PostgreSQL 之前,必須創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群。
Fedora
在 Fedora,CentOS 等類似的版本上,PostgreSQL 安裝包中提供了一個(gè) PostgreSQL 配置腳本。運(yùn)行這個(gè)腳本,可以進(jìn)行簡(jiǎn)單地配置:
$ sudo /usr/bin/postgresql-setup –initdb
[sudo] password:
* Initializing database in ‘/var/lib/pgsql/data’
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Debian
在基于 Debian 的發(fā)行版上,在安裝 Postgres 的過(guò)程中,配置會(huì)通過(guò) apt自動(dòng)完成。
其他版本
最后,如果你是在其他版本上運(yùn)行的,那么你可以直接使用 PostgreSQL 提供的一些工具。initdb命令會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)集群,但是這個(gè)命令必須在postgres用戶下運(yùn)行,你可以使用sudo來(lái)暫時(shí)地成為postgres用戶:
$ sudo -u postgres
“initdb -D /var/lib/pgsql/data
–locale en_US.UTF-8 –auth md5 –pwprompt”
運(yùn)行 PostgreSQL
現(xiàn)在,數(shù)據(jù)庫(kù)集群已經(jīng)存在了,使用 initdb的輸出中提供給你的命令或者使用 systemd 啟動(dòng) PostgreSQL 服務(wù)器:
$ sudo systemctl start postgresql
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶
使用 createuser命令來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶。postgres用戶是 Postgres 安裝的超級(jí)用戶。
$ sudo -u postgres createuser –interactive –password bogus
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password:
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
使用 createdb命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。在這個(gè)例子中,我創(chuàng)建了數(shù)據(jù)庫(kù)exampledb,并把該數(shù)據(jù)庫(kù)的擁有者分配給用戶bogus。
$ createdb exampledb –owner bogus
與 PostgreSQL 交互
你可以使用 psql命令來(lái)與 PostgreSQL 中的數(shù)據(jù)庫(kù)進(jìn)行交互。這個(gè)命令提供了一個(gè)交互界面,所以你可以用它來(lái)查看和更新你的數(shù)據(jù)庫(kù)。你需要指定要使用的用戶和數(shù)據(jù)庫(kù),來(lái)連接到一個(gè)數(shù)據(jù)庫(kù)。
$ psql –user bogus exampledb
psql (XX.Y)
Type “help” for help.
exampledb=>
創(chuàng)建一個(gè)表
數(shù)據(jù)庫(kù)包含很多表。這些表可以可視化為表格,有很多行(在數(shù)據(jù)庫(kù)中稱為 記錄)和很多列。行和列的交集稱為字段。
結(jié)構(gòu)化查詢語(yǔ)言(SQL)是以它提供的內(nèi)容而命名的,它能提供可預(yù)測(cè)且一致的語(yǔ)法,來(lái)查詢數(shù)據(jù)庫(kù)內(nèi)容,從而收到有用的結(jié)果。
目前,你的數(shù)據(jù)庫(kù)是空的,沒(méi)有任何的表。你可以用 CREATE語(yǔ)句來(lái)創(chuàng)建一個(gè)表。結(jié)合使用IF NOT EXISTS是很有用的,它可以避免破壞現(xiàn)有的表。
在你創(chuàng)建一個(gè)表之前,想想看你希望這個(gè)表包含哪一種數(shù)據(jù)(在 SQL 術(shù)語(yǔ)中稱為“數(shù)據(jù)類型”)。在這個(gè)例子中,我創(chuàng)建了一個(gè)表,包含兩列,有唯一標(biāo)識(shí)符的一列和最多九個(gè)字符的可變長(zhǎng)的一列。
exampledb=> CREATE TABLE IF NOT EXISTS my_sample_table(
exampledb(> id SERIAL,
exampledb(> wordlist VARCHAR(9) NOT NULL
);
關(guān)鍵字 SERIAL并不是一個(gè)數(shù)據(jù)類型。SERIAL是PostgreSQL 中的一個(gè)特殊的標(biāo)記,它可以創(chuàng)建一個(gè)自動(dòng)遞增的整數(shù)字段。關(guān)鍵字VARCHAR是一個(gè)數(shù)據(jù)類型,表示限制內(nèi)字符數(shù)的可變字符。在此例中,我指定了最多 9 個(gè)字符。PostgreSQL 中有很多數(shù)據(jù)類型,因此請(qǐng)參閱項(xiàng)目文檔以獲取選項(xiàng)列表。
插入數(shù)據(jù)
你可以使用 INSERT語(yǔ)句來(lái)給你的新表插入一些樣本數(shù)據(jù):
exampledb=> INSERT INTO my_sample_table (wordlist) VALUES (‘Alice’);
INSERT 0 1
如果你嘗試在 wordlist域中輸入超過(guò) 9 個(gè)字符,則數(shù)據(jù)輸入將會(huì)失?。?/p>
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
ERROR: VALUE too long FOR TYPE CHARACTER VARYING(9)
改變表或者列
當(dāng)你需要改變一個(gè)域的定義時(shí),你可以使用 ALTER這一 SQL 關(guān)鍵字。例如,如果你想改變wordlist域中最多只能有 9 個(gè)字符的限制,你可以重新設(shè)置這個(gè)數(shù)據(jù)類型。
exampledb=> ALTER TABLE my_sample_table
ALTER COLUMN wordlist SET DATA TYPE VARCHAR(10);
ALTER TABLE
exampledb=> INSERT INTO my_sample_table (WORDLIST) VALUES (‘Alexandria’);
INSERT 0 1
查詢表中的內(nèi)容
SQL 是一種查詢語(yǔ)言,因此你可以通過(guò)查詢來(lái)查看數(shù)據(jù)庫(kù)的內(nèi)容。查詢可以是很簡(jiǎn)單的,也可以涉及連接多個(gè)不同表之間的復(fù)雜關(guān)系。要查看表中的所有內(nèi)容,請(qǐng)使用 SELECT關(guān)鍵字和*(*是通配符):
exampledb=> SELECT * FROM my_sample_table;
id | wordlist
—-+————
1 | Alice
2 | Bob
3 | Alexandria
(3 ROWS)
更多數(shù)據(jù)
PostgreSQL 可以處理很多數(shù)據(jù),但是對(duì)于任何數(shù)據(jù)庫(kù)來(lái)說(shuō),關(guān)鍵之處在于你是如何設(shè)計(jì)你的數(shù)據(jù)庫(kù)的,以及數(shù)據(jù)存儲(chǔ)下來(lái)之后你是怎么查詢數(shù)據(jù)的。在 OECD.org上可以找到一個(gè)相對(duì)較大的公共數(shù)據(jù)集,你可以使用它來(lái)嘗試一些先進(jìn)的數(shù)據(jù)庫(kù)技術(shù)。
第一,將數(shù)據(jù)下載為逗號(hào)分隔值格式(CSV)的文件,并將文件另存為 Downloads文件夾中的land-cover.csv。
在文本編輯器或電子表格應(yīng)用程序中瀏覽數(shù)據(jù),來(lái)了解有哪些列,以及每列包含哪些類型的數(shù)據(jù)。仔細(xì)查看數(shù)據(jù),并留意錯(cuò)誤情況。例如,COU列指的是國(guó)家代碼,例如AUS表示澳大利亞和GRC表示希臘,在奇怪的BRIICS之前,這一列的值通常是 3 個(gè)字符。
在你理解了這些數(shù)據(jù)項(xiàng)后,你就可以準(zhǔn)備一個(gè) PostgreSQL 數(shù)據(jù)庫(kù)了。
$ createdb landcoverdb –owner bogus
$ psql –user bogus landcoverdb
landcoverdb=> create table land_cover(
country_code varchar(6),
country_name varchar(76),
**all_subnational_region_code varchar(5),
**all_subnational_region_name varchar(14),
large_subnational_region_code varchar(17),
large_subnational_region_name varchar(44),
measure_code varchar(13),
measure_name varchar(29),
land_cover_class_code varchar(17),
land_cover_class_name varchar(19),
year_code integer,
year_value integer,
unit_code varchar(3),
unit_name varchar(17),
power_code integer,
power_name varchar(9),
reference_period_code varchar(1),
reference_period_name varchar(1),
value float(8),
flag_codes varchar(1),
flag_names varchar(1));
引入數(shù)據(jù)
Postgres 可以使用特殊的元命令 copy來(lái)直接引入 CSV 數(shù)據(jù):
landcoverdb=> copy land_cover from ‘~/land-cover.csv’ with csv header delimiter ‘,’
COPY 22113
插入了 22113 條記錄。這是一個(gè)很好的開(kāi)始!
查詢數(shù)據(jù)
用 SELECT語(yǔ)句可以查詢這 22113 條記錄的所有列,此外 PostgreSQL 將輸出通過(guò)管道傳輸?shù)狡聊簧?,因此你可以輕松地滾動(dòng)鼠標(biāo)來(lái)查看輸出的結(jié)果。更進(jìn)一步,你可以使用高級(jí) SQL 語(yǔ)句,來(lái)獲得一些有用的視圖。
landcoverdb=> SELECT
lcm.country_name,
lcm.year_value,
SUM(lcm.value) sum_value
FROM land_cover lcm
JOIN (
SELECT
country_name,
large_subnational_region_name,
**all_subnational_region_name,
MAX(year_value) max_year_value
FROM land_cover
GROUP BY country_name,
large_subnational_region_name,
**all_subnational_region_name
) AS lcmyv
ON
lcm.country_name = lcmyv.country_name AND
lcm.large_subnational_region_name = lcmyv.large_subnational_region_name AND
lcm.**all_subnational_region_name = lcmyv.**all_subnational_region_name AND
lcm.year_value = lcmyv.max_year_value
GROUP BY lcm.country_name,
lcm.large_subnational_region_name,
lcm.**all_subnational_region_name,
lcm.year_value
ORDER BY country_name,
year_value;
下面是樣例的一些輸出:
—————+————+————
Afghanistan | 2019 | 743.48425
Albania | 2019 | 128.82532
Algeria | 2019 | 2417.3281
American Samoa | 2019 | 100.2007
Andorra | 2019 | 100.45613
Angola | 2019 | 1354.2192
Anguilla | 2019 | 100.078514
Antarctica | 2019 | 12561.907
[…]
SQL 是一種很豐富的語(yǔ)言,超出了本文的討論范圍。通讀 SQL 的內(nèi)容,看看你是否可以對(duì)上面的查詢語(yǔ)句進(jìn)行修改,以提供不同的數(shù)據(jù)集。
拓展數(shù)據(jù)庫(kù)
PostgreSQL 是偉大的開(kāi)源數(shù)據(jù)庫(kù)之一。有了它,你可以為結(jié)構(gòu)化數(shù)據(jù)設(shè)計(jì)存儲(chǔ)庫(kù),第二使用 SQL 以不同的方式查詢它,以便能夠獲得有關(guān)該數(shù)據(jù)的新視角。PostgreSQL 也能與許多語(yǔ)言集成,包括 Python、Lua、Groovy、Java 等,因此無(wú)論你使用什么工具集,你都可以充分利用好這個(gè)出色的數(shù)據(jù)庫(kù)。
via: https://opensource.com/article/22/9/drop-your-database-for-postgresql
作者:Seth Kenlon選題:lkxed譯者:chai001125校對(duì):wxy
本文由 LCTT原創(chuàng)編譯,Linux**榮譽(yù)推出
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://xiesong.cn/49989.html