DBA | SQL 結構化查詢語言介紹與學習環境準備

[ 知識是人生的燈塔,只有不斷學習,才能照亮前行的道路 ]

📢?大家好,我是?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/Foundation

  • ISO/IEC 9075-8: object model to be supported (SQL/Objects Extended Objects)?[丟棄]?并入 SQL/Foundation

  • ISO/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

image.png
weiyigeek.top-SQL標準擴展支持時間線圖

下面是 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子實現部分的講解頁面數量,可以看出變動還是比較大的。

image.png
weiyigeek.top-專用于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 語言開始學習,例如?SELECTINSERTUPDATE?和?DELETE、CREATE、GARNT?等基本操作。這些是最常用的命令,可以幫助你了解如何從數據庫中檢索數據以及如何向其中添加或修改數據。

第二步:?學習如何使用內聯、外聯?JOIN?語句來連接多個表,以便從不同表中檢索數據。這對于處理復雜的數據關系非常重要。

第三步:?學習如何使用聚合函數(如?SUMAVGMAX?和?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/

image.png


weiyigeek.top-使用Adminer訪問MariaDB圖

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/,正常情況下,如下圖所示:

image.png
weiyigeek.top-使用 Adminer 訪問 PostgreSQL圖

當然,除了使用 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 語句,插入示例數據,如下所示:

image.pngweiyigeek.top-插入示例數據到MariaDB數據庫圖

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

image.png
weiyigeek.top-從MariaDB數據庫查詢插入的示例數據圖

溫馨提示:由于 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';
image.png
weiyigeek.top-插入示例數據到PostgreSQL數據庫圖

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 表空間文件介紹配置實踐指南

若文章對你有幫助,請將它轉發給更多的看友,若有疑問的小伙伴,可在評論區留言你想法喲?💬!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95337.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day39_2025-08-13

知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 展平操作&#xff1a;除第一個維度batchsize外全部展平 dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練…

使用GTX ip core + SDI IP core實現SDI設計

使用GTX ip core SDI IP core實現SDI設計 1.SDI接口可以調用GTX IP&#xff0c;具體代碼可以參考xapp592&#xff0c;將代碼移植進入工程里&#xff0c;增加SDI IP核&#xff0c;增加引腳約束即可運行起來 2.使用transceiver的gt的ip core&#xff0c;然后協議選擇SDI協議 3.使…

【無標題】centos 配置阿里云的yum源

1、查看系統正在使用的yum源列表yum repolist結果分析&#xff1a;目前這里看出有base &#xff0c;extras &#xff0c;updates三個yum源&#xff0c;這三個也是系統默認的yum源&#xff0c;一般還需要一個epel企業級額外的yum源&#xff0c;本文主要就是更改yum源的配置文件&…

GPT-5全面開放!OpenAI回應用戶反饋:GPT-4o已重新上線!

OpenAI 近日宣布&#xff0c;其最新模型 GPT-5 現已全面向所有 Plus、Pro、Team 和免費用戶開放。 為進一步優化用戶體驗并應對初期反饋&#xff1a; 用戶額度提升&#xff1a; 在剛剛過去的周末&#xff0c;OpenAI已將 Plus 和 Team 用戶的 GPT-5 使用額度提升至原來的 2 倍…

線程安全的單例模式,STL和智能指針

目錄 什么是單例模式 什么是設計模式 單例模式的特點 餓漢實現方式和懶漢實現方式 餓漢方式實現單例模式 懶漢方式實現單例模式 懶漢方式實現單例模式(線程安全版本) STL,智能指針和線程安全 STL中的容器是否是線程安全的? 智能指針是否是線程安全的? 其他常見的各種鎖 什么是…

[每周一更]-(第155期):深入Go反射機制:架構師視角下的動態力量與工程智慧

在構建高復雜度、高靈活性的Go語言系統時&#xff0c;反射&#xff08;reflect&#xff09;就像一把雙刃劍——用得好能斬斷開發枷鎖&#xff0c;用不好則可能自傷程序。本文將深入探討反射的內部機理、典型應用場景、安全邊界及性能優化策略。一、反射核心&#xff1a;類型與值…

15_基于深度學習的蘋果病害檢測識別系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

Kotlin 數據容器 - MutableList(MutableList 概述、MutableList 增刪改查、MutableList 遍歷元素)

一、MutableList 概述MutableList 是 Kotlin 中可變的列表接口&#xff0c;它繼承自 List 接口并添加了修改列表內容的方法MutableList 允許添加、刪除、更新元素二、創建 MutableList 1、基礎創建 使用 mutableListOf 函數 // 創建一個 MutableList&#xff0c;包含 4 個元素 …

數據庫規范化:消除冗余與異常的核心法則

規范化&#xff08;Normalization&#xff09; 是數據庫設計中的核心流程&#xff0c;旨在通過結構化表與字段&#xff0c;消除數據冗余和避免數據異常&#xff08;插入/更新/刪除異常&#xff09;&#xff0c;同時確保數據依賴合理。其核心方法是將大表拆分為多個小表&#xf…

AI繪畫與攝影新紀元:ChatGPT+Midjourney+文心一格 共繪夢幻世界

文章目錄一、AI藝術的新時代二、ChatGPT&#xff1a;創意的引擎與靈感的火花三、Midjourney&#xff1a;圖像生成的魔法與技術的奇跡四、文心一格&#xff1a;藝術的升華與情感的共鳴五、融合創新&#xff1a;AI繪畫與攝影實戰的無限可能六、應用場景與實踐案例AI藝術的美好未來…

如何衡量需求的緊急程度

衡量需求的緊急程度&#xff0c;其核心在于建立一套客觀、量化、且基于商業影響的評估框架&#xff0c;從而將干系人主觀的“緊迫感”&#xff0c;轉化為團隊可進行理性決策的“優先級數據”。一套行之有效的緊急程度衡量體系&#xff0c;其構建必須綜合考量五大關鍵維度&#…

setInterval的任務正在執行時,setTimeout的任務會等待前者完成后再執行,這樣會造成2個計時器的時間精度出錯?

setInterval&#xff0c;setTimeout 2種計時器在同一個頁面處理任務&#xff0c;想看下精度用時情況。setInterval的任務正在執行時&#xff0c;setTimeout的任務會等待前者完成后再執行&#xff0c;這樣會造成2個計時器的時間精度出錯&#xff1f;本來settimeout啟動0.5秒&…

DeepSeek-R1-0528 推理模型完整指南:領先開源推理模型的運行平臺與選擇建議

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

【AI實戰】從零開始微調Qwen2-VL模型:打造制造業智能安全巡檢系統

【AI實戰】從零開始微調Qwen2-VL模型&#xff1a;打造制造業智能安全巡檢系統&#x1f3af; 項目背景與目標&#x1f6e0; 環境準備硬件要求軟件環境搭建&#x1f4ca; 數據準備&#xff1a;構建高質量訓練集第一步&#xff1a;提取規章制度知識第二步&#xff1a;創建標注數據…

5 重復匹配

在前幾章里&#xff0c;我們學習了如何使用各種元字符和特殊的字符集合去匹配單個字符。本章將學習如何匹配多個連續重復出現的字符或字符集合。5.1 有多少個匹配你現在已經學會了正則表達式的模式匹配中的基礎知識&#xff0c;但目前所有的例子都有一個非常嚴重的局限。請大家…

【瀏覽器兼容性處理】

瀏覽器兼容性處理是前端開發中重要的一環&#xff0c;指解決不同瀏覽器&#xff08;或同一瀏覽器不同版本&#xff09;對HTML、CSS、JavaScript解析執行存在差異&#xff0c;導致頁面顯示異常或功能失效的問題。以下是常見問題及系統的處理方案&#xff1a; 一、常見兼容性問題…

Android組件化實現方案深度分析

組件化是解決大型應用代碼臃腫、耦合嚴重、編譯緩慢、團隊協作困難等問題的關鍵架構手段&#xff0c;其核心在于 模塊化拆分、解耦、獨立開發和按需集成。 一、 組件化的核心目標與價值 解耦與高內聚&#xff1a; 將龐大單體應用拆分為功能獨立、職責單一的模塊&#xff08;組件…

外賣:重構餐飲的線上服務密碼

外賣不是 “把堂食菜裝進盒子送出去”&#xff0c;而是 “用線上化服務重構餐飲與用戶連接” 的經營模式 —— 它的核心&#xff0c;是 “讓用戶在家也能吃到‘像在店里一樣好’的體驗”。一、外賣的底層邏輯用戶點外賣&#xff0c;本質是 “想在家獲得‘餐廳級體驗’”&#x…

C++——高性能組件

文章目錄一、什么是高性能組件1.1 C 中高性能組件的核心設計原則1.2 常見的 C 高性能組件 / 庫舉例1.3 實現高性能組件的關鍵工具二、定時器2.1 什么是用戶態定時器2.2 為什么要使用用戶態定時器2.3 高性能用戶態定時器的實現原理2.3.1 訓練營2.3.1.1 問題解析2.3.1.2 模擬問答…

【軟考中級網絡工程師】知識點之 UDP 協議:網絡通信中的高效輕騎兵

目錄一、UDP 協議簡介二、UDP 協議特點2.1 無連接性2.2 不可靠性2.3 面向數據報2.4 低開銷2.5 廣播支持三、UDP 協議工作原理3.1 UDP 報文格式3.2 UDP 數據傳輸過程四、UDP 協議應用場景4.1 實時音視頻傳輸4.2 在線游戲4.3 DNS 查詢4.4 其他應用場景五、UDP 與 TCP 對比5.1 可靠…