package com.chp.mysql; import java.sql.CallableStatement; import
java.sql.Connection; import java.sql.DriverManager; import
java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Types;
public class Jdbc { public static void main(String[] args) { // 1.加载驱动类 try {
Class.forName("com.mysql.jdbc.Driver"); // 2.建立连接 String url =
"jdbc:mysql://localhost:3306/java"; Connection con =
DriverManager.getConnection(url, "root", "root"); // 查询 String sql = "select *
from teacher"; //使用preparedStatement作用:性能更高,防止sql注入 PreparedStatement ps =
con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next())
{ System.out.println(rs.getString(1)+rs.getString(2)); } // 增删改 sql = "update
teacher set name =? where teaId=?"; ps = con.prepareStatement(sql);
ps.setString(1, "程老师"); ps.setInt(2, 1); ps.executeUpdate(); //调用存储过程
CallableStatement cstm=con.prepareCall("{call myProdure(?,?,?)}");
cstm.setString(1, "苍老师"); cstm.setInt(2, 99); cstm.registerOutParameter(3,
Types.INTEGER); cstm.execute(); System.out.println(cstm.getInt(3));
//执行完需要关闭jdbc对象 if (rs != null) {//关闭记录集 rs.close(); } if (ps != null) {//关闭声明
ps.close(); } if (con != null) {//关闭连接对象 con.close(); } } catch (Exception e) {
e.printStackTrace(); } } }
一.前言

 
 本人是搞java系统开发这块的,数据库是面试笔试的重点,所以特定整理了一些自己遇到的自认为有价值和他人遇到的好的面试题进行整理.这篇就当做题集.会不定期更新此篇题集.

 

题目1

    什么是数据库事务?

 
答案:单个逻辑单元执行的一系列操作,这些操作要么全做要么全不做,是不可分割的.事务的开始和结束用户是可以控制的,如果没控制则由数据库默认的划分事务.事务具有以下性质:

(1)原子性

    指一个事务要么全执行,要么全不执行.也就是说一个事务不可能执行到一半就停止了.比如:你去买东西,钱付掉了,东西没拿.这两步必须同时执行
,要么都不执行.

(2)一致性

   指事务的运行并不改变数据库中的一致性.比如 a+b=10;a改变了,b也应该随之改变.

(3)独立性

   两个以上的事务不会出现交替运行的状态,因为这样可能导致数据的不一致

(4)持久性

   事务运行成功之后数据库的更新是永久的,不会无缘无故的回滚.

 

题目2

   执行数据库查询时候,如果查询的数据有很多,假设有1000万条,用什么方法可以提高查询效率?在数据库方面或java代码方面有什么优化办法?

1.在数据库设计方面

(1)建立索引

(2)分区(比如说按时间分区)

(3)选取最适用的字段属性(尽量减少字段宽度和使用固定长度的字段)

2.在数据库I/O方面

(1)增加缓冲区

(2)如果涉及到表的级联,最好不同的表放在不同的磁盘,以增加I/O速度

3.Sql语句方法

(1)优化sql语句,减少比较次数,可用连表查询来代替子查询

(2)限制返回的条目数(mysql用limit)

(3)有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就

去掉外键(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)

4.在java方面

如果反复使用的查询,可通过preparedstatement,因为他在运行前已经预编译,只要运行就Ok了.

 

题目3

sql语言的常见问题

1.增删查改之类的问题,连表查询是必出题目,可以参考之前我写的那篇文章

这里讲一些分组查询跟降序升序分页

分组:group by 列名 

统计各个部门薪水大于5000的人数

例子:SELECT department , COUNT(money) from employee where money>=5000group by
department;

 

分页:limit ()

select * from table limit 5; --返回前5行 

select * from table limit 0,5; --同上,返回前5行  

select * from table limit 5,10; --返回6-15行

应用到java里,select * from table limit " +(pageNo-1)*pageSize + "," + pageSize

排序:order by 列名 

asc 和desc 不写默认为升序

前者是升序后者是降序

 

综合题:

 以下两张表,员工表employee 与部门表 department

             

查询结果如下:

请写出sql语句

分析:

我们可以看到这是一般的连表,但是连表的显示的统计人数,所以我们分两步来走

第一步:查出各个部门的对应人数,把这个看做一个新表e1

select e.dep_id,count(name) num from employee e group by dep_id;

第二部:将查询结果与部门表连表

由于查询结果是显示左边的全部表格信息所以用左联,空的话为0,则采用ifnull()函数来解决

select d.*,ifnull(num,0) num  from  department d left  join (select
e.dep_id,count(name) num from employee e group by dep_id) e1 on d.id=e.dep_id;

 

题目四

什么是数据库的三范式?

第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)

数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必

须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两

个独立的字段。

第二范式(2NF):

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必

须先满足第一范式(1NF)。

要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储

各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖

主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成

一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,

以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

第三范式的要求如下:

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一

个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:

1,每一列只有一个值

2,每一行都能区分。

3,每一个表都不包含其他表已经包含的非主关键字信息。

例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,

否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就

是数据冗余

题目五

union 与union all的区别

 

union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排 序运算,删除重复的记录再返回结果。 union all
则会显示重复结果,只是简单的两个结果合并并返回.所以效率比union高,在保证没有重复数据的情况下用union all.

select name from table1

union

select name  from table2;

题目六

.用一条 SQL  语句查询出每门课都大于 80 分的学生姓名 

name kecheng fenshu 

张三   语文          81 

张三   数学          75 

李四   语文          76 

李四   数学          90 

王五   语文          81 

王五   数学        100 

王五   英语         90  

分析:都大于80,他的反面就是<=80,我们可以先求出所有<=80的姓名,然后取反就可以了 

所以sql语句 select name from student where name not in (select  name from student
where fenshu <=80);

 

题目七

求各个部门直接的比赛结果?  有个叫team 的表格,里面有id跟部门名name,如果各个部门要举行比赛用语句求出比赛结果  

select a.name,b.name from game a cross join game b where a.name<b.name;

 

题目八

一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在 多万个用户,若要在

每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决 每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?

 

alter table drop column score;

alter table add colunm score int;

可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,

这样的操作时无法回滚的,在我的印象中,只有 insert update delete 等 DML 语句才能回滚,

对于 create table,drop table ,alter table 等 DDL 语句是不能回滚

题目九

Class.forName()的作用?

按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载

过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该

类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这

个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例

对象了。

题目十

大量数据的分页?

select * from table order by id limit(pagesize*(pageNumbe-1),pagesize);

 

题目十一

统计每年每月的信息
year monthamount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
提示:这个与工资条非常类似,与学生的科目成绩也很相似。

select sales.year ,
(select t.amount from sales t where t.month='1' and t.year= sales.year) ' m
1',
(select t.amount from sales t where t.month=' 2 ' and t.year= sales.year) ' m
2',
(select t.amount from sales t where t.month=' 3 ' and t.year= sales.year) ' m
3',
(select t.amount from sales t where t.month=' 4 ' and t.year= sales.year) as
' m 4' from
sales group by year;

题目十二

. 删除除了 id  号不同, 其他都相同的学生冗余信息
2.学生表如下:
id 号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001       数学         69
2 2005002 李四 0001       数学         89
3 2005001 张三 0001       数学         69

mysql写法:

DELETE FROM student  WHERE ID NOT IN (SELECT t.id FROM(
        SELECT  MIN(id) id FROM student  GROUP BY 学号, 姓名,课程,编号,分数
    ) t)

注意:一定要按上面的写,如果你以为select t.id 多此一举的话那么你就大错特错了,原因:
在mysql中,不能通过嵌套子查询来直接删除或者修改记录,需要通过别名来指定嵌套子查询作为一个临时表。

同时还要注意给min(id)定义一个id别名,不然无法识别列名

 

题目十二

用JDBC如何调用存储过程以及sql调用
package com.chp.mysql; import java.sql.CallableStatement; import
java.sql.Connection; import java.sql.DriverManager; import
java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Types;
public class Jdbc { public static void main(String[] args) { // 1.加载驱动类 try {
Class.forName("com.mysql.jdbc.Driver"); // 2.建立连接 String url =
"jdbc:mysql://localhost:3306/java"; Connection con =
DriverManager.getConnection(url, "root", "root"); // 查询 String sql = "select *
from teacher"; //使用preparedStatement作用:性能更高,防止sql注入 PreparedStatement ps =
con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next())
{ System.out.println(rs.getString(1)+rs.getString(2)); } // 增删改 sql = "update
teacher set name =? where teaId=?"; ps = con.prepareStatement(sql);
ps.setString(1, "程老师"); ps.setInt(2, 1); ps.executeUpdate(); //调用存储过程
CallableStatement cstm=con.prepareCall("{call myProdure(?,?,?)}");
cstm.setString(1, "苍老师"); cstm.setInt(2, 99); cstm.registerOutParameter(3,
Types.INTEGER); cstm.execute(); System.out.println(cstm.getInt(3));
//执行完需要关闭jdbc对象 if (rs != null) {//关闭记录集 rs.close(); } if (ps != null) {//关闭声明
ps.close(); } if (con != null) {//关闭连接对象 con.close(); } } catch (Exception e) {
e.printStackTrace(); } } }
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

技术
©2019-2020 Toolsou All rights reserved,
Element-UI二次封装实现TreeSelect 树形下拉选择组件(精华)2020年8月9日 C#基础知识点 反射python 中的短路逻辑elementui select 获取 value在vue+element-ui中,select选项值动态从后台获取,同时将选中值的id传给后台的方法(精华)2020年7月21日 ASP.NET Core 全局过滤器的使用java几种常见运行时异常及简单例子华为受限老对手受益最大?分蛋糕的人越来越多了!ToastUtils 的使用vue 监听 Treeselect 选择项的改变