Appearance
SQL 基础
SQL (Structured Query Language) 是一种用于管理关系型数据库的标准语言。本文将介绍 SQL 的核心概念和基本语法。
1. 基本概念
什么是 SQL
SQL 是一种用于管理关系型数据库的标准语言,它可以用于创建、查询、更新和删除数据库中的数据。
关系型数据库
关系型数据库是一种基于关系模型的数据库,它使用表格来存储数据,表格由行和列组成。
- 表格 (Table):存储数据的基本单位
- 行 (Row):表格中的一条记录
- 列 (Column):表格中的一个字段
- 主键 (Primary Key):唯一标识一条记录的字段
- 外键 (Foreign Key):引用其他表格主键的字段
2. 数据类型
数值类型
- INT:整数
- BIGINT:大整数
- FLOAT:单精度浮点数
- DOUBLE:双精度浮点数
- DECIMAL:精确小数
字符串类型
- CHAR:固定长度字符串
- VARCHAR:可变长度字符串
- TEXT:长文本
- BLOB:二进制数据
日期时间类型
- DATE:日期
- TIME:时间
- DATETIME:日期时间
- TIMESTAMP:时间戳
- YEAR:年份
3. 基本 SQL 语句
CREATE TABLE
用于创建表格。
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);INSERT
用于插入数据。
sql
-- 插入单条数据
INSERT INTO users (name, email, age) VALUES ('John Doe', 'john@example.com', 30);
-- 插入多条数据
INSERT INTO users (name, email, age) VALUES
('Jane Smith', 'jane@example.com', 25),
('Bob Johnson', 'bob@example.com', 35);SELECT
用于查询数据。
sql
-- 查询所有字段
SELECT * FROM users;
-- 查询指定字段
SELECT name, email FROM users;
-- 带条件查询
SELECT * FROM users WHERE age > 25;
-- 排序
SELECT * FROM users ORDER BY age DESC;
-- 限制结果数量
SELECT * FROM users LIMIT 10;
-- 分组
SELECT age, COUNT(*) FROM users GROUP BY age;
-- 连接查询
SELECT users.name, orders.amount FROM users
JOIN orders ON users.id = orders.user_id;UPDATE
用于更新数据。
sql
-- 更新所有记录
UPDATE users SET age = 31 WHERE id = 1;
-- 更新多条记录
UPDATE users SET age = age + 1 WHERE age > 30;DELETE
用于删除数据。
sql
-- 删除指定记录
DELETE FROM users WHERE id = 1;
-- 删除所有记录
DELETE FROM users;4. 高级 SQL 语句
子查询
子查询是嵌套在其他 SQL 语句中的查询。
sql
-- 子查询作为条件
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
-- 子查询作为结果
SELECT (SELECT COUNT(*) FROM users) AS user_count;连接查询
连接查询用于从多个表格中获取数据。
sql
-- 内连接
SELECT users.name, orders.amount FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- 左连接
SELECT users.name, orders.amount FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- 右连接
SELECT users.name, orders.amount FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
-- 全连接
SELECT users.name, orders.amount FROM users
FULL JOIN orders ON users.id = orders.user_id;联合查询
联合查询用于合并多个查询的结果。
sql
-- 联合查询
SELECT name FROM users
UNION
SELECT product_name FROM products;
-- 联合查询(包含重复)
SELECT name FROM users
UNION ALL
SELECT product_name FROM products;5. 函数
聚合函数
- COUNT():计数
- SUM():求和
- AVG():平均值
- MAX():最大值
- MIN():最小值
sql
-- 计数
SELECT COUNT(*) FROM users;
-- 求和
SELECT SUM(amount) FROM orders;
-- 平均值
SELECT AVG(age) FROM users;
-- 最大值
SELECT MAX(amount) FROM orders;
-- 最小值
SELECT MIN(age) FROM users;字符串函数
- CONCAT():连接字符串
- SUBSTRING():截取字符串
- UPPER():转换为大写
- LOWER():转换为小写
- LENGTH():字符串长度
sql
-- 连接字符串
SELECT CONCAT(name, ' ', email) FROM users;
-- 截取字符串
SELECT SUBSTRING(name, 1, 3) FROM users;
-- 转换为大写
SELECT UPPER(name) FROM users;
-- 转换为小写
SELECT LOWER(email) FROM users;
-- 字符串长度
SELECT LENGTH(name) FROM users;日期函数
- NOW():当前日期时间
- CURDATE():当前日期
- CURTIME():当前时间
- DATE():提取日期
- TIME():提取时间
- YEAR():提取年份
- MONTH():提取月份
- DAY():提取日
sql
-- 当前日期时间
SELECT NOW();
-- 当前日期
SELECT CURDATE();
-- 当前时间
SELECT CURTIME();
-- 提取日期
SELECT DATE(created_at) FROM users;
-- 提取时间
SELECT TIME(created_at) FROM users;
-- 提取年份
SELECT YEAR(created_at) FROM users;
-- 提取月份
SELECT MONTH(created_at) FROM users;
-- 提取日
SELECT DAY(created_at) FROM users;6. 约束
主键约束
主键约束用于唯一标识一条记录。
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);外键约束
外键约束用于维护表格之间的关系。
sql
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(id)
);唯一约束
唯一约束用于确保字段的值唯一。
sql
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);非空约束
非空约束用于确保字段的值不为空。
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);默认约束
默认约束用于设置字段的默认值。
sql
CREATE TABLE users (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);7. 索引
索引用于提高查询性能。
创建索引
sql
-- 创建普通索引
CREATE INDEX idx_name ON users(name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 创建复合索引
CREATE INDEX idx_name_age ON users(name, age);删除索引
sql
DROP INDEX idx_name ON users;8. 事务
事务是一组原子性的 SQL 操作,要么全部执行,要么全部不执行。
事务的特性
- 原子性 (Atomicity):事务是一个不可分割的工作单位
- 一致性 (Consistency):事务执行前后,数据库状态保持一致
- 隔离性 (Isolation):多个事务并发执行时,互不影响
- 持久性 (Durability):事务执行完成后,结果永久保存
事务操作
sql
-- 开始事务
START TRANSACTION;
-- 执行 SQL 语句
INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');
UPDATE orders SET amount = 100 WHERE id = 1;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;9. 视图
视图是一个虚拟表格,它是基于 SQL 查询结果的可视化表格。
创建视图
sql
CREATE VIEW user_orders AS
SELECT users.id, users.name, orders.amount, orders.created_at
FROM users
JOIN orders ON users.id = orders.user_id;使用视图
sql
SELECT * FROM user_orders WHERE amount > 100;删除视图
sql
DROP VIEW user_orders;10. 存储过程
存储过程是一组预编译的 SQL 语句,它可以被多次调用。
创建存储过程
sql
DELIMITER //
CREATE PROCEDURE get_users()
BEGIN
SELECT * FROM users;
END //
DELIMITER ;调用存储过程
sql
CALL get_users();删除存储过程
sql
DROP PROCEDURE get_users;11. 触发器
触发器是一种特殊的存储过程,它在特定事件发生时自动执行。
创建触发器
sql
DELIMITER //
CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action) VALUES (NEW.id, 'insert');
END //
DELIMITER ;删除触发器
sql
DROP TRIGGER after_user_insert;12. 实践示例
创建数据库和表格
sql
-- 创建数据库
CREATE DATABASE mydb;
-- 使用数据库
USE mydb;
-- 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建订单表
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
amount DECIMAL(10, 2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);插入数据
sql
-- 插入用户数据
INSERT INTO users (name, email, age) VALUES
('John Doe', 'john@example.com', 30),
('Jane Smith', 'jane@example.com', 25),
('Bob Johnson', 'bob@example.com', 35);
-- 插入订单数据
INSERT INTO orders (user_id, amount) VALUES
(1, 100.00),
(1, 200.00),
(2, 150.00),
(3, 300.00);查询数据
sql
-- 查询所有用户
SELECT * FROM users;
-- 查询年龄大于 25 的用户
SELECT * FROM users WHERE age > 25;
-- 查询用户及其订单
SELECT users.name, orders.amount, orders.created_at
FROM users
JOIN orders ON users.id = orders.user_id;
-- 统计每个用户的订单总金额
SELECT users.name, SUM(orders.amount) AS total_amount
FROM users
JOIN orders ON users.id = orders.user_id
GROUP BY users.id;13. 常见问题与解决方案
语法错误
问题:SQL 语句语法错误 解决方案:检查 SQL 语句的语法,确保使用正确的关键字和语法结构。
约束冲突
问题:插入或更新数据时违反约束 解决方案:确保数据符合约束要求,如主键唯一、外键存在等。
性能问题
问题:查询速度慢 解决方案:
- 创建适当的索引
- 优化查询语句
- 避免全表扫描
事务问题
问题:事务未提交或回滚 解决方案:确保事务正确提交或回滚,避免长时间占用锁。
14. 总结
SQL 是一种强大的数据库语言,它可以用于管理关系型数据库的各种操作。通过学习 SQL 的基本概念和语法,我们可以有效地管理和查询数据库中的数据。
SQL 的核心概念包括:
- 表格、行、列
- 主键、外键
- 数据类型
- 基本 SQL 语句
- 高级 SQL 语句
- 函数
- 约束
- 索引
- 事务
- 视图
- 存储过程
- 触发器
通过不断学习和实践,我们可以掌握 SQL 的技能,并将其应用到实际的数据库管理中。