oracle04

来源:互联网 发布:java jlabel dialog 编辑:程序博客网 时间:2024/05/21 17:57
 

============sql04 ====================
一。日期处理函数:
 round(日期,"格式")//格式默认 dd,会考虑四舍五入
 trunc(日期,"格式")//格式默认 dd,不考虑四舍五入
select to_char(round(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;
 打印出下一天0点整
select to_char(trunc(sysdate,'dd'),'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(trunc(sysdate,'mm'),'yyyy-mm-dd hh24:mi:ss') from dual;
 sysdate+2:加2天。
dd 表示以日作为基本截取单位,mm以月作为基本截取单位。月过了一半就返回下一个月,
 打印出当天0点整      日过了一天就返回下一天。
 
 给你任何的一个时间,得到这个时间度应的下一个月的开始,就以mm作为基本单位。月!
 add_months(trunc(sysdate,'mm'),1);用系统函数系统会自动识别月+1.无需你关心细节。
 
二。索引(数据量越大效果越明显)
 目的:加速查询。主要是减少磁盘的I/O等啥啥啥的。
 从头查到尾的  ----全表扫描
  通过索引  ------索引查找
  
  自动建立索引2:主键   唯一键  叫:唯一性索引
  
 set timing on --为了测试索引,设置统计sql时间.
 执行时间:1生成执行计划 2查询:首次时间会把执行计划生成时间包含进去,之后就不会包含罗!!
 
 create sequence test_index_pk ;
 insert into test_index_values(test_index_pk.nextval,'test'||1);连接字符串
 commit;
 
 begin
  for abc in 2..100000 loop
   insert into test_index_values(test_index_pk.nextval,'test'||abc);
   commit;
  end loop;
 end;
 
 select id,name from tab where name = 'test50000';
 理论上:200条1提交commit; 否则10万条数据都在缓存中,怕缓存不够。
 
 建立索引:
  create index “test_index_na” on test_index(name);在这个表上该字段建立索引。
 建立索引需要消耗时间,一般建立索引在晚上睡觉做。
  (M) 地心(多杈树) //这是索引的底层编制数据方式(组织方式)rowid
 (a-m) , (n-z)
 a-c c-e e-m,n-x x-z
 
 rowid ------记录的18位的磁盘编号。
 oracle没一条记录都会打一个rowid编号。物理编号
 select rowid,id,salary form s_emp;
 最快的查询方式 select id,salary from s_emp where rowid='AAANEiAAEAAAATPAAY'
 :因为不需要消耗磁盘查找。如果不删除,则这数据磁盘地址是固定的。
主要是底层应用,实际中在区分记录的时候可以使用。(有些表没有主键就通过这个东西来区分)
 
rowid是伪列,虽然在表中看不到,但是他确实有。以区分每一条记录。

什么字段会使用索引://dba查询优化!
 1.经常会出现在where条件后的字段。
 2.如果2个字段同时出现在where条件后边。create index "a" on tab(id,id2);联合索引
 3.使用索引,数据量越大越明显。查询出的数据量要低于2%-4%.
 4.经常变动的表不适合建立索引。增,删,查,改(导致蜂窝)
 5。表不能太小。
 (索引占空间)
 
 四:视图(不占空间,只保存一个语句撒,其实也占):对同一组数据有不同的表现撒。
   优点:限制数据库的访问,简化查询,数据的独立性(不同的人看不同等级的数据,访问控制)
   create or replace view myview  as 子查询
 
  简单的视图,可以通过增,删改视图来修改真表。除非复杂的视图有许多限制的,比如有组函数等


五:数据库的设计:开发步骤
 想法--模型ER图--表模型--生成脚本--建立表库
 实体:
 属性:
 关系:1:1 1:多 多:多
按照e_r图实现:三种关系:
没有外键,关系照常表达。外键让数据的表达更加的严格了。但操作就比较高了。
有些人不设置外键,是为了让自己更轻松。设置外键可以是项目难度高达n倍。我以前就不喜欢建立外键。麻烦死了。

六:3范式:
 1范式:字段不可再分,比如:面积可分为宽和高,基本所有东东都满足。
 2范式:所有的非主属性都依赖于主属性(唯一能标识该记录的属性id罗,主键罗)。
 3范式:在2范式基础上消除了传递依赖。
  
  
七:分页技术
希望一页显示10条
按工资排序,找出前10位的员工
伪列:rownum  oracle 独有(老师说的,不是我说的)
  limit   mysql
  top   sqlserver
ep:select rownum,last_name,salary from s_emp order by salary desc;


引擎现编号后排序
select rownum,last_name ,salary from (
 select last_name ,salary from s_emp order by salary desc
)where rownum<11 and rownum<21;

select * from (//取出不符合条件的数据
 select rownum r,last_name ,salary from (//对排序好的数据进行编号
  select last_name,salary from s_emp order by salary desc//排序
 ) where rownum<21
) where r>10;

10 .truncate table s_emp ; 同delete table s_emp;一样,但是他会自动提交,
不可恢复的删除。不是dml语言,而是ddl语言。

11。delete 于 truncate的区别: 
 delete 不会把表空间释放,(磁盘空间)
 truncate会把表的空间释放,有数据来就会增加。(磁盘空间) 把高水位线拍扁。

所以呢,删除小量的数据:delete
大量的数据删除使用truncate会释放空间,并且比delete的还快。

================下午PL/SQL  Oracle对sql的扩充=========================
1.procedure ---过程,同函数差不多,只是过程没有返回值。
2。Pro C/C++ ---用c/c++访问数据库的技术。
   vc   ---ado技术/odbc vc访问数据库技术
   sqlj/jdbc ----java访问数据库的技术
   oci--c/c++连接接口。一堆函数偏底层。
3。在sql上加上了过程话语言。
 
plsql中拓展了类型和变量,控制语句。具有算法描述语句,增加了过程和函数,对象类型的方法
 declare --申明区 定义类型和变量
 begin --执行区 些代码的地方
 exception  --异常处理区 处理异常
 end; --
 /
 4个关键字把程序分成了3个部分。
 
  1.:= 给变量赋值
    = 比较(一个=表示比较)
    into 把查询出的内容赋值给变量
   
例子:
 declare
  v1 number(5) := 1000;
  v2 varchar(20);  //声明变量
 begin
  select first_name into v2 from students where id = v1
    //sql处理语句
 exception
  when no_data_found then insert into log_table (info) values(‘student 1000 does not exist!');
  commit;
    //异常处理语句
 end; 
  
 
 begin end 交给过程性语句执行器,普通的sql语句会交给sql语句执行器,分析之后整合输出即可
 
 
 plsql例子:
  begin
   dbms_output.put_line('hell plsql');打印一句话
  endl;
 / 反斜线代表plsql的结束,所以要使用/来结束。
 plsql程序的输出,默认是关闭的,所以我们要打开,才能打印东东。
  set serveroutput on
 
  sqlplus developer一个图形话的友好的工具,oracle官方网有得下载。
  plsql对大小写不敏感。so begin BEGIN zhe same ;
 
 --单行注释 /**/多行注释 
 标识符:给变量,类型,对象(函数,过程,游标命名的)
 declare
  var_fist_name varchar2(25);
 begin
  select first_name into var_fist_name from s_emp where id =1 ;
  dbms_output.put_line(var1);
 end;
 
 定义常量:var_fist_name constant varchar2(25)

 如果定义了一个变量,没有赋初值,则那个变量的值就是NULL;
 注意:plsql中,查询的内容必须有对应的内存。必须把查询的内容放在一个地。否则报错。即放入一个变量中。
 
 2天怒努力省好几倍的精力。  
plsql中没有NULL;
------------------------------------------------

数据类型:
 标量型:number binary_integer boolean date varchar2 char binary_intege
 组合型:record记录类型 table表类型 
 参考类型:ref cursor
 大类型:bfile blob clob
 
number(4,3) 整数位是4-3=1位,3个小数位数。
---------------------------------------------------
1.定义一个和s_emp表中的first_name 类型相同的 长度相同的变量

注意:在什么环境下写的sql脚本,那么你执行脚本的时候必须配置为相对应的环境。

可以在不了解数据类型长度的情况下,使用%type
%type :取得表中对应字段类型。取类型
 表名.字段名%type  :自动搜索类型
declare
 var_name s_emp.first_name%type;//这叫类型

二。record记录类型
结构体类型:
 例子:
 declare --定义一个record类型
  type record_emp is record(
   var_name varchar2(25),
   var_age number,
   var_id number
  );
  --用record类型去定义变量
  var_emp record_emp;
 begin
  select first_name ,salary ,dept_id into var_emp where id =1;
  dbms_output.put_line(var_emp.var_name||':'||var_emp.var_salary);
 end;
 
--var_name cwjtab.id%type
-----------------------------------------------------
两个记录类型之间的赋值。
var_emp record_emp;
var_emp2 record_emp2;
 1.怎么把var_emp导入到var_emp2中?=》var_emp2:=var_emp;
 2.怎么单个赋值? var_emp2.name =var_emp.name;
      var_emp2.id =var_emp.id;
 3.select id,name into var_emp from s_emp ;//2个放入有3个元素的记录变量中,会报错:to many values;.............
 (即查询的字段少,但是记录变量里面的字段比较多!!!)
解决:select id,name into var_emp.id ,var_emp.name.................
单个赋值呗,晕死哦。

into后面可以接多个变量,表示接受多个字段值。
作业:学生和课程多对多实现


 

原创粉丝点击