为什么这个不会报错 还是能出数据 数据是一样的

为什么这个不会报错 还是能出数据 数据是一样的

https://img1.sycdn.imooc.com/climg/66b5879c09798aa516000900.jpg            
下载视频
投屏
复制链接

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2024-08-09 11:25:27

同学你好,同学是指在8分钟左右老师讲解的知识点吗?如果是,这个要求并不一定是语法错误,但很大可能不能获取正确的数据。正是因为这样的sql能够执行,所以经常会导致我们认为“既然执行了,说明没问题”,实际上有问题的不是语法,而是数据。例如课程中老师的语句,将sal写在select中之后,可以查询到数据,如下图:

https://img1.sycdn.imooc.com/climg/66b58c2409c5833506260329.jpg

此时就会有问题,最后一列的sal是什么含义,这个数据显然和其他三列是不匹配的。但是如果仅从语法层面看,这个语句没有问题,但是从数据看,这个数据存在问题。所有就有了课程中老师讲解的规范,这个规范不是语法要求,但是是开发中要时刻注意的,容易踩到的坑。

另外,课程中老师演示时是有报错的,但是我们这里测试都没有报错。从Mysql相关资料中看,可能是因为我们现在使用的版本中,默认不是严格模式,所以没有进行报错,同学可以手动设置为严格模式尝试一下。例如先执行下面的语句:

set global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES';
set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES';

然后再执行sql语句,就会出现相同的报错。

综上,正是因为实际开发时,我们后端程序员没有DBA这样直接修改数据库模式的权限,所以书写sql语句的时候,即使测试时的测试数据库支持了非严格模式的sql语句,在生产环境的数据库依然可能因为是严格模式而导致程序出现问题。所以老师在课程中专门将这个问题提炼和讲解,为了同学们以后不要踩坑,同时养成良好的习惯。

祝学习愉快~

  • 提问者 鱿鱼三明治 #1
    SELECT COUNT(ename)
    FROM t_emp 
    WHERE sal > (SELECT AVG(sal) FROM t_emp) AND hiredate < "1985-1-1";

    那这个统计入职年份在1985年之后的薪资大于平均薪资的人员数量这么写可以吗  1985年之后数据只有一条  我就换了一下换成之前 

    2024-08-09 14:18:57
  • 好帮手慕小蓝 回复 提问者 鱿鱼三明治 #2

    同学你好,语句是没问题的。

    祝学习愉快~

    2024-08-09 16:05:00
  • 提问者 鱿鱼三明治 #3
    好的 谢谢
    2024-08-10 10:23:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1203    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师