数据库语言

发布于:2024-05-23 ⋅ 阅读:(143) ⋅ 点赞:(0)

DQL 数据查询语言

  • 简单查询
  • 限定查询
  • 子查询
  • 表连接
  • 集合

DCL 数据控制语言

  • grant 赋权
    grant 权限 to 用户
  • revoke 回收权限 dba 岗位
    revoke 权限 from 用户;

DDL 数据定义语言

  • 创建 create
  • 删除 drop
  • 修改 alter
  • 清空 truncate

DML 数据操作语言

  • 插入 insert
  • 更新 update
  • 删除 delete
  • 合并 merge

TCL事务控制语言

  • 提交 commit
  • 回滚 rollback

创建表

1、复制表的方式创建表

create table 表名 as select 语句;

create  table 表名  as select  语句;

--创建一张emp1 ,emp1和emp表的列名列的数据类型等都一致
create table emp1 as select * from emp;
select * from emp1; 

--创建表emp3 内容和emp表的 ename,job,hiredate列一样
create table emp3 as select ename,job,hiredate from emp;
select * from emp3;
--创建emp10,emp20,emp30三张表,表数据分别是emp表10部门,20部门,30部门的数据
create table emp10 as select * from emp  where deptno=10;
create table emp20 as select * from emp  where deptno=20;
create table emp30 as select * from emp  where deptno=30;
select * from emp10;
select * from emp20;
select * from emp30;

--创建一张emp_null 表格式同emp一致(注意:表格式)
create table emp_null as select * from emp  where 1=2;
select * from emp_null;
2、手动创建表
字段类型:|-数值型  number  int
         |-字符型  char  varchar  varchar2
         |-日期型  date

语法结构:
create  table(1  类型长度 [约束],2  类型长度 [约束],
                  .....)

--创建学生表
create  table   student(id     number(10),
                        name   varchar2(50),
                        sex    varchar2(8),
                        birth  date,
                        family varchar2(100),
                        phone  number(11));
emp
select * from  student;
drop table student;
--创建一张yuangong 字段参考emp表 
create table yuangong(员工编号  number(4),
                      部门编号  number(2),
                      职位      varchar2(9),
                      员工姓名  varchar2(10),
                      薪资      number(7,2),
                      提成      number(7,2),
                      入职日期  date,
                      经理编号  number(4));

select * from yuangong;

带约束创建表
create  table(1  类型长度 [约束],2  类型长度 [约束],
                  .....)

表的约束是Oracle数据库中应用在表数据上一系列强制性的规则。
当向已创建约束的表中插入数据或修改表中数据时,必须满足表的完整性约束所规定的条件。
按照约束用途分类:

  1. primary key:主键约束 唯一且非空
  2. foreign key:外键约束
  3. check:检查约束
  4. unique:唯一约束
  5. not null:非空约束
  6. default:默认值
create  table   student(
		id    number(8)  primary key,
		--一个列可以加多个约束,如果有not null约束 必须放最后
        name  varchar2(1000) unique not null , 
        sex   varchar2(6) check(sex in('男','女')) ,
        class varchar2(20) not null,
        birth date  default date'2023-9-1');

带约束名创建表:

create  table(1  类型长度 constraint 约束名 约束,2  类型长度 constraint 约束名 约束,
                  .....)
drop table student;
create  table   student(id    number(8) constraint pk_id primary key,
                        name  varchar2(1000) constraint unn_name unique not null , --一个列可以加多个约束,如果有not null约束 必须放最后
                        sex   varchar2(6)  check(sex in('男','女')) ,
                        class varchar2(20) constraint nn_class not null,
                        birth date  default date'2023-9-1'); --默认值不可以添加约束名

单独设置约束名

create  table(1  类型长度 ,2  类型长度 ,
                  .....
            [约束名]  约束(字段),
            [约束名]  约束(字段));
drop   table  student;
create  table   student(id    number(8) ,
                        name  varchar2(1000),
                        sex   varchar2(6),
                        class varchar2(20),
                        birth date,
                        
                        primary key(id,name), --可以设置组合主键  为一个或多个字 段
                       
                        check(sex in('男','女')),
                        unique(name),
                        check(class is not null) --非空约束必须改写为check
                                                  --默认值不可以用这种定义方式
                        );

一张表只能有一个主键,但是一个主键可以由多个字段共同构成。
外键约束:外键约束需要两张表,创建外键约束的表是子表(外键表),参考表是父表(参考表)。
创建外键约束的列叫外键列,参考表的参考列必须是父表的主键列。
外键约束的作用:外键列中的值必须是父表的主键列中存在的值。

语法: [constraint 约束名 ] foreign key(外键列) references 父表(主键列)
drop  table  yuangong;
create table yuangong(empno number(4),
                      ename varchar2(10)  ,
                      job varchar2(9)  ,
                      mgr number(4) ,
                      hiredate date  ,
                      sal number(7,2) ,
                      comm number(7,2),
                      deptno number(2),
                      
                      primary key(empno),
                      foreign key(deptno) references dept(deptno) )

增加约束
alter table 表名 add [constraint] 约束类型();
alter table yuangong add  unique(mgr);

几种特殊情况 需要特殊语句添加/修改 约束

  • 当修改非空约束、默认值约束、列的类型长度时,需要使用modify
  • 当修改数据类型长度时,要求字符为空或长度大于原始长度
alter table 表名 modify 列名 [类型长度 ] [default| not  null | null];
--修改yuangong 表 sal字段约束可以为空
alter table yuangong modify sal number(7,2);  --默认值的类型长度也会影响修改
select * from yuangong;
insert into yuangong(empno) values(1234);
truncate table yuangong;

select * from  yuangong;
--修改yuangong表的sal 类型长度为8,2
alter table yuangong modify sal number(8,2);

drop table yuangong;

删除约束
alter table 表名 drop constraint 约束名
alter table yuangong drop constraint SYS_C0011517;
alter修改表
 	1添加列
      alter table 表名 add 列名 数据类型长度       ;
      alter table yuangong add phone_number varchar2(20);
      select * from  yuangong;    

    2修改列的数据类型
      alter table 表名 modify 列名 数据类型;
      alter table user_info modify phone_number number(20);
   	3修改列名
      alter table 表名 rename column 原列名 to 新列名;
      alter table yuangong  rename column phone_number to p_number;
      alter table  emp100 rename column abc to cba;
    4删除列
      alter table 表名 drop column 列名;
      alter table yuangong drop column p_number;
 
    5修改表名
      alter table 原表名 rename to 新表名;
      alter table yuangong rename to yuan_gong;
alter table  emp100 rename to emp001;  
select * from yuan_gong;    
删除表
rop table 表名
--物理删除   --无法在回收站找回
drop table 表名 purge;


select * from emp10;
insert into emp10(empno) values(1234);
truncate table emp10;  --ddl
--清空表数据
truncate table 表名
--查看回收站  
select * from user_recyclebin;

select  * from  emp3;
--清空 emp3  --删除表数据 表结构还在 但是数据无法找回 慎用  
truncate table emp3;
--删除 表emp3   --删除表 可以通过 recyclebin 找回
drop  table emp3;
--闪回技术  闪回emp3
flashback  table  a to before drop;

--物理删除emp3;
drop  table emp3 purge;

--清空回收站 
purge recyclebin;

总结

ddl --一般操作无法撤回
create |-复制表的方式创建  create  tableas  select ...;
       |-手动创建表 create table(1 数据类型 [约束],2 数据类型 [约束]...)
                    |-数据类型 |-数值型 int number
                               |-字符型 char varchar varchar2
                               |-日期型 date
                    |-约束: 主键pk(唯一且非空) 外键(两张表) fk 唯一 un 检查 ck 非空 nn 默认值 default

alter |-增加列    alter  add
      |-删除列    alter  drop
      |-重命名    alter  rename
      |-删除约束  alter  drop
      |-修改列的类型长度及约束  alter  modify 

drop |-删除表 drop  table[purge]
     |-清空表 truncate table--慎用
     |-清空回收站  purge  recyclebin
     |-闪回技术  flashback
truncate      

DML数据操作语言

插入  insert
更新  update
删除  delete 
合并  merge
commit;
rollback;

insert 插入数据

批量插入
insert into 表名[(列名)] select 语句
--创建一个表emp1 结构和emp一致
drop table emp1;
create table emp1 as select * from emp where 1=2;
手动插入
insert into 表名[(列名)] values(1,2...)

dml操作有提交和回滚
 
--创建一张emp2 表结构同emp  向emp2插入emp表10部门的数据
create table emp2 as select * from emp where 1=2;    --ddl
insert into emp2 select * from emp where deptno=10;   --dml
select * from emp2;
--向emp2表插入emp表30部门的员工的员工编号
insert into emp2(empno) select empno from emp where deptno=30;   --dml
--清空emp2  向emp2表的sal,deptno列 插入10部门的平均工资和人数
truncate table emp2;   --ddl
insert into emp2(sal,deptno) select avg(sal),count(1) from emp where deptno=10;
create table abc(a number(10));
--清空emp2  向emp2表插入一条数据 : 
--姓名  QUEEN  员工编号  7890 工资 4800 部门 10 职位 MANAGER 入职日期 今天
insert into emp2(ename,empno,sal,deptno,job,hiredate) values('QUEEN',7890,4800,10,'MANAGER',sysdate);
要求数据类型,字段数量一致 


update 更新数据
语法:
update 表名 set1=1[,2=2..]  where 条件

--把 emp1表中的员工姓名更新为小写,职位更新为首字母大写
select * from emp1;
update emp1 set ename=lower(ename),job=initcap(job),sal=sal+500  where 1=1;

--把 emp1表中的员工姓名更新为大写,职位更新为大写
update emp1 set ename=upper(ename),job=upper(job) where 1=1;
--把emp1表中10部门工资增加500
update emp1 set sal=sal+500 where deptno=10;
--把emp1表中KING 入职日期更新为空
update emp1 set hiredate='' where ename='KING';
--把emp1中10部门员工职位改为小写 工资增加666
update emp1 set job=lower(job),sal=sal+666 where deptno=10;

--创建emp_1 数据同emp
create table emp_1 as select* from emp;
--更新10部门的工资翻番再翻番 名字转小写
select * from  emp_1;
update emp_1 set sal=sal*2*2,ename=lower(ename) where deptno=10;
--更新20部门的工资减半再减半,名字转首字母大写
update emp_1 set sal=sal/2/2 ,ename=initcap(ename) where deptno=20;
--更新30部门的工资为原来的百分之一再三次方
update emp_1 set sal=power(sal/100,3) where deptno=30;
--所有人奖金加10000
update emp_1 set comm=nvl(comm,0)+10000 where 1=1;
删除数据 delete

语法:
delete from[where 条件]

select * from  emp_1;
--从 emp_1表中删除10部门数据
delete from emp_1 where deptno=20;
--从emp_1表中删除工资小于SCOTT工资的员工信息
delete from emp_1 where sal<(select sal from emp where ename='SCOTT');
--删除emp_1中1981年入职的员工信息
DELETE FROM emp_1 where to_char(hiredate,'yyyy')=1981;
--删除emp_1表中全部数据
delete from emp_1 where 1=1;

delete、drop、truncate区别

delete drop truncate
DML DDL DDL
表中数据 表中全部数据
可以加where条件 不可以 不可以
可以回滚 不能回滚 不能回滚
merge into 合并数据
--有则改之 无则加勉
语法:
merge into 表a   --要更新的表
using   表b      --参考表
on(条件)         --on 和() 没有空格
when  matched  then
  update set a.=b./....
when  not matched  then
  insert[(a....)] values(b./...)

--创建emp1020 和emp10部门 20部门数据一样
drop  table emp1020;
create table  emp1020  as select * from emp  where deptno in(10,20);
--emp2030 和emp20 30部门数据一样
drop table emp2030;
create  table emp2030  as select * from  emp where deptno in(20,30);
--把 emp2030 表中20部门的员工姓名更新为小写
update emp2030 set  ename=lower(ename) where deptno=20;
commit;
select * from emp1020;
select * from  emp2030;

网站公告

今日签到

点亮在社区的每一天
去签到