美文网首页mysql
mysql sql语句常见踩坑点

mysql sql语句常见踩坑点

作者: 修行者12138 | 来源:发表于2020-08-21 02:29 被阅读0次

使用limit时,一定要搭配使用order by,否则结果难以预料,除非你只关心数量,不关心内容
(可以了解下mysql不加order by时默认的排序规则)

distinct后面有多列时(比如distinct column1, column2...), distinct是对后面所有列同时做去重,而不是只对column1做去重。
如果你以为distinct column1, column2...查出来的column1只出现一次,那结果就与你的预期不符

union与union all区别
union会排除重复记录,相当于distinct,同时会按默认规则排序;
union all不会去重,也不会排序
使用union还是union all,取决于业务场景需不需要对结果去重和排序。

任何字段与null比较,结果都是false,即使是null与null比较。
所以多个字段关联查询时,如果其中一个字段为null,关联结果就是false,比如null = null and 1 = 1。

在写多字段关联的sql时,需要结合业务场景,考虑当其中一个字段为null时,本次关联还生不生效。

比如a和b都是学生表,两个表都有s_id(学生id)和c_id(班级id)列,求两个表共同的学生(学生id和班级id同时相等时,判定为同一个学生),sql为:

select * from a, b where a.s_id = b.s_id and a.c_id = c.c_id

假如有一个学生,在a、b表都存在,但是c_id为空(比如该学生未排到具体班级),那么上面的sql就会漏掉该学生,需要把sql调整为:

select * from a, b 
where 
((a.c_id is null and b.c_id is null) or a.c_id = b.c_id)
and a.s_id = c.s_id

left join注意事项
https://www.jianshu.com/p/d0f9b3c75b0d

student_info表是学生信息表,student_score表是学生成绩表,两表通过s_id(学生id)字段关联,编写sql查询学生成绩,有以下两种写法:

第一种写法

select sc.score
from student_info si, student_score sc
where si.s_id = sc.s_id

第二种写法

select 
    (select sc.score from student_score sc where si.s_id = sc.s_id)
from student_info si

上面两种写法有什么区别?
第一种写法,如果si.s_id = sc.s_id这里关联出多条记录,最后结果就会有多条,不会报错。
第二种写法,如果si.s_id = sc.s_id这里关联出多条记录,sql就会报错,程序会抛异常(除非在后面加上limit 1)。

选择哪种写法,取决于业务场景
如果理论上同一个学生在成绩表里可能有多条记录,那就一定要用第一种写法;
如果理论上同一个学生在成绩表里只会有一条记录,那就看数据有问题时(即同一个学生出现了多个成绩),是选择抛出异常,不展示数据,还是依然要展示错误数据。

not in可能丢失数据
https://www.jianshu.com/p/5898e54cdec9

写insert语句时,最好不要直接写insert into table values(...),要把字段也列出来,insert into table (column1, column2...) values(...),这样表加了字段变了sql也不会报错

两表关联时,要考虑两边的字段都是''的情况,null与null比较结果是false,但''与''比较结果是true

相关文章

  • MYSQL踩坑记录:You have an error in y

    MYSQL踩坑记录:You have an error in your SQL syntax; check the...

  • Mysql 原理(一)

    Mysql是我们常见的存储引擎,下面总结一下我认知的Mysql。一、mysql基础架构 二、sql语句的执行流...

  • 【搬运】MySQL语句

    mysql sql语句大全

  • MySQL Operation

    sql语句练习sql练习2 MYSQL导入数据出现The MySQL server is running with...

  • Mysql的 sql 语句大全

    Mysql的 sql 语句大全

  • MySQL常用语句

    MySQL是最常见的数据库,渗透测试中也经常会碰到php+mysql的网站,本章记录一下最常见的sql语句,记录一...

  • Linux [MySQL]

    @[TOC](Linux [MySQL]) Database MySQL 注意: MySQL 的SQL语句以分号...

  • MySQL的SQL语句执行过程

    理解MySQL当中的SQL语句 MySQL的sql语句和我们常用的编程语句一样,都是我们输入文本,编译器编译或者解...

  • MySQL的函数认识

    理解MySQL当中的SQL语句 MySQL的sql语句和我们常用的编程语句一样,都是我们输入文本,编译器编译或者解...

  • MySql数据库基础及IDE

    一、基础操作--sql语句 启动MySQL:service mysql start停止MySQL:service ...

网友评论

    本文标题:mysql sql语句常见踩坑点

    本文链接:https://www.haomeiwen.com/subject/flymjktx.html