MySQL-带着问题去了解MySQL

 1.什么是数据库事务?

答案:单个逻辑单元执行的一系列操作,这些操作要么全做要么全不做,是不可分割的.事务的开始和结束用户是可以控制的,如果没控制则由数据库默认的划分事务.事务具有以下性质:

⑴ 原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

⑵ 一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

⑷ 持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。


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 bydepartment;

分页: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;


4.什么是数据库的三范式?
第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必
须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两
个独立的字段。
第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必
须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储
各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖
主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成
一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,
以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
第三范式的要求如下:
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一
个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,
否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就

是数据冗余


5.union 与union all的区别

union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排 序运算,删除重复的记录再返回结果。 union all 则会显示重复结果,只是简单的两个结果合并并返回.所以效率比union高,在保证没有重复数据的情况下用union all.
select name from table1
union

select name  from table2;


6.用一条 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);


7.求各个部门直接的比赛结果? 

有个叫team 的表格,里面有id跟部门名name,如果各个部门要举行比赛用语句求出比赛结果

select a.name,b.name from game a cross join game b where a.name<b.name;


8.删除除了 id  号不同, 其他都相同的学生冗余信息


9.一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在 多万个用户,若要在
每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决 每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?


alter table drop column score;
alter table add colunm score int;
可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
这样的操作时无法回滚的,在我的印象中,只有 inert update delete 等 DML 语句才能回滚,

对于 create table,drop table ,alter table 等 DDL 语句是不能回滚


10.Class.forName()的作用?
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载
过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该
类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这
个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例

对象了。


11.大量数据的分页?
select * from table order by id limit (pagesize*(pageNumbe-1),pagesize;



https://blog.csdn.net/u013252072/article/details/52912385

发布了55 篇原创文章 · 获赞 40 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/java173842219/article/details/79788209
今日推荐