全部文章

数据库基础速查

SQLite、PostgreSQL、MySQL 常用操作、SQL 语法与 GUI 工具推荐

目录 29 节

数据库基础速查

这页适合做“数据库入门与选型导航”。如果你现在还不确定该用 SQLite、PostgreSQL 还是 MySQL,可以先看下面的场景判断,再回到具体命令。

先按场景选

SQLite

  • 适合单机工具、小型站点、本地缓存、桌面应用
  • 零配置、最省事
  • 不适合高并发写入和复杂多用户场景

PostgreSQL

  • 适合中大型 Web 应用、后台系统、分析型查询
  • 功能完整,类型、索引、扩展能力都很强
  • 如果你没有历史包袱,很多新项目直接选它就够了

MySQL

  • 适合传统业务系统、很多托管平台和老项目迁移场景
  • 生态成熟、资料多
  • 团队已有 MySQL 经验时,上手和维护成本会更低

SQLite

零配置的嵌入式数据库,适合小型项目和本地开发。

# 安装
scoop install sqlite

# 打开/创建数据库
sqlite3 mydb.sqlite

# 常用命令
.tables              -- 列出所有表
.schema users        -- 查看表结构
.mode column         -- 列模式显示
.headers on          -- 显示列名
.quit                -- 退出

GUI 工具

winget install DBBrowserForSQLite.DBBrowserForSQLite

PostgreSQL

Docker 快速启动

docker run -d --name postgres \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  postgres:16-alpine

连接

# psql 客户端
psql -h localhost -U postgres -d mydb

# Docker 内
docker exec -it postgres psql -U postgres

常用命令

\l                    -- 列出数据库
\c mydb               -- 切换数据库
\dt                   -- 列出表
\d users              -- 查看表结构
\di                   -- 列出索引
\q                    -- 退出

MySQL

Docker 快速启动

docker run -d --name mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  mysql:8

连接

docker exec -it mysql mysql -u root -p

常用命令

SHOW DATABASES;
USE mydb;
SHOW TABLES;
DESCRIBE users;

推荐学习顺序

如果你刚开始接触数据库,建议按这个顺序:

  1. 先学表、行、列、主键、索引这些基础概念
  2. 再掌握 SELECT / INSERT / UPDATE / DELETE
  3. 然后补 JOIN、聚合、排序、分页
  4. 最后再学习事务、迁移、备份、权限控制

先理解“数据怎么组织”和“查询为什么慢”,比一开始背更多 SQL 语法更重要。

SQL 语法速查

建表

CREATE TABLE users (
  id SERIAL PRIMARY KEY,          -- PostgreSQL
  -- id INT AUTO_INCREMENT PRIMARY KEY,  -- MySQL
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  age INT DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CRUD

-- 插入
INSERT INTO users (name, email, age) VALUES ('Domi', '[email]', 20);

-- 查询
SELECT * FROM users WHERE age > 18 ORDER BY created_at DESC LIMIT 10;
SELECT name, COUNT(*) FROM users GROUP BY name HAVING COUNT(*) > 1;

-- 更新
UPDATE users SET age = 21 WHERE name = 'Domi';

-- 删除
DELETE FROM users WHERE id = 1;

JOIN

-- INNER JOIN
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- LEFT JOIN(保留左表所有行)
SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

索引

CREATE INDEX idx_users_email ON users(email);
CREATE UNIQUE INDEX idx_users_name_email ON users(name, email);
DROP INDEX idx_users_email;

常用函数

-- 聚合
SELECT COUNT(*), AVG(age), MAX(age), MIN(age), SUM(age) FROM users;

-- 字符串
SELECT UPPER(name), LOWER(name), LENGTH(name) FROM users;

-- 日期
SELECT NOW(), CURRENT_DATE, EXTRACT(YEAR FROM created_at) FROM users;

建模与索引建议

写 SQL 之前,先把几个原则记住会少走很多弯路:

  • 主键尽量稳定,不要频繁变更
  • 会被高频查询、排序、关联的字段,再考虑建索引
  • 索引不是越多越好,写入也要为索引付成本
  • 能用唯一约束表达规则时,优先用数据库约束,而不是只靠业务代码兜底

一个常见误区是:表一慢就盲目加索引。更稳妥的做法是先看查询语句、过滤条件、排序字段和执行计划。

备份与迁移

数据库真正容易出问题的地方,往往不是“建不起来”,而是“改结构”和“恢复数据”。

建议至少建立这些习惯:

  • 结构变更走 migration,不要手工改线上库
  • 升级前先做备份,尤其是生产环境
  • 把连接信息放进环境变量,不要硬编码在仓库里
  • 本地、测试、生产三套环境尽量分离

常见问题

为什么本地能连,部署后连不上

优先检查:

  • 主机、端口、用户名、密码是否正确
  • 容器或服务器的网络是否互通
  • 数据库是否只监听了本地地址
  • 环境变量是否真的被应用读取到了

为什么查询越来越慢

高频原因通常包括:

  • 没索引或索引没命中
  • 一次查太多列、太多行
  • LIKE '%keyword%' 这类查询无法有效利用普通索引
  • 把业务筛选全交给应用层,而不是数据库层

延伸阅读

GUI 工具推荐

工具说明
DBeaver免费,支持所有主流数据库
TablePlus轻量美观(macOS/Windows)
DB Browser for SQLiteSQLite 专用
AdminerWeb 界面,单文件 PHP
pgAdminPostgreSQL 官方工具
winget install dbeaver.dbeaver

参考链接

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 如果你只是快速查资料,可先看目录和相关文档,再决定是否深入全文。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 想先建立认知,再决定是否深入实践的人
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 顺手记录真正对你有用的命令、链接和注意事项,避免重复搜索
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇数据恢复与磁盘工具