面试题: select name, sum(decode(t.course,JDBC,t.grade,0)) JDBC, sum(decode(t.course,Hibernate,t.grade,0)) Hibernate, sum(decode(t.course,Spring,t.grade,0)) Spring from tb_course t group by t.name; 11.对象 (1)对象包括: 表、序列、同义字、链接、视图等。 对象的特点:可以给其他对象使用,名字不能重复。 (2)序列:自动生成的唯一序列号,常用在主键自动生成。 创建序列: create seqeuence s_tb_student; 删除序列: drop seqeuence s_tb_student; 序列的两个属性currval,nextval: select s_tb_student.currval from dual; select s_tb_student.nextval from dual; 使用序列: insert into tb_student(id)values(s_tb_student.nextval); 序列不会随着rollback回滚,下面这些情况时sequence值可能产生间隙: 回滚发生; 序列用于多个表(不建议),建议一张表使用一个序列; 系统宕机。 (3)索引 面试:如何优化你的查询? 1.的查询方式? --全表扫描 select * from tb_student 慢 --利用索引扫描 快 --共享语句 最快(oracle有个回滚段,临时表空间) 索引 index 作用:在中用来加速对表的查询 原理:通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 特点:与表独立存放,但不能独立存在,必须属于某个表 由自动维护,表被删除时,该表上的索引自动被删除。 索引的创建: 自动:当在表上定义一个primary key或者unique约束1条件时,会 自动创建一个对应的索引。 手动:用户可以创建索引以加速查询。 create index i_tb_student_name on tb_student(name); 查询的时候使用索引: select * from tb_student where name=Alice; 删除索引: drop index i_tb_student_name; 当创建索引的时候,oracle会默认创建一个和当前表相关的索引页, 而索引页中保存了索引字段和真实的磁盘地址,当用户发送sql语句带了索引时, oracle会到索引页中查询索引字段,直接定位磁盘IO,提取数据。 所以索引数据快于全表扫描。 索引的维护 1.建立索引后,查询的时候需要在where条件中带索引字段才可以使用索引。 2.在经常查询的字段上面建立索引。不要在所有字段上建立索引。 3.因为索引是用来加速查询速度的,如果一张表经常做insert,delete, update ,而很少做select,不建议建立索引 如果一张表字段很少,不建议建立索引。 4.索引是由oracle自动维护的。索引使用久了会产生索引碎片 (磁盘碎片),影响查询效果,所以使用久了需要手动进行维护(删除在重建) sql语句的优化: 多使用共享语句,尽量使你的sql语句能够使用索引。 怎样使sql语句能够使用到索引呢? 当sql语句中包含not in,<>,is null,is not null,like%%的时候 不会使用索引。 in:可以使用索引。 优化方案: a<>0 改为a>0 or a<0 a is not null改为 a>0 或a> is null 用一个缺省值代替空值 like%%不能使用索引 like001%可以使用索引 (4)同义字 :通过创建同义字(对象的另外的一个名字)简化访问对象的操作。 create synonym tb_emp for scott.emp; select * from tb_emp; 删除:drop synonym tb_emp; 链接--database link (5)视图 创建用户时通过dba角色赋予权限,而不是手动赋予权限,则会创建 视图会报:没有权限 解决方案:使用system用户登录,在给j1703赋予权限 grant create any table to j1703 with admin option; grant create any view to j1703 with admin option; grant select any table to j1703 with admin option; 所有数据字典都是视图: select * from User_Tables; 视图可以使复杂的查询变得简单 创建简单视图(一个表): create view v_deptinfo as select deptno as 部门,count(*) 人数,sum(sal) 总工资,avg(sal) 平均工资,max(sal) 最高工资,min(sal) 最低工资 from scott.emp group by deptno; 使用视图:select *from v_deptinfo; 复杂视图(多个表) 删除视图:drop view v_deptinfo; (6)数据建模(试规范题) 软件开发过程: 1. 需求调研,与客户进行沟通 2. 需求分析,将现实工作中的动作模拟到计算机 数据建模 3. 开发 4. 测试 5. 上线部署 从关系的表中删除冗余信息的过程称为规范化, 是得到高效的关系型表的逻辑结构最好和最容易的方法。 规范化数据时:应执行以下操作: 将的结构精简为最简单的形式 从表中删除冗余值 标识所有依赖与其他数据的数据 获得数据化的三种方法:三范式 步骤1: 第一范式:必须要有主键,并且每个属性值都是不可分的最小数据单元 ,则称为是第一范式。 第二范式:所有非主关键字都完全依赖于主关键字(通常用于联合主键) 第三范式:非主关键字不能依赖于其他非主关键字(通常用于一个主键) 数据建模 1.根据三个范式 2.分析实体之间的关系 1对1:一个人只有一个 唯一外键关联或者主键关联 一对多:一个班级可以有多个学生 一个学生只属于一个班级 关联:一对多使用主外键关联,通常在多方建立外键 多对多:一个学生可以选择多门课程 一门课程可以被多个学生选修 关联:多对多通常使用中间表(再多建一张表存储)关联数据 通常中间表会有两张表的id作为联合主键,并且 作为外键指向关联表 订单和用户之间的关系是多对一: create table tb_order( id int primary key, code varchar2(50), user_id int, foregin key(user_id) references tb_user(id) ); 订单和书籍是多对多关系: create table tb_item( order_id int, book_id int, count int, primary key(order_id,book_id), foregin key(order_id) references tb_order(id), foregin key(book_id) references tb_book(id) ); select * from tb_user u,tb_book b,tb_order o,tb_item i where u.id=o.user_id and o.id=i.order_id, and b.id=i.book_id
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-73999-5.html
他不是把军舰开去了吗
在中国同志有更传统的意思哦