查询:select
数据维护语言DML:insert update delete merge
数据定义语言DDL:create alter drop rename truncate
数据控制语言DCL:grant revoke
事务控制:commit rollback savepoint
数据和信息的载体,信息是数据的内涵
数据库database
定义:按照数据结构来组织,存储和管理数据的仓库
特点:长期存储在计算机内、有组织的、可共享的大量数据集合
二维的数据表是关系数据
数据库的
提供存储和处理大量数据的能力
方便查询
数据操纵语音DML
select
insert
update
delete
merge
数据定义语音DDL
create
alter
drop
rename
truncate
comment
数据控制语音DCL
grant
revoke
事务处理控制
commit
rollback
savepoint
列的约束:域完整性
行的约束:实体完整性
引用的约束:引用完整性
重复数据称为数据冗余
唯一约束:要求该列唯一,允许为空,但只能出现一个值
主键约束:要求主键列的数据唯一,并且不允许为空
域完整性:
限制数据类型
检查约束:某列取值范围限制、格式限制等,如有关年龄,手机号码***号码的约束
外键约束:用于两表建立关系,需要指定引用主表列
默认值约束:某列的默认值,如我们的男性学员较多,性别默认为“男”
非空约束
引用完整性:
使用SQL创建
主键约束:用于唯一标识一条记录的列
选择原则
最少性:尽量选择单个键作为主键
稳定性:尽量选择数值更新少的列作为主键
主键(Primary Key)约束:pk_colname
唯一(Unique Key)约束:uq_colname
检查(Check Key)约束:ck_colname
外键(Foreign Key)约束:fk_colname
create table table_name(
id int primary key,
name char(10) not null,
password varchar2(25) nor null,
gender char(1) default('m'),默认约束
email varchar2(50)
--constraint ck_gender check(gender='m' or gender='f')
);
加检查约束:
alter table table_name
add constraint ck_gender
check(gender='m' or gender='f');
加唯一约束:
alter table table_name
add constraint uq_email
unique(email);
默认约束:
alter table table_name modify(gender char(1) default'm');
表之间的关系:
一对多/多对一;例如:员工-部门,学生-班级,
多对多:形成两个一对多;例如:学生-课程,电影-演员
一对一:使用相对较少;例如:员工-合同
建立外键关系
create table employee(
in int primary key,
name char(5char) not null,
deptid int
);
create table department(
in int primary key,
name char(5char)naot null
)
alter table employee
add constraint fk_deptid
foreign key(deptid) references department(id);
符合主键
所以函数依赖关系是{学号,课程号}->{成绩}
alter table tb
add constraint PK_ID primary key(学号,课程号)
go
删除约束
alter table table_name dorp constraint fk_name
约束的使用场景
要求数据库强制进行数据完整性检查的时候
使用SQL增删改查
create table department(
in int primary key, --主键约束
name varchar2(5char) not null--部门名
);
create table employee(
in int primary key, --主键
name varchar2(4char) not null,--员工姓名
birthdate date not null, --出生年月
hiredate date not null, --入职时间
gender char(1char) not null,--性别
job varchar(5char) not null,--职位
salary number(7,2) not null,--月工资
deptid int --部门ID
);
alter table employee
add constraint fk_deptid
foreign key(deptid) references department(id);
insert into department(id,name) values(1,'财务部');
insert into department values ();
commit;
insert into employee(id,name,birethdate,hiredate,gender,job,salary)
values(1,'张三',to_date('1988-2-12','yyyy-mm-dd'),sysdate,'男','职员',3500);
insert into employee
values(2,'张三',to_date('1988-2-12','yyyy-mm-dd'),sysdate,'男','职员',3500,1,default默认值调用);
commit;
update employee set salary=salary+500 where id=2;
commit;
insert into <表名>values();
commit;--提交事务
update employee set salary=salary+500,deptid=1 where id=2;
commit;
delete from emplyee where id=1;
commit;
基本查询
select name as 姓名,gender 性别 from employee;
过滤列
为列取别名,去掉空格
select trim(name) as 姓名,gender 性别
trim()去空格
带条件查询
比较与逻辑运算符
not or
null值比较
用is null不能用=null
查询
排序
select *from table_name order by 列名,id desc;
升序asc
降序desc
范围查询
3000-4000之间
select * from employee where salary between 3000 and 4000;
deptid是1或者2
select * from employee where deptid=1 or deptid=2;
select * from employee where deptid in(1,2);
模糊查询like:%,_表示一个字符
select * from employee where like''
聚合函数
select max(salary) from employee;最高工资
select min(salary) from employee;最低工资
select avg(salary) from employee;平均工资
select sum(salary) from employee;总工资
select count(*) from employee;总行数
select sum(salary),max(salary),min(salary),avg(salary) from employee;
select distinct job from employee;去掉重复数据distinct
分组查询
group by
按部门统计人数
select deptid,count(*) from employe group by deptid;
所查询的列不在聚合函数内就在group by里面
按照职务分组计算平均工资
select job,avg(salary) from employee group by job;
按部门查询平均工资大于4000
select deptid,avg(salary) from employee group by deptid having avg(salary)>4000;
having用于分组条件增加现在行
查询同名的员工
select name,count(*) from employee group by name having count(*)>1;
按部门查询平均工资在3500之上的部门,并按平均工资降序
select deptid,avg(salary) from employee
group by deptid having avg(salary)>3500
order by avg(salary) desc;
不能再where子句中使用聚合函数来限制行
只能通过having子句来限制行
多表连接查询:笛卡尔成集
select e.name,d.name from
employee e,department d
where deptid=d.id;
只要有逻辑上的连接,不建立外键也能应用
汇总各部门的总工资,要求带出部门名
select sum(salary) from employee e,department d
where e.deptid=d.id
group by d.name;
外连接使用关键字outer join用于检索一个表的所有记录和另外一个表中的匹配行
左外连接:作边的表所有数据都应该查出来
控制也可以查询出来
左外连接
select *from employee e
left outer join department d
on e.deptid=d.id;
右外连接
select *from employee e
right outer join department d
on e.deptid=d.id;
全外连接
select *from employee e
full outer join department d
on e.deptid=d.id;
oracle专有写法
右外连接
select e.name,d.name from
employee e,department d
where deptid(+)=d.id;
左外连接
select e.name,d.name from
employee e,department d
where deptid=d.id(+);
子查询
在select、insert、update
单行子查询用=
select name from employee
where salary=(select max(salary) from employee);
多行子查询用in
select name from employee
where deptid in
(select deptid from employee where name in('陈晨'or'熊成'));
分页查询:伪列关键字rownum
不能用*号,取前3条,
子查询伪列的rownum取别名,使用别名查询
select * from (select rownum rn.id from employee) a
where rn between 4 and 6;
序列sequence为表中的行自动生成序列号
创建序列create sequence序列名称
[increment by 增量]
[start with 起始数字]--默认是1
[maxvalue 最大值|nomaxvalue]
[minvalue 最小值|nominvalue];
create sequence id_seq;
序列的属性:
nextval下一个序列号
currval当前的序列号
select id_seq.nextval from dual;
select id_seq.currval from dual;
增加主键
insert into department values(id_seq.nextval,'部门1');
视图是一张虚拟表,他表示一张表的部分数据或多张表的综合数据,
其结构和数据是建立在对表的查询基础上。
视图中并不存放数据,主要用于查询,一般不用作增删改
创建视图
create or replace view view_name
as
<select 语句>
删除视图:
drop view view_name;
create or replace view v_employee
as
select e.name as ename,d.name as dname from employee e,department d
where e.deptid=d.id
事务是一个独立的逻辑工作单元,
它由特定的一系列必须作为一个整体一起成功或失败的SQL语句组成,
它为数据库提供了读访问的一致性。
特点(ACID)
atomicity(原子性):事务要么完全成功,要么完全失败,不存在局部事情。
consistency(一致性):数据库总会保持一致性的状态
isolation(隔离性):在事务提交以前,由该事务所做的修改,只对该事务的当前会话可见
durability(持久性):事务完成以后,就不能被取消
oracle没有专门启动事务的语句,但只要启动DML命令,oracle就会锁定正在被修改的一些对象,
而且一直锁定到被完成为止。
提交事务commit
回滚事务rollback
使用savepoint的部分回滚
语法:
savepoint name;
rollback to savepoint name;