您的位置:首页 > 职场人生

数据库 SQL面试题

2015-08-13 16:58 169 查看
数据库 SQL面试题
1) 谈一下数据库的索引的原理,如何发挥作用的?针对插入操作索引会起正面作用么?



索引类似于书的目录,主要用于提高查询效率,也就是按条件查询的时候,先查询索引,再通过索引找到相关的数据,索引相当于记录了对某个关键词,指定到不同的文件,或者文件里的不同位置的结构

索引会降低数据更新的效率,当插入、修改、删除时会引起索引结构的更新



2) 数据库表里如果数据行数很多,做分页查询,SQL如何书写?



3) 说说group by, having是做什么的,举一个group by的例子



4) 说说外连接和内连接的区别



5) 事务是什么概念,举例说明



6) 一个表:emp(姓名,性别,年龄,工作类型,领导姓名,工资,部门)

a) 列出每个部门的最高工资和最低工资

Select max(工资),min(工资) from emp group by部门

b) 列出各部门’工作类型’为’普通职员’的最低和最高工资

Select max(工资),min(工资) from emp group by部门

Where工作类型=’ 普通职员’

c) 列出高于本部门平均工资的员工姓名,工资,部门

select 姓名,工资,部门 from emp e1 where工资>(

selectavg(工资)from emp e2 where e2. 部门=e1.部门

)



存储过程和函数的区别是什么?

答:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值,并且不涉及特定用户表。

4.事务是什么?

答:事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须有4个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能称为一个事务。

5.游标的作用是什么?如何知道游标已经到了最后?

答:游标用于定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断其是否到了最后。通常此变量不等于0表示出错或到了最后。

7.什么叫做SQL注入式攻击?如何防范?

答:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。防范SQL注入式攻击闯入:只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。如:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。

10.什么是聚集索引?什么是非聚集索引?什么是主键?

答:表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键。聚集索引确定表中数据的物理顺序。一个表中只能包含一个聚集索引。非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储。

11.现有一张表,有两个字段:ID,NAME。ID为主键。如果希望查询出所有拥有2个或更多ID 的NAME,查询语句应该如何写?

select[Name] from group by(name) having(count([ID]>=2)。

15.一般数据库若出现日志满了,会出现什么情况,是否还能使用?

答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。也就是说基本上处于不能使用的状态。



19.学生其存放在Student表中,学生选课情况存放在SC表中,课程情况存放在Course表中




(1)查询与“刘晨”在同一个系学习的学生。

答:SELECT Sno,Sname,Sdept FROM Student WHERE SdeptIN(SELECT Sdept FROM Student WHERE Sname=’刘晨’);

或者:SELECT S1.Sno,S1.Sname,S1.Sdept FROM StudentS1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=’刘晨’;

(2)查询选修了课程名为“信息系统”的学生学号和姓名

答:SELECT Sno,Sname FROM Student WHERE Sno IN(SELECT SnoFROM SC) WHERE Cno IN(SELECT Cno FROM Course WHERE Cname=’信息系统’);

或者:SELECT Sno,Sname FROM Student,SC,Course WHEREStudent.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=’信息系统’;

用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。(employee:

eid,ename,salary,deptid;)



select * from employee order by deptid desc,salary



列出各个部门中工资高于本部门的平均工资的员工号和部门号,并按部门号排序

createtable employee921(id int primary key ,name varchar(5

0),salarybigint,deptid int);

Select id,deptid from employee921as e1 where salary>(

Select avg(salary) from employee921 as e2 whre e2.deptid= e1.deptId

)

select a.ename,a.salary,a.deptid

from emp a,

(selectdeptd,avg(salary) avgsal from emp group by deptid ) b

wherea.deptid=b.deptid and a.salary>b.avgsal;



分页语句取出sql表中第31到40的记录(以自动增长ID为主键)

sql server方案:

selecttop 10 * from t where id not in (select top 30 id from t order by id ) orde byid



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

name kecheng fenshu

张三 语文 81

张三 数学 75

李四 语文 76

李四 数学 90

王五 语文 81

王五 数学 100

王五 英语 90

select distinct name from score where name notin (select distinct name from score where score<=80)





用JDBC如何调用存储过程

Connection conn=super.getConn();
CallableStatement statement=null;
try {
statement=conn.prepareCall("{call proc_UpdateLevel(?,?,?,?)}");
statement.setString(1, cusNo);
statement.setInt(2, year);
statement.registerOutParameter(3, Types.VARCHAR);
statement.registerOutParameter(4,Types.FLOAT);
statement.execute();
Stringcuslevel=(String)statement.getObject(3);
Doublemoney=(Double)statement.getObject(4);
System.out.println(cuslevel+" "+money);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
statement.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: