PostgreSQL
功能强大的开源关系型数据库。
PostgreSQL
这一课你将能做到
- 用 SQL 语句创建表、插入数据、查询数据
- 理解索引的作用并创建索引
- 用 Node.js 连接 PostgreSQL 并执行查询
为什么要学
数据不能只存在内存里,重启就丢了。PostgreSQL 是关系型数据库,把数据持久化到硬盘,支持复杂查询、事务、并发访问。比 MySQL 功能更强,支持 JSON、数组、全文检索。
人话:PostgreSQL 是「文件柜」,把数据分门别类存好,随时能快速找到。
先建立图像
-- 创建表
CREATE TABLE course (
id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- 插入数据
INSERT INTO course (title, description) VALUES
('HTML', '网页骨架'),
('CSS', '网页皮肤');
-- 查询数据
SELECT * FROM course WHERE title LIKE 'H%';
结果:
id | title | description | created_at
----+-------+--------------+----------------------------
1 | HTML | 网页骨架 | 2025-01-15 10:30:00
跟着做
步骤 1:安装与连接
# macOS
brew install postgresql
brew services start postgresql
# Ubuntu
sudo apt install postgresql
sudo systemctl start postgresql
# 连接
psql -U postgres
步骤 2:数据库与表操作
-- 创建数据库
CREATE DATABASE codeforge;
-- 切换数据库
\c codeforge
-- 创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- 查看表结构
\d users
-- 删除表
DROP TABLE IF EXISTS users;
步骤 3:CRUD 操作
-- 插入
INSERT INTO users (username, email, password_hash)
VALUES ('admin', 'admin@example.com', 'hashed_password');
-- 查询
SELECT * FROM users;
SELECT username, email FROM users WHERE id = 1;
SELECT * FROM users WHERE username LIKE 'adm%' ORDER BY created_at DESC LIMIT 10;
-- 更新
UPDATE users SET email = 'new@example.com' WHERE id = 1;
-- 删除
DELETE FROM users WHERE id = 1;
步骤 4:索引(加速查询)
-- 创建索引
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_created_at ON users(created_at);
-- 查看索引
\d users
-- 删除索引
DROP INDEX idx_users_email;
索引像书的目录,加速 WHERE email = '...' 查询,但减慢插入/更新(要维护索引)。
步骤 5:关联查询
-- 课程表
CREATE TABLE course (
id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
category_id INTEGER
);
-- 分类表
CREATE TABLE category (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
-- 插入关联数据
INSERT INTO category (name) VALUES ('前端'), ('后端');
INSERT INTO course (title, category_id) VALUES
('HTML', 1),
('Node.js', 2);
-- JOIN 查询
SELECT c.title, cat.name AS category
FROM course c
JOIN category cat ON c.category_id = cat.id;