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 TRANSACTIONCOMMITROLLBACK)来确保数据的一致性。

第六步: 学习如何使用索引(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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 可靠…