1.DDL—数据定义语言
DDL——数据定义语言,可以创建、修改和删除表。
1.1create 表创建
表创建遵循三范式:
-
列不可再分,字段的原子性
-
添加主键(数据量多,频繁操作的需要定义主键)
-
拆分消除传递依赖,建立主外键关系
创建表的一般格式:
create table 表名(
字段名1 字段类型1 约束条件,
字段名2 字段类型2 约束条件,
…
)
其中约束条件是对字段值的要求;常用约束条件包含以下几种:
关键字 | 功能 |
---|---|
primary key | 主键约束:非空+唯一 |
not null | 非空约束,结果不能为空值 |
unique | 唯一约束,该字段值只能出现一次 |
default () | 默认约束,当不给字段提供值时存在默认值 |
check() | 检查字段值是否与规定值相同 |
foreign key | 外键约束,定义该字段为外键,与主表主键相连接。当直接在字段后面定义时,references 主表(字段名),另起一行时:constraint 提示名 foreign key(从表字段名) references 主表(字段名) |
--创建一个名为CGNDEPT的主表
create table CGNDEPT (
deptno number (3) primary key,--主键
dname varchar (18)
);
--插入数据
insert into CGNDEPT values (101,'设计');
insert into CGNDEPT values (102,'生产');
--创建一个名为CGN,有6个字段并按照一定条件约束
create table CGN (
empno varchar2 (8) primary key,--主键:非空且唯一,该主键是该表的主键
ename varchar2 (18) constraint ck_null not null,--非空值
esex char (1 char) constraint ck_sex check(esex in('男','女')),--检查字段内容
ebirthday date default (sysdate),--默认约束
ephone number (11) unique,--唯一约束
deptno number (3) references CGNDEPT(deptno)--外键约束,与外键连接的约束
--constraint ck_sex foreign key(deptno) references NGCDEPT(deptno)
--在字段后面只需要references 引用即可
--当另起一行时,constraint 和 foreign一起使用
);
--插入数据
insert into CGN values ('C880188','张三','男',default,13354895674,101);
insert into CGN values ('C880178','李四','男',to_date('1999-5-5','yyyy-mm-dd'),13012651230,102);
select * from CGN;
select * from CGNDEPT;
drop table CGN;
drop table CGNDEPT;
1.2alter 表结构修改
表名修改:rename 原表名 to 新表名
修改列:alter table 表名 rename column 原列名 to 新列名
修改类型:alter table 表名 modify (字段 类型)
修改约束:先删除 后添加
添加列:alter table 表名 add 字段 类型
删除列:alter table 表名 drop column 字段
--修改表名
rename tb_txt to tb_txt_new;
--修改列名
alter table tb_txt_new rename column txtid
to tid;
--修改类型
alter table tb_txt_new modify(tid
varchar2(20));
--添加列
alter table tb_txt_new add col varchar2(30);
--删除列
alter table tb_txt_new drop column col;
select * from tb_txt_new;
1.3drop 表删除
drop table 表名;
--删除名为CGNDEPT的表格
drop table CGNDEPT;
2.DML——数据操作语言
数据操作语言DML可以用来做数据的增删改。
2.1insert
insert可以在已经存在的表格中添加数据,其格式为:
- insert into 表名 values (所有字段的值列表);
此方式添加一条数据,必须定义所有字段:
--在名为dept的表中增加以行数据,且定义了各字段的值
insert into dept values (50,'教学部','上海');
-
insert into 表名(字段1,字段2,…) values (指定字段的值列表);
添加一条数据并为指定字段赋值:
--在名为dept表中的deptno,dname字段添加值
insert into dept(deptno,dname) values (60,'后勤部');
2.2delete
delete可以删除数据源中的所有数据,也可以指定删除满足条件的数据。
- delete from 数据源;
--删除dept表中的全部数据
delete from dept;
- delete from dept where 条件;
--删除dept表中 deptno为50和60的数据
delete from dept where deptno in(50,60);
以上删除操作是在不考虑主从表的情况下进行的,当删除表的数据与其他表由主外键连接时,需要格外注意。
当删除的是从表中的数据,可以直接删除,当删除主表中的数据没有与从表产生连接,也可以直接删除。
--直接删除从表
delete from emp;
--删除主表中的dept为40的字段值,该值不在从表的值列表中
delete from dept where deptno=40;
若要删除主表中某一数据时,且主从表中都存在的,则不可直接删除主表数据,要先删除从表中的数据,再删除主表中的数据,顺序不能颠倒。
--先删除从表中字段deptno值为10的数据
delete from emp where deptno=10;
--最后删除主编中字段为deptno值为10的数据
delete from dept where deptno=10;
此外还可以在从表外键设置on delete cascade,该方法在删除主表数据的同时,也能将引用了主表数据的从表同样内容的整行数据进行删除。
--创建一个名为CGNDEPT的主表
create table CGNDEPT (
deptno number (3) primary key,--主键
dname varchar (18)
);
--插入数据
insert into CGNDEPT values (101,'设计');
insert into CGNDEPT values (102,'生产');
--创建一个名为CGN,有6个字段并按照一定条件约束
create table CGN (
empno varchar2 (8) primary key,--主键:非空且唯一,该主键是该表的主键
ename varchar2 (18) constraint ck_null not null,--非空值
esex char (1 char) constraint ck_sex check(esex in('男','女')),--检查字段内容
ebirthday date default (sysdate),--默认约束
ephone number (11) unique,--唯一约束
deptno number (3) references CGNDEPT(deptno) on delete cascade--外键约束,与外键连接的约束 on delete cascade
--constraint ck_sex foreign key(deptno) references NGCDEPT(deptno)
--在字段后面只需要references 引用即可
--当另起一行时,constraint 和 foreign一起使用
);
--插入数据
insert into CGN values ('C880188','张三','男',default,13354895674,101);
insert into CGN values ('C880178','李四','男',to_date('1999-5-5','yyyy-mm-dd'),13012651230,102);
--删除主表中数据的同时,从表数据中deptno=101的数据也会被删除
delete from cgndept where deptno=101;
当从表外键字段设置on delete set null时,删除主表时,从表的数据也会被删除,但是不会被整行删除,而是将该字段的值删除后使用null代替。
2.3update
update可以修改表中所有数据的指定字段的值。
update 表名 set 字段名=z字段值,字段名=字段值…;
--将emp表中sal字段的值都+100,deptno字段的值都设置为40
update emp set sal=sal+100,deptno=40;
3.DQL
select 数据 from 数据源 where 行过滤条件 group by 分组字段 having 过滤组信息 order by …;