数据库对象:
1.函数(方法):
function
2.触发器:
trigger
3.表:
table
4.索引:
index
5.视图:
view
6.序列:
sequence
7.用户:
user
8.同义词:
synonym
9.表空间:
tablespace
授权:
grant ... to
撤销权限:
revoke ... from
Oracle学习重点:
1.标识列(序列+触发器)
2.分页sql代码
sqlserver的数据类型:
1.字符串:
varchar
2.整数:
int
3.小数:
float/money
4.时间:
datetime
5.布尔:
bit
Oracle的数据类型:
1.字符串:
varchar2
2.整数/小数:
number(p,s) p:精度 s:小数位数
例如 number(5,2) 123.45
3.日期时间:
date
--创建表
create table tb_0723(
sid number primary key,
sname varchar2(50),
ssex varchar2(10)
)
六大约束:
1.主键
2.非空
3.检查
4.唯一
5.外键
6.默认
--创建表空间
create tablespace tbs_0723
datafile 'D:\app\0723.dbf'
size 50M
--创建用户
create user lx
identified by 123
default tablespace tbs_0723
--授权
grant connect,resource to lx
--撤销
revoke connect from lx
数据库:让数据持久性的
SqlServer
登录用户:
创建库==》创建表
一个用户对应多个库
Oracle
创建数据库:
创建用户==》指定表空间
一个库对应多个用户
伪列 :
rownum,rowid
分页案例:
每页3条数据
第一页:1~3
第二页:4~6
第三页:7~9
页码:pageIndex 1 2 3
每页数据条数:pageSize 3
开始:pageStart 1 4 7
结束:pageEnd 3 6 9
上一页的最后一条+1 就是本页的第一条
pageStart=(pageIndex-1)*pageSize+1
pageEnd=pageIndex*pageSize
函数:
日期函数:
获取月份:
add_months
获取当前系统时间:
sysdate
获取当前时间:
current_date
取整(四舍五入):
round
取整 只取年月日:
trunc
本月最后一天:
last_day
下周几为几号:
next_day(星期一、星期二、星期三、星期四、星期五、星期六、星期日)
字符串函数:
小转大:
upper
大转小:
lower
去掉左边的指定字符:
ltrim
去掉右边的指定字符:
rtrim
在字符串中第一次出现的位置:
instr
截取:
substr
连接:
concat、||
哈希码:
ascii
编码对应的字符:
chr
字符串字符长度:
length
左填充:
lpad
右填充:
rpad
判断 字符为什么
decode('b', 'a','周' , 'b',2 , 'c','嗯呐' , 'd',4)
反序:
reverse
数学函数:
向上取最小的整数:
ceil
取整数位:
floor、trunc
四舍五入:
round
求余:
mod
开平方:
sqrt
正负数:
sign
nvl:
nvl(comm,0)--工资+奖金
查询每个员工的工资减去1250:案例
select ename, decode(sign(sal-1250),-1,'不纳税',0,'刚刚好',1,'纳税') from emp;
代码块:
begin
.....
end
打印语句:
dbms_output.put_line('');
赋值:
into、:=
扫描器:键盘输入 &
字段类型:
%type
行类型:
%rowtype
条件分支:
一种可能
if 条件 then
end if;
两种可能
if 条件 then
else
end if;
三种 或 三种以上可能
if 条件 then
elsif 条件 then
....
else ..
end if;
case:
case when then
case 变量
when 值1 then 代码1;
when 值2 then 代码2;
when 值3 then 代码3;
....
else 代码n;
end case;
循环:loop
begin
<<循环体名字>>[可写可不写]
loop
打印语句
循环条件
判断语句
end loop;--停止
end;
案例:循环打印1--100之间所有的整数
declare i number:=1;
begin
<<a>>--给循环起名字为a
loop
dbms_output.put_line(i);
i:=i+1;--每循环一次 i的值加1
exit a when i=101;
end loop;
end;
while:
while(循环条件) loop
循环体;
打印语句
end loop;
案例:循环打印1--100之间所有的整数
declare i number:=1;
begin
while(i<=100) loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end;
for:
begin
for i in 数字..数字(循环条件、从小到大) loop
打印语句
end loop;
end;
案例:循环打印1--100之间所有的整数
begin
for i in 1..100 loop
dbms_output.put_line(i);
end loop;
end;
mod:余
案例:求出1--100之间所有能被3 和 5整除的数字之和
declare i number:=1;
begin
loop
if(mod(i,3)=0)then
if(mod(i,5)=0)then
dbms_output.put_line(i);
end if;
end if;
i:=i+1;
exit when i>100;
end loop;
end;
异常:
no_data_found
too_many_rows
自定义异常:
1、定义行类型
2、查询数据
3、打印定义
4、exception when 异常 then
5、打印输出
案例:
declare mrow emp%rowtype;
begin
select*into mrow from emp where empno =6666;
dbms_output.put_line(mrow.ename);
exception when too_many_rows then
dbms_output.put_line('查询数据太多');
when no_data_found then
dbms_output.put_line('查询不到数据');
end;
抛出异常:
1、定义变量
2、定义异常
3、抛出异常
4、处理异常:
案例:查询指定工号的员工工资,如果工资低于1250 就抛出工资太低异常
declare
msal number;--定义变量存工资
me exception;--定义异常
begin
select sal into msal from emp where empno=7566;
if(msal < 1250) then
raise me;--抛出异常
end if;
exception when me then--处理异常
dbms_output.put_line('工资有点不高呀');
end;
函数function:
1、创建一个函数
2、返回值类型
3、定义变量
4、查询语句
5、返回值
案例:
1、无参:定义一函数查询到工号为7369的员工姓名
create or replace function getname
return varchar2 is
sname varchar2(20);
begin
select ename into sname from emp where empno=7369;
return sname;
end;
2、有参:定义一个函数,接收工号,返回这个员工的工资
create or replace function getsal(sid number)
return number is --返回值类型
msal number;--定义变量
begin
select sal into msal from emp where empno=sid;
return msal;--返回值
end;
使用函数:
1、无参:
select 对象名() from dual;
2、有参:
select 对象名(值) from dual;
游标:
隐式游标
显式游标:遍历多行数据
REF游标(自定义游标)
打印:属性、一行中的属性
隐式游标:SQL
属性:
%found:受影响行数>0就为true
%notfound:受影响行数<1就为true
%rowcount:受影响行数
%isopen:判断游标是否打开,始终为false
显式游标:
1、定义游标
2、打开游标
3、提取数据
4、关闭游标
案例:
declare
cursor 游标名 is sql语句;
begin
open 游标;
loop
fetch 游标 into 变量;
exit when 游标%notfound;
dbms_output.put_line();
end loop;
close 游标
end;
嵌套:
loop(显式游标):
1、定义变量
2、定义游标
3、定义第二个变量
4、sql语句
5、打开游标
6、提取游标数据
7、打印语句
8、打开第二个变量的游标
9、提取第二个变量的数据
10、再次打印语句
11、关闭两个游标
案例:打印部门编号的同时,打印该部门的所有员工信息
declare
dr dept%rowtype;--部门变量
cursor dc is select * from dept;--部门游标
er emp%rowtype;--员工信息变量
cursor ec(dno number) is select * from emp where deptno=dno;--员工信息游标\
begin
open dc;--打开部门游标
loop
fetch dc into dr;--提取部门游标中的数据
exit when dc%notfound;
dbms_output.put_line('部门编号:'||dr.deptno);--打印部门编号、每得到一个部门编号,就查询该部门下的员工
open ec(dr.deptno);--打开员工游标
loop
fetch ec into er;--提取员工游标中的数据
exit when ec%notfound;
dbms_output.put_line(' 姓名:'||er.ename||' 工资:'||er.sal);
end loop;
close ec;--关闭员工游标
end loop;
close dc;--关闭部门游标
end;
for:
1、定义游标
2、定义第二个游标
3、for循环,打开游标,提取数据
案例:打印部门编号的同时,打印该部门的所有员工信息
declare
cursor dc is select * from dept;--部门游标
cursor ec(dno number) is
select * from emp where deptno=dno;--员工游标
begin
for dr in dc loop--循环 打开游标 提取数据
dbms_output.put_line(dr.deptno);
for er in ec(dr.deptno) loop
dbms_output.put_line(' 姓名:'||er.ename||' 工资:'||er.sal);
end loop;
end loop;
end;
序列:sequence
创建序列
create sequence 名字;
获取序列的当前值:
select 名字.currval from dual;
获取序列的下一个值:
select 名字.nextval from dual;
删除序列
drop sequence 名字;
同义词:synonym
案例:创建私有同义词
create synonym sb for scott.emp;
共有同义词:public synonym
创建公有同义词:
create public synonym sss for scott.emp;
创建视图:
案例:
create view v_info
as
select a.empno,a.ename,a.deptno,b.dname,b.loc
from emp a
join dept b
on a.deptno=b.deptno
授权视图:
grant create view to scott;
连接外键:references 表名(字段名)
提交事物:commit;
回滚(撤回):rollback
多行数据插入表二中:
insert into 表1 select * from 表2;
复制数据及表字段并创建表2:
create table 表2as select *from 表1
默认单词:default
默认为系统时间:
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')
去重:distinct