1、1. sql2000 和 sql2005 有什么区别?a、 最直观的一点就是两者的界面有很明显的不同。sql2005 的操作风格更接近于vs2005。b、 sql2005 比 sql2000 存储的数据量要大很多, sql2005 支持数据库逻辑分区;c、 sql2000 与 sql20005 jdbc 连接不同:sql2000 jdbc 连接:url 地址:jdbc:microsoft:sqlserver:/:;driver :com.microsoft.jdbc.sqlserver.SQLServerDriver;sql2005 jdbc 连接:url 地址:jdbc:sqlserver:
2、/:;databaseName=;driver :com.microsoft.sqlserver.jdbc.SQLServerDriver;d、 安全性能的提高:sql Server 2005 包括了一些在安全性能上的改进,例如将用户和对象分开、数据库加密、设置安全默认值、增强密码政策、缜密的许可控制、以及一个增强型的安全模式。e、 sql2005 还提供了一些新的特性,比如文件流支持(向第三代数据库迈出了可喜的一步) 、T-Sql 的改进(处理错误、递归查询功能、关系运算符 PIVOT, APPLY, ROW_NUMBER 和其他数据列排行功能,等等)、数据库镜像、透 明的客户端重定向、新的
3、基于架构的安全模型、内建的 Http 服务器等.。1.存储过程的作用?存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列 SQL 语句。 可以从自己的存储过程内引用
4、其它存储过程,这可以简化一系列复杂语句。 存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。2. sqlserver 和 oracle 数据库的性能优化3.1 选用适合的 ORACLE 优化器ORACLE 的优化器共有 3 种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)在缺省情况下,ORACLE 采用 CHOOSE 优化器 , 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用 CHOOSE 优化器,而直接采用基于规则或者基于成本的优化器.访问 Table 的方式3.2ORACLE 采
5、用两种访问表中记录的方式: a. 全表扫描 全表扫描就是顺序地访问表中每条记录. ORACLE 采用一次读入多个数据块(database block)的方式优化全表扫描.b. 通过 ROWID 访问表 你可以采用基于 ROWID 的访问方式情况,提高访问表的效率 ,RowId 包含了表中记录的物理位置信息.ORACLE 采用索引(INDEX)实现了数据和存放数据的物理位置(RowId)之间的联系。 通常索引提供了快速访问 ROWID 的方法,因此那些基于索引列的查询就可以得到性能上的提高.3.3. 选择最有效率的表名顺序(只在基于规则的优化器中有效) 3.4. WHERE 子句中的连接顺序OR
6、ACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其他 WHERE 条件之前 , 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾.3.5. SELECT 子句中避免使用 * 当你想在 SELECT 子句中列出所有的 COLUMN 时,使用动态 SQL 列引用 * 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE 在解析的过程中 , 会将* 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间. 3.6. 减少访问数据库的次数当执行每条 SQL 语句时, ORACLE 在内部执行了许多
7、工作: 解析 SQL 语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少 ORACLE 的工作量.3.7. 整合简单,无关联的数据库访问 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)3.8. 使用表的别名(Alias) 当在 SQL 语句中连接多个表时, 请使用表的别名并把别名前缀于每个 Column上.这样一来,就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误.3.9. 对经常要查询的字段可以建立一个视图3.10. 在表中的某个字段上建立索引,可以提高检索速度。3. 模糊查
8、询可以用索引吗?(1)如果模糊查询是下边这个样子:where a like *%,就可以用索引;如果模糊查询是 where a like %*的形式,就不能使用索引!(2)建全文索引后使用 constain4. 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, up
9、date, updateidentity, updateowner, updatesecurity, user, with;函数:Avg(), Count(), First(), Last(), Max(), Min(), Sum(),StDev()StDevP()StDev,StDevP 返回总体或总体样本的标准偏差的估计值, Var(),VarP()Var,VarP 返回一个总体或总体样本的方差的估计值ODBC 标量函数:1. 字符串函数 ASCII LENGTH RTRIM CHAR LOCATE SPACE CONCAT LTRIM SUBSTRING LCASE RIGHT UCAS
10、E LEFT2. 数字函数 ABS FLOOR SIN ATAN LOG SQRT CEILING POWER TAN COS RAND MOD EXP SIGN 3. 时间和日期函数 CURDATE DAYOFYEAR MONTH CURTIME YEAR WEEK NOW HOUR QUARTER DAYOFMONTH MINUTE MONTHNAME DAYOFWEEK SECOND DAYNAME 4. 数据类型变换 CONVERTORACLE5. Oracle 中的事务Oracle 在缺省情况下任何一个 DML 语句都会开始一个事务,直到用户发出Commit 或 Rollback 操
11、作,这个事务才会结束。在 Oracle 中,执行 DDL 语句(如 Create Table、Create View 等)时,会在执行之前自动发出一个 Commit 命令,并在随后发出一个 Commit 或者 Rollback 命令。(1) 提交事务 提交一事务,即将在事务中由 SQL 语句所执行的改变永久化。在提交前,ORACLE 已有下列情况: 在 SGA 的回滚段缓冲区已生成回滚段记录,回滚信息包含有所修改值的老值。 在 SGA 的日志缓冲区已生成日志项。这些改变在事务提交前可进入磁盘。 对 SGA 的数据库缓冲区已作修改,这些修改在事务真正提交之前可进入磁盘。 在事务提交之后,有下列情
12、况: 对于与回滚段相关的内部事务表记录提交事务,并赋给一个相应的唯一系统修改号(SCN) ,记录在表中。 在 SGA 的日志缓冲区中日志项由 LGWR 进程写入到在线日志文件, 这是构成提交事务的原子事务。 在行上和表上的封锁被释放。 该事务标志为完成 。 注意:对于提交事务的数据修改不必由 DBWR 后台进程立即写入数据文件,可继续存储在 SGA 的数据库缓冲区中,在最有效时将其写入数据文件。(2) 回滚事务 回滚事务的含义是撤消未提交事务中的 SQL 语句所作的对数据修改。ORALCE允许撤消未提交的整个事务,也允许撤消部分。 在回滚整个事务(没有引用保留点)时,有下列情况: 在事务中所有
13、 SQL 语句作的全部修改,利用相应的回滚段被撤消。 所有数据的事务封锁被释放。 事务结束。 当事务回滚到一保留点(具有 SAVEPOINT)时,有下列情况: 仅在该保留点之后执行的语句被撤消。 该指定的保留点仍然被保留,该保留点之后所建立的保留点被删除。 自该保留点之后所获取的全部表封锁和行封锁被释放,但指定的保留点以前所获取的全部数据封锁继续保持。 该事务仍可继续。 (3) 保留点 保留点(savepoint )是在一事务范围内的中间标志,经常用于将一个长的事务划分为小的部分。保留点可标志长事务中的任何点,允许可回滚该点之后的工作。在应用程序中经常使用保留点;例如一过程包含几个函数,在每个
14、函数前可建立一个保留点,如果函数失败,很容易返回到每一个函数开始的情况。在回滚到一个保留点之后,该保持点之后所获得的数据封锁被释放。6. 视图在什么情况下可以对其,删除,修改操作:DML 操作应遵循的原则:1).简单视图可以执行 DML 操作;2).在视图包含 GROUP 函数,GROUP BY 子句,DISTINCT 关键字时不能删除数据行;3).在视图不出现下列情况时可通过视图修改基表数据或插入数据:a.视图中包含 GROUP 函数,GROUP BY 子句,DISTINCT 关键字;b.使用表达式定义的列;c.ROWNUM 伪列。d.基表中未在视图中选择的其他列定义为非空且无默认值。WIT
15、H CHECK OPTION 子句限定:通过视图执行的 INSERTS 和 UPDATES 操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。视图的删除:DROP VIEW VIEW_NAME 语句删除视图。删除视图的定义不影响基表中的数据。只有视图所有者和具备 DROP VIEW 权限的用户可以删除视图。视图被删除后,基于被删除视图的其他视图或应用将无效。7. oracle 中各种连接的写法:内连接,外连接 ,左外连接,右外连接以上几种连接一般用于多表之间复杂的查询,下面先说说内连接,也即相等连接,如右两张表 dept ,employee,dep
16、t 里有字段 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(+)
17、 =dept.deptno这是一个右连接看下面的例子select empno,ename,sal,emp.deptno,dept.deptno from emp,dept where dept.no=emp.deptno(+)这是一个左连接两个查询显示的查询结果是一样的,刚开始学 oracle 的时候很多人都很难明白这个,现在有个笨办法,大家不防记下来, ()出现查询条件的左边即右连接,出现在右边即左连接。 ()可以放在左边也可以放在右边,但是一定要放在缺少条件的那一边,如上面的例子中,如果公司最近准备成立一个新的部门,测试部门,但现在还没有招新员工,而现在 Boss 想知道公司有知道公司的员
18、工在那个部门并且想知道没有员工的部门,我们可以用上面的查询语句实现。左外连接(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.dept
19、no=dept.deptno)以上显示的结果和外连接查询出来的结果是一样的 ,只是写法不一样而已,实际工作中外连接用的比较多,没有必要都要去用它,但是概念大家一定要了解。全外关联 :FULL OUTER JOINSELECT 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 的员工记录和没有任何
20、员工的部门记录。8.查询的优化1).根据查询条件建立合适的 index2).因为 SQL 是从右向左解析,多表查询时,记录数少的表放在右边3).多个条件时,收敛快的条件放在右边。4).避免使用复杂的集合函数,象 not in 等。5).避免在条件中对字段进行函数操作6).尽量避免使用 select *,应该写出需要查询的字段7).在 java 中尽量使用 preparestatement 执行 sql,从而共享执行计划 “9.怎么看执行计划使用 explain 或者 autotrace 查看执行计划10. 如何强制一个 SQL 语句使用索引? 使用 index hints11. Oracle
21、中的 PL/SQL 块是否熟悉?Oracle 中的内置函数是否熟悉?内置函数:ASCII,CHR,CONCAT, decode,to_date,to_char,to_number 等等。12.如何取一个没有排序的查询结果中的前 10 条记录?select fielda from tablea where rownum=11;15. 如何取一个有排序的查询结果中的第 11 条到第 20 条记录?select fielda from (select fielda ,rownum rn from (select fielda from tablea order by fieldb ) where r
22、ownum=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 C
23、ONSTRAINT 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 k
24、ey(DepNo) References Depart(DepNo);18. oracle 中的常用函数,如:日期函数1. 日期函数ADD_MONTHS:返回给指定的日期加上指定的月数后的日期。其格式为add_months(d,n) , 其中 d 是日期 ,n 表示月数。MONTHS_BETWEEN:返回两个日期之间的月数。其格式为:months_between(d1,d2) , d1 晚于 d2,结果返回正数,否则返回负数。LAST_DAY:返回指定日期当月的最后一天的日期值。格式为:last_day(d)。ROUND:返回日期值,此日期四舍五入为格式模型指定的单位。格式为:round(d,
25、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
26、,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 函数进行逐个值的替换。3. 数字函数ABS(n) : 取绝对值 SIG
27、N(n) : 取符号CEIL(n) : 向上取整 FLOOR(n) : 向下取整SIN(n) : 正弦 FOWER(m,n): m 的 n 次幂COS(n) : 余弦 MOD(m,n): 取余数ROUND(m,n): 四舍五入 TRUNC(m,n): 截断 SQRT(n): 平方根4. 转换函数TO_CHARTO_DATETO_NUMBER5. 其他函数NVL(expre1,expre2) : 将空值替换为指定的值NVL2(expre1,expre2,expre3): expre1 不是空值,则 NVL2 返回 expre2,否则返回 expre3NULLIF(expre1,expre2) :
28、 比较两个表达式,如果相等,返回空值,否则返回expre16. 分组函数AVGMIN :参数列中所有值的最小值MAXSUMCOUNT7. 分析函数ROW_NUMBER,RANK,DENSE_RANK数据库 简单 SQL 语句总结 1.在查询结果中显示列名:a.用 as 关键字:select name as 姓名 from students order by ageb.直接表示: select name 姓名 from students order by age2.精确查找:a.用 in 限定范围:select * from students where native in (湖南, 四川) b
29、.between.and:select * from students where age between 20 and 30c.“=”:select * from students where name = 李山 d.like:select * from students where name like 李% (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“ 李” 的所有对象,应该命令:%李%;若是第二个字为李,则应为 _李%或_李或_李_ 。)e.匹配检查符:select * from courses where cno lik
30、e AC% (表示或的关系,与“in(.)“类似,而且“ 可以表示范围,如:select * from courses where cno like A-C%)3.对于时间类型变量的处理a.smalldatetime:直接按照字符串处理的方式进行处理,例如:select * from students where birth = 1980-1-1 and birth 1 6.UNION 联合合并查询结果,如:SELECT * FROM studentsWHERE name like 张% UNION ALL SELECT * FROM students WHERE name like 李%7.
31、多表查询a.内连接select g.sno,s.name,c.coursename from grades g JOIN students s ON g.sno=s.sno JOIN courses c ON o=o(注意可以引用别名)b.外连接b1.左连接select o,max(coursename),count(sno) from courses LEFT JOIN grades ON o=o group by o左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。b2.右连接与左连接类似b3.全连接s
32、elect sno,name,major from students FULL JOIN majors ON students.mno=majors.mno 两边表中的内容全部显示c.自身连接 select o,c1.coursename,c1.pno,c2.coursename from courses c1,courses c2 where c1.pno=o 采用别名解决问题。d.交叉连接select lastname+firstname from lastname CROSS JOIN firstanme相当于做笛卡儿积8.嵌套查询a.用关键字 IN,如查询李山的同乡:select *
33、from students where native in (select native from students where name= 李山) b.使用关键字 EXIST,比如,下面两句是等价的:select * from students where sno in (select sno from grades where cno=B2) select * from students where exists (select * from grades where grades.sno=students.sno AND cno=B2)9.关于排序 ordera.对于排序 order,有两种方法:asc 升序和 desc 降序
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。