oracle数据库之数据的增删改以及简单的单表查询

来源:互联网 发布:软件在线升级原理 编辑:程序博客网 时间:2024/05/16 15:12

/*注意,下面的某些表内容是为了演示需要,你们练习的时候可以复制我的这篇文章做SQL脚本直接运行,应该没有问题,如果有问题可以检查一下是不是少了    ;         或者哪行注释没有注释掉,自己改改。也可以自己建表,按照相应的语法规则进行数据的相关操作。*/

--人员表

create table person(

personID     number ,

pname        varchar2(20) constraint NN_pname not null,

psex         char(2) ,

pbirth       date  ,

constraint   PK_personID primary key (personID) ,

constraint   CK_psex  check (psex='' or psex='')

);

--增加数据

--普通加法(不加列名,默认为按表的列的排列顺序逐个插入)

--要求:数据对应,数据类型对应,插入的值的数量和列的数量必须一致,木有值的插入null

insert into person values (1,'david','',to_date('1990-09-10','yyyy-mm-dd'));

insert into person values (2,'ggyy','',to_date('1990-10-10','yyyy-mm-dd'));

insert into person values (3,'朱刀','',to_date('1990-10-10','yy-mm-dd'));

insert into person values (4,'泥巴','',to_date('1990-10-10','yy-mm-dd'));

insert into person values (5,'憨坨','',to_date('1990-10-10','yy-mm-dd'));

insert into person values (6,'李静芳','',null);

delete from person where  personID =6;

--使用to_date  的方法:   to_date('要插入的日期','该日期的格式')  下面是两个例子:

--to_date('2010-01-02 13:34:09','yyyy-mm-dd hh24:mi:ss')

--to_date('2010-01-02','yyyy-mm-dd')

---文艺加法(要加哪些列,列的顺序在在前面给好,后面按前面给的格式添加)

----这样想加哪几列,怎样的顺序加,想怎么搞怎么搞!

-----注意,必须满足表的约束,如主键,唯一,非空等,有的列必须加数据,不能为空!

insert into person (personID,pname) values (7,'犀利哥');

---2B加法   目前没有发现...(欢迎各位达人提供!)

--设置序列(自动增长列),一般的管理系统项目中都会用到

create sequence seq_personID ;

drop sequence seq_personID ;

select * from person;

--start with n  序列的初值为increment by m 序列间隔为m

--如果不写,默认为从1开始,序列间隔为1

--前面插入了7条数据,所以这里的序列从8开始,否则违反主键约束

create sequence seq_personID start with 8 increment by 1;

--序列使用方法:序列名.Nextval

--上面加的是高中同学,现在以自增长的方式添加几个大学同学...

insert into person (personID,pname,psex) values (seq_personID.Nextval,'胖子','');

insert into person (personID,pname,psex) values (seq_personID.Nextval,'小成成','');

insert into person (personID,pname,psex) values (seq_personID.Nextval,'乐姐','');

insert into person (personID,pname,psex) values (seq_personID.Nextval,'靓崽波','');

select personID,pname,psex from person;


--insert into (列名)select 列名 from b  从表b中查找出需要的数据插入到表a

---一般这种方法用于表的复制,或者表中某些列数据的复制

-----哥刚才去吃了个饭,妈的,长沙这个鬼地方真是吃一餐饭出一身汗啊!特别是我还脑残-----的点了个煲仔...

-----接上面将的内容...

-----表的所有数据复制太简单,不讲了,一般也不常用,全部复制用什么sql语句啊,直接把数据导出去不就行了

-----讲下某些数据的复制

-------假设现在计科0903班的全体男生都被招到华为,女生都被招到中兴去了    美好的愿望...

-------所以现在华为和中兴的员工信息表中就要添加新的数据   ,怎么办呢?

create table huaweiworker(

workerID        number ,

pname        varchar2(20)  not null,

psex         char(2) ,

pbirth       date  ,

constraint   PK_jobID primary key (workerID) 

);

--使用该方法插入数据

--假设华为已经有1000个员工了,所以工号为personID+1000

insert into huaweiworker (workerID,pname,psex,pbirth) select personID+1000,pname,psex,pbirth from person where  psex='';

---这样person表中的部分信息就加到huaweiworker表中了,女生全招到中兴去了就省略不---写了...

select * from huaweiworker ;

--删除数据     不加where就是全删了

delete from person     --慎用!

--条件删除

delete from person where pname='犀利哥';  --  把犀利哥删掉了

--删表  慎用! 表木有了,里面的数据肯定木有了,一个通宵的努力就木有了...

/*drop table roleandnode ;

drop table tfunction ;

drop table trole ;

drop table userandrole ;

drop table loginzh ;

drop table person ;*/

--修改       不加where   就是全部数据都改了

--2B修改法

update person set pname='犀利哥;--把全部人的名字都改成犀利哥了,不过我没提交  嘿嘿~


--文艺修改法,按条件选定一行数据,将某些列改为自己需要的数据

---这里,我把朱刀的名字改成超级帅男了,妈的,提交了,杯具...

update person set pname='超级帅男' where pname='朱刀';

--登录账号表

create table loginzh(

userID       number ,

personID     number ,

zhanghao     varchar2(20) ,

passwd       varchar2(20) ,

logintime    date ,

loginIP      varchar2(15) ,

constraint   PK_userID primary key (userID) ,

constraint   FK_personID foreign key (personID) references person (personID) 

);

--为这个表加点数据

create sequence seq_userID ;

insert into loginzh  values (seq_userID.Nextval,1,'111111','123456',sysdate,null);  -- sysdate为系统当前时间

insert into loginzh  values (seq_userID.Nextval,2,'222222','123456',sysdate,null);

insert into loginzh  values (seq_userID.Nextval,3,'333333','123456',sysdate,null);

insert into loginzh  values (seq_userID.Nextval,4,'444444','123456',sysdate,null);

insert into loginzh  values (seq_userID.Nextval,5,'555555','123456',sysdate,null);

insert into loginzh  values (seq_userID.Nextval,6,'666666','123456',sysdate,null);

--角色表

create table trole (

roleID       number ,

rolename     varchar2(20) ,

roleremark   varchar2(100) ,

constraint PK_roleID primary key (roleID) 

);

--为这个表加点数据

create sequence seq_roleID ;

insert into trole values (seq_roleID.Nextval,'剑圣','一个能转出剑刃风暴和无敌斩的家伙!');

insert into trole values (seq_roleID.Nextval,'宙斯','一个能全屏放闪电的家伙!');

insert into trole values (seq_roleID.Nextval,'LION','用大招抢人头的屌丝!');

insert into trole values (seq_roleID.Nextval,'炸弹人','我不说什么了...');

insert into trole values (seq_roleID.Nextval,'UG','辉耀在手,天下我有!');

insert into trole values (seq_roleID.Nextval,'风行者','风一样的男子,哦不,是女子!');

select * from trole ;

--账号与角色表

create table userandrole(

userID number ,

roleID number ,

constraint FK_userID foreign key (userID) references loginzh (userID) ,

constraint FK_roleID foreign key (roleID) references trole (roleID) 

);

--为这个表添加数据

insert into userandrole values (1,1);

insert into userandrole values (2,1);

insert into userandrole values (3,2);

insert into userandrole values (4,2);

insert into userandrole values (5,3);

insert into userandrole values (6,3);

--功能节点表

create table tfunction(

functionID number ,

nodename   varchar2(20) ,

noderemark varchar2(100),

constraint PK_functionID primary key (functionID) 

);

--角色到节点表

create table roleandnode(

roleID number ,

functionID number ,

constraint FK_roleID1 foreign key (roleID) references trole (roleID) ,

constraint FK_functionID foreign key (functionID) references tfunction (functionID)

);

--查询  这个是关键!

---简单的单表查询     *代表全部列

select * from person    

---只查询某些列     as的作用是取别名

select pname as 姓名 ,psex as 性别 from person ;  

----条件查询   where  后面接条件

select pname as 姓名 ,psex as 性别 from person where psex='' ;

----模糊查询  通配符 : %   表示0个或多个字符  ;   _   表示一个字符     关键字用 like   而不是 =

-----为了方便演示 ,我在表里面再插入些数据

insert into person values (seq_personID.nextVal,'洛晴川','',null);

insert into person values (seq_personID.nextVal,'四阿哥','',null);

insert into person values (seq_personID.nextVal,'八阿哥','',null);

insert into person values (seq_personID.nextVal,'九阿哥','',null);

insert into person values (seq_personID.nextVal,'十阿哥','',null);

insert into person values (seq_personID.nextVal,'十三阿哥','',null);

insert into person values (seq_personID.nextVal,'十四阿哥','',null);

select * from person ;   --查询全部数据

select * from person where pname like '_阿哥' ;

select * from person where pname like '%阿哥' ;


--亲,通过这两个查询语句看出差别了么?



--附加常用查询效果:

--①查询中的字符串拼接工作,sqlserver 中是使用 oracle中使用 ||

select '姓名:'||pname as 姓名,'性别:'||psex as 性别,'生日:'||pbirth as 生日 from person


--②查询非空字段  ,空字段

select * from person where pbirth is not null;

select * from person where pbirth is null;

--③对查询出的结果排序  默认为升序排列

select * from person order by personID ; 


-- 看到效果没

---什么?   不写order by 也是这么排列的?  好吧,下面的语句让你明白!

select * from person order by personID desc ;  -- desc 表示降序排列 -- 有木有看到效果?!


---关于这个排序的应用很常见  :例如成绩管理,有一列是总分,你在总分那一列按降序排--列,成绩的排名不就出来了嘛?  自己去实践下!

--④关于查询前多少行数据

select * from person  where rownum <=10 ; 

-- 查询前10行数据  这个配合上面的排序语句,是不是可以求出班上成绩前10名的

--人,要在视图中使用,后面学习

--如果在表中使用的话 ,是先查出前10行数据,再排序,达不到整体求前10 的效果

--⑤指定范围的一个查找  下面三条语句查询的结果完全一样  但要注意  第三种的用法

---方式1

select * from person where personID >= 5 and personID <=15 ; 

---方式2

select * from person where personID between 5 and 15 ; 

---方式3:   

select * from person where personID in (5,6,7,8,9,10,11,12,13,14,15) ;

-----方式3一般不用于数值类型的,而是用于一些特殊的分类

select * from person where psex in('','') ;

-----可能你会说,我上面表的检查约束不就是  psex='' or psex=''  吗?  这样把所有数-----据都查出来有什么意思?

-----注意! 如果你是在给泰国某个公司做项目!!! 那么表的约束是不是要改改呢?   

-----那么这条语句是不是还能查出所有数据呢?  这个...  你懂的...

-----还有,这里只是做个示范,不代表一定很实用,真正的使用要靠大家平时多积累经验啊!

-------其实上面讲的都是忽悠你的,in的真正用法是用在多表连接中,即当你不知道你的目-------标范围时,用in ,当然用exists也行(两种方式有区别,下次讲)

select * from person where personID in (select personID from loginzh) ;


-------这里涉及多表连接的查询,后面再细讲!

--⑥排除重复数据    这个很常用,前面忘写了,居然排到第六号才想起来...

---上面的表都不方便演示这个功能...

---新建一个表   员工工资表

create table tsalary(

personID number ,

msalary  number ,

mreward  number ,

constraint FK_personID1 foreign key (personID) references person (personID) 

)

insert into tsalary values (1,10000,5000) ;

insert into tsalary values (2,10000,3000) ;

insert into tsalary values (3,8000,3000) ;

insert into tsalary values (4,6000,3000) ;

insert into tsalary values (5,5000,3000) ;

insert into tsalary values (6,10000,5000) ;

insert into tsalary values (8,6000,1000) ;

insert into tsalary values (9,8000,2000) ;

insert into tsalary values (10,5000,3000) ;

--终于可以了

select distinct msalary as 工资水平 from tsalary order by msalary;

--不加distinct   

select  msalary as 工资 from tsalary order by msalary;

-- 注意  : 如果distinct后面有多个字段,那么就是排除掉这些字段都相同的行数据

select distinct msalary,mreward as 工资水平 from tsalary order by msalary;   

 --一共有9条数据,这里排除了两条

--⑦加常量列    数据库中的数据并没有改变,只是查询显示时多显示一个常量列

select t.*,'华为' as 所在公司 from person t  where rownum <=5 ;


/*好了,今天的内容就到这里,有什么问题可以在我博客里留言

或者加本人QQ248690920

欢迎大家一起相互学习,相互交流!*/


原创粉丝点击