-- 20181106講課內容
-- DDL 語句
創(chuàng)建表
--創(chuàng)建年級表tb_grade
create table tb_grade(
gradeId number(6) primary key, --主鍵
gradeName varchar2(20) not null, -- 年級名稱
addtime date
);
-- 創(chuàng)建班級表 tb_classs
create table tb_class(
classId number(6) primary key,
className varchar2(20) not null,
gradeId number(6) not null,
classNum number(3),
beginTime date,
endTime date,
constraint ck_classnum check (classNum>=20 and classNum<=50),
檢查/外鍵約束
-- 檢查約束挖息,班級人數不能小于20不能大于50
constraint fk_gradeid_tbgradeid foreign key(gradeId) references tb_grade(gradeId)
--外鍵,本表的某一個列指向另外一個表列(被關聯表的字段必須是唯一的)
);
字段操作
-- 為已經存在的表添加字段
alter table tb_class add remark varchar2(50);
-- 更新字段(如果該列有數據寸谜,變換類型或者是長度變小,都不行养距,需要先清空數據蝗砾,再更新)
alter table tb_class modify classNum number(5);
-- 刪除字段
alter table tb_class drop column remark;
-- DML語句
時間
-- sysdate oracle中取系統(tǒng)當前時間,相當于mysql中的now()
select sysdate from dual; -- dual oracle中的虛表,物理上不存在恬吕,為了讓語法健全签则,虛擬出來的表
增(union)
-- 單條添加
insert into tb_grade values(1,'一年級',sysdate);
-- 批量添加 union用法 合并查詢結果(合并重復內容),如果是union all 不合并重復內容
insert into tb_grade
select 2,'2年級',sysdate from dual union
select 3,'3年級',sysdate from dual union
select 4,'4年級',sysdate from dual union
select 5,'5年級',sysdate from dual union --all
select 5,'5年級',sysdate from dual;
查
-- 查詢
select * from tb_grade;
select * from tb_class;
join on
-- 查詢每個年級下的班級數量(即使年級下沒有班級也顯示0)铐料,顯示年級名稱和班級數量
select * from tb_grade a join tb_class b on a.gradeid=b.gradeid;
select * from tb_grade a left join tb_class b on a.gradeid=b.gradeid;
group by
-- 在分組查詢時select里面的所有字段在group by后面出現(除非使用聚合函數)
-- count 為null不計數
select a.gradename,count(b.classid) from tb_grade a left join tb_class b on a.gradeid=b.gradeid
group by a.gradename;
select a.gradename,count(b.classid) as cnum from tb_grade a left join tb_class b on a.gradeid=b.gradeid
group by a.gradename order by cnum desc;
--統(tǒng)計各個年級的總人數 nvl 相當于mysql ifnull
select a.gradename,nvl(sum(b.classnum),0) as cnum from tb_grade a left join tb_class b on a.gradeid=b.gradeid
group by a.gradename order by cnum desc;
-- 添加班級表
insert into tb_class(classid,classname,gradeid,classnum) values(1,'11班',1,20);
insert into tb_class(classid,classname,gradeid,classnum) values(2,'12班',1,24);
insert into tb_class(classid,classname,gradeid,classnum) values(3,'13班',1,21);
insert into tb_class(classid,classname,gradeid,classnum) values(4,'21班',2,25);
insert into tb_class(classid,classname,gradeid,classnum) values(5,'22班',2,25);
insert into tb_class(classid,classname,gradeid,classnum) values(6,'41班',4,25);
insert into tb_class(classid,classname,gradeid,classnum) values(7,'42班',4,25);
insert into tb_class(classid,classname,gradeid,classnum) values(8,'31班',3,25);
刪除
-- 刪除
delete from tb_grade where gradeid=7;
truncate table tb_grade ; --刪除數據
-- delete 和truncate區(qū)別 1,delete 刪除可以加條件 truncate不可以(只能整表刪除)
-- 2豺旬,delete 刪除時速度慢钠惩,刪除時記錄日志,如果誤刪數據族阅,在一定時間內可以找回
-- truncate 刪除速度快篓跛,不記錄日志,無法找回
序列
-- 為什么使用序列 oracle創(chuàng)建表時無法使用自增坦刀,oracle自增功能通過序列實現
-- 序列的創(chuàng)建
create sequence seq_tbgrade_id -- 定義序列名稱
start with 10 -- 定義開始值
increment by 1 -- 定義增量
minvalue 1 --最小值 不能高于開始值
maxvalue 9999999 -- 最大值(最大為27個9)
-- 序列的使用
-- nextval 下一個值 currval 當前值
select seq_tbgrade_id.currval from dual;--取當前值(必須先取下一個值)
select seq_tbgrade_id.nextval from dual; --取下一個值
-- 插入時使用
insert into tb_grade values(seq_tbgrade_id.nextval,'n年級',sysdate);
select * from tb_grade;
-- union 里面不能使用序列
select 1,'n年級',sysdate from dual union
select 2,'n年級',sysdate from dual union
select 3,'n年級',sysdate from dual;
select seq_tbgrade_id.nextval,'n年級',sysdate from dual union
select seq_tbgrade_id.nextval,'n年級',sysdate from dual union
select seq_tbgrade_id.nextval,'n年級',sysdate from dual;