[ 知識是人生的燈塔,只有不斷學習,才能照亮前行的道路 ]
📢?大家好,我是?WeiyiGeek,一名深耕安全運維開發(SecOpsDev)領域的技術從業者,致力于探索DevOps與安全的融合(DevSecOps),自動化運維工具開發與實踐,企業網絡安全防護,歡迎各位道友一起學習交流、一起進步 🚀,若此文對你有幫助,一定記得倒點個關注?與小紅星??,收藏學習不迷路?😋?。
0x00 前言簡述
描述:秉承著全棧出品必屬精品,此 SQL 學習專欄是作者在學習DBA運維相關知識時,發現網絡上很多教程都是針對零基礎入門級別的講解,但是卻沒有深入講解SQL語句的實踐用法,以至于很多初學者在學習完之后,對于SQL語句的運用實踐還是一知半解,所以特意將自己學習DBA運維時相關操作實踐記錄并歸納總結,旨在幫助初學者深入理解SQL語句的運用。
本專欄,適合零基礎的看友系統學習SQL知識,以及有一定基礎但是沒有深入理解的看友對所學的SQL語言知識進行查漏補缺,希望對大家在繁多的數據庫管理系統(DBMS)開發運維方面起到一定的幫助。
原文連接:?https://articles.zsxq.com/id_jcwpnaa75tc5.html
什么是 RDBMS ?
答:指關系型數據庫管理系統,全稱 Relational Database Management System;RDBMS 是 SQL 的基礎同樣也是所有現代數據庫系統的基礎,比如?MSSQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access
。
在此SQL學習專欄在中,實踐的SQL基礎或高級語句將完全兼容 MySQL、Oracle、SQL Server 以及 PostgreSQL 等主流數據庫,如有特殊的SQL語句作者也會加以說明。
MySQL
?- MySQL 是一個關系型數據庫管理系統,由瑞典 MySQL AB 公司開發,屬于 Oracle 旗下產品。MySQL 是最流行的數據庫管理系之一,在 WEB 應用方面,MySQL 是最好的 RDBMS (Relational Database Management System 關系數據庫管理系統) 應用軟件之一,其缺省客戶端命令執行工具是?mysql
。Oracle
?- Oracle 數據庫是目前世界上流行的關系數據庫管理系統,它是由甲骨文公司開發的。Oracle 數據庫是目前世界上流行的關系型數據庫之一,它具有高度的可靠性、可用性以及伸縮性,并且能夠提供高性能的并行處理能力,其缺省客戶端命令執行工具是?sqlplus
。SQL Server
?- SQL Server 是由 Microsoft 開發的關系數據庫管理系統,它是微軟公司推出的一個基于關系型數據庫管理系統,在 Windows Server 操作系統以及.NET項目中會常常使用到,其缺省客戶端可視化工具是?SSMS
。PostgreSQL
?- PostgreSQL 是一種開源的關系型數據庫管理系統,它是由全球數千名開發者共同開發和維護的。PostgreSQL 支持 SQL 標準的大部分功能,并且提供了許多高級特性,比如復雜的數據類型、全文搜索、地理空間數據支持等,其缺省客戶端命令執行工具是?psql
。
什么是 SQL 語言?
描述:SQL, 即結構化查詢語言Structured Query Language
, 是一種用于訪問和處理關系型數據庫的標準語言。自其問世以來得到了廣泛的應用,不僅著名的大型商用數據庫產品,如 Oracle、DB2、Sybase、SQL Server 等兼容支持它,很多開源的數據庫產品如 PostgreSQL、MySQL、MariaDB 等也兼容支持它,甚至一些小型的產品如 Access 也支持 SQL 語言。另外,近些年蓬勃發展的 NoSQL 數據庫系統最初是宣稱不再需要 SQL 的,后來也不得不修正為 Not Only SQL,來擁抱 SQL,所以從這里凸顯出學SQL語法就是學習數據庫管理操作之基,重要性不言而喻。
SQL 起源
SQL 的起源可追溯到IBM(藍色巨人
)的System R項目所采用的 SEQUEL 語言,它對 SQL 語言的形成和規范化產生了重大的影響,第一個版本的 SQL 標準 SQL86 就是基于 System R 的手冊而來的。值得惋惜的是當前 IBM ?并沒有什么產品化的想法,倒是 Oracle 富有遠見,在 1979 年率先推出了支持 SQL 的商用產品,隨著數據庫技術和應用的發展,為各種不同的關系數據庫系統提供一致的語言成了一種現實需要。
SQL 標準
雖然SQL標準通常被認為是成熟的技術,而不是20世紀80年代初標準化過程開始時的創新,尖端技術,但它仍然是一個不斷擴展,不斷發展的相關標準。對 SQL 標準影響最大的機構自然是那些著名的數據庫產商,而具體的制訂者則是一些非營利機構,最初的SQL標準于1986年正式發由ANSI(美國國家標準協會)制定標準,并于1987年作為ISO(國際標準組織)標準采用,由其聯合成立的一個技術委員會 JTC1/SC32 負責 SQL 標準的制訂工作,并在1989年和1992年發布了擴展版和修訂版。此后,SQL經歷了多次修訂和完善,形成了多個版本的標準,如?SQL-86、SQL-89、SQL-92、SQL:1999、....、 SQL:2019、....、SQL:2023
?等。其中 ANSI 主導了?SQL-86、SQL-89 和 SQL-92
?標準,而 ISO 則主導了?SQL:1999
以及后續的版本。
其中 SQL86 大概只有幾十頁,SQL92 正文大約有 500 頁,而 SQL99 則超過了 1000 頁,由此看出從 SQL99 開始,SQL 標準的個頭就非常龐大了,內容包羅萬象,可以說已經沒有人能夠掌握標準的所有內容了。此外為了允許相關部分以不同的速度進行,SQL標準被分成了多個部分, 它包括以下幾個部分:
ISO/IEC 9075-1: Framework (SQL/Framework)
ISO/IEC 9075-2: Foundation (SQL/Foundation)
ISO/IEC 9075-3: Call Level Interface (SQL/CLI)
ISO/IEC 9075-4: Persistent Stored Modules (SQL/PSM)
ISO/IEC 9075-5: Embedded SQL (SQL/Bindings)
ISO/IEC 9075-6: SQL specialization of the X-Open XA specification (SQL/Transaction)?
[丟棄]
ISO/IEC 9075-7: Extensions to SQL to deal with time-oriented data types (SQL/Temporal)
?[丟棄]
?在 SQL:2011 并入SQL/FoundationISO/IEC 9075-8: object model to be supported (SQL/Objects Extended Objects)?
[丟棄]
?并入 SQL/FoundationISO/IEC 9075-9: Management of External Data (SQL/MED)
ISO/IEC 9075-10: Object Language Bindings (SQL/OLB)
ISO/IEC 9075-11: Information and Definition Schemas (SQL/Schemata)
ISO/IEC 9075-12: Replication facilities for SQL (SQL/Replication)
ISO/IEC 9075-13: SQL Routines and Types Using the Java Programming Language (SQL/JRT)
ISO/IEC 9075-14: XML-Related Specifications (SQL/XML)
ISO/IEC 9075-15: SQL support for Multi-Dimensional Arrays (SQL/MDA )
ISO/IEC 9075-16: Property Graph Queries in SQL(SQL/PGQ)
其中兩個部分是在20世紀90年代完成的,作為 SQL-1992 的補充,如:SQL/CLI(調用語言接口)于1995年完成,SQL/PSM(持久存儲模塊)于1996年完成。在 1999 年完成了對第一部分至第五部分的修訂和擴充,之后在SQL與Java(Sun的商標)和XML以及使用SQL來管理SQL數據庫外部的數據方面進行了大量的工作。所有部分的另一個修訂版作為SQL:2003完成。自SQL:2003以來,SQL標準委員會已經擴展了對XML的支持,并糾正了一些錯誤, 擴展的SQL/XML標準于2006年發布,所有九個部分的完整修訂版于2008年發布,SQL標準擴展支持時間線:https://www.jcc.com/resources/sql-standards

下面是 SQL 標準簡要的發展與演化歷史:
1986 年:ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86,首次將 SQL 語言標準化的版本。
1989 年:ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89,增加了完整性約束。
1992 年:ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2),最重要的一個版本,引入了標準的分級概念。
1999 年:ISO/IEC 9075:1999,SQL:1999(SQL3),變動最大的一個版本,定義了SQL的大部分核心功能,包括數據定義語言(DDL)、數據操作語言(DML)、數據控制語言(DCL)等,增加了面向對象特性、正則表達式、存儲過程、Java 等支持。
2003 年:ISO/IEC 9075:2003,SQL:2003,增加了更多的功能和改進,引入了 XML、Window 函數等,例如更復雜的查詢功能和更豐富的數據類型。
2006 年:ISO/IEC 9075:2006,SQL:2006,引入了一些新特性,如遞歸查詢和更靈活的窗口函數等。
2008 年:ISO/IEC 9075:2008,SQL:2008,增加了對XML數據的支持,以及一些性能和安全性改進,支持 TRUNCATE 函數等。
2011 年:ISO/IEC 9075:2011,SQL:2011,引入了對信息架構的支持等,使得數據庫的元數據可以被查詢和操縱,例如時序數據類型等。
2016 年:ISO/IEC 9075:2016,SQL:2016,引入了新的窗口函數和一些性能相關的特性,如數組和JSON數據類型的增強。
2021 年:ISO/IEC 19075:2021,SQL:2021,是 SQL 標準(ISO/IEC 9075)的補充指南,重點在多態表函數、Java 集成和 OLAP。
2023 年:ISO/IEC 19075:2023,SQL:2023,是 SQL 標準(ISO/IEC 9075)的補充指南,主要補充 OLAP 和多態表函數等高級 SQL 用法。
細心的讀者會發現,從?SQL:1999
?開始,標準簡稱中的短橫線(-)被換成了冒號(:),并且標準制定的年份也改用四位數字表示年份,這是由于ISO 標準習慣上采用冒號,ANSI 標準則一直采用短橫線,從 SQL:1999 版本后便有 ISO 制定。
SQL 標準符合性
SQL 標準因為定義過于寬泛等技術和非技術原因,不同數據庫管理系統(DBMS)產品對標準的符合程度存在很大的差異。大到功能特性,小到部分語法語義的細節,在不同產品之間都存在很多差異,造成實際的應用遷移遠比 C/C++ 程序的遷移要復雜很多,例如,下圖展示了SQL標準系列針對不同SQL子實現部分的講解頁面數量,可以看出變動還是比較大的。

因此,盡管很多產品都號稱自己符合 SQL 標準,并不意味著應用可以容易的在它們之間切換,不過好在基礎CRUD基礎語句大同小異的。除了 Oracle、DB2 等經典的商業產品,以及 PostgreSQL、MySQL 等開源產品總體上對 SQL 標準的符合程度較高以外,很多產品提到的 SQL 標準,涉及的內容其實是 SQL92 里頭最基本或最核心的一部分(屬于入門級的范疇,SQL92 本身是分級的,包括入門級、過渡級、中間級和完全級)。但從 SQL99 之后,標準中符合程度的定義就不再分級,而是改成了核心兼容性和特性兼容性,也沒有機構來推出權威的 SQL 標準符合程度的測試認證了。
目前,由于國產化的潮流趨勢,國產數據庫作為數據庫領域的后來者,為了保證與國際主流數據庫產品的兼容性,在 SQL 標準符合程度上也做出了很大的努力,還組織了專門的機構來做產品的標準符合性測試。
更多詳細內容,讀者可以查閱相關資料:
ISO –?http://www.iso.ch,?click on "ISO STORE", and search for 9075. Prices are in Swiss Francs.
ANSI –?http://www.ansi.org/, click on "Access Standards - eStandards Store" and search for "SQL Language".
SQL 能做什么?
SQL 可創建新數據庫
SQL 可在數據庫中創建新表
SQL 面向數據庫執行查詢
SQL 可在數據庫中插入新的記錄
SQL 可更新數據庫中的數據
SQL 可從數據庫刪除記錄
SQL 可在數據庫中創建存儲過程
SQL 可在數據庫中創建視圖生成虛擬表
SQL 可以設置用戶庫、表、存儲過程和視圖的權限
如何學習 SQL 語言?
作者以實踐為主,理論為輔的方式來講解 SQL 語言,那作者初學者的我們該如何學習 SQL 語言呢?
第一步:?初學者可以從最基本的 SQL 語言開始學習,例如?SELECT
、INSERT
、UPDATE
?和?DELETE、CREATE、GARNT?
等基本操作。這些是最常用的命令,可以幫助你了解如何從數據庫中檢索數據以及如何向其中添加或修改數據。
第二步:?學習如何使用內聯、外聯?JOIN
?語句來連接多個表,以便從不同表中檢索數據。這對于處理復雜的數據關系非常重要。
第三步:?學習如何使用聚合函數(如?SUM
、AVG
、MAX
?和?MIN
)和分組查詢(GROUP BY
),以便對數據進行匯總和分析。
第四步:?學習如何使用子查詢和視圖(VIEW
),以便對數據進行更復雜的分析和處理。
第五步:?學習如何使用事務(BEGIN TRANSACTION
,?COMMIT
,?ROLLBACK
)來確保數據的一致性。
第六步:?學習如何使用索引(INDEX
)來優化查詢性能。
第七步:?學習如何使用觸發器(TRIGGER
)和存儲過程(PROCEDURE
),以便在數據庫中執行更復雜的操作。
第八步:?學習如何使用不同數據庫的擴展方法函數和存儲過程,以便執行更復雜的操作。
總體來說,學習 SQL 語言需要不斷地實踐和練習。你可以通過編寫查詢語句來檢索數據,并通過修改數據庫表結構或插入、更新和刪除記錄來加深理解。此外,還可以參考一些在線教程、書籍或視頻課程來幫助你系統地學習 SQL 語言的各個方面。
另外,除了 SQL 標準之外,大部分 SQL 數據庫程序都擁有它們自己的專有擴展,比如 MySQL 與 Oracle 之間擴展模塊是有所不同的,所以在SQL基礎之上,最后再根據不同的 DBMS 產品文檔來學習其特有的擴展功能和語法。
最后也希望本實踐指南能夠幫助你快速入門 SQL 語言,并能夠在實際項目中靈活運用,希望大家能夠從中有所收獲,并多多支持作者,謝謝!
0x01 環境搭建
環境說明
本實踐指南將以?MySQL/MariaDB
?為例,講解 SQL 語言的基礎語法和用法, MySQL 是一個流行的開源關系數據庫管理系統(RDBMS),它使用結構化查詢語言(SQL)來管理數據。MariaDB 是MySQL的一個分支,由開源社區維護,旨在完全兼容MySQL并添加新特性,為了方便學習回退作者采用Docker容器方式搭建學習環境。
環境版本如下:
openEuler 24.03 (LTS-SP1) x86_64
Docker version 26.1.3, build b72abbb
Docker Compose version v2.23.0
MariaDB:11.6.2 部署?
PostgreSQL:17.5 部署
Adminer 5.3.0 ?數據庫在線管理工具
MySQL:8.0.35 ?可選
溫馨提示:此處作者采用的是?openEuler 24.03 (LTS-SP1)
?系統,現已進行了安全加固配置滿足等保三級要求,加固文檔以可參考作者【網安等保 | OpenEuler 24.03系統主機安全加固及配置優化實踐指南】文章, 針對 Docker 環境安裝除了參考上面文章中安裝腳本,也可參考作者前面的文章,這里就不在累述了。
若Docker Hub 倉庫鏡像源無法訪問拉取,可參考作者下述文章來解決:運維 Tips | Docker Hub 倉庫國內無法拉取鏡像,如何應對?
環境部署
操作系統安裝
運維 | 國產操作系統遙遙領先? 新手必備 OpenEuler(歐拉) 開源操作系統快速安裝配置指南
Docker 環境安裝
描述:在 openEuler 24.03 國產操作系統,使用阿里云鏡像源安裝 Docker 環境,并配置加速鏡像源,最后安裝最新的 Docker-Compose 容器編排工具。
# 1: 安裝必要的一些系統工具
sudo yum install -y yum-utils# 2: 添加軟件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 使用 CentOS 8 庫中的源
echo"8"?> /etc/yum/vars/centos_version
sed -i?'s/$releasever/$centos_version/g'? /etc/yum.repos.d/docker-ce.repo# 3: 安裝 Docker 最新版本
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y# 或者安裝指定版本的Docker-CE:
# 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# 2: 安裝指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]# 4.配置 Docker 守護進程
mkdir -vp /etc/docker/
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"data-root":"/var/lib/docker",
"registry-mirrors": ["https://hub.wygk.eu.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver":?"overlay2",
"log-driver":?"json-file",
"log-level":?"warn",
"log-opts": {
"max-size":?"100m",
"max-file":?"10"
},
"live-restore":?true,
"dns": [?"223.5.5.5"],
"insecure-registries": [?"harbor.weiyigeek.top"]
}
EOF# 5.重載守護進程
sudo systemctl daemon-reload# 6.啟動 Docker 服務(自啟動)
sudo systemctl?enable?docker --now# 7.驗證安裝是否成功
$ docker info
Client: Docker Engine - CommunityVersion: ? ?26.1.3Context: ? ?default
....$ sudo docker run --rm hello-worldlatest: Pulling from library/hello-worlde6590344b1a5: Pull completeDigest: sha256:e0b569a5163a5e6be84e210a2587e7d447e08f87a0e90798363fa44a0464a1e8Status: Downloaded newer image?for?hello-world:latest
# 運行 Hello World 鏡像后,輸出下面的信息表示安裝成功:Hello from Docker!This message shows that your installation appears to be working correctly.# 9.安裝驗證 Docker-Compose
DOCKER_COMPOSE_VERSION=$(curl -s?"https://api.github.com/repos/docker/compose/tags"?| grep?'"name":'?| grep -v?'beta\|alpha\|rc'?| head -n 1 | awk -F?'"''{print $4}')
curl -L https://gh.wygk.eu.org/https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION:="v2.35.1"}/docker-compose-"$(uname -s)"-"$(uname -m)"?-o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose$ docker-compose versionDocker Compose version v2.35.1
MariaDB 容器部署(推薦)
1.持久化目錄以及配置文件準備
# 持久化目錄 (此處僅為作者示例路徑,請根據實際環境調整.)
mkdir -vp /data/mariadb/{deploy,data,config}# MariaDB 配置文件
cd?/data/mariadb/
tee config/my.cnf <<'EOF'
[mysqld]
# 數據存儲目錄
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock# 開啟 binlog
log_bin = /var/lib/mysql/mysql_bin
log_bin_index = /var/lib/mysql/mysql_bin.index
server_id = 1
expire_logs_days = 7
max_binlog_size = 100M
binlog_format = ROW
sync_binlog = 1# 優化參數
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000# 連接數
max_connections = 1024
max_user_connections = 256
# 連接緩沖大小
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
join_buffer_size = 8M# 日志
slow_query_log = 0
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2# 字符串
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci# 禁止域名解析,提升連接速度
skip-name-resolve# 禁止使用符號鏈接
symbolic-links = 0
EOF
2.創建?
docker-compose.yml
?配置文件
cd?/data/mariadb/deploy/
tee docker-compose.yml <<'EOF'
services:mariadb:image: mariadb:11.6.2container_name: mariadbrestart: alwaysenvironment:MARIADB_ROOT_PASSWORD: weiyigeek.topMYSQL_DATABASE: appMARIADB_USER: appMARIADB_PASSWORD: weiyigeek.topvolumes:- /data/mariadb/data:/var/lib/mysql- /data/mariadb/config:/etc/mysql/conf.dports:-?"3306:3306"adminer:image: adminer:latestrestart: alwaysports:- 8080:8080
EOF
3.進入?
docker-compose.yml
?文件所在目錄,執行下述命令快速部署并啟動 MariaDB 容器。
# 部署運行
docker-compose up -d# ? Container mariadb ? ? ? ? ? Started ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??# ? Container deploy-adminer-1 ?Started?# 查看容器運行狀態
docker ps# 890e26f87859 ? mariadb:11.6.2 ?"docker-entrypoint.s…" ? 3 months ago ? Up 3 months ? 0.0.0.0:3306->3306/tcp ? mariadb
最后使用 Adminer 訪問 MariaDB 驗證數據庫是否能正常運行使用,地址:http://服務器IP:8080/
MySQL 容器部署(可選)
# 數據持久化目錄
mkdir /data/mysql/data# 部署 MySQL 8 與 adminer 資源清單
tee /data/mysql/docker-compose.yml <<'EOF'
version:?'3.8'
services:mysql8:image: mysql:8.0command: --default-authentication-plugin=mysql_native_passwordrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: weiyigeek.topMYSQL_DATABASE: appMYSQL_USER: appMYSQL_PASSWORD: weiyigeek.topvolumes:- /data/mysql/data:/var/lib/mysqlports:- 3306:3306
EOF
溫馨提示:在Linux系統中是采用 man, help 與 info 命令查看幫助文檔,而在在?MySQL / MariaDB
?中是使用 help,建議在學習實踐的時候多采用文檔查看使用幫助,例如:
mysql>?help?contentsAccount ManagementAdministration...mysql>?help?Account ManagementCREATE USERDROP USERGRANTRENAME USERREVOKESET PASSWORD
PostgreSQL 容器部署
PostgreSQL 是一個開源的關系數據庫管理系統,它支持 SQL 語言的標準特性,以下是使用 Docker 容器來部署 PostgreSQL 的步驟:
步驟 01.創建數據持久化目錄與資源清單文件,其中數據庫名稱 app、數據庫賬號 postgres, 密碼 weiyigeek.top
mkdir /data/postgresql/{deploy,data}
cd?/data/postgresql/deploy
tee docker-compose.yml <<'EOF'
version:?'3.8'
# 定義服務列表
services:
# 定義 PostgreSQL 服務postgres:# 使用 PostgreSQL 官方鏡像,版本 17.5image: postgres:17.5# 指定容器名稱(如果不指定,Docker 會自動生成)container_name: postgres# 環境變量配置environment:# 設置 PostgreSQL 超級用戶(默認為 postgres)POSTGRES_USER: postgres# 設置 PostgreSQL 超級用戶密碼(必須設置)POSTGRES_PASSWORD: weiyigeek.top# 設置默認創建的數據庫名稱(默認為 POSTGRES_USER 的值)POSTGRES_DB: app# 設置容器內部的語言環境為 UTF-8LANG: C.UTF-8# 設置時區為 UTCTZ:?"Asia/Shanghai"# 容器重啟策略(always:總是自動重啟,除非手動停止)restart: always ?# 總是自動重啟容器,無論退出狀態如何# 端口映射配置(主機端口:容器端口)ports:-?"5432:5432"# 將容器內部的5432端口映射到主機的5432端口# 數據卷配置(持久化數據)volumes:- /data/postgresql/data:/var/lib/postgresql/data ?# 使用宿主機的目錄掛載到容器的數據庫數據目錄
EOF
步驟 02. 進入資源清單文件所在目錄,執行下述命令快速部署并啟動 PostgreSQL 容器。
docker-compose up -d[+] Running 1/1? Container postgres ?Started
或者使用 Docker run 命令行快速部署 PostgreSQL 容器:
docker run -id --name=postgresql -v /data/postgresql/data:/var/lib/postgresql/data -p 5432:5432 -E POSTGRES_DB=app -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=weiyigeek.top -e LANG=C.UTF-8 -e TZ=Asia/Shanghai postgres:17.5
步驟 03.同樣使用 Adminer 訪問 PostgreSQL,地址:http://服務器IP:8080/
,正常情況下,如下圖所示:

當然,除了使用 Adminer 訪問管理 MariaDB 或者 PostgreSQL,還可以使用其他數據庫管理工具如:Navicat 等。
示例數據準備
描述:前面說到,作者將以實踐的方式來學習數據庫相關知識,因此需要準備一套數據庫、表、字段示例,以用于后續的實踐學習, 作者將在 MariaDB 數據庫進行實踐,當然你也可以選擇 MySQL 或者 PostgreSQL。
以下是需要創建的示例數據:
-- 創建測試數據庫
createdatabase?app;-- 切換到該數據庫中
use?app;?-- 刪除原有表,重新創建示例數據
-- 注意:由于表中字段有外鍵,不能先刪除 departments 表,需要將引用的表先行刪除,否則會報 Cannot delete or update a parent row: a foreign key constraint fails。
droptable?job_history;?
droptable?employees;
droptable?departments;-- 創建部門 (departments) 表
CREATETABLE?departments (
idINT?AUTO_INCREMENT PRIMARY?KEYCOMMENT'部門ID', ??-- 部門ID,主鍵,自增長
nameVARCHAR(32)?NOTNULLCOMMENT'部門名稱', ? ? ? ? ? ? ? ? ? ?-- 部門名稱,不可為空location?VARCHAR(32)?COMMENT'部門位置'? ? ? ? ? ? ? ? ? ? ? ? ??-- 部門樓層,不可為空?
);
-- 向部門表插入數據
INSERTINTO?departments (id,?name, location)?VALUES
(1,?'銷售部',?'1F'),
(2,?'媒體部',?'2F'),
(3,?'測試部',?'3F'),
(4,?'安全部',?'4F'),
(5,?'研發部',?'5F'),
(6,?'財務部',?'')-- 創建員工 (employees) 表
CREATETABLE?employees (idINT?AUTO_INCREMENT PRIMARY?KEYCOMMENT'員工ID', ? ? ? ?-- 員工ID,主鍵,自增長nameVARCHAR(50)?NOTNULLCOMMENT'員工姓名', ? ? ? ? ? ? ? ? ? ? ??-- 員工姓名,不可為空email?VARCHAR(50)?NOTNULLCOMMENT'員工郵箱', ? ? ? ? ? ? ? ? ? ? ?-- 員工郵箱,不可為空hire_date?DATENOTNULLCOMMENT'入職日期', ? ? ? ? ? ? ? ? ? ? ? ??-- 入職日期,不可為空salary?DECIMAL(10,2)?NOTNULLDEFAULT'3600.00'COMMENT'薪資', ? ??-- 員工薪資,不可為空, 缺省值為3600.00department_id?INTCOMMENT'部門ID', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??-- 外鍵,關聯部門表的部門IDFOREIGNKEY?(department_id)?REFERENCES?departments(id) ??-- 設置外鍵約束
);
-- 向員工表插入數據
INSERTINTO?employees (name, email, hire_date, salary, department_id)?VALUES
('張三',?'zhangsan@weiyigeek.top',?'2018-05-15',?8500.00,?1),
('李四',?'lisi@weiyigeek.top',?'2019-03-22',?12000.00,?2),
('王五',?'wangwu@weiyigeek.top',?'2020-07-10',?7500.00,?3),
('趙六',?'zhaoliu@weiyigeek.top',?'2017-11-05',?9800.00,?4),
('錢七',?'qianqi@weiyigeek.top',?'2021-02-18',?6800.00,?5),
('孫八',?'sunba@weiyigeek.top',?'2019-09-30',?10500.00,?6),
('周九',?'zhoujiu@weiyigeek.top',?'2020-01-15',?9200.00,?1),
('吳十',?'wushi@weiyigeek.top',?'2018-08-20',?11500.00,?2),
('鄭十一',?'zhengshiyi@weiyigeek.top',?'2021-06-12',?7800.00,?3),
('王小明',?'wangxiaoming@weiyigeek.top',?'2017-04-25',?13200.00,?4),
('經天緯地',?'jtwd@weiyigeek.top',?'2019-05-01',?16200.00,?6);-- 創建工作歷史 (job_history)表
CREATETABLE?job_history (employee_id?INTNOTNULLCOMMENT'員工ID', ? ? ? ? ? ? ? ? ? ? ? ??-- 員工ID,不可為空start_date?DATENOTNULLCOMMENT'開始日期', ? ? ? ? ? ? ? ? ? ? ??-- 開始日期,不可為空end_date?DATENOTNULLCOMMENT'結束日期', ? ? ? ? ? ? ? ? ? ? ? ??-- 結束日期,不可為空department_id?INTNOTNULLCOMMENT'部門ID', ? ? ? ? ? ? ? ? ? ? ??-- 部門ID,不可為空PRIMARY?KEY?(employee_id, start_date), ? ? ? ? ? ? ? ? ? ? ? ? ? ??-- 主鍵,聯合主鍵
FOREIGNKEY?(employee_id)?REFERENCES?employees(id), ? ? ? ? ? ? ? ?-- 設置外鍵約束
FOREIGNKEY?(department_id)?REFERENCES?departments(id) ? ? ? ? ? ??-- 設置外鍵約束
);
-- 插入工作歷史數據
INSERTINTO?job_history (employee_id, start_date, end_date, department_id)?VALUES
(1,?'2018-05-15',?'2019-12-31',?1),
(1,?'2020-01-01',?'2022-12-31',?2),
(2,?'2019-03-22',?'2020-06-30',?3),
(2,?'2020-07-01',?'2023-12-31',?2),
(3,?'2020-07-10',?'2021-12-31',?3),
(3,?'2022-01-01',?'2023-12-31',?4),
(4,?'2017-11-05',?'2019-05-31',?5),
(4,?'2019-06-01',?'2023-12-31',?4),
(5,?'2021-02-18',?'2022-08-31',?6),
(5,?'2022-09-01',?'2023-12-31',?5),
(6,?'2019-09-30',?'2021-03-31',?1),
(6,?'2021-04-01',?'2023-12-31',?6),
(7,?'2020-01-15',?'2021-07-31',?2),
(7,?'2021-08-01',?'2023-12-31',?1),
(8,?'2018-08-20',?'2020-02-29',?3),
(8,?'2020-03-01',?'2023-12-31',?2),
(9,?'2021-06-12',?'2022-12-31',?4),
(9,?'2023-01-01',?'2023-12-31',?3),
(10,?'2017-04-25',?'2018-10-31',?5),
(10,?'2018-11-01',?'2023-12-31',?4),
(11,?'2019-05-01',?'2025-12-31',?6);-- 查看表數據
SELECT?*?FROM?departments;
SELECT?*?FROM?employees;
SELECT?*?FROM?job_history;
使用 Adminer 訪問 MariaDB,執行以上 SQL 語句,插入示例數據,如下所示:

再查詢插入的示例數據,如下所示:

溫馨提示:由于 AUTO_INCREMENT 是一個 MySQL 特有的語法,用于自動增加列的值。然而,在 PostgreSQL 中,你應該使用 SERIAL 或 BIGSERIAL 數據類型來自動管理主鍵的自動增長。
例如,在 PostgreSQL 中創建表時,你可以這樣寫:
-- 創建部門 (departments) 表
CREATETABLE?departments (
idSERIAL?PRIMARY?KEY, ? ? ? ? ? ? ? ??-- 部門ID,主鍵,自增長 (PostgreSQL使用SERIAL代替AUTO_INCREMENT)
nameVARCHAR(32)?NOTNULL, ? ? ? ? ? ??-- 部門名稱,不可為空location?VARCHAR(32), ? ? ? ? ? ? ? ? ??-- 部門位置
CONSTRAINT?departments_name_unique?UNIQUE?(name) ?-- 可選:添加部門名稱唯一約束
);
COMMENTONTABLE?departments?IS'部門信息表';
COMMENTONCOLUMN?departments.id?IS'部門ID';
COMMENTONCOLUMN?departments.name?IS'部門名稱';
COMMENTONCOLUMN?departments.location?IS'部門位置';-- 創建員工 (employees) 表
CREATETABLE?employees (idSERIAL?PRIMARY?KEY, ? ? ? ? ? ? ? ? ? ?-- 員工ID,主鍵,自增長nameVARCHAR(50)?NOTNULL, ? ? ? ? ? ? ? ?-- 員工姓名,不可為空email?VARCHAR(50)?NOTNULL, ? ? ? ? ? ? ??-- 員工郵箱,不可為空hire_date?DATENOTNULL, ? ? ? ? ? ? ? ? ?-- 入職日期,不可為空salary?DECIMAL(10,2)?NOTNULLDEFAULT3600.00, ?-- 員工薪資,不可為空, 缺省值為3600.00department_id?INT, ? ? ? ? ? ? ? ? ? ? ? ?-- 外鍵,關聯部門表的部門IDFOREIGNKEY?(department_id)?REFERENCES?departments(id), ?-- 設置外鍵約束CONSTRAINT?employees_email_unique?UNIQUE?(email) ?-- 添加郵箱唯一約束
);
COMMENTONTABLE?employees?IS'員工信息表';
COMMENTONCOLUMN?employees.id?IS'員工ID';
COMMENTONCOLUMN?employees.name?IS'員工姓名';
COMMENTONCOLUMN?employees.email?IS'員工郵箱';
COMMENTONCOLUMN?employees.hire_date?IS'入職日期';
COMMENTONCOLUMN?employees.salary?IS'員工薪資';
COMMENTONCOLUMN?employees.department_id?IS'部門ID';-- 創建工作歷史 (job_history)表
CREATETABLE?job_history (employee_id?INTNOTNULL, ? ? ? ? ? ? ? ? ??-- 員工ID,不可為空start_date?DATENOTNULL, ? ? ? ? ? ? ? ? ??-- 開始日期,不可為空end_date?DATENOTNULL, ? ? ? ? ? ? ? ? ? ??-- 結束日期,不可為空department_id?INTNOTNULL, ? ? ? ? ? ? ? ??-- 部門ID,不可為空PRIMARY?KEY?(employee_id, start_date), ? ? ?-- 主鍵,聯合主鍵
FOREIGNKEY?(employee_id)?REFERENCES?employees(id), ?-- 設置外鍵約束
FOREIGNKEY?(department_id)?REFERENCES?departments(id), ?-- 設置外鍵約束
CONSTRAINT?job_history_date_check?CHECK?(start_date < end_date) ?-- 添加日期有效性檢查
);
COMMENTONTABLE?job_history?IS'員工工作歷史表';
COMMENTONCOLUMN?job_history.employee_id?IS'員工ID';
COMMENTONCOLUMN?job_history.start_date?IS'開始日期';
COMMENTONCOLUMN?job_history.end_date?IS'結束日期';
COMMENTONCOLUMN?job_history.department_id?IS'部門ID';

END
加入:作者【全棧工程師修煉指南】知識星球
『?全棧工程師修煉指南』星球,主要涉及全棧工程師(Full Stack Development)實踐文章,包括但不限于企業SecDevOps和網絡安全等保合規、安全滲透測試、編程開發、云原生(Cloud Native)、物聯網工業控制(IOT)、人工智能Ai,從業書籍筆記,人生職場認識等方面資料或文章。
Q: 加入作者【全棧工程師修煉指南】星球后有啥好處?
? 將獲得作者最新工作學習實踐文章以及網盤資源。
? 將獲得作者珍藏多年的全棧學習筆記(需連續兩年及以上老星球友,也可單次購買)
? 將獲得作者專門答疑學習交流群,解決在工作學習中的問題。?
? 將獲得作者遠程支持(在作者能力范圍內且合規)。
目前新人僅需?69?元即可加入作者星球,數量有限,期待你的加入!
獲取:作者工作學習全棧筆記
作者整理了10年的工作學習筆記(涉及網絡、安全、運維、開發),需要學習實踐筆記的看友,可添加作者微信或者回復【工作學習實踐筆記】,當前價格¥299,除了獲得從業筆記的同時還可進行問題答疑以及每月遠程技術支持,希望大家多多支持,收獲定大于付出!
?知識推薦?往期文章
🔥【最新】Nginx | 核心知識150講,百萬并發下性能優化之連接池與內存池筆記
🔥【最新】Nginx | 核心知識150講,百萬并發下性能優化之常用容器類型介紹筆記
🔥【最新】Nginx | 核心知識150講,百萬并發下性能優化之靜態、動態模塊編譯使用筆記
🔥【最新】Nginx | 核心知識150講,百萬并發下性能優化之事件驅動框架筆記
💡【相關】DBA | Oracle EM管理工具介紹使用實踐指南
💡【相關】DBA | Oracle 用戶與權限配置實踐指南
💡【相關】DBA | Oracle 數據文件介紹配置實踐指南
💡【相關】DBA | Oracle 表空間文件介紹配置實踐指南
若文章對你有幫助,請將它轉發給更多的看友,若有疑問的小伙伴,可在評論區留言你想法喲?💬!