SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)

发布于:2025-04-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、为什么需要SQL?

想象你在管理一个图书馆:

  • 传统方法:手动记录每本书的位置、借阅者、归还日期
  • SQL方法:用数据库系统自动管理,快速查询《Java编程思想》在哪个书架

SQL(Structured Query Language)就是数据库的"魔法咒语",让你高效管理数据。

二、CRUD操作:数据库的四大基本技能

1. 创建表(CREATE)

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    age INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 插入数据(INSERT)

INSERT INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 25);

3. 查询数据(SELECT)

-- 查询所有用户
SELECT * FROM users;

-- 查询年龄大于18岁的用户
SELECT id, name, age 
FROM users 
WHERE age > 18 
ORDER BY created_at DESC;

-- 分页查询(第2页,每页10条)
SELECT * FROM users LIMIT 10 OFFSET 10;

4. 更新数据(UPDATE)

-- 将ID为1的用户年龄改为26
UPDATE users 
SET age = 26, email = 'new@example.com' 
WHERE id = 1;

5. 删除数据(DELETE)

-- 删除ID为5的用户
DELETE FROM users WHERE id = 5;

三、JOIN操作:关联表查询的魔法

假设我们有两个表:

-- 用户表
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 订单表
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

1. 内连接(INNER JOIN)

SELECT u.name, o.amount
FROM users u
INNER JOIN orders o 
ON u.id = o.user_id;

结果:只显示同时存在于用户表和订单表的数据。

2. 左连接(LEFT JOIN)

SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o 
ON u.id = o.user_id;

结果:显示所有用户,包括没有订单的用户(订单金额为NULL)。

3. 右连接(RIGHT JOIN)

SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o 
ON u.id = o.user_id;

结果:显示所有订单,包括未匹配到用户的订单(用户名为NULL)。

4. 全连接(FULL OUTER JOIN)

SELECT u.name, o.amount
FROM users u
FULL OUTER JOIN orders o 
ON u.id = o.user_id;

结果:显示所有用户和订单,无论是否匹配。

四、索引:让查询速度起飞的秘籍

1. 为什么需要索引?

  • 未加索引:逐行扫描数据(像在图书馆逐本书找《红楼梦》)
  • 加索引:快速定位数据(像用图书馆的分类目录查找)

2. 创建索引

-- 在email字段创建普通索引
CREATE INDEX idx_users_email ON users(email);

-- 在name和age字段创建复合索引
CREATE INDEX idx_users_name_age ON users(name, age);

3. 索引适用场景

  • 经常用于查询条件的字段(如WHERE子句)
  • 外键关联字段
  • 排序字段(ORDER BY)

五、常见问题解答

1. WHERE和HAVING的区别?

  • WHERE:过滤行(在聚合前)
  • HAVING:过滤分组(在聚合后)
SELECT user_id, COUNT(*) AS order_count
FROM orders
WHERE amount > 100  -- 过滤金额>100的订单
GROUP BY user_id
HAVING order_count > 2;  -- 过滤订单数>2的用户

2. 如何防止SQL注入?

  • 使用预编译语句(PreparedStatement)
  • 避免直接拼接SQL字符串
// Java示例
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
stmt.setString(1, userEmail);

六、推荐学习资源

  1. SQL Zoo 互动教程
  2. W3Schools SQL教程
  3. 《SQL必知必会》
  4. MySQL官方文档

七、总结

SQL是数据时代的通用语言,掌握CRUD、JOIN和索引将使你:

  • 高效管理数据
  • 快速构建应用
  • 解锁数据分析能力

现在就打开MySQL客户端,尝试用今天学到的知识创建一个用户表吧!记得每次操作前备份数据,享受SQL的乐趣。🚀


网站公告

今日签到

点亮在社区的每一天
去签到