SQL 查询常见错误总结及修正方法(1)

目录

一、语法错误类型

1. 括号 / 引号使用错误

2. NOT IN 语法错误

二、逻辑错误类型

1. NOT EXISTS 误用

2. 子查询冗余

三、修正方案速查表

四、最佳实践建议

五、IN、NOT IN、IS、EXISTS 用法详解

1. IN 和 NOT IN

2. IS 和 IS NOT

3. EXISTS 和 NOT EXISTS


以下是 SQL 查询中常见的语法错误逻辑错误及修正建议,结合具体案例说明:

一、语法错误类型

1. 括号 / 引号使用错误
  • 错误示例
    SELECT …… FROM …… WHERE university not in {select university ...}  -- 大括号错误
    SELECT …… FROM …… WHERE university = 复旦大学                     -- 字符串未加引号
    
  • 修正方法
    • 子查询必须用 括号 () 包裹。
    • 字符串值需用 单引号 ‘’ 包裹(如‘复旦大学’)。
  • 正确写法
    SELECT …… FROM …… WHERE university NOT IN (SELECT university ...)
    SELECT …… FROM …… WHERE university = '复旦大学'
    
2. NOT IN 语法错误
  • 错误示例
  • SELECT …… FROM …… WHERE university not in university=复旦大学    -- 混淆操作符
    SELECT …… FROM …… WHERE university not in ('复旦大学')           -- 正确语法但逻辑冗余
    
  • 修正方法
    • NOT IN 后需跟 值列表(用逗号分隔并用括号包裹)。
    • 若仅排除单个值,直接用 != 更简洁。
  • 正确写法
    SELECT …… FROM …… WHERE university != '复旦大学'                 -- 排除单个值
    SELECT …… FROM …… WHERE university NOT IN ('复旦大学', '北大')   -- 排除多个值
    

二、逻辑错误类型

1. NOT EXISTS 误用
  • 错误示例
    SELECT …… FROM ……
     WHERE NOT EXISTS (SELECT university ...)      -- 子查询逻辑不符
    
  • 错误原因
    NOT EXISTS 用于判断子查询是否有结果,而非直接排除值。
  • 修正方法
    • 若需排除特定值,用 != 或 NOT IN
    • 若坚持使用 NOT EXISTS,需改为判断 “当前行的学校不在复旦大学记录中”:

      SELECT device_id, gender, age, university 
      FROM user_profile AS u1 
      WHERE NOT EXISTS (
          SELECT 1 
          FROM user_profile AS u2 
          WHERE u2.university = '复旦大学'  -- 子查询查找复旦大学
            AND u1.university = u2.university  -- 关联外层当前行
      );
      
    • NOT EXISTS 正确用法示例:
      SELECT …… FROM …… 
      WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t1.id = t2.id)
      
2. 子查询冗余
  • 错误示例
    SELECT …… FROM …… 
    WHERE university NOT IN (
        SELECT university FROM t 
        WHERE university='复旦'
    )
    
  • 错误原因
    子查询结果固定为 ('复旦'),直接写 != '复旦' 更高效。
  • 修正方法
    SELECT …… FROM …… WHERE university != '复旦'
    

三、修正方案速查表

错误类型原错误代码示例修正后代码
括号使用错误WHERE NOT IN {子查询}WHERE NOT IN (子查询)
字符串未加引号WHERE university = 复旦WHERE university = '复旦'
NOT IN 语法错WHERE university not in 复旦WHERE university != '复旦'
子查询逻辑冗余WHERE NOT IN (SELECT ...)WHERE != '值' 或 NOT IN ('值')

四、最佳实践建议

  1. 优先用简单操作符

    • 排除单个值用 !=,排除多个值用 NOT IN
    • 示例:
      WHERE university != '复旦'            -- 排除单个学校
      WHERE university NOT IN ('复旦', '北大')  -- 排除多个学校
      
  2. 避免过度使用子查询
    若子查询结果为固定值,直接写在条件中。

  3. 注意 NULL 值处理
    NOT IN 若包含 NULL 可能导致意外结果,需额外过滤:

    WHERE university NOT IN ('复旦') AND university IS NOT NULL

五、INNOT INISEXISTS 用法详解

1. IN 和 NOT IN
  • 作用:判断字段值是否在指定列表中。
  • 语法
    WHERE column IN (值1, 值2, ...)         -- 在列表中
    WHERE column NOT IN (值1, 值2, ...)     -- 不在列表中
    
  • 示例
    -- 查询复旦大学或北京大学的用户
    WHERE university IN ('复旦大学', '北京大学');
    
    -- 查询非这两所学校的用户
    WHERE university NOT IN ('复旦大学', '北京大学');
    
  • 注意事项
    • NOT IN 与 NULL:若列表中包含 NULL,则整个条件返回 NULL(导致无结果)。需确保列表中不含 NULL,或额外过滤 IS NOT NULL
      -- 错误示例(若 blacklist 包含 NULL,可能无结果)
      WHERE university NOT IN (SELECT school FROM blacklist);
      
      -- 正确示例(过滤 NULL)
      WHERE university NOT IN (SELECT school FROM blacklist WHERE school IS NOT NULL);
      
2. IS 和 IS NOT
  • 作用:专门用于判断字段是否为 NULL
  • 语法
    WHERE column IS NULL         -- 字段值为 NULL
    WHERE column IS NOT NULL     -- 字段值不为 NULL
    
  • 示例
    -- 查询没有填写学校的用户
    WHERE university IS NULL;
    
    -- 查询填写了学校的用户
    WHERE university IS NOT NULL;
    
  • 注意事项
    不能用 = 或 != 判断 NULL,必须用 IS
    WHERE university = NULL;     -- 错误!永远返回 FALSE
    WHERE university IS NULL;    -- 正确
    
3. EXISTS 和 NOT EXISTS
  • 作用:判断子查询是否有结果(不关心具体值,只关心是否存在)。
  • 语法
    WHERE EXISTS (子查询)         -- 子查询有结果则返回 TRUE
    WHERE NOT EXISTS (子查询)     -- 子查询无结果则返回 TRUE
    
  • 示例
    -- 查询有订单的用户(两表通过user_id 关联)
    SELECT * FROM users
    WHERE EXISTS (
        SELECT 1 FROM orders WHERE orders.user_id = users.id
    );
    
    -- 查询没有订单的用户
    SELECT * FROM users
    WHERE NOT EXISTS (
        SELECT 1 FROM orders WHERE orders.user_id = users.id
    );
    
  • 注意事项
    • 子查询中常用 SELECT 1(效率更高),因为只需判断是否存在结果,无需返回具体列。
    • NOT EXISTS 比 LEFT JOIN ... IS NULL 更高效,尤其在大数据量时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值