-- 创建数据库(指定所有者为myuser)
CREATE DATABASE mydb OWNER myuser;
-- 删除数据库(谨慎操作,不可逆)
DROP DATABASE IF EXISTS mydb;
-- 查看所有数据库
\l -- psql命令(非SQL),或使用SQL:SELECT datname FROM pg_database;
\c mydb -- psql命令,切换到mydb数据库
用户与权限管理
-- 创建角色(用户),允许登录并设置密码
CREATE ROLE myuser WITH LOGIN PASSWORD 'mypassword';
-- 授予角色数据库权限(如授予mydb的所有权限给myuser)
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
-- 授予表权限(如授予mytable的SELECT/INSERT权限给myuser)
GRANT SELECT, INSERT ON mytable TO myuser;
-- 查看角色列表
\du -- psql命令,或使用SQL:SELECT rolname FROM pg_roles;
-- 删除角色
DROP ROLE IF EXISTS myuser;
表操作
创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- SERIAL:自增整数(类似MySQL的AUTO_INCREMENT)
name VARCHAR(50) NOT NULL, -- 非空字符串
age INT CHECK (age > 0), -- 检查约束:年龄必须大于0
tags TEXT[], -- 数组类型:存储多个标签
profile JSONB, -- JSONB类型:高效存储用户配置
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认值:当前时间
);
修改表结构
-- 1. 添加列
ALTER TABLE users ADD COLUMN email VARCHAR(100) UNIQUE; -- 唯一约束
-- 2. 修改列类型
ALTER TABLE users ALTER COLUMN age SET DATA TYPE SMALLINT;
-- 3. 删除列
ALTER TABLE users DROP COLUMN IF EXISTS email;
-- 4. 查看表结构
\d users -- psql命令,或使用SQL:SELECT * FROM information_schema.columns WHERE table_name = 'users';
删除表
DROP TABLE IF EXISTS users; -- 谨慎操作,不可逆
数据CRUD操作
插入数据(INSERT)
-- 单条插入
INSERT INTO users (name, age, tags, profile)
VALUES ('Alice', 25, ARRAY['java', 'pg'], '{"city": "Beijing", "job": "engineer"}');
-- 多条插入
INSERT INTO users (name, age, tags, profile)
VALUES
('Bob', 30, ARRAY['python', 'django'], '{"city": "Shanghai", "job": "developer"}'),
('Charlie', 28, ARRAY['go', 'grpc'], '{"city": "Guangzhou", "job": "architect"}');
查询数据(SELECT)
-- 1. 基础查询(查询所有列)
SELECT * FROM users;
-- 2. 条件过滤(年龄>25且标签包含'java')
SELECT name, age FROM users
WHERE age > 25 AND 'java' = ANY(tags); -- ANY:判断数组是否包含指定元素
-- 3. JSONB查询(查询城市为北京的用户)
SELECT name, profile->>'city' AS city -- ->>:提取JSONB字段为文本
FROM users
WHERE profile @> '{"city": "Beijing"}'; -- @>:JSONB包含判断
-- 4. 排序与分页(按创建时间降序,取第1-2条)
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 2 OFFSET 0; -- LIMIT:每页条数,OFFSET:偏移量(第N页:OFFSET (N-1)*LIMIT)
更新数据(UPDATE)
-- 更新Alice的年龄为26
UPDATE users
SET age = 26, tags = ARRAY['java', 'pg', 'spring'] -- 同时更新数组
WHERE name = 'Alice';
删除数据(DELETE)
-- 删除年龄>30的用户(谨慎操作,建议先SELECT验证)
DELETE FROM users
WHERE age > 30;
没有回应