logo资料库

JAVA面试数据库部分经典面试题.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
1.sql2000和sql2005有什么区别?
1.存储过程的作用?
2.sqlserver和oracle数据库的性能优化
3.1选用适合的ORACLE优化器
3.2ORACLE 采用两种访问表中记录的方式:
3.3. 选择最有效率的表名顺序(只在基于规则的优化器中有效)
3.4. WHERE子句中的连接顺序.
3.5. SELECT子句中避免使用 ‘ * ‘
3.6. 减少访问数据库的次数
3.7. 整合简单,无关联的数据库访问
3.8. 使用表的别名(Alias)
3.9. 对经常要查询的字段可以建立一个视图
3.10. 在表中的某个字段上建立索引,可以提高检索速度。
3.模糊查询可以用索引吗?
4.sql的关键字及其一些函数
5.Oracle中的事务
(1) 提交事务
(2) 回滚事务
(3) 保留点
6.视图在什么情况下可以对其,删除,修改操作:
7.oracle中各种连接的写法:
8.查询的优化
9.怎么看执行计划
10.如何强制一个SQL语句使用索引?使用index hints
11.Oracle中的PL/SQL块是否熟悉?Oracle中的内置函数是否熟悉?
12.如何取一个没有排序的查询结果中的前10条记录?
13.问:如何取一个有排序的查询结果中的前10条记录?
14.如何取一个没有排序的查询结果中的第11条到第20条记录?
15.如何取一个有排序的查询结果中的第11条到第20条记录?
16.数据库设计中,主键的作用?
17.Oracle数据库设计中,建立外键的方法?
(1)用Create table命令语句在设计数据库表时建立外键
(2)用Alter table命令语句,为一个存在的表添加外键
18.oracle中的常用函数,如:日期函数
1. 日期函数
2. 字符函数
3. 数字函数
4. 转换函数
5. 其他函数
6. 分组函数
7. 分析函数
[数据库] 简单SQL语句总结
1.在查询结果中显示列名:
2.精确查找:
3.对于时间类型变量的处理
4.集合函数
5.分组group
6.UNION联合
7.多表查询
a.内连接
b.外连接
b1.左连接
b2.右连接
b3.全连接
c.自身连接
d.交叉连接
8.嵌套查询
a.用关键字IN,如查询李山的同乡:
b.使用关键字EXIST,比如,下面两句是等价的:
9.关于排序order
a.对于排序order,有两种方法:asc升序和desc降序
b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:
10.其他
a.对于有空格的识别名称,应该用"[]"括住。
b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno fro
c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑
d.注意在做否定意义的查询是小心进入陷阱:如,没有选修‘B2’课程的学生 :select stu
11.关于有难度多重嵌套查询的解决思想:如,选修了全部课程的学生:select * from s
1. sql2000 和 sql2005 有什么区别? a、 最直观的一点就是两者的界面有很明显的不同。sql2005 的操作风格更接近于 vs2005。 b、 sql2005 比 sql2000 存储的数据量要大很多,sql2005 支持数据库逻辑分区; c、 sql2000 与 sql20005 jdbc 连接不同: sql2000 jdbc 连接:url 地址:jdbc:microsoft:sqlserver://:<1433>; driver :com.microsoft.jdbc.sqlserver.SQLServerDriver; sql2005 jdbc 连接:url 地址:jdbc:sqlserver://:[;databaseName=]; driver :com.microsoft.sqlserver.jdbc.SQLServerDriver; d、 安全性能的提高:sql Server 2005 包括了一些在安全性能上的改进,例如将用户和对象分开、数据 库加密、设置安全默认值、增强密码政策、缜密的许可控制、以及一个增强型的安全模式。 e、 sql2005 还提供了一些新的特性,比如文件流支持(向第三代数据库迈出了可喜的一步)、T-Sql 的改 进(处理错误、递归查询功能、关系运算符 PIVOT, APPLY, ROW_NUMBER 和其他数据列排行功能, 等等)、数据库镜像、透 明的客户端重定向、新的基于架构的安全模型、内建的 Http 服务 器等...。 1. 存储过程的作用? 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合, 以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行, 而且允许用户声明变量、有条件执行以及其它强大的编程功能。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个 结果集以及返回值。 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列 SQL 语句。 可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。 存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。 2. sqlserver 和 oracle 数据库的性能优化 3.1 选用适合的 ORACLE 优化器 ORACLE 的优化器共有 3 种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 在缺省情况下,ORACLE 采用 CHOOSE 优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用 CHOOSE 优化器,而直接采用基于规则或者基于成本的优化器. 访问 Table 的方式 3.2ORACLE 采用两种访问表中记录的方式: a. 全表扫描 全表扫描就是顺序地访问表中每条记录. ORACLE 采用一次读入多个数据块(database block)的 方式优化全表扫描. b. 通过 ROWID 访问表 你可以采用基于 ROWID 的访问方式情况,提高访问表的效率,RowId 包含了表中记录的物理位置 信息.ORACLE 采用索引(INDEX)实现了 数据和存放数据的物理位置(RowId)之间的联系。 通常索引提供了快速访问 ROWID 的方法, 因此那些基于索引列的查询就可以得到
性能上的提高. 3.3. 选择最有效率的表名顺序(只在基于规则的优化器中有效) 3.4. WHERE 子句中的连接顺序. ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数 量记录的条件必须写在 WHERE 子句的末尾. 3.5. SELECT 子句中避免使用 ‘ * ‘ 当你想在 SELECT 子句中列出所有的 COLUMN 时,使用动态 SQL 列引用 ‘*’ 是一个方便的方法. 不幸的是,这是一个非常 低效的方法. 实际上,ORACLE 在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通 过查询数据字典完成的, 这 意味着将耗费更多的时间. 3.6. 减少访问数据库的次数 当执行每条 SQL 语句时, ORACLE 在内部执行了许多工作: 解析 SQL 语句, 估算索引的利用率, 绑 定变量 , 读数据块等等. 由此可 见, 减少访问数据库的次数 , 就能实际上减少 ORACLE 的工作量. 3.7. 整合简单,无关联的数据库访问 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 3.8. 使用表的别名(Alias) 当在 SQL 语句中连接多个表时, 请使用表的别名并把别名前缀于每个 Column 上.这样一来, 就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误. 3.9. 对经常要查询的字段可以建立一个视图 3.10. 在表中的某个字段上建立索引,可以提高检索速度。 3. 模糊查询可以用索引吗? (1)如果模糊查询是下边这个样子:where a like '*****%',就可以用索引; 如果模糊查询是 where a like '%****'的形式,就不能使用索引! (2)建全文索引后使用 constain 4. sql 的关键字及其一些函数 sql 关键字:all, alter, as, asc, container, create, delete, desc, drop, first, from, in, index, insert, into, join, last, on, schema, select, selectschema, selectsecurity, table, to, update, updateidentity, updateowner, updatesecurity, user, with; 函数:Avg(), Count(), First(), Last(), Max(), Min(), Sum(),StDev() StDevP()[StDev,StDevP 返回总体或总体样本的标准偏差的估计值], Var(), VarP()[Var,VarP 返回一个总体或总体样本的方差的估计值 ODBC 标量函数: 1. 字 符 串 函 数 ASCII LENGTH LTRIM SUBSTRING LCASE RIGHT UCASE RTRIM LEFT CHAR LOCATE SPACE CONCAT 2. 数 字 函 数 ABS FLOOR SIN ATAN LOG SQRT CEILING POWER TAN COS RAND MOD EXP SIGN 3. 时 间 和 日 期 函 数 CURDATE DAYOFYEAR MONTH WEEK NOW HOUR QUARTER DAYOFMONTH MINUTE MONTHNAME CURTIME YEAR DAYOFWEEK
SECOND DAYNAME 4. 数据类型变换 CONVERT ORACLE 5. Oracle 中的事务 Oracle 在缺省情况下任何一个 DML 语句都会开始一个事务,直到用户发出 Commit 或 Rollback 操作, 这个事务才会结束。在 Oracle 中,执行 DDL 语句(如 Create Table、Create View 等)时,会在执行之前自动 发出一个 Commit 命令,并在随后发出一个 Commit 或者 Rollback 命令。 (1) 提交事务 提交一事务,即将在事务中由 SQL 语句所执行的改变永久化。在提交前,ORACLE 已有下列情 况: 在 SGA 的回滚段缓冲区已生成回滚段记录,回滚信息包含有所修改值的老值。 在 SGA 的日志缓冲区已生成日志项。这些改变在事务提交前可进入磁盘。 对 SGA 的数据库缓冲区已作修改,这些修改在事务真正提交之前可进入磁盘。 在事务提交之后,有下列情况: 对于与回滚段相关的内部事务表记录提交事务,并赋给一个相应的唯一系统修改号(SCN),记 录在表中。 在 SGA 的日志缓冲区中日志项由 LGWR 进程写入到在线日志文件, 这是构成提交事务的原子 事务。 在行上和表上的封锁被释放。 该事务标志为完成 。 注意:对于提交事务的数据修改不必由 DBWR 后台进程立即写入数据文件,可继续存储在 SGA 的数据库缓冲区中,在最有效时将其写入数据文件。 (2) 回滚事务 回滚事务的含义是撤消未提交事务中的 SQL 语句所作的对数据修改。ORALCE 允许撤消未提交的整 个事务,也允许撤消部分。 在回滚整个事务(没有引用保留点)时,有下列情况: 在事务中所有 SQL 语句作的全部修改,利用相应的回滚段被撤消。 所有数据的事务封锁被释放。 事务结束。 当事务回滚到一保留点(具有 SAVEPOINT)时,有下列情况: 仅在该保留点之后执行的语句被撤消。 该指定的保留点仍然被保留,该保留点之后所建立的保留点被删除。 自该保留点之后所获取的全部表封锁和行封锁被释放,但指定的保留点以前所获取的全部数据封锁继 续保持。 该事务仍可继续。 (3) 保留点 保留点(savepoint)是在一事务范围内的中间标志,经常用于将一个长的事务划分为小的部分。保留 点可标志长事务中的任何点,允许可回滚该点之后的工作。在应用程序中经常使用保留点;例如一过程包 含几个函数,在每个函数前可建立一个保留点,如果函数失败,很容易返回到每一个函数开始的情况。在 回滚到一个保留点之后,该保持点之后所获得的数据封锁被释放。 6. 视图在什么情况下可以对其,删除,修改操作: DML 操作应遵循的原则:
1).简单视图可以执行 DML 操作; 2).在视图包含 GROUP 函数,GROUP BY 子句,DISTINCT 关键字时不能删除数据行; 3).在视图不出现下列情况时可通过视图修改基表数据或插入数据: a.视图中包含 GROUP 函数,GROUP BY 子句,DISTINCT 关键字; b.使用表达式定义的列; c.ROWNUM 伪列。 d.基表中未在视图中选择的其他列定义为非空且无默认值。 WITH CHECK OPTION 子句限定: 通过视图执行的 INSERTS 和 UPDATES 操作不能创建该视图检索不到的数据行, 因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。 视图的删除: DROP VIEW VIEW_NAME 语句删除视图。 删除视图的定义不影响基表中的数据。 只有视图所有者和具备 DROP VIEW 权限的用户可以删除视图。 视图被删除后,基于被删除视图的其他视图或应用将无效。 7. oracle 中各种连接的写法: 内连接,外连接 ,左外连接,右外连接 以上几种连接一般用于多表之间复杂的查询, 下面先说说内连接,也即相等连接,如右两张表 dept ,employee, dept 里有字段 deptid,deptname,employee 有字段 empno,deptid,ename,sal,age 等 那连接查询语句如下:select A.* ,B.* from dept A,employee B where A.deptid=B.deptid 一般出现这种情况的是一张是主表,另一张是子表,主表的主键作为子表的外键,显示结果按照子表的显 示, 内连接简单,这里就不多说了 外连接在 oralce 里用(+)表示,先看例子 select empno,ename,sal,emp.deptno,dept.deptno from emp,dept where emp.deptno(+) =dept.deptno 这是一个右连接 empno,ename,sal,emp.deptno,dept.deptno 看下面的例子 select dept.no=emp.deptno(+) 这是一个左连接 两个查询显示的查询结果是一样的,刚开始学 oracle 的时候很多人都很难明白这个,现在有个笨办法, 大家不防记下来,(+)出现查询条件的左边即右连接,出现在右边即左连接。(+)可以放在左边也可以 where from emp,dept 放在右边,但是一定要放在缺少条件的那一边,如上面的例子中,如果公司最近准备成立一个新的部门, 测试部门,但现在还没有招新员工,而现在 Boss 想知道公司有知道公司的员工在那个部门并且想知道 没有员工的部门,我们可以用上面的查询语句实现。 左外连接(left outer join)和右外连接(reght outer join)如同上面的外连接,查询的结果是一样的。 左外连接:select empno,ename,sal,emp.deptno,dept.deptno from dept left outer join emp on (emp.deptno=dept.deptno) 右外连接:select empno,ename,sal,emp.deptno,dept.deptno from emp reight outer join dept on (emp.deptno=dept.deptno) 以上显示的结果和外连接查询出来的结果是一样的 ,只是写法不一样而已,实际工作中外连接用的比较多, 没有必要都要去用它,但是概念大家一定要了解。
全外关联 :FULL OUTER JOIN SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id); 结果为:所有员工及对应部门的记录,包括没有对应部门编号 department_id 的员工记录和没有任何员 工的部门记录。 8. 查询的优化 1).根据查询条件建立合适的 index 2).因为 SQL 是从右向左解析,多表查询时,记录数少的表放在右边 3).多个条件时,收敛快的条件放在右边。 4).避免使用复杂的集合函数,象 not in 等。 5).避免在条件中对字段进行函数操作 6).尽量避免使用 select *,应该写出需要查询的字段 7).在 java 中尽量使用 preparestatement 执行 sql,从而共享执行计划" 9. 怎么看执行计划 使用 explain 或者 autotrace 查看执行计划 10.如何强制一个 SQL 语句使用索引? 使用 index hints 11.Oracle 中的 PL/SQL 块是否熟悉?Oracle 中的内置函数是否熟悉? 内置函数:ASCII,CHR,CONCAT, decode,to_date,to_char,to_number 等等。 12. 如何取一个没有排序的查询结果中的前 10 条记录? select fielda from tablea where rownum<=10; 13. 问:如何取一个有排序的查询结果中的前 10 条记录? select fielda from (select fielda from tablea order by fieldb ) where rownum<=10; 错误写法:select fielda from tablea where rownum<=10 order by fieldb; 14. 如何取一个没有排序的查询结果中的第 11 条到第 20 条记录? select fielda from (select fielda,rownum rn from tablea where rownum<=20) where rn>=11; 15. 如何取一个有排序的查询结果中的第 11 条到第 20 条记录? select fielda from (select fielda ,rownum rn from (select fielda from tablea order by fieldb ) where rownum<=20) where rn>=11; 16. 数据库设计中,主键的作用? 主键的作用保持数据表记录的唯一性,建立主键索引和作为外键使用.使用主键与外键的配对来表示实体间 的连接. 17. Oracle 数据库设计中,建立外键的方法?
(1)用 Create table 命令语句在设计数据库表时建立外键 Create table Depart ( DepNO Number(2), DepName varchar2(10), CONSTRAINT pk_dept PRIMARY KEY (DepNO) ); Create table Emp ( EmpNo Number(4), EmpName varchar2(20), DepNo CONSTRAINT fk_deptno References Depart(DepNo) ); (2)用 Alter table 命令语句,为一个存在的表添加外键 Create table Depart ( DepNO Number(2), DepName varchar2(10), CONSTRAINT pk_dept PRIMARY KEY (DepNO) ); Create table Emp( EmpNo Number(4), EmpName varchar2(20), DepNo Number(2) ); Alter table Emp ADD CONSTRAINT fk_deptno Foreign oracle 中的常用函数,如:日期函数 1. 日期函数 18. key(DepNo) References Depart(DepNo); ADD_MONTHS:返回给指定的日期加上指定的月数后的日期。其格式为 add_months(d,n) , 其中 d 是日期,n 表示月数。 MONTHS_BETWEEN:返回两个日期之间的月数。其格式为:months_between(d1,d2) , d1 晚于 d2, 结果返回正数,否则返回负数。 LAST_DAY:返回指定日期当月的最后一天的日期值。格式为:last_day(d)。 ROUND:返回日期值,此日期四舍五入为格式模型指定的单位。格式为:round(d,[fmt])。 NEXT_DAY:返回指定的下一个星期几的日期,格式为:next_day(d,day)。 TRUNC:将指定日期截断为由格式模型指定的单位的日期,与 round 函数不同的是它只舍不入。 格 式为:trunc(d,[fmt]),如果不指定 fmt,日期则被截断为天。 EXTRACT:提取日期时间类型中的特定部分。 格式为:extract(fmt from d)。注意:此处的格式不 用使用单引号。 2. 字符函数 INITCAP(char) :将首字母转换为大写。 LOWER(char) : 转换为小写 UPPER(char) : 转换为大写 LTRIM(char,set) :左剪裁 RTRIM(char,set) :右剪裁
TRANSLATE(char,from):按字符翻译 REPLACE(char,search_str,replace_str): 字符串替换 INSTR(char,substr[,pos]) :查找子串位置 SUBSTR(char,pos,len) : 取子字符串 CONCAT(char1,char2) : 连接字符串 CHR:根据提供的 ASCII 码返回对应的字符 LPAD 和 RPAD: 左填充和右填充 LENGTH:返回字符串的长度 DECODE:与执行逐个字符替换的 translate 函数不同的是,decode 函数进行逐个值的替换。 SIGN(n) : 取符号 FLOOR(n) : 向下取整 FOWER(m,n): m 的 n 次幂 MOD(m,n): 取余数 TRUNC(m,n): 截断 3. 数字函数 ABS(n) : 取绝对值 CEIL(n) : 向上取整 SIN(n) : 正弦 COS(n) : 余弦 ROUND(m,n): 四舍五入 SQRT(n): 平方根 4. 转换函数 TO_CHAR TO_DATE TO_NUMBER 5. 其他函数 NVL(expre1,expre2) : 将空值替换为指定的值 NVL2(expre1,expre2,expre3): expre1 不是空值,则 NVL2 返回 expre2,否则返回 expre3 NULLIF(expre1,expre2) : 比较两个表达式,如果相等,返回空值,否则返回 expre1 6. 分组函数 AVG MIN :参数列中所有值的最小值 MAX SUM COUNT 7. 分析函数 ROW_NUMBER,RANK,DENSE_RANK [数据库] 简单 SQL 语句总结 1.在查询结果中显示列名: a.用 as 关键字:select name as '姓名' from students order by age b.直接表示:select name '姓名' from students order by age 2.精确查找:
a.用 in 限定范围:select * from students where native in ('湖南', '四川') b.between...and:select * from students where age between 20 and 30 c.“=”:select * from students where name = '李山' d.like:select * from students where name like '李%' (注意查询条件中有“%”,则说明是部分匹配, 而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'% 李%';若是第二个字为李,则应为'_李%'或'_李'或'_李_'。) e.[]匹配检查符:select * from courses where cno like '[AC]%' (表示或的关系,与"in(...)"类似,而且 "[]"可以表示范围,如:select * from courses where cno like '[A-C]%') 3.对于时间类型变量的处理 a.smalldatetime:直接按照字符串处理的方式进行处理,例如: select * from students where birth > = '1980-1-1' and birth <= '1980-12-31' 4.集合函数 a.count()求和,如:select count(*) from students (求学生总人数) b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’ c.max(列)和 min(列),求最大与最小 5.分组 group 常用于统计时,如分组查总数:select gender,count(sno) from students group by gender (查看男女学生各有多少) 注意:从哪种角度分组就从哪列"group by" 对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届 别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender" select grade, mno, gender, count(*) from students group by grade, mno, gender 通常 group 还和 having 联用,比如查询 1 门课以上不及格的学生,则按学号(sno)分类有: select sno,count(*) from grades where mark<60 group by sno having count(*)>1 6.UNION 联合 合并查询结果,如:SELECT * FROM students WHERE name like ‘张%’ UNION [ALL] SELECT * FROM students WHERE name like ‘李%’
分享到:
收藏