[5]Java开发实习面试打卡
Posted Leida_wanglin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[5]Java开发实习面试打卡相关的知识,希望对你有一定的参考价值。
1.常用SQL语句
- 数据定义语言DDL(Data Ddefinition Language)
CREATE,DROP,ALTER
主要为以上操作 集对逻辑结构等有操作的,其中包括表结构,视图和索引. - 数据查询语言DQL(Data Query Language)
SELECT
这个较好理解 即查询操作,以select关键字.各种简单查询,连续查询等都属于DQL. - 数据操纵语言DML(Data Manipulation Language)
INSERT,UPDATE,DELETE
主要为以上操作,即对数据进行操作的,对应上面所说的查询操作DQL与DML共同构建了多数初级程序员常用的增删改查操作.而查询是较为特殊的一种,被划分到DQL中. - 数据控制功能DCL(Data Control Language)
CRANT,REVOKE,COMMIT,ROLLBACK
主要为以上操作,即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等.
1.1.超键,候选键,主键,外键分别是什么?
- 超键:在关系中能够唯一标识元组的属性集称为关系模式的超键.一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键.超键包含候选键和主键.
- 候选键:是最小超键,即没有冗余元素的超键.
- 主键:数据库表中对存储数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null).
- 外键:在一个表中存在的另一个表的主键称此表的外键.
1.2.SQL约束有哪几种?
- NOT NULL: 用于控制字段的内容一定不能为空(NULL).
- UNIQUE:控制字段内容不能重复,一个表允许有多个UNIQUE约束.
- PRIMARY KEY:也是用于控件字段内容不能重复,但它在一个表只允许出现一个.
- FOREIGN KEY:用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一.
- CHECK:用于控制字段的值的范围.
1.3.什么是子查询
1.条件:一条SQL语句的查询结果做为另一条查询语句的条件或查询结果
2.嵌套:多条SQL语句嵌套使用,内部的SQL查询语句称为子查询.
1.3.1.子查询的三种情况
- 子查询是单行单列的情况:结果集是一个值,父查询使用:=,<,>等运算符
-- 查询工资最高的员工是谁?
select * from employee where salary=(select max(salary) from
employee);
- 子查询是多行单列的情况:结果集类似于一个数组,父查询使用:in运算符
-- 查询工资最高的员工是谁?
select * from employee where salary in (select max(salary) from
employee);
- 子查询是多行多列的情况:结果集类似于一张虚拟表,不能用于where条件,用于select子句中作为子表
-- 1) 查询出 2011 年以后入职的员工信息
-- 2) 查询所有的部门信息,与上面的虚拟表中的信息比对,找出所有部门 ID
相等的员工。
select * from dept d, (select * from employee where join_date >
'2011-1-1') e where e.dept_id = d.id;
-- 使用表连接:
select d.*, e.* from dept d inner join employee e on d.id =
e.dept_id where e.join_date > '2011-1-1'
1.4. mysql中in和exists区别
mysql中的in语句是把外表和内表作hash连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的.这个要区分环境的.
- 如果查询的两个表大小相当,那么用in和exists差别不大.
- 如果两个表中一个较少,一个是大表,则子查询表大的用exists,子查询表小的用in.
- not in 和 not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引.所以无论那个表大,用not exists都比not in 要快.
1.5.varchar与char的区别
1.5.1.char的特点
- char表示定长字符串,长度是固定的.
- 如果插入数据的长度小于char的固定长度时,则用空格填充.
- 因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法.
- 对于char来说,最多能存放的字符个数为255,和编码无关.
1.5.2. varchar的特点
- varchar表示可变长字符串,长度是可变的
- 插入的数据是多长,就按照多长来存储.
- varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法.
- 对于varchar来说,最多能存放的字符个数为65532.
总之,结合性能角度(char更快)和节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法.
1.6.drop,delete与truncate的区别
Delete | Truncate | Drop | |
---|---|---|---|
类型 | 属于DML | 属于DDL | 属于DDL |
回滚 | 可回滚 | 不可回滚 | 不可回滚 |
删除内容 | 表结构还在,删除表的全部或一部分数据行 | 表结构还在,删除表中的所有数据 | 从数据库中删除表,所有的数据行,索引和权限也会被删除 |
删除速度 | 删除速度慢,需要逐行删除 | 删除速度快 | 删除速度最快 |
因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete,在保留表而删除所有数据的时候用truncate.
2.SQL的生命周期?
- 应用服务器与数据库服务器建立一个连接
- 数据库进程拿到请求sql
- 解析并生成执行计划,执行
- 读取数据到内存并进行逻辑处理
- 通过步骤一的连接,发送结果到客户端
- 关掉连接,释放资源
3.慢查询日志
用于记录执行时间超过某个临界值的SQL日志,用于快速定位慢查询,为我们的优化做参考.
开启慢查询日志
配置项: slow_query_log
可以使用show variables like 'slow_query_log'
查看是否开启,如果状态值为OFF,可以使用set GLOBAL slow_query_log = on
来开启,它会在datadir下产生一个xxx-slow.log
的文件
设置临界时间
配置项: long_query_time
查看: show CARIABLES like 'long_query_time'
,单位秒
设置: set long_query_time=0.5
实操时应该从长时间设置到短的时间,即将最慢的SQL优化掉
查看日志,一旦SQL超过了我们设置的临界时间就会被记录到xxx-slow.log
中
4.关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
- 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写.
- 分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引
- 如果对语句的优化已经无法进行,可以考虑表中是否太大,如果是的话可以进行横向或者纵向的分表.
5.字段为什么要求定义为not null?
null值会占用更多的字节,且会在程序中造成很多与预期不符的情况.
6.优化查询过程中的数据访问
- 访问数据太多导致查询性能下降
- 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
- 确认MySQL服务器是否在分析大量不必要的数据行
- 避免犯如下SQL语句错误
- 查询不需要的数据.解决办法:使用limit解决
- 多表关联返回全部列.解决办法:指定列名
- 总是返回全部列.解决办法:避免使用SELECT *
- 重复查询相同的数据.解决办法:可以缓存数据,下次直接读取缓存
- 是否在扫描额外的记录.解决办法:使用explain进行分析,如果发现查询需要扫描大量的数据,但只返回少数的行,可以通过如下技巧去优化:
- 使用索引覆盖扫描,把所有的列都放在索引中,这样存储引擎不需要回表获取对应行就可以返回结果
- 改变数据库和表的结构,修改数据表达式
- 重写SQL语句,让优化器可以以更优的方式执行查询.
7.优化特定类型的查询语句
- count(*)会忽略所有的列,直接统计所有列数,不要使用count(列名)
- MyISAM中,没有任何where条件的count(*)非常快.
- 当有where条件时, MyISAM的count统计不一定比其它引擎快.
- 可以使用explain查询近似值,用近似值代替count(*)
- 增加汇总表
- 使用缓存
以上是关于[5]Java开发实习面试打卡的主要内容,如果未能解决你的问题,请参考以下文章