数据库部分
1、数据库三范式是什么?
第一范式(curly pasta是什么意思1NF):
字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一
个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
第三范式(3NF):
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
2、说出一些数据库优化方面的经验?
1、关键字段建立索引。
2、使用存储过程,它使SQL变得更加灵活和高效。功能测试工程师简历
3、备份数据库和清除垃圾数据。
4、SQL语句语法的优化。
5、清理删除日志。
3、union 和 union all 有什么不同?
UNION 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排
序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表 UNION。这个 SQL 在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而 UNION ALL 只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用 UNION ALLascii编码用几位二进制表示,
4.分页语句
取出 sql 表中第31到40的记录(以自动增长 ID 为主键)
sql server 方案1:
selecttop 10 * from t where id not in (select top 30 id from t order by id ) orde byid sql server 方案2:
selecttop 10 * from t where id in (select top 40 id from t order by id) order by iddesc
mysql 方案:
select * from t order by id limit 30,10
oracle 方案:
select * from (select rownum r,* from t where r<=40) wherer>30
分页技术(直接利用 sql 语句进行分页,效率最高和最推荐的)
mysql:
sql = "select * from articles limit " +(pageNo-1)*pageSize + "," + pageSize;
oracle:
sql = "select * from " +"(selectrownum r,* from " + "(select* from articles order by postime desc)" +"whererownum<= " +pageNo*pageSize +") tmp " +"wherer>" +(pageNo-1)*pageSize;
sqlserver:
sql = "select top 10 * from id not id(select top" + (pageNo- 1)*pageSize + "id from articles)"
5.用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
name | kecheng | fenshu |
张三 | 语文 | 81 |
张三 | 数学 | 75 |
李四 | 语文 | 76 |
李四 | 数学 | 90 dockerrxss |
王五 | 语文 | 81 |
王五 | 数学 | 100 |
王五 | 英语 | 90 |
准备数据的 sql 代码:
create table score(id int primary key auto_increment,namevarchar(20),subject varchar(20),score int);
insert into score values (null,'张三','语文',81), (null,'张三','cms采集插件数学',75), (null,'李四','语文',76), (null,'李四','数学',90), (null,'王五','语文',81),
(null,'王五','数学',100),
(null,'王五 ','英语',90);
A: select distinct name from score where name not in (selectdistinct name from score where score<=80)
B:select distince name t1 from score where 80< all (selectscore from score where name=t1);
6.所有部门之间的比赛组合
一个叫 department 的表,里面只有一个字段 name,一共有4条纪录,分别是 a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条 sql 语句显示所有可能的比赛组合.
select a.name,b.name from team a, team b where a.name < b.name
7、注册 Jdbc 驱动程序的三种方式
第一种方式
isterDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());jdbc是使用桥的模式进行连接的。DriverManager就是管理数据库驱动的一个类,java.sql.Driver就 是一个提供注册数据库驱动的接口,而com.microsoft.sqlserver.jdbc.SQLServerDriver()是 java.sql.Driver接口的一个具体实现。
第二种方式
System.setProperty("jdbc.drivers", "com.microsoft.sqlserver.jdbc.SQLServerDriver"); 多个驱动使用冒号分隔开,在连接时JDBC会按顺序搜索,直到到第一个能成功连接指定URL的驱动程序。
第三种方式(推荐)Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");好处在于能够在编译时不依赖于特定的JDBC Driver库,也就是减少了项目代码的依赖性,而且也很容易改造成从配置文件读取JDBC配置,从而可以在运行时动态更换数据库连接驱动。
8、用 JDBC 如何调用存储过程
代码如下:
package com.huawei.interview.lym;
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types;
publicclass JdbcTest {
public static voidmain(String[] args) {
Connection cn = null;
CallableStatement cstmt =null;
try {
//这里最好不要这么干,因为驱动名写死在程序中了
Class.forName("sql.jdbc.Driver");
mysql语句转oracle//实际项目中,这里应用 DataSource 数据,如果用框架,
//这个数据源不需要我们编码创建,我们只需
Datasource ds =context.lookup()
cn = DriverManager.getConnection("jdbc:mysql:///test","root","root");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论