数据库基础速查
这页适合做“数据库入门与选型导航”。如果你现在还不确定该用 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;
推荐学习顺序
如果你刚开始接触数据库,建议按这个顺序:
- 先学表、行、列、主键、索引这些基础概念
- 再掌握
SELECT / INSERT / UPDATE / DELETE - 然后补
JOIN、聚合、排序、分页 - 最后再学习事务、迁移、备份、权限控制
先理解“数据怎么组织”和“查询为什么慢”,比一开始背更多 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 SQLite | SQLite 专用 |
| Adminer | Web 界面,单文件 PHP |
| pgAdmin | PostgreSQL 官方工具 |
winget install dbeaver.dbeaver
参考链接
- PostgreSQL 文档 — 官方文档
- MySQL 文档 — 官方文档
- SQLite 文档 — 官方文档
- SQL 教程 — 在线教程