/*注意,下面的某些表内容是为了演示需要,你们练习的时候可以复制我的这篇文章做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 序列的初值为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 表a (列名)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
欢迎大家一起相互学习,相互交流!*/