Appearance
MySQL SQL基础
SQL(Structured Query Language)是用于管理关系型数据库的标准语言。在MySQL中,SQL用于创建、查询、更新和删除数据库中的数据。本文档将介绍MySQL中的SQL基础语法和操作。
SQL分类
SQL语句通常分为以下几类:
- DDL(Data Definition Language):数据定义语言
- DML(Data Manipulation Language):数据操作语言
- DQL(Data Query Language):数据查询语言
- DCL(Data Control Language):数据控制语言
DDL - 数据定义语言
DDL用于定义和管理数据库结构。
CREATE DATABASE
创建新的数据库:
sql
CREATE DATABASE IF NOT EXISTS mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE TABLE
创建新表:
sql
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
ALTER TABLE
修改现有表结构:
sql
-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 修改列
ALTER TABLE users MODIFY COLUMN age TINYINT UNSIGNED;
-- 删除列
ALTER TABLE users DROP COLUMN phone;
-- 添加外键
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
DROP TABLE
删除表:
sql
DROP TABLE IF EXISTS users;
DML - 数据操作语言
DML用于插入、更新和删除表中的数据。
INSERT
插入新记录:
sql
-- 插入单行数据
INSERT INTO users (username, email, age)
VALUES ('john_doe', 'john@example.com', 25);
-- 插入多行数据
INSERT INTO users (username, email, age)
VALUES
('jane_smith', 'jane@example.com', 30),
('bob_johnson', 'bob@example.com', 28);
-- 从其他表插入数据
INSERT INTO archived_users SELECT * FROM users WHERE age > 65;
UPDATE
更新现有记录:
sql
-- 更新所有记录
UPDATE users SET age = age + 1;
-- 更新特定记录
UPDATE users
SET email = 'newemail@example.com'
WHERE username = 'john_doe';
-- 使用JOIN更新
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.last_order_date = o.created_at
WHERE o.status = 'completed';
DELETE
删除记录:
sql
-- 删除特定记录
DELETE FROM users WHERE age < 18;
-- 删除所有记录(保留表结构)
DELETE FROM users;
-- 使用JOIN删除
DELETE u FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'cancelled';
DQL - 数据查询语言
DQL用于从数据库中检索数据,主要是SELECT语句。
基本SELECT
sql
-- 选择所有列
SELECT * FROM users;
-- 选择特定列
SELECT username, email FROM users;
-- 选择去重数据
SELECT DISTINCT age FROM users;
WHERE子句
sql
-- 等值比较
SELECT * FROM users WHERE age = 25;
-- 比较操作
SELECT * FROM users WHERE age > 18 AND age < 65;
-- 字符串匹配
SELECT * FROM users WHERE username LIKE 'j%';
-- IN操作符
SELECT * FROM users WHERE age IN (25, 30, 35);
-- NULL值检查
SELECT * FROM users WHERE email IS NOT NULL;
排序和限制
sql
-- 排序
SELECT * FROM users ORDER BY age DESC, username ASC;
-- 限制结果数量
SELECT * FROM users LIMIT 10;
-- 分页查询
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
聚合函数
sql
-- 计数
SELECT COUNT(*) FROM users;
-- 平均值
SELECT AVG(age) FROM users;
-- 最大值和最小值
SELECT MAX(age), MIN(age) FROM users;
-- 求和
SELECT SUM(age) FROM users;
-- 分组聚合
SELECT age, COUNT(*) as count FROM users GROUP BY age;
JOIN操作
sql
-- 内连接
SELECT u.username, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接
SELECT u.username, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 右连接
SELECT u.username, o.order_date
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
-- 多表连接
SELECT u.username, o.order_date, p.name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;
子查询
sql
-- 在WHERE中使用子查询
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE status = 'pending');
-- 在FROM中使用子查询
SELECT * FROM (
SELECT username, COUNT(*) as order_count
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id
) AS user_orders
WHERE order_count > 5;
-- 相关子查询
SELECT username, email FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id AND o.status = 'completed'
);
高级查询
UNION操作
sql
-- 合并结果集(去重)
SELECT username FROM users WHERE age > 30
UNION
SELECT email FROM users WHERE age < 20;
-- 合并结果集(不去重)
SELECT username FROM users WHERE age > 30
UNION ALL
SELECT email FROM users WHERE age < 20;
CASE语句
sql
SELECT
username,
age,
CASE
WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 65 THEN '成年人'
ELSE '老年人'
END AS age_category
FROM users;
窗口函数
sql
-- 排名函数
SELECT
username,
age,
ROW_NUMBER() OVER (ORDER BY age DESC) as row_num,
RANK() OVER (ORDER BY age DESC) as rank_num
FROM users;
-- 窗口聚合
SELECT
username,
age,
AVG(age) OVER (ORDER BY id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as avg_age_window
FROM users;
事务操作
sql
-- 开始事务
START TRANSACTION;
-- 执行多个操作
INSERT INTO users (username, email) VALUES ('new_user', 'new@example.com');
INSERT INTO profiles (user_id, bio) VALUES (LAST_INSERT_ID(), 'New user bio');
-- 提交事务
COMMIT;
-- 或回滚事务
-- ROLLBACK;
性能优化提示
- 使用索引:为经常查询的列创建索引
- **避免SELECT ***:只选择需要的列
- 使用LIMIT:限制结果集大小
- 优化WHERE条件:使用高效的过滤条件
- 避免在WHERE中使用函数:这会导致索引失效
总结
SQL是与MySQL数据库交互的核心语言。掌握基础的SQL语法是进行数据库操作的前提。在实际开发中,需要根据具体需求选择合适的SQL语句,并注意性能优化。后续文档将详细介绍查询优化、索引策略等高级主题。