============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后面可以接多个变量,表示接受多个字段值。
作业:学生和课程多对多实现