java面试题-数据库

1.根据部门号从高到低,工资从低到高列出每个员工的信息。

select * from employee order by deptid desc,salary

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

创建表:

mysql> create table employee921(
            id int primary key auto_increment,
            name varchar(50),
            salary bigint,deptid int
        );

插入实验数据

mysql> insert into employee921 values(null,'zs',1000,1),(null,'ls',1100,1),(null,'ww',1100,1),(null,'zl',900,1) ,(null,'zl',1000,2), (null,'zl',900,2) ,(null,'zl',1000,2) , (null,'zl',1100,2);

编写sql语句:

  • 1.查找各部门平均工资:
SELECT AVG(salary),deptid FROM employee921 GROUP BY deptid;

结果:
这里写图片描述

  • 2.查找各部门大于平均工资的人:
SELECT employee921.id,employee921.name,employee921.salary,employee921.deptid tid FROM  employee921 
WHERE salary > (SELECT AVG(salary) FROM employee921 GROUP BY deptid HAVING deptid = tid);

结果:

这里写图片描述

  • 3.各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序
SELECT COUNT(*) ,tid 
    FROM (

        SELECT employee921.id,employee921.name,employee921.salary,employee921.deptid tid FROM  employee921 WHERE salary > (SELECT AVG(salary) FROM employee921 GROUP BY deptid HAVING deptid = tid)
    ) AS t 
    GROUP BY tid ;

结果

这里写图片描述

3. 数据库三范式是什么?
  • 第一范式(1NF)字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)
    数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。

  • 第二范式(2NF):
    第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
    要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键

    第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

  • 第三范式的要求如下
    满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
    所以第三范式具有如下特征
    1,每一列只有一个值
    2,每一行都能区分。
    3,每一个表都不包含其他表已经包含的非主关键字信息。

    例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。

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

表:

name   kecheng   fenshu 
张三     语文       81
张三     数学       75
李四     语文       76
李四     数学       90
王五     语文       81
王五     数学       100
王五     英语       90

准备数据的sql代码:

create table score(id int primary key auto_increment,name varchar(20),subject varchar(20),score int);
insert into score values 
(null,'张三','语文',81),
(null,'张三','数学',75),
(null,'李四','语文',76),
(null,'李四','数学',90),
(null,'王五','语文',81),
(null,'王五','数学',100),
(null,'王五 ','英语',90);

提示:当百思不得其解时,请理想思维,把小变成大做,把大变成小做,

答案:

 select distinct name from score  where  name not in (select distinct name from score where score<=80)
5.所有部门之间的比赛组合
select a.name, b.name 
from team a, team b 
where a.name < b.name
6.统计每年每月的信息

这里写图片描述

准备sql语句:

drop table if exists sales;
create table sales(id int auto_increment primary key,year varchar(10), month varchar(10), amount float(2,1));
insert into sales values
(null,'1991','1',1.1),
(null,'1991','2',1.2),
(null,'1991','3',1.3),
(null,'1991','4',1.4),
(null,'1992','1',2.1),
(null,'1992','2',2.2),
(null,'1992','3',2.3),
(null,'1992','4',2.4);

答案

SELECT sales.year ,
(SELECT t.amount FROM sales t WHERE t.month='1' AND t.year= sales.year) 'm1',
(SELECT t.amount FROM sales t WHERE t.month='2' AND t.year= sales.year) 'm2',
(SELECT t.amount FROM sales t WHERE t.month='3' AND t.year= sales.year) 'm3',
(SELECT t.amount FROM sales t WHERE t.month='4' AND t.year= sales.year) AS 'm4' 
FROM sales  GROUP BY YEAR;
7.删除除了id号不同,其他都相同的学生冗余信息

学生表 如下

这里写图片描述

创建表并插入数据:

CREATE TABLE student2(id INT AUTO_INCREMENT PRIMARY KEY,CODE VARCHAR(20),NAME VARCHAR(20));
INSERT INTO student2 VALUES(NULL,'2005001','张三'),(NULL,'2005002','李四'),(NULL,'2005001','张三');
student2

删除冗余信息数据:

DELETE FROM student2 WHERE id NOT IN(SELECT MID FROM (SELECT MIN(id) MID
FROM student2 GROUP BY NAME) AS t);

或者

DELETE FROM student2 WHERE id NOT IN(SELECT MIN(id) FROM (SELECT * FROM student2) AS t GROUP BY t.name);
8.求出小于45岁的各个老师所带的大于12岁的学生人数

数据库中有3个表 teacher 表,student表,tea_stu关系表。

teacher 表 teaID name age 
student 表 stuID name age 
teacher_student表 teaID stuID 

要求用一条sql查询出这样的结果

1.显示的字段要有老师name, age 每个老师所带的学生人数
2 只列出老师age为40以下,学生age为12以上的记录

实验准备

DROP TABLE IF EXISTS tea_stu;
    DROP TABLE IF EXISTS teacher;
    DROP TABLE IF EXISTS student;
      CREATE TABLE teacher(teaID INT PRIMARY KEY,NAME VARCHAR(50),age INT);
      CREATE TABLE student(stuID INT PRIMARY KEY,NAME VARCHAR(50),age INT);
      CREATE TABLE tea_stu(teaID INT REFERENCES teacher(teaID),stuID INT REFERENCES student(stuID));
INSERT INTO teacher VALUES(1,'zxx',45), (2,'lhm',25) , (3,'wzg',26) , (4,'tg',27);
INSERT INTO student VALUES(1,'wy',11), (2,'dh',25) , (3,'ysq',26) , (4,'mxc',27);
INSERT INTO tea_stu VALUES(1,1), (1,2), (1,3);
INSERT INTO tea_stu VALUES(2,2), (2,3), (2,4);
 INSERT INTO tea_stu VALUES(3,3), (3,4), (3,1);
INSERT INTO tea_stu VALUES(4,4), (4,1), (4,2) , (4,3);

解题思路:(真实面试答题时,也要写出每个分析步骤,如果纸张不够,就找别人要)

  • 1.要会统计分组信息,统计信息放在中间表中:
SELECT teaid,COUNT(*) FROM tea_stu GROUP BY teaid;
  • 2.接着其实应该是筛除掉小于12岁的学生,然后再进行统计,中间表必须与student关联才能得到12岁以下学生和把该学生记录从中间表中剔除,代码是:
SELECT tea_stu.teaid,COUNT(*) total FROM student,tea_stu 
WHERE student.stuid=tea_stu.stuid AND student.age>12 GROUP BY tea_stu.teaid
  • 3.接着把上面的结果做成虚表与teacher进行关联,并筛除大于45的老师
SELECT teacher.teaid,teacher.name,total 

    FROM teacher ,(SELECT tea_stu.teaid,COUNT(*) total FROM student,tea_stu WHERE student.stuid=tea_stu.stuid AND student.age>12 
    GROUP BY tea_stu.teaid) 

AS tea_stu2 WHERE teacher.teaid=tea_stu2.teaid AND teacher.age<45;

结果:

这里写图片描述

9. JDBC中的PreparedStatement相比Statement的好处
  • 1.相对比较安全,可以防止sql注入
  • 2.有预编译功能,相同操作批量数据效率较高
10.用 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){}
}

11.事务是什么?有什么用?事务特性?
  • 事务就是一个事情,组成这个事情可能有多个单元,要求这些单元,要么全都成功,要么全都不成功。

  • 在开发中,有事务的存在,可以保证数据完整性

  • 事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。
      

    • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

    • 一致性(consistency)。事务前后数据的完整性必须保持一致。

    • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

    • 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值