like关键字的简单使用

--数据库基本表的创建,插入,删除,更新操作
--建立一个"学生"表
--学生的学号:Sno,类型是char(9)-->因为学生的学号是9位的定长的字符串;
--学生的姓名:Sname,类型是varchar2(8)-->因此可以是2,3,4汉字,而本数据库中一个汉字对应两个字符;
--学生的年龄:Sage,类型是smallint-->smallint占用的是两个字节,表示数的范围是,-32,768-->32,767;
--学生的性别:Ssex,类型是char(2)-->学生的性别只有两种情况,'男'或者'女',因此使用2位的定长字符串表示;
--学生的所属系别:Sdept,类型是varchar2(4)-->学生所属系别的长度是不确定的,假设最长4个字符;
--学生表的主键为学生的学号;
create table Student
(
       Sno char(9) primary key,
       Sname varchar2(8),
       Ssex char(2) not null,
       Sage smallint not null,
       Sdept varchar2(4) not null
);

--创建学生"课程"表
--课程的课程号:Cno,类型是char-->假设课程号是4位的定长字符;
--课程的课程名:Cname,类型是varchar2-->首先课程的名字是一个字符串,假设课程名字最多有10个汉字,最多含有20个字符组成;
--课程的先行课程号:Cpno,类型是char-->这个属性的数据类型应该和课程号的数据类型是一致的;
--课程的学分:Ccredit,类型为smallint-->课程的学分是一个小正整数;
--学生"课程"表中的主键是Cno;
--学生"课程"表中的外键为Cpno;课程表中的Cpno引用自课程表中的Cno;
create table Course
(
       Cno char(4) primary key,
       Cname varchar2(20) not null,
       Cpno char(4),
       Ccredit smallint not null,
       foreign key(Cpno) references Course(Cno)
);

--创建学生"选修"表
--学生的学号Sno,类型为char(9)-->学号的长度是9个数字的定长字符;
--学生的课程号Cno,类型为char(4)-->课程号的长度是4个数字的定长字符;
--学生的成绩Grade,类型为smallint-->这个整数在0->100之间的数字;
--选修表的主键:Cno和Sno的组合;
--选修表的外键:选修表中的Sno引用自学生表Student中的学号Sno;选修表中的Cno引用自学生表Courses中的课程号Cno;
create table SC
(
       Sno char(9),
       Cno char(4),
       Grade smallint,
       primary key(Sno,Cno),
       foreign key(Sno) references Student(Sno),
       foreign key(Cno) references Course(Cno)
);

--查询到当前数据库的字符集,
--如果value=ZHS16GBK,那么一个汉字占用2个字节,即一个汉字占用2个字符的大小;
--如果value=AL32UTF8,那么一个汉字占用3个字节,即一个汉字占用3个字符的大小;
select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
alter user scott account unlock;
alter user sys account unlock;
alteruseruser_name account unlock identifiedby  new_password;
--查询的结果显示的value = ZHS16GBK,那就说明在本数据库中一个汉字是占用两个字节的.

--向学生表中插入数据
insert into Student values('201215121','李勇','男',20,'CS');
insert into Student values('201215122','刘晨','女',19,'CS');
insert into Student values('201215123','王敏','女',18,'MA');
insert into Student values('201215125','张立','男',19,'IS');

--违背实体的完整性
insert into Student values('201215121','李白','男',20,'CS');
insert into Student values('201215122','刘备','女',19,'CS');

--违背实体的完整性
insert into Student values(null,'张三','男',19,'CS');
insert into Student values(null,'李四','男',20,'IS');

--违背用户定义的完整性
insert into Student values('201215126','张立','男',null,'IS');
insert into Student values('201215126','张立',null,30,'IS');

--查询学生的全部信息
select * from Student;

--删除学生表
drop table Student;

--向课程表中插入数据
--注意插入数据时,可能会发生违背参照的完整性-->因为Cpno字段的值可能在表中还没有被插入;
--注意插入数据式,还可能发生违背实体的完整性-->因为我们插入了一行之后,再次插入,主码和表中的重复;
insert into Course values('2','数学',null,2);
insert into Course values('6','数据处理',null,2);
insert into Course values('4','操作系统','6',3);
insert into Course values('7','PASCAl语言','6',4);
insert into Course values('5','数据结构','7',4);
insert into Course values('1','数据库','5',4);
insert into Course values('3','信息系统','1',4);

--违背了实体的完整性约束
insert into Course values('1','数据库','5',5);
insert into Course values('3','信息系统','1',4);

--违背了实体的完整性
insert into Course values(null,'数据库','5',4);
insert into Course values(null,'数据结构','7',4);

--违背了参照的完整性
insert into Course values('8','数据结构','20',4);
insert into Course values('9','数据结构','11',4);

--违背了用户自定义完整性
insert into Course values('10','数据结构','7',null);
insert into Course values('13','操作系统','6',null);

--说明在不违背子表中外码的值来自父表中主码已有的值的前提下,外码的值可以为空
insert into Course values('2','数学',null,2);
insert into Course values('6','数据处理',null,2);

--对课程表进行的查询操作
select * from Course;

--删除课程表
drop table Course;

--向选修表中插入数据
--在对选修表中的数据进行插入的时候,插入的学号和插入的课程号必须是学生表中,课程表中已经出现的值;
--选修表中的主码是学号和课程号的的组合,这时候对单一的学号或者单一的课程号来看他们是可以重复的;
--在进行数据的插入的时候组成主码的一个或者多个属性列,都不能为空
insert into SC values('201215121','1',92);
insert into SC values('201215121','2',85);
insert into SC values('201215121','3',88);
insert into SC values('201215122','2',90);
insert into SC values('201215122','3',80);

--insert into SC values('201215122','1',90);

--违反参照的完整新,子表中外码的值不能是父表中主码中不存在的值
insert into SC values('201215122','9',100);
insert into SC values('201400644','1',70); 

--违背了实体的完整性,表中的主码的值必须是唯一的,不能够重复
insert into SC values('201215122','3',90);
insert into SC values('201215121','1',92);

--违背实体的完整性,组成主码的各个属性列的值不能为空
insert into SC values('201215122',null,90);
insert into SC values(null,'2',70);   

--对选修表进行的查询操作
select * from SC;     

--删除选修表基本表
drop table SC;
--字符匹配
--谓词like可以用来进行字符串的匹配,
--like关键字的使用的格式为:[not]  like '<匹配串>'  [escape  <''换吗字符'>]
--其含义就是查找指定的属性值与<匹配串>相匹配的元组.
--<匹配串>可以是一个完整的字符串,也可以是含有通配符"%"和''_"字符串
--%代表任意长度的字符串,长度可以是0,长度可以是1.....(或者说代表任意字符的0次,1次或者多次出现)
--_代表任意的单个字符,长度只能是1(或者说任意字符的1次出现);

--查询学号为201215121的学生的详细情况
select * 
from Student
where Sno like '201215121';

select * 
from Student
where Sno='201215121';

--说明以上两种SQL语句的执行效果是相同的
--如果like后面的匹配串中不含任何通配符,则可以使用=来代替like谓词
select * 
from Student 
where Sno not like '201215121';

select * 
from Student 
where Sno!='201215121';

select * 
from Student
where Sno<>'201215121';
--以上两条SQL语句的执行效果是相同的
--如果like后面的匹配串中不含任何通配符,可以使用<>或者!=来代替not like子句

--查询出所有姓刘的学生的姓名,学号,性别
select Sno 学生学号 ,Sname 学生姓名 ,Ssex 学生性别
from Student
where Sname like '刘%';

--查询姓刘的且全名为两个字的学生的姓名,学号,性别
select Sname 学生姓名,Sno 学生学号,Ssex 学生性别,Sdept 学生院系
from Student
where Sname like '刘_';

--注意:数据库字符集ASCII时一个汉字需要两个_;当字符集为GBK时只需要一个_;
select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';
--说明本数据库是GBk字符集,使用统配符_时,一个_代表一个汉字;

--查询课程表Course 中所有课程信息
select * 
from Course;

--查询课程表Course课程名为以"数"开始的且字数为4的课程的所有信息
select Cno 课程号,Cname 课程名,Cpno 先行课程 ,Ccredit 学分
from Course
where Cname like '数___';

--查询课程表Course课程名为以"数"开始的课程的所有信息
select Cno 课程号,Cname 课程名,Cpno 先行课程 ,Ccredit 学分
from Course
where Cname like '数%';

--查询课程表Course课程名不是以"数"开始的课程的所有信息
select Cno 课程号,Cname 课程名,Cpno 先行课,Ccredit 课程学分
from Course
where Cname not like '数%';

--如果用户要查询的字符本身就含有通配符%或者_,这时候就需要使用escape  <''换吗字符'>
--查询课程表Course 中所有课程信息
select * 
from Course;

--先向课程表中插入含有统配符_的一条记录
insert into Course values('8','DB_Design','5',4);

--查询DB_Design课程的课程号和学分
select Cno 课程号,Cname 课程名,Cpno 先行课程号,Ccredit 课程学分 
from Course
where Cname like 'DB\_Design'  escape '\';

--使用\的目的是为了告诉SQL执行程序这是一个普通字符,而不是一个通配符,在使用的时候不要忘记使用escape
--那么我们一定要使用 \来进行转义吗,我们可以使用其他的字符吗
select Cno 课程号,Cname 课程名,Cpno 先行课程号,Ccredit 课程学分 
from Course
where Cname like 'DB$_Design'  escape '$'; 

select Cno 课程号,Cname 课程名,Cpno 先行课程号,Ccredit 课程学分 
from Course
where Cname like 'DB#_Design'  escape '#';

select Cno 课程号,Cname 课程名,Cpno 先行课程号,Ccredit 课程学分 
from Course
where Cname like 'DB@_Design'  escape '@';

select Cno 课程号,Cname 课程名,Cpno 先行课程号,Ccredit 课程学分 
from Course
where Cname like 'DB#_Design' ;
--从上面三条SQL语句可见,选一个特殊字符进行转义即可,不一定非要使用\来进行转义,使用$,#,@也是可以的
--但是如果不是escape子句的话,虽然不会出错,但是_会被解释成通配符,就不是我们所想的结果了

--查询以"DB_"开头,且倒数第三个字符为i的课程的详细情况
select Cno 课程号,Cname 课程名,Cpno 先行课程号,Ccredit 课程学分
from Course 
where Cname like 'DB@_%i__'  escape '@';

--这条SQL语句中第一个统配符前面使用了@,让SQL执行程序知道这个_是作为普通字符出现的
--而第二个统配符%以及后面的_前面没有使用 @符号,说明任然是当做约定的统配符使用的
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值