数据库中一些重点知识总结

题目1
什么是数据库事务?
答案:单个逻辑单元执行的一系列操作,这些操作要么全做要么全不做,是不可

分割的.事务的开始和结束用户是可以控制的,如果没控制则由数据库默认的划

分事务.事务具有以下性质:
(1)原子性
指一个事务要么全执行,要么全不执行.也就是说一个事务不可能执行到一

半就停止了.比如:你去买东西,钱付掉了,东西没拿.这两步必须同时执行 ,要么

都不执行.
(2)一致性
指事务的运行并不改变数据库中的一致性.比如 a+b=10;a改变了,b也应该随

之改变.
(3)独立性
两个以上的事务不会出现交替运行的状态,因为这样可能导致数据的不一致
(4)持久性
事务运行成功之后数据库的更新是永久的,不会无缘无故的回滚.

题目2
执行数据库查询时候,如果查询的数据有很多,假设有1000万条,用什么方法

可以提高查询效率?在数据库方面或java代码方面有什么优化办法?
1.在数据库设计方面
(1)建立索引
(2)分区(比如说按时间分区)
(3)选取最适用的字段属性(尽量减少字段宽度和使用固定长度的字段)
2.在数据库I/O方面
(1)增加缓冲区
(2)如果涉及到表的级联,最好不同的表放在不同的磁盘,以增加I/O速度
3.Sql语句方法
(1)优化sql语句,减少比较次数,可用连表查询来代替子查询
(2)限制返回的条目数(mysql用limit)
(3)有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在

设计数据库时就去掉外键(比喻:就好比免检产品,就是为了提高效率,充分

相信产品的制造商)
4.在java方面
如果反复使用的查询,可通过preparedstatement,因为他在运行前已经预编译,

只要运行就Ok了

题目3
sql语言的常见问题
1.增删查改之类的问题,连表查询是必出题目,可以参考之前我写的那篇文章
这里讲一些分组查询跟降序升序分页
分组:group by 列名
统计各个部门薪水大于5000的人数
例子:SELECT department , COUNT(money) from employee where

money>=5000group by department;

分页:limit ()
select * from table limit 5; –返回前5行
select * from table limit 0,5; –同上,返回前5行
select * from table limit 5,10; –返回6-15行
应用到java里,select * from table limit ” +(pageNo-1)*pageSize + “,” +

pageSize
排序:order by 列名
asc 和desc 不写默认为升序
前者是升序后者是降序

综合题:
以下两张表,员工表employee 与部门表 department

查询结果如下:

请写出sql语句
分析:
我们可以看到这是一般的连表,但是连表的显示的统计人数,所以我们分两步来


第一步:查出各个部门的对应人数,把这个看做一个新表e1
select e.dep_id,count(name) num from employee e group by dep_id;
第二部:将查询结果与部门表连表
由于查询结果是显示左边的全部表格信息所以用左联,空的话为0,则采用

ifnull()函数来解决
select d.*,ifnull(num,0) num from department d left join (select

e.dep_id,count(name) num from employee e group by dep_id) e1 on

d.id=e.dep_id;

题目四
什么是数据库的三范式?
第一范式(1NF):字段具有原子性,不可再分。
第二范式(2NF):要求数据库表中的每个实例或行必须可以被惟一地区分。通

常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为

主关键字或主键。
第三范式(3NF):要求一个数据库表中不包含已在其它表中已包含的非主关键

字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现

发帖人姓名,否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分

都必须严格保持一致,这就是数据冗余。

题目五
union 与union all的区别

union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结

果集进行排 序运算,删除重复的记录再返回结果。
union all 则会显示重复结果,只是简单的两个结果合并并返回.所以效率比

union高,在保证没有重复数据的情况下用union all.

题目六
.用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
分析:都大于80,他的反面就是<=80,我们可以先求出所有<=80的姓名,然后取反

就可以了
所以sql语句 select name from student where name not in (select name

from student where fenshu <=80);

题目七
求各个部门直接的比赛结果? 有个叫team 的表格,里面有id跟部门名name,如

果各个部门要举行比赛用语句求出比赛结果
select a.name,b.name from game a cross join game b where

a.name

猜你喜欢

转载自blog.csdn.net/weixin_42091417/article/details/81835781