[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
📢 大家好,我是 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 表空间文件介绍配置实践指南
若文章对你有帮助,请将它转发给更多的看友,若有疑问的小伙伴,可在评论区留言你想法哟 💬!