SQL
SQL(Structured Query Language)是用于管理关系型数据库的标准语言。本文介绍SQL的基础语法和常用操作。
主流数据库对比
关系型数据库(RDBMS)
MySQL
- 开源关系型数据库
- 广泛用于Web应用
- 支持事务和ACID特性
- 适合OLTP(联机事务处理)
- 社区版免费,企业版收费
PostgreSQL
- 功能强大的开源数据库
- 支持复杂查询和自定义类型
- 提供JSON支持
- 适合复杂的数据分析
- 完全开源,功能丰富
SQLite
- 轻量级嵌入式数据库
- 零配置
- 适合移动应用和桌面应用
- 单文件存储
- 无需服务器
Oracle
- 企业级数据库
- 高性能和高可用性
- 丰富的企业特性
- 适合大型企业应用
- 商业软件,价格昂贵
NoSQL数据库
MongoDB
- 文档型数据库
- 灵活的数据模型
- 适合快速开发
- 支持复杂查询
- 社区版免费,企业版收费
Redis
- 内存数据库
- 键值存储
- 支持多种数据结构
- 适合缓存和会话存储
- 开源免费
Cassandra
- 列式数据库
- 高可扩展性
- 适合大数据应用
- 分布式架构
- 开源免费
Neo4j
- 图数据库
- 适合关系型数据
- 支持复杂图查询
- 适合社交网络分析
- 社区版免费,企业版收费
数据库选择建议
选择关系型数据库的场景
- 需要强一致性
- 数据结构相对固定
- 需要复杂的事务支持
- 需要复杂的查询和连接操作
选择NoSQL数据库的场景
- 需要高可扩展性
- 数据结构灵活多变
- 需要高性能读写
- 处理大量非结构化数据
数据定义语言(DDL)
数据库操作
sql
-- 创建数据库
CREATE DATABASE mydb;
-- 删除数据库
DROP DATABASE mydb;
-- 选择数据库
USE mydb;
表操作
sql
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 修改表
ALTER TABLE users
ADD COLUMN phone VARCHAR(20);
-- 删除表
DROP TABLE users;
数据操作语言(DML)
插入数据
sql
-- 插入单条数据
INSERT INTO users (username, email, age)
VALUES ('john', 'john@example.com', 25);
-- 插入多条数据
INSERT INTO users (username, email, age)
VALUES
('alice', 'alice@example.com', 30),
('bob', 'bob@example.com', 28);
更新数据
sql
-- 更新单条数据
UPDATE users
SET email = 'new@example.com'
WHERE id = 1;
-- 更新多条数据
UPDATE users
SET age = age + 1
WHERE age < 30;
删除数据
sql
-- 删除单条数据
DELETE FROM users
WHERE id = 1;
-- 删除多条数据
DELETE FROM users
WHERE age > 50;
数据查询语言(DQL)
基本查询
sql
-- 查询所有字段
SELECT * FROM users;
-- 查询特定字段
SELECT username, email FROM users;
-- 使用别名
SELECT username AS name, email AS mail FROM users;
条件查询
sql
-- 简单条件
SELECT * FROM users WHERE age > 18;
-- 多条件
SELECT * FROM users
WHERE age > 18 AND email LIKE '%@example.com';
-- IN 操作符
SELECT * FROM users
WHERE age IN (20, 25, 30);
-- BETWEEN 操作符
SELECT * FROM users
WHERE age BETWEEN 20 AND 30;
排序和分组
sql
-- 排序
SELECT * FROM users
ORDER BY age DESC, username ASC;
-- 分组
SELECT age, COUNT(*) as count
FROM users
GROUP BY age;
-- 分组后筛选
SELECT age, COUNT(*) as count
FROM users
GROUP BY age
HAVING count > 1;
连接查询
sql
-- 内连接
SELECT u.username, p.title
FROM users u
INNER JOIN posts p ON u.id = p.user_id;
-- 左连接
SELECT u.username, p.title
FROM users u
LEFT JOIN posts p ON u.id = p.user_id;
-- 右连接
SELECT u.username, p.title
FROM users u
RIGHT JOIN posts p ON u.id = p.user_id;
子查询
sql
-- 在WHERE中使用子查询
SELECT * FROM users
WHERE age > (SELECT AVG(age) FROM users);
-- 在FROM中使用子查询
SELECT u.username, p.post_count
FROM users u
JOIN (SELECT user_id, COUNT(*) as post_count FROM posts GROUP BY user_id) p
ON u.id = p.user_id;
事务控制
事务操作
sql
-- 开始事务
START TRANSACTION;
-- 执行SQL语句
INSERT INTO users (username, email) VALUES ('test', 'test@example.com');
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
视图
视图操作
sql
-- 创建视图
CREATE VIEW user_posts AS
SELECT u.username, p.title, p.created_at
FROM users u
JOIN posts p ON u.id = p.user_id;
-- 使用视图
SELECT * FROM user_posts WHERE username = 'john';
-- 删除视图
DROP VIEW user_posts;
存储过程
存储过程示例
sql
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE GetUserPosts(IN userId INT)
BEGIN
SELECT p.* FROM posts p WHERE p.user_id = userId;
END //
DELIMITER ;
-- 调用存储过程
CALL GetUserPosts(1);