mysql总结

java类和mysql数据类型对应

java类mysql数据库
java.lang.BytebyteTINYINT
java.uitl.CurrencytimezoneVARCHAR
java.lang.ShortshortSMALLINT
java.lang.IntegerintegerINTEGER
java.lang.LonglongBIGINT
java.lang.FloatfloatFLOAT
java.lang.DoubledoubleDOUBLE
java.lang.BigDecimalbig_decimalNUMERIC
java.lang.StringstringVARCHAR
java.lang.Booleantrue_falseCHAR(1)
java.lang.Booleanyes_noCHAR(1)
java.uitl.Date / java.sql.DatedateDATE/DATETIME
java.sql.TimetimeTIME
java.sql.TimestamptimestampTIMESTAMP
java.uitl.CalendarcelendarTIMESTAMP
java.io.SerializableserializableVARBINARY/BLOB
java.sql.ClobclobCLOB
java.sql.BlobblobBLOB
java.lang.ClassclassVARCHAR
java.uitl.LocalelocaleVARCHAR
java.uitl.TimeZonetimezoneVARCHAR
java.uitl.CurrencycurrencyVARCHAR

mysql 执行顺序

FROM- ON- JOIN- WHERE- GROUP BY- HAVING- SELECT- DISTINCT- ORDER BY- LIMIT

上语法顺序是不能前后互换的,否则报错

  • HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足
  • having 和 group by 可以单独使用
  • having 和 group by 可使用 select中对 表项列起的别名

group by 使用

如果不使用 group by 去分组,直接使用聚合函数(sum,count等)是对所有数据生效的,如果使用了分组group by,是对每个分组里的所有数据使用聚合函数的

DISTINCT和GROUP BY去重区别

在MySQL中,DISTINCT和GROUP BY都可以用来去除重复的数据,但是它们的实现方式有所不同。

DISTINCT关键字用于查询中,可以让查询结果中只显示不重复的记录。例如,如果有一个表格名为employees,其中有多个员工的记录,那么可以使用以下语句查询不同的职位:

SELECT DISTINCT job_title FROM employees;
GROUP BY子句用于分组查询,它根据指定的列对数据进行分组,然后返回每个组的统计信息。例如,如果有一个表格名为sales,其中有多个客户的记录,那么可以使用以下语句查询每个客户的总销售额:

SELECT customer_id, SUM(amount) as total_salesFROM salesGROUP BY customer_id;
在上述例子中,GROUP BY子句根据customer_id对记录进行分组,并返回每个组的总销售额。

对null不可以使用 != null 来判断

在这里插入图片描述

mysql中的内存表虚拟表

在这里插入图片描述

mysql中的not in或者 in 操作 会自动过滤掉 null

在这里插入图片描述

  1. 使用in的时候,忽略为null的,不会查询出comm为null的数据
select * from emp e where e.comm in (300, 500, null);

in 相当于or,mysql中在in操作符后面的括号里对于null值的判断不是 is null 而是=,因而对于null值判断永远都是false。

注意: java中的 null == null 返回的true

  1. 使用not in的时候,如果 not in后面的选项中没有null且not in 后面没有跟子查询,只会查询从comm列不为空的列中过滤,会过滤掉comm为null的数据
select * from emp e where e.comm not in (300, 500);

not in 后面跟子查询会查出包含null的结果集

select * from emp e where e.comm not in (select e2.comm from emp e2 where e.comm is not null)
  1. 使用not in 的时候,如果not in后面的选项中有null,不会查询出来任何数据。sql语句本身直接返回false(因为not in 相当于 !=* && != * && != null, 因为数据库中null和任何值比较(无论是 = 还是 !=)都会返回false),所以使用not in的时候,要保证in中的条件不会出现null的情况,不然可能会出现意想不到的情况。
select * from emp e where e.comm not in (300, 500, null);

!=和<>通常可以互换。但是,并非所有 DBMS 都支持这两种不等于操作符,另外!=和<>是 不会包括值为N ULL的数据的,这个细节从侧面映证了NULL在数据库当中有其特殊的含义

另外对于存在not in 语句最理想的解决办法是尽量避免使用NOT IN,除非必须使用并且可以保证结果绝对有默认值, 更好的建议是使用 left join 连接查询进行替代,或者可以使用not exists 语句进行改写

改写方式1:

select * from emp e where  not exists (select 1 from emp e2 where e2.comm != 300 and e2.comm != 500 )

改写方式2:

使用连接查询

在这里插入代码片

从数据库的设计层面来了解一下为什么不能使用!=null

多数程序员的认知里面包括编程语言的认知都是1和0,也就是"真和假",但是主流数据库的设计却并不是如此,他们在设计中使用了第三个条件:不确定 ,什么叫不确定?用我们通俗的语言的来讲就是"404"(找不到),而用程序的话来讲就是“unknown ”(不知道)。但是数据库是只返回查询结果为“true”的结果的,对于false的内容和“unknown ”是不认识的。

​ null 你可以理解为一片空。=代表等值,假设数据库是一个货架,你可以问货架上的一个格子里装的是1吗(是否=1)?然后传回一个值,这个格子里是1或者不是1。你也可以问格子里装的是0吗?然后返回一个值,是0或者不是0。但是你不能问这个格子里装的是空吗(是否=null) ?因为不存在『装在格子里的空』,只存在『空的格子』所以应该问『这个格子是否是空的?(是否 is null) 』 所以永远都应该使用 is null 而不是=null。
​ 通常情况下数据库建表的时候默认是 NULL,但在工作中一般建表的时候都会禁止使用 NULL 的!
​ 因为NULL 表示的是什么都没有,它与空字符串、0 这些是不等价的,是不能用于比较的 如: … = NULL 、== NULL = ‘’== 得到的结果为 false,判断 NULL 必须使用 IS NULLIS NOT NULL 进行判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值