数据定义语言(DDL)
用来定义数据库对象:数据库,表,列等。关键字。也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
数据库
表
索引
约束
视图
数据操作语言(DML)
用来对数据库中表的数据进行增删改
数据查询语句(DQL)
数据控制语言(DCL)
用来定义数据库的访问权限和安全级别,及创建用户
事务控制语言(TCL)
字符型
char
定长,最大2000字符
varchar2(20)
变长,最大4000字符
clob(character large object)
数字型
number
number(5,2)
number(5)
日期
date
timestamp
oracle默认日期格式‘DD-MON-YY'
改日期默认格式
图片
blob
二进制数据 可以存放图片、声音
关系运算符 > < >= <= = !=(或<>)
逻辑运算符 or and not
算数运算
四则运算
null参与运算时,结果永远为null-->解决nvl/nvl2
连接符 concat、||
单行函数:
① 字符函数
a.lower /upper/initcap
b.substr(str,begin):将str从begin开始截取
select substr('Hello world',3) from dual ;
c.substr(str,begin,len) :将str从begin开始截取,截取的长度是len
d.length/lengthb
获取字符个数、字节数
select length('Hello world') 字符数, lengthb('Hello world') 字节数 from dual ;
select length('西安') 字符数, lengthb('西安') 字节数 from dual ;
e.instr(a,b) :在a中,查找b的位置(从1开始数)。如果不存在,返回0 ;
f.lpad左填充、rpad右填充
g.trim()
h.replace()
select replace('Hello world','l','*') from dual ;
②数值函数
a. round(数字,n) :对数字的第n位小数进行四舍五入。
b.trunc(数字,n):截取(舍尾)
c.mod():求余
③ 日期函数
a.关键字sysdate:获取当前时间
b.格式化时间 to_char(时间,格式)
c.日期 可以+/-数字
d.日期只能-日期,不能+日期
e. months_between(日期1,日期2) :相差的月数。日期1- 日期2
f: add_months(时间,月数):增加月份
g. last_day(时间) :当月的最后一天
i. next_day(时间,'星期N'):下一个星期N是哪一天
j. 四舍五入
h.截取(舍尾)
日期格式
④通用函数
a.nvl/nvl2
b.nullif(a,b) :如果a=b,则返回null;否则返回a
c. coalesce :从左往右,寻找第一个不为null的值
d.条件判断函数
1)decode(字段,条件1,表达式1,条件2,表达式2,...,条件n,表达式n,其他)
⑤转换函数
多行函数
count(*) :求总数量
sum 求和
avg 求平均值
max最大值
min最小值
select sum(sal) 总工资,avg(sal) 平均工资, max(sal) 最高工资,min(sal) 最低工资 from emp ;
conn[ect]命令
conn 用户名/密码@网络服务名 [as sysdba/sysoper]
disc[onnect]命令
passw[ord]
show user
exit
start和@
运行sql脚本
edit
该命令可以编辑指定的sql脚本
spool
该命今可以将sg1*plus屏幕上的内容输出到指定文件中去。
可以用来控制输出的各种格式,set show
linesize
设置显示行的宽度,默认是80个字符
显示行宽
设置行宽
pagesize
设置列宽
设置类型为字符串的列:
设置类型为数字的列:
显示运行时间
ed
c /错误的命令/正确的命令
select * from emp;
a order by sal ;
过程:
-注意:a后面有2个空格。
序号
是否区分大小写?
注释
C
建表
R
查看当前用户所有
查看表的结构
U
修改表名
增加字段
修改字段名
修改字段的长度
删除字段
D
6个约束
主键约束Primary Key: 唯一,不能为null
唯一约束Unique :唯一,允许为null
检查约束Check:对字段的数据范围进行限制( 年龄 age>0 and age<100)
外键约束Foreign Key:两张表之间
默认约束Default:对字段进行默认值的设置
非空约束Not Null:对字段 是否可以为null进行限制
主键和唯一键的区别:
作为范围可以分为两大类
二者的区别:
列级约束
表级约束
列级约束
create table student
(
stuNo number(3) primary key, --主键约束
stuName varchar(20) unique ,--非空约束not null、唯一约束
stuAddress varchar(50) default '陕西西安' check( length(stuAddress)>2 and length(stuAddress)<20 ),--默认约束、check约束
subId number(3)
)
注意事项
①如果一个列有多个约束(且包含default约束),则default约束必须放在第一个
②唯一约束:不适用于null
③check约束:
④ 不论违反的是 主键约束,还是唯一约束,在重复插入数据时,都报错:违反唯一约束条件
约束命名
constraint 约束类型_约束列
命名规则
注意事项: 约束名 在当前用户下的所有表之间 共用。
创建带约束的表
表级约束
外键(完整约束条件)
创建外键
要求外键列数据必须在主表的主键列存在或是为NULL。
表级约束
列级约束
级联置空、级联删除
级联删除
级联置空
create table student4
(
stuNo number(3),
stuName varchar2(20),
subId number(3),
constraint FK_student4_sub foreign key(subId) references sub(sId)
--级联删除on delete cascade
on delete set null -- 级联置空
);
在子表中设置
使用外键的一些设置
追加约束
① alter table 表名 add constraint 约束名 具体的约束
追加唯一约束:
追加主键约束:
追加检查约束:
追加外键约束:
② alter table 表名 modify 约束名 具体的约束
追加默认约束(默认值):
alter table student5 modify stuname default '未命名' ;
追加非空约束
删除约束
alter table 表名 drop constraint 约束名;
如何删除默认约束?
完整性约束
delete from student where sno=1;
delete from 表名;
drop table student;
truncate table student;
select * from 表名;
基础查询
多字段查询
select hiredate from emp;
查询全部列
别名
select ename as "姓名",job as "工作" from emp;
select ename "姓名",job "工作" from emp;
select ename 姓名 ,job 工作 from emp; --不推荐,如下是错的:
distinct去重
列的计算
条件查询where
运算符
between ..and.. 数字/日期
select * from emp where sal between 2000 and 3000
select * from emp where hiredate between '01-1月-81' and '10-11月-81' ;
模糊查询:like
通配符
查询姓名中 第二个字母是M的员工
查询姓名长度>=6的员工。
转义符:ename: A_B
in
排序查询
select * from .... where... order by 字段名|别名|表达式|数字 asc(默认)|desc ;
多个字段进行排序
如果排序存在null:在Oracle中Null最大。如果需要null排在最后,使用nulls last ;
分组
查询时,不在组函数(多行函数)中的列,必须在group by后面
筛选 行:where
筛选 组:having
查询每个部门的人数:按部门分组
查询每个部门的人数,只查询人数大于5的组
连接查询
内连接
外连接
左外
右外
完全
自连接
将一张表,通过别名“视为”不同的表
集合运算
创建保存点
回滚至保存点
提交
创建用户
create user 用户名 identified by 密码;
修改密码
给自己修改密码
sql> password 用户名
给别人修改密码
sql> alter user 用户名 identified by 新密码
删除用户
drop user 用户名 [cascade]
级联删除
- 权限 - 系统权限 - 用户对数据库的相关权限 - 140多个系统权限 - 对象权限 - 用户对其他用户的数据对象操作的权限 - Oracle拥有25个对象权限 - 角色(一组权限) - 预定义角色 - 自定义角色
角色
授予权限
查询
收回权限
权限维护
xiaoming用户可以去查询scott的emp表/还希望小明可以把这个权限继续给别人。
如果是对象权限,就加入with grant option
系统权限,system给xiaoming权限时:
如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样
使用profile管理用户口令
账户锁定
指定该帐户(用户)登陆时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用dba的身份去执行该命令
例子:指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现
给账户(用户)解锁
终止口令
为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba身份来操作
例子:给前面创建的用户tea创建一个profile文件,要求该用户每隔10天要修改自家的登陆密码,宽限期为2天。
口令历史
如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,0racle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密
码。
删除profile
1NF
2NF
3NF
注意
等价于1
等价于2
等价于
create table myemp as select empno,ename,job from emp;
a. SQL Loader工具 b.数据泵 c.外部表
insert into mystudent values(2,'ls',24);
insert into mystudent values(2,'ls',24);
insert into mystudent values(3,'ww',55);
重复数据可以通过rowid删除,但不能通过rowNum删除。
删除全部数据
分析
删除重复的行:
将重复数据分为一组:
数据插入越早,rowid越小。
最终SQL:
思路
尝试:
查询每种工作的最低工资,以及领取该工资的员工姓名。
select min(sal),job from emp
group by job ;
select e.ename ,t.job, t.minsal from emp e , (select min(sal) minsal ,job from emp
group by job) t
where e.empno = t.empno ;
--where t. minsal = e.sal and t.job = e.job ;
t
minsal, job
a b
c d
e f
查询出工资不超过2500的人数最多的部门名称。
分析:
select d.deptno,d.dname from dept d ,emp e
where d.deptno = e.deptno and e.sal<=2500
group by d.deptno,d.dname
having count() = ( select max(count()) from emp
where sal<=2500
group by deptno
);
查询出管理 员工人数最多的人的名字 和 他管理的人的名字。
先查出管理最多的员工数 (最多管理几个人)
select max(cn) from
(select count(mgr) cn, mgr from emp
group by mgr) t ;
再查出与最多员工 相对应的MRG
select mgr from emp
group by mgr
having count(mgr) = (select max(cn) from
(select count(mgr) cn, mgr from emp
group by mgr) t );
最终:
select e.ename 员工 , b.ename 领导 from emp e ,emp b
where e.mgr = b.empno
and e.mgr = (select mgr from emp
group by mgr
having count(mgr) = (select max(cn) from
(select count(mgr) cn,mgr from emp
group by mgr) t ));
员工编号、年薪、部门名称
select empno,sal*12,dname from emp e,dept d where e.deptno = d.deptno ;
select * from emp ;
create view myempview as select empno 编号,sal*12 年薪,dname 部门名称 from emp e,dept d where e.deptno = d.deptno ;
create view baseview as select empno,ename,job from emp with read only;//设置只读
create view empdeptno20 as select * from emp where deptno=20 with check option;
简单视图
复杂视图
①当出现以下之一时,不能Insert/update
②当出现以下之一时,不能delete
create view testview
as
select avg(sal) 平均工资,sum(sal) 总工资,job from emp group by job ;
--没有出现在组函数中的列,必须出现在group by后。
不合适:
create synonym hremp for hr.employees; --需要先授权:sys账户中grant create synonym to scott;
create procedure myPro as pnum number:=10; begin dbms_output.put_line('hello'); dbms_output.put_line('world'||pnum); end;
方法一:
方法二:
输入参数:deptno
输出参数:所有员工信息 -- List
存储过程 /存储函数 不能直接返回光标。 -- package
小结:要返回光标,必须先建包package。
包:包头+包体
其中 包头,相当于 接口; 包体,相当于实现类。
创建包头:右键程序包-->新建
创建包体:右键包头-->创建主体
可以在包中 建立存储过程。