10、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?
alter table drop column score; alter table add colunm score int;
可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
这样的操作时无法回滚的,在我的印象中,只有inert update delete等DML语句才能回滚, 对于create table,drop table ,alter table等DDL语句是不能回滚。
解决方案一,update user set score=0;
解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就alter table user drop column score;alter table user add column score int。
下面代码实现每年的那个凌晨时刻进行清零。 Runnable runnable = new Runnable(){
public void run(){ clearDb(); schedule(this,new Date(new Date().getYear()+1,0,0));
} };
schedule(runnable, new Date(new Date().getYear()+1,0,1));
10、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。 select count(*) as num,tb.id
from tb,
(select role from tb where id=xxx) as t1 where
tb.role = t1.role and tb.id != t1.id group by tb.id having
num = select count(role) from tb where id=xxx; 8. xxx公司的sql面试 Table EMPLOYEES Structure:
EMPLOYEE_ID NUMBER Primary Key, FIRST_NAME VARCHAR2(25), LAST_NAME VARCHAR2(25), Salary number(8,2), HiredDate DATE,
Departmentid number(2) Table Departments Structure:
Departmentid number(2) Primary Key,
DepartmentName VARCHAR2(25).
(2)基于上述EMPLOYEES表写出查询:写出雇用日期在今年的,或者工资在[1000,2000]之间的,或者员工姓名(last_name)以’Obama’打头的所有员工,列出这些员工的全部个人信息。(4分) select * from employees
where Year(hiredDate) = Year(date()) or (salary between 1000 and 200)
or left(last_name,3)='abc';
(3) 基于上述EMPLOYEES表写出查询:查出部门平均工资大于1800元的部门的所有员工,列出这些员工的全部个人信息。(4分)
mysql> select id,name,salary,deptid did from employee1 where (select avg(salary)
from employee1 where deptid = did) > 1800;
(4) 基于上述EMPLOYEES表写出查询:查出个人工资高于其所在部门平均工资的员工,列出这些员工的全部个人信息及该员工工资高出部门平均工资百分比。(5分) select employee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary from employee1,
(select deptid,avg(salary) avgSalary from employee1 group by deptid) as t where employee1.deptid = t.deptid and employee1.salary>t.avgSalary;
1、注册Jdbc驱动程序的三种方式
1、用JDBC如何调用存储过程 代码如下:
package com.huawei.interview.lym;
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types;
public class JdbcTest {
/**
* @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub Connection cn = null;
CallableStatement cstmt = null;
try { //这里最好不要这么干,因为驱动名写死在程序中了
Class.forName(\
//实际项目中,这里应用DataSource数据,如果用框架,
//这个数据源不需要我们编码创建,我们只需Datasource ds = context.lookup() //cn = ds.getConnection();
cn = DriverManager.getConnection(\ cstmt = cn.prepareCall(\cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1, \
cstmt.setInt(2, 25); cstmt.execute();
//get第几个,不同的数据库不一样,建议不写 System.out.println(cstmt.getString(3));
} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
finally {
/*try{cstmt.close();}catch(Exception e){} try{cn.close();}catch(Exception e){}*/ try { if(cstmt != null)
cstmt.close(); if(cn != null)
cn.close();
} catch (SQLException e) { // TODO Auto-generated catch block }
e.printStackTrace();
} }
1、JDBC中的PreparedStatement相比Statement的好处
答:一个sql命令发给服务器去执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执行指令等过程。
select * from student where id =3----缓存--?xxxxx二进制命令 select * from student where id =3----直接取-?xxxxx二进制命令 select * from student where id =4--- -?会怎么干?
如果当初是select * from student where id =?--- -?又会怎么干? 上面说的是性能提高 可以防止sql注入。
1. 写一个用jdbc连接并访问oracle数据的程序代码
2、Class.forName的作用?为什么要用?
答:按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。 有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring的ioc中每次依赖注入的具体类就是这样配置的,jdbc的驱动类名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名。
3、大数据量下的分页解决方法。
答:最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。
sql语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql: sql server:
\
mysql:
String sql =
\String sql =
\
\
oracle:
String sql =
\
(select *,rownum rid from (select * from students order by postime desc) where rid<=\pagesize*pagenumber + \
\
4、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). Connection cn = null; PreparedStatement pstmt =null; Resultset rs = null; try {
Class.forname(driveClassName);
cn = DriverManager.getConnection(url,username,password);
pstmt = cn.prepareStatement(“select score.* from score ,student “ +
“where score.stuId = student.id and student.name = ?”);
pstmt.setString(1,studentName); Resultset rs = pstmt.executeQuery(); while(rs.next()) { }
system.out.println(rs.getInt(“subject”) + “ ” + rs.getFloat(“score”) );
}catch(Exception e){e.printStackTrace();} finally { }
if(rs != null) try{ rs.close() }catch(exception e){}
if(pstmt != null) try{pstmt.close()}catch(exception e){} if(cn != null) try{ cn.close() }catch(exception e){}
5、这段代码有什么不足之处? try {
Connection conn = ...; Statement stmt = ...;
ResultSet rs = stmt.executeQuery(\
while(rs.next()) { }
} catch(Exception ex) { }
答:没有finally语句来关闭各个对象,另外,使用finally之后,要把变量的定义放在try语句块的外面,以便在try语句块之外的finally块中仍可以访问这些变量。
36、说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。
4、为什么要用 ORM? 和 JDBC 有何不一样?
orm是一种思想,就是把object转变成数据库中的记录,或者把数据库中的记录转变成objecdt,我们可以用jdbc来实现这种思想,其实,如果我们的项目是严格按照oop方式编写的话,我们的jdbc程序不管是有意还是无意,就已经在实现orm的工作了。
现在有许多orm工具,它们底层调用jdbc来实现了orm工作,我们直接使用这些工具,就省去了直接使用jdbc的繁琐细节,提高了开发效率,现在用的较多的orm工具是hibernate。也听说一些其他orm工具,如toplink,ojb等。 8. XML部分