SQL_ERROR_INFO 处理

在牛客网的自学SQL刷题时,遇上了许多SQL_ERROR_INFO。记录下来,方便自己将来学习。
若对你也有一定帮助,感到万分荣幸,希望能给个喜欢,谢谢。
后续会视遇到的SQL错误情况,更新此博客

1. 保留字或者函数名错误

SQL_ERROR_INFO: "execute command denied to user 'root'@'localhost' for routine 'split'"

含义:
使用了错误的保留字或者函数名,如sql里面并没有split函数。
解决:
应该具体查询相应的函数,确保输入正确。


2. 语境中窗口函数使用错误

SQL_ERROR_INFO: "You cannot use the window function 'row_number' in this context.'"

含义:
不能够在该语境下使用窗口函数row_number,(类似的还有dense_rank等窗口函数。)在语境中使用的窗口函数存在问题,有可能导致了一对多,或者多对一的情况跟,导致数据结构不平衡,从而出现错误。
解决:
重新思考窗口函数返回值,以及over(partition by column_name order by column_name) 的作用效果。或者单独使用一个子查询列表的形式囊括窗口函数,然后再通过from 或者 in 的方式引用子查询内的窗口函数,而非窗口函数直接放置在主查询中。


3. 派生表引用错误

SQL_ERROR_INFO: 'Every derived table must have its own alias'

含义:
每个派生表都必须有自己的别名,这个错误是由于没有指定派生表的别名引起的
解决:
在调用子查询,或者派生表时,应该为派生表命名。
示例:

-------------------错误----------------
select column_name
from (
	select column_name
	from table
)
------------------正确-----------------
select column_name
from (
	select column_name
	from table
) t #此处 t 就是派生表的别名

4. group by模式错误

SQL_ERROR_INFO:"this is incompatible with sql_mode=only_full_group_by"

含义:
MySQL 5.7.5以上版本,实现了对功能依赖的检测。如果启用了only_full_group_by SQL模式(默认启用),那么MySQL就会拒绝执行 select list、HAVING condition或ORDER BY list引用既不在GROUP BY子句中被命名,也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)的未聚合列的查询。

从MySQL5.7.5开始,默认的SQL模式包括only_full_group_by。(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的。关于前5.7.5行为的描述,请参阅MySQL 5.6参考手册。)

解决:
-----------------------------------------方案一:
通过使用ang_value()函数来规避模式错误
修改前

select
	id as a,
	name as n
from user

修改后

select 
	 any_value(id) as a,
	 any_value(name) as b
from user

----------------------------------------方案二:

  1. 连接数据库,输入sql模式查询命令
select @@sql_mode;
  1. 修改数据库配置my.ini文件
    在数据库安装文件夹下的my.ini文件,添加代码
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
  1. 重启MySQL服务

5. 列名错误

SQL_ERROR_INFO: "Unknown column 'count' in 'where clause'"

含义:
在查询中,count列是不清楚的。因为表中没有该列
解决:
可能是表中并没有count列,而是含有count字段的列名,比如count_user,而_user并没有写上去,导致的unknow column错误。注意列名即可

6. 列名指代不清错误

SQL_ERROR_INFO: "Column 'count' in where clause is ambiguous"

含义:
列名指代不清楚,常出现在有连接表的查询中,select、where调取列时没有指代清楚count列究竟来自哪个表
解决:

select count
from table1  t1 join table2 t2
on t1.count = t2.count

应该在count前面加上表名.,如 t1.count

select t1.count
from table1  t1 join table2 t2
on t1.count = t2.count

7. 排序的值是无字符

SQL_ERROR_INFO: "BIGINT UNSIGNED value is out of range in '(`t21`.`exam_cnt_rank_21` - `t20`.`exam_cnt_rank_20`)'"

含义:
(t21.exam_cnt_rank_21 - t20.exam_cnt_rank_20)为无字符值,而其计算结果缺超出了无字符值的限制范围。mysql 当两个字段想减时,如果其中一个或两个字段的类型的unsigned无签名类型,如果想减的值小于0则会报错(BIGINT UNSIGNED value is out of range)。
解决:
因为rank、row_number、dense_rank都会产生无字符值(即正值),而用无字符值返回的结果的类型也将相应的被限制为无字符值类型,需要使用cast(rank as signed)调整为有符号的数值。

8. group函数使用无效

SQL_ERROR_INFO: 'Invalid use of group function'

含义:
group 函数的使用是非法的,无效的

9. 操作数列超出

SQL_ERROR_INFO: ‘Operand should contain 1 column(s)’
含义:
操作数列应包含1列。对于只应进行一个数列操作的地方,却放入了不止一个数列.是由于尝试将大量不能合并的数据到一列去造成的错误
解决:

  1. 在where中加入and 或者 or
where flag = 0, answer_cnt > 0
# 修改为为
where flag=0 and answer_cnt >0
  1. where column_name in ()
where column_name in (
	select column_name1, column_name2 # 这里返回了不止一列,导致where in 函数使用错误
	from table
)
# 修改为
where column_name in(
	select column_name
	from table
) 

参考资料

  1. https://blog.csdn.net/Forever_jacklove/article/details/124731744
  2. https://blog.csdn.net/weixin_46573158/article/details/123198193
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值