数据库方面

1.01 SQL查询数据表中重复数据

有一张MySQL的数据表名为 member,其中有2个字段 

  id unsigned int  

  name varchar(20) 

  假设数据库中的数据类似: 

  id    name 

  1.    AAA 

  2.    BBB 

  3.    CCC 

  4.    AAA 

请写一段SQL取出数据表中name重复的数据。(注意只需要重复的) 

  :SELECT * FROM member GROUP BY name having count(*)>1;

1.02有一张表:记录在这1个小时中,每条记录的变动情况。比如银行的卡号表。 怎么做到,这张表的数据是1个小时执行更新操作:

a.ADDDEL执行时时操作,对Modify通过一步调用,记录执行日志方式。

b.通过主表做扩展字段,对主表进行冗余,记录操作信息。

c.对主表进行扩展表,通过扩展表记录操作。

d.通过内存队列,在内存队列中记录信息,之后做1小时同步。

1.03数据库索引使用注意

数据库索引是为了加快查询速度,但是会降低更新插入删除的速度;如果每次都要获取所有表记录,那么增加索引意义就不大了;对于大量重复值的字段增加索引也是没意义的。针对记录比较少的表增加索引反而会浪费存储空间,而不会加快速度

1.04几千G的数据怎么查询一条记录比较快

通过增加索引、几千G数据放一张表不大现实,可以通过分区,不过分区又会增加查询难度;

1.05 数据库连接池原理、好处,tomcat中什么位置增加?

原理:是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。

好处:对于一个复杂的数据库应用,频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。数据库连接池技术带来的优势:

1.资源重用

2.更快的系统响应速度

3.新的资源分配手段

4.统一的连接管理,避免数据库连接泄漏

Tomcat配置位置:在tomcat的context.xml中指定Resource的JNDI名称;

1.06 数据库冷备份和热备份的不同点以及各自的优点

热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。

热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。

1.07存储过程和函数的区别

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

存储过程优点:执行速度更快?首次运行时,进行优化和编译得到执行计划并将该计划存储在系统表中,以后直接运行。保证数据的安全性和完整性,降低网络通信量;减少数据库工作量;

执行存储过程用的类:

CallableStatement c=con. prepareCall ("{call getCustomerName(?,?)}");

2、事务特点:原子性、一致性、隔离性和持久性;

原子性,要么全都执行,要么全都不执行。

一致性,事务在完成时,必须使所有的数据都保持一致状态。

隔离性,由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。

持久性,事务完成之后,它对于系统的影响是永久性的。

1.08 数据库三大范式

范式一:每一字段只存储一个值

范式二:必须先符合范式一的条件,且每一行都能被唯一的识别。将范式一转换成范式二的方法是添加主键。

范式三:没有一个非关键属性依赖于另一个非关键属性。

1.09数据库锁机制

1.数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。

2.悲观封锁、乐观封锁和死锁

悲观封锁:

锁在用户修改之前就发挥作用: 
Select ..for update(nowait) 
Select * from tab1 for update 
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。 
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。 

乐观封锁

乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

死锁

当两个用户希望持有对方的资源时就会发生死锁. 
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。

1.10请描述Struts - Oracle中大数据量下的分页解决方案

千万级数据别用Hibernate了,ibatis吧。
 另外和分页没关系,用啥都一样,关键看你的查询SQL优化的好不好,表结构设计的好不好,是不是加了合适的索引,SQL查询时用到索引没,表该分区就分区。

1.11 java中的访问MY SQL/Server 的数据库连接代码

首先增加mysql-connector-java-5.0.5-bin.jar驱动包;

驱动程序名

String driver = "com.mysql.jdbc.Driver";

// URL指向要访问的数据库名scutcs

String url = "jdbc:mysql://127.0.0.1:3306/scutcs";

// MySQL配置时的用户名

String user = "root";

// Java连接MySQL配置时的密码

String password = "root";

try {

// 加载驱动程序

Class.forName(driver);

// 连续数据库

Connection conn = DriverManager.getConnection(url, user, password);

if(!conn.isClosed())

System.out.println("Succeeded connecting to the Database!");

// statement用来执行SQL语句

Statement statement = conn.createStatement();

// 要执行的SQL语句

String sql = "select * from student";

//处理结果集

1.12甚么时候会出现事务回滚,而甚么时候不会出现事务回滚?如何设计事务回滚。

可以在抛出异常的时候加入事务回滚方法;若数据库不支持回滚,可给记录行设定状态序号和历史状态序号,更新前先设定状态序号,如果成功了就把这个状态序号设成历史序号以表示提交,如果失败了就把原始数据给恢复过来以回滚。

1.13 SQL语言

1.Orcale 如何实现分页查询?

答:SELECT * FROM (SELECT A.*, ROWNUM RN FROM A WHERE ROWNUM <= 40)

WHERE RN >= 21

2.Orcale如何实现查询出来的空值变成0?

答:真的要是把空值用0表示的话,oracle中有nvl函数

select nvl(columnName,0) from table

意思就是把columnName字段为空的显示成0,当然也可以显示成任何字符或者数字

3.Orcale如何实现查询出来的两个字段放在一个位置上?

答:oracle数据库

select A || ‘:‘ || B from t

前提是A B字段都是字符型,假如不是,就用to_char()方法转换成字符型

4.建立数据表

create table t_student (id int(5) primary key,name varchar(20));

5.插入数据

insert into t_student values (1,’zhangsan’,’lanqiu’);

6.SQL查询重复数据

列出所有名字重复的人的记录,最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了:

select  name  from  t_student where dep=’1’  group  by  name  having  count(*)>1

7.清除重复数据:

过滤掉所有多余的重复记录,我们知道distinct、group by 可以过滤重复,于是就有最直观的:select  distinct  *  from  emp    或  select  name,age  from  emp  group  by  name,age

8.group by order by having where先后顺序

where.....group by....having.....order by

1.14触发器的具体含义和用法

触发器是编写的一段SQL语句,其关键字是TRIGGER(触发器的意思),它附着于指定的表,作用主要在于监控其附着的表在产生特定动作时应做的SQL处理,使用触发器的好处在于大大简化了相关表的维护,将数据一致性问题交由数据库后台处理。

一、数据库方面问题

1、对内外连接的理解?

1)、内连接:select * from a inner join b on a.id = b.id;

只显示a.idb.id相同的行,左边显示a表的字段,右边显示b表的字段;

2)、左外连接:select * from a left join b on a.id = b.id;

左边显示a表的字段并显示所有数据,右边显示b表的字段,只显示a.idb.id相同的行,其他用null补充;

3)、右外连接:select * from a right join b on a.id=b.id;

右边显示b表的字段并显示所有数据,左边显示a表的字段,只显示a.idb.id相同的行,其他用null补充;

4)、完全外连接:select * from a full join b on a.id=b.id;

左边显示a表字段,右边显示b表的字段;其中a.idb.id相同的行全显示,a.idb.id不同的行,在a表中有数据的行在b中用null填充,在b表中有数据的行在a表中用null填充;

5)、交叉连接:select * from a cross join b;

返回的行数是左边与右边行数的乘积;

2、在jsp下面实现orcale数据库表的分页操作?

答:数据库表总行数:由查询数据库获得;

每页显示行数:由jsp页面设置;

当前页数:请求参数;

当前页数与每页行数计算出当前页第一行行数,定义结果集至此行,然后再取出每页行数的行,返回给jsp页面即可;

3、数据库的优化:

答:a、合理的索引;b、如果表的数据太大,根据业务优化表的结构,减少表的数据量,即每个月建一张表;根据分页进行显示;c、减少对数据库的访问次数,建立二级缓存;d、通过批处理的方式(针对insertupdate等);

4E-R

即实体-联系图

E-R图的基本要素是实体型(用矩形表示)、属性(用椭圆形表示)和联系(用菱形表示)

技术分享

5、什么是事务?

答:就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over

在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序

Begin Tran  --激活事务     Rollback Tran --回滚事务      Commit Tran  --提交事务

6事务具有4个属性

1)、原子性:事务是不可分割的单元,事务包括的操作要么多做,要么都不做;

2)、一致性:事务必须使数据库从一个一致性状态变至另外一个一致性状态;

3)、隔离性:即一个事务的执行不能受其他事务的影响;

4)、持久性:指一个事务一旦提交,它对数据库的改变是永久的;

7SQL中的联合有什么用

答:针对多个关联的表进行一次SQL查询;

8存储过程的具体实现

存储过程(stored procedure)是一组为了完成特定功能的sql 语句集,经编译后存储在数据库中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

9、存储过程的优点:
(1)存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的sql 语句;(存储过程允许标准组件式编程)
(2)存储过程要比批处理的执行速度快很多。因为存储过程是预编译的;
(3)网络中传送的只是调用的存储语句,而不是多条sql 语句,从而减少了网络流量;
(4)系统管理员通过数据访问权限的限制,避免非授权用户对数据的访问,保证了数据的安全。
10、触发器的具体含义和用法。
答:触发器是编写的一段SQL语句,其关键字是TRIGGER(触发器的意思),它附着于指定的表,作用主要在于监控其附着的表在产生特定动作时应做的SQL处理,使用触发器的好处在于大大简化了相关表的维护,将数据一致性问题交由数据库后台处理。

11、在MS SQL_Server 数据库中通过什么约束保证数据库的实体完整性?

答:可以通过建立唯一的索引、PRIMARY KEY约束、UNIQUE约束或IDENTITY约束来实现实体完整性;

10几种常用的数据结构及内部实现原理。

11内存有哪几种存储组织结构.请分别加以说明

11、在多表连接查询中,如果有一个表没有数据,页面上怎么显示。


二、SQL方面问题:

1、从表table(客户名、发生日期,发生金额)找出某客户最后发生的业务日期?

select top 1 日期 from table order by日期 desc;(指定递减顺序)

2怎样将数据库表中重复的列的数据找出来并删除

方法一:使用delete语句,把name相同的类中id最大(或者最小)的数据删掉,循环执行,直到受影响的行数是0

delete from table where id in (select max(id) from table group by name having count(*)>1);

方法二:还是delete语句,把除了name相同的类中最大的id(或者最小)的数据删掉,执行一次即可

delete from table where id not in ( select max(id) from table group by name);

方法三(查询出来放置在新的表中):select distinct name into table1 from table;

 



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。