java类和mysql数据类型对应
java类 | mysql数据库 | |
---|---|---|
java.lang.Byte | byte | TINYINT |
java.uitl.Currency | timezone | VARCHAR |
java.lang.Short | short | SMALLINT |
java.lang.Integer | integer | INTEGER |
java.lang.Long | long | BIGINT |
java.lang.Float | float | FLOAT |
java.lang.Double | double | DOUBLE |
java.lang.BigDecimal | big_decimal | NUMERIC |
java.lang.String | string | VARCHAR |
java.lang.Boolean | true_false | CHAR(1) |
java.lang.Boolean | yes_no | CHAR(1) |
java.uitl.Date / java.sql.Date | date | DATE/DATETIME |
java.sql.Time | time | TIME |
java.sql.Timestamp | timestamp | TIMESTAMP |
java.uitl.Calendar | celendar | TIMESTAMP |
java.io.Serializable | serializable | VARBINARY/BLOB |
java.sql.Clob | clob | CLOB |
java.sql.Blob | blob | BLOB |
java.lang.Class | class | VARCHAR |
java.uitl.Locale | locale | VARCHAR |
java.uitl.TimeZone | timezone | VARCHAR |
java.uitl.Currency | currency | VARCHAR |
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
- 使用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
- 使用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)
- 使用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 NULL
或 IS NOT NULL
进行判断。
MySQL中的IF()
MySQL中的IF()函数用于进行条件判断,并根据条件返回不同的值。
基本语法
IF(expr, v1, v2)
expr:需要判断的条件表达式。
- v1:如果expr为真(非零或非NULL),则返回v1。
- v2:如果expr为假(零或NULL),则返回v2。