数据库方面
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.对ADD和DEL执行时时操作,对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.id与b.id相同的行,左边显示a表的字段,右边显示b表的字段;
(2)、左外连接:select * from a left join b on a.id = b.id;
左边显示a表的字段并显示所有数据,右边显示b表的字段,只显示a.id与b.id相同的行,其他用null补充;
(3)、右外连接:select * from a right join b on a.id=b.id;
右边显示b表的字段并显示所有数据,左边显示a表的字段,只显示a.id与b.id相同的行,其他用null补充;
(4)、完全外连接:select * from a full join b on a.id=b.id;
左边显示a表字段,右边显示b表的字段;其中a.id与b.id相同的行全显示,a.id与b.id不同的行,在a表中有数据的行在b中用null填充,在b表中有数据的行在a表中用null填充;
(5)、交叉连接:select * from a cross join b;
返回的行数是左边与右边行数的乘积;
2、在jsp下面实现orcale数据库表的分页操作?
答:数据库表总行数:由查询数据库获得;
每页显示行数:由jsp页面设置;
当前页数:请求参数;
当前页数与每页行数计算出当前页第一行行数,定义结果集至此行,然后再取出每页行数的行,返回给jsp页面即可;
3、数据库的优化:
答:a、合理的索引;b、如果表的数据太大,根据业务优化表的结构,减少表的数据量,即每个月建一张表;根据分页进行显示;c、减少对数据库的访问次数,建立二级缓存;d、通过批处理的方式(针对insert/update等);
4、E-R图:
即实体-联系图
E-R图的基本要素是实体型(用矩形表示)、属性(用椭圆形表示)和联系(用菱形表示);
5、什么是事务?
答:就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over;
在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
Begin Tran --激活事务 Rollback Tran --回滚事务 Commit Tran --提交事务
6、事务具有的4个属性:
(1)、原子性:事务是不可分割的单元,事务包括的操作要么多做,要么都不做;
(2)、一致性:事务必须使数据库从一个一致性状态变至另外一个一致性状态;
(3)、隔离性:即一个事务的执行不能受其他事务的影响;
(4)、持久性:指一个事务一旦提交,它对数据库的改变是永久的;
7、SQL中的联合有什么用?
答:针对多个关联的表进行一次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;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。