mysql基础

一、核心技术

1.常见日期格式

date和datetime类型区别

区别1:

①date类型可用于需要一个日期值而不需要时间部分时;

②datetime类型:可用于需要同时包含日期和时间信息的值。

区别2:

①date:MySQL 以 ‘YYYY-MM-DD’ 格式检索与显示date值;

②datetime:MySQL 以 'YYYY-MM-DD HH:mm:ss’格式检索与显示 DATETIME 类型。

区别3:

①date类型:支持的范围是 ‘1000-01-01’ 到’9999-12-31’;

②datetime类型:支持的范围是’1000-01-0100:00:00’ 到 ‘9999-12-3123:59:59’。

2.mysql驱动版本对比

老版本驱动,一般指5.x版本:

driverClassName: com.mysql.jdbc.Driver

新版本驱动,一般指8.x版本:

driverClassName: com.mysql.cj.jdbc.Driver

总结:使用mysql数据库,代码中使用的数据库版本要和数据库服务版本保持一致,并且数据库驱动准确无误才可以正常创建连接

mysql中in 和exists 区别。

exists:
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false

not exists:
not exists与exists相反,也就是当exists条件有结果集返回时,loop到的记录将被丢弃,否则将loop到的记录加入结果集

in
in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引(外表效率高,可用大表),而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。

@see MySQL中exists和in的区别及使用场景 https://www.cnblogs.com/xiaoxiong-kankan/p/7928153.html

思考

1.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 ID 是几?

6
一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(上文中提到的)MySQL的话,这条记录的ID是5。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。
但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。

@see Java面试题(四):数据库 https://www.jianshu.com/p/4ff8add187a4

2. limit深度分页问题

普通的limit m,n,m表示偏移量,n表示返回条数,当m偏移量很大时,就需要扫描过多的表数据,例如limit 1000000,100,查询就需要扫描1000100条,然后舍弃掉不符合条件的前1000000条,效率自然也就低了。

我们大概有3种方式来解决limit分页慢的问题,请根据自己的数据量和业务需求进行选择:
1、id连续的情况下,直接用where id>500的方式来解决
2、id不连续的情况下,使用select id from test limit 5000000,1来获取limit起始值,但是实际测试发现效果不大
3、id不连续的情况下,新建一个order_no字段用来计算起始值,效率很高,但是需要解决order_no更新的问题
4、限制查询页数

参考:数据量大时limit分页慢的问题https://www.jianshu.com/p/b40852891fb0

二、sql运维

1.SELECT结果直接INSERT

INSERT INTO `table1`(`Column1`,`Column2`,`Column3`)         
SELECT t2.Column1,t2.Column2,t2.Column3  FROM `table2` t2 WHERE XXX;

例子

INSERT INTO `sys_i18n` ( `business_type`, `language`, `i18n_key`, `i18n_value`, `remark`, `version`, `is_deleted`, `create_by`, `create_time`, `update_by`, `update_time` ) 
SELECT
'general' AS `business_type`,
`language`,
`i18n_key`,
`i18n_value`,
'从客诉导入' AS `remark`,
`version`,
`is_deleted`,
`create_by`,
`create_time`,
`update_by`,
`update_time` 
FROM
        `cpgroup_shrimp_scm`.`cp_shrimp_sys_i18n` 
WHERE
        `i18n_key` IN ( 'i18n.general.onlyExcelIsSupported', 'i18n.general.excelTemplateFormatIsIncorrect', 'i18n.excelImport.disposalErrorMsg1', 'i18n.general.missRequiredParams' );

参考文献

1.mysql中文官网 https://www.mysqlzh.com/
1.oracle中if/else功能的实现的3种写法 https://www.cnblogs.com/yangzhilong/archive/2013/04/03/2998282.html
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值