SQL & 第一阶段面试题测试

本次测试为阶段性小测,主要目的在于测试 SQL 熟练程度以及第一阶段面试题掌握程度

测试时长:120 分钟

SQL 部分

简答题

  1. MySQL 中常用的数据类型有哪些,分别与 Java 的哪些类型对应
  1. mysql java
  2. bigint long
  3. varchar String
  4. decimal Bigdecimal
  5. date/datetime java.util.date
  6. int Interger
  1. 请简述 ORM 思想,以及表与类之间的映射关系
  1. 答:ORm思想其实主要就是将数据库表结构与java中的对象映射起来,比如数据库中的表对应了java中的一个类,数据库表中的列名对应了类的字段,而表中的一行数据就代表表了一个对象
  1. 请简述什么是 DDL、DML 和 DQL
  1. 答:DDL数据定义语言,主要是用来打开数据库和建表删表的
  2. DML数据操作语言,通过sql语句对数据库表进行增删改
  3. DQL数据查询语言,通过sql语句对数据进行查询操作
  1. MyISAM 和 InnoDB 存储引擎有什么区别?该如何选择?
  1. 答:最主要的区别在于InnoDB支持外键,支持事务,而MyISAM不支持,应基于实际需求,若要对程序要进行事务控制则选择InnoDB,不需要则选择MyISAM
  1. 请简单描述下事物的四大特性
  1. 答:1.原子性:事务里可包含多个业务,多个业务可视为一个原子不可分割,要么同时失败,要么同时成功2.一致性:事务最终达成的状态与预期结果相符3.隔离性:事务与事务之间是独立的隔离的,不会影响到彼此4.持久性:事务完成之后,数据会被持久化到磁盘中

SQL 题

  1. 为以下模型对象创建表,并写出对应的建表语句
  1. public class Student {
  2. // 学号:主键 & 非空 & 自增
  3. private Long id;
  4. // 姓名:非空
  5. private String name;
  6. // 生日
  7. private Date birthDay;
  8. // 性别:0=未知,1=男,2=女
  9. private Integer gender;
  10. // 学分:默认为 100 分
  11. private Double score;
  12. // 老师姓名
  13. private String teacher;
  14. }
  1. # 请在下方写出对应以上类以及注释描写相关约束的建表语句
  2. create table student(
  3. bigint id, primary key, Not Null,Auto_increment,
  4. varchar name, Not NUll,
  5. int gender,
  6. decimal score,defult 100,
  7. varchar teacher
  8. )
  1. 请分别使用插入完整列的数据、插入部分数据以及批量插入三种方式为学生表初始化数据
  1. 1.插入完整数据
  2. INSERT INTO student (name,birthDay,gender,score,teacher) VALUES ('kinkin','2000-06-07',2,98,'pp')
  3. 2.插入部分数据
  4. INSERT INTO student(name,teacher) VALUES ('Connie','bomm')
  5. 3.批量插入
  6. INSERT INTO student VALUES ('Tom','2055-05-02',1,84,'coco'),('Jerry','1990-06-07',2,94,'Tony')
  1. 找到学号为 3 的学生,将其分数减去 10 分
  1. SELECT score - 10 newScore FROM student WHERE id = 3
  1. 删除 id 小于 3 的学生
  1. DELETE FROM student WHERE id < 3
  1. 查询分数大于 70 的学生信息,并按照分数进行降序排序
  1. SELECCT * FROM student WHERE score > 70 and score DESC
  1. 统计分数小于 60 的学生数量
  1. SELECT COUNT(*) FROM student WHERE score < 60
  1. 查询 2000 年 1 月 1 日以后出生的学生人数
  1. SELECT COUNT(*) FROM student WHERE birthday > '2000-01-01'
  1. 查询 “小刘” 老师的学生平均学分是多少
  1. SELECT AVG(score) FROM student WHERE teacher = '小刘'
  1. 查询老师为小刘、小熊、小王或小何且分数在 60-80 之间的学生信息
  1. SELECT * FROM student WHERE score BETWEEN 60 AND 80 and teacher in ('小刘','小熊','小王','小何')
  1. 查询班级前三名学生信息
  1. SELECT * FROM student score DESC limt 0,3

第一阶段面试题

  1. 什么是 JDK 什么是 JRE,他们之间有什么关系?
  1. 答:JREjava运行环境,jdkjava开发环境,jdk是基于JRE的基础上去运行的
  1. 八大基本类型是哪些,其中每个类型占用的字节大小分别是多少
  1. 答:八大基本类型:int(4),long(8),char(2),short,boolean(1),byte(1),double(8),float(4)
  1. Override 和 Overload 有什么区别?
  1. 答:Overload是重载,重载是发生在同一个类中,方法名相同,方法参数列表(参数类型,参数个数,参数顺序)不同,方法返回值类型可以不同
  2. Override重写是基于继承的基础上发生在子类重写父类中的方法,要求子类重写父类的方法必须方法名,参数列表相同,方法返回值类型必须小于父类或者是其子类,方法访问权限必须大于等于父类,子类抛出的异常范围要小于父类
  1. 抽象类和接口的区别是什么?
  1. 答:1.接口中的方法都是抽象方法,不能有具体的实现,(JAVA8之后,可以有默认的实现方法),而抽象类中的方法可以有抽象方法也可以有其他普通方法2.接口中只有static,final变量,而抽象类中不一定3.接口中的方法默认都是public修饰,而抽象类中方法可以由public,protected,default修饰4.抽象类只能继承一个类,而接口可以继承多个接口
  1. 字节流与字符流有什么区别?该如何选择?
  1. 答:字符流是基于字节流的基础上由JVM自动转换过来的,但是这个操作比较耗时,而且在不清楚编码格式的情况下还容易导致乱码,当需要直接操作字符的时候可以选择字符流,当需要将一些音频,视频等二进制文件存入磁盘中时,还是选用字节流
  1. transient 关键字有什么作用?
  1. 答:transient关键字只能修饰变量不能修饰方法和类,被transient修饰的变量可防止被序列化,且能防止被反序列化时,该变量不会被持久化和修复
  1. final、finally、finallize 的区别
  1. 答:final修饰的类不能被继承,final修饰的变量不能再被修改,final修饰的方法不能再被重写,内部类若要访问外部类的局部变量时,须得将变量设置成final类型的(特别是线程)
  2. finally是异常语句结构的一部分,总是被执行
  3. finallizeObject的一个方法,当jvm垃圾处理器回收时,会调用被回收对象的该方法,以此代替垃圾处理机制回收其他资源,但JVM不能保证该方法总是被调用
  1. ArrayList 和 LinkedList 的区别
  1. 答:1.都是List的子接口,ArrayList底层数据结构是Object数组,LinkedList底层数据结构是双向链表
  2. 2.访问数据的快慢:因为ArrayList底层是数组的原因,能通过索引位置快速访问查找到具体的元素,而LinkedList不行
  3. 3.两个集合都是非线程安全的集合,但里面的元素都是有序的
  4. 4.ArrayList会在尾部预留出一大节空间用于存储,但是也造成了空间的浪费,而LinkedList造成的空间浪费更多,因为它会在它的前后预留出空间来存储直接前驱和直接后继还有数据
  1. 请从继承和使用两个层面来描述 List、Set 以及 Map 三者的区别
  1. 答:List集合里面的元素有序且能重复,子接口有ArrayList(底层结构数组) , LinkedList(底层结构双向链表),set集合里面的元素无序且唯一,子接口有hashset(底层结构哈希表),treeset(底层结构二叉树),Map是通过存储一对键值对(keyvalue),key的值是有序的,由于它们的底层数据结构不同,当要使用它们时,从具体的需求,去考虑,结合它们的底层实现原理去选择具体的集合
  1. 线程的状态有哪些?请简单描述每个状态的概念
  1. 答:最主要的几个状态
  2. 新生状态:new,还没有调用satrt()方法前的状态
  3. 就绪状态:资源什么的已就绪,就等待cpu的调度
  4. 阻塞状态:由于等待IO资源,其他网络资源,其他线程sleep(),join()造成的状态
  5. 结束状态:线程顺利结束后的状态
  1. 什么是线程死锁?怎么解决死锁?
  1. 答:线程死锁其实就是因为线程间抢夺资源,但是又不肯释放资源而陷入僵持状态,从而导致程序无法正常执行的状态,造成线程死锁的原因:1.互斥条件:一个资源只能被一个线程所拥有2.不可剥夺条件:一个线程先运行完之后再释放自身的资源,不能由其他线程来抢夺3.循环等待条件:线程间是有顺序,头尾相接等待资源4.请求等待保持条件:当一个线程在申请其他资源时,又申请不到,不释放自身资源
  2. 解决死锁:从造成死锁的原因入手1.互斥条件:有锁,不能破坏2.不可剥夺条件:不等线程运行完,直接去抢夺它的资源3.循环等待条件:不按照顺序,逆序释放资源4.请求等待保持条件:一次申请所有资源
  1. 如何保证多个线程(t1/t2/t3)按照顺序依次执行?
  1. 答:通过调用join方法,调用该方法的线程会先执行,而其他线程等待
  1. 什么是线程安全问题?有哪些解决方案?
  1. 答:线程安全其实就是很多线程同时去争夺抢占cpu的资源调度,而导致cpu运行轨迹不同,程序无法正常运行的问题,解决方法就是给线程加锁,只有拥有该锁的线程才能调用资源,其他线程等待
  1. JVM 运行时内存区域有哪些?分别有什么作用?
  1. 答:方法区:加载类信息生成.class文件和配置文件 堆区:当方法调用的时候会在该区开辟出一个内存空间,但空间会随方法调用的结束而消失 栈区:当new一个新对象时,就会在该区开辟一块内存空间
  1. JDK8 常用的新特性有哪些?
  1. 答:1.lambada表达式:优化代码,使代码变得更加简洁
  2. 2.stream表达式:有基于lambda表达式的基础上进行更改,使得我们的代码更加优化和简洁,可读性也变强了