sql增删改查怎么写?有时会不会有联表查询的增删查改

SQL 的增删改查(CRUD)是数据库操作的核心。针对你的问题,我先为你梳理基础单表的写法,再重点解答"联表查询的增删改查"该怎么实现。

📝 SQL 基础单表增删改查

假设我们有一张用户表 user,包含 id, username, age, phone 等字段:

  • 增 (INSERT) :向表中添加新记录。

    sql 复制代码
    -- 插入单条数据
    INSERT INTO user (username, age, phone) VALUES ('张三', 25, '13800000000');
    -- 批量插入多条数据
    INSERT INTO user (username, age, phone) VALUES ('李四', 22, '13900000000'), ('王五', 30, '13700000000');
  • 删 (DELETE) :删除表中的记录。切记带上 WHERE 条件!

    sql 复制代码
    DELETE FROM user WHERE id = 1;
  • 改 (UPDATE) :修改表中已有的数据。同样必须带 WHERE 条件!

    sql 复制代码
    UPDATE user SET age = 26, phone = '13811111111' WHERE username = '张三';
  • 查 (SELECT) :从表中检索数据。

    sql 复制代码
    SELECT id, username, age FROM user WHERE age > 20 ORDER BY age DESC;

🔗 联表查询的增删改查

是的,SQL 完全支持联表进行增、删、改、查。 这在处理多张关联表(比如订单表和商品表、用户表和部门表)的业务时非常常见。

1. 联表查询 (JOIN SELECT)

这是最常用的一种。当你需要从两张或多张表中获取数据时使用,核心关键字是 JOIN

sql 复制代码
-- 查询订单信息,并带出下单用户的名字
SELECT o.order_no, u.username, o.amount
FROM orders o
JOIN user u ON o.user_id = u.id  -- 通过 user_id 将订单表和用户表关联起来
WHERE o.status = 1;
2. 联表更新 (JOIN UPDATE)

当你需要根据另一张表的数据来更新当前表,或者同时更新多张表时使用。

sql 复制代码
-- 场景:当支付表(payments)中有记录时,把订单表(orders)的状态改为已支付('paid')
UPDATE orders o
JOIN payments p ON o.id = p.order_id
SET o.status = 'paid'
WHERE p.payment_time IS NOT NULL;

(注:不同数据库的联表更新语法略有差异,上述为 MySQL 常见写法)

3. 联表删除 (JOIN DELETE)

可以根据关联表的条件来删除主表的数据,甚至可以一次性删除多张表的数据。

sql 复制代码
-- 场景:删除用户表(user)中,在日志表(user_logs)里超过一年没有活跃记录的用户
DELETE u 
FROM user u
JOIN user_logs ul ON u.id = ul.user_id
WHERE ul.last_active_time < '2025-01-01';

⚠️ 高危提醒 :联表删除和更新一样,破坏力极强。在生产环境中执行前,务必先用同样的 JOIN 条件写一条 SELECT 语句,确认筛选出的数据确实是你想要删除的,再进行操作!

4. 联表新增 (INSERT ... SELECT)

虽然不能像查询那样随意"JOIN着插入",但你可以把一个联表查询的结果集,整体插入到另一张表中。

sql 复制代码
-- 场景:年底了,把高薪员工的信息连同计算好的奖金,插入到奖金表(bonuses)中
INSERT INTO bonuses (employee_id, bonus_amount, reason)
SELECT e.id, e.salary * 0.2, '年度优秀员工奖金'
FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE d.dept_name = '技术部' AND e.salary > 20000;

在实际的 Java + MyBatis-Plus 开发中,简单的联表查询可以通过手写 XML 或注解 SQL 来实现;如果是复杂的联表更新或删除,很多开发者也会选择先在代码中查出 ID,再通过循环或批量操作来完成,这样逻辑会更清晰且安全。

相关推荐
renhongxia113 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
程序员无隅14 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
愿做无知一猿14 小时前
Nacos连接MySQL异常?DataGrip竟成救星
数据库·mysql
G.O.G.O.G14 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
研究员子楚15 小时前
GEO行业发展标准体系白皮书V2.0-第10卷 · 全球篇:跨国标准协同与全球品牌语义治理框架
数据库·人工智能·microsoft·架构·geo
Omics Pro15 小时前
深度学习多组学互作:组内+组间
数据库·人工智能·深度学习·mysql·搜索引擎·自然语言处理
残*影17 小时前
如何优雅地保存MySQL数据变更历史?
数据库·mysql
乐观的Terry17 小时前
3、数据库设计与领域实体
java·数据库·spring boot·spring cloud·ai编程
舞影天上17 小时前
RuoYi-Vue-Plus Docker 部署踩坑:MySQL 中文双重编码的根因与修复
数据库
Database_Cool_17 小时前
数据仓库弹性扩缩容怎么实现?AnalyticDB MySQL 在线扩容 0 中断实战
数据库·数据仓库·mysql·阿里云