首先通过代码重现建立三个基础练习表格,代码重现参照了老师的博客,以下为连接:
https://blog.csdn.net/qq_38975453/article/details/104696976
下面我们在这三张表格的基础上进行练习:
一、INDEX练习
[例3.13]
create unique index stusno on student(sno)
create unique index coucno on course(cno)
create unique index scno on sc(sno ASC,cno DESC)
该段语句代码意为在student、course表中分别按学生学号和课程号建立索引,其中系统默认按升序进行排序。第三个语段意为在sc表中先按学生学号升序(ASC)进行排序,在排完序的基础上,如果有某个学号有对应多门课程号,则在该基础上在某个学号内部对课程号按降序(DESC)进行排序。
[例3.14] 将SC表的SCno索引名改为SCSno
alter index scno rename to scsno
该语句会报错,查阅资料得知在SQL serever中,alter不支持修改表名和索引名,如若改变索引名就需要调用存储过程。
[3.15]删除索引
drop index stusno
/*该语句会报错必须为 DROP INDEX 语句指定表名和索引名。*/
查阅资料得知:在SQL serever中,drop删除索引时必须指明表明和索引名。
drop index stusno on student;
/*或者*/
drop index student.stusno;
二、INSERT练习
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
[例3.69]将一个新学生元组(学号:201215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
insert into student(sno,sname,ssex,sdept,sage) values('201215128','陈冬','男','IS',18);
select * from student
/*违反了 PRIMARY KEY 约束“PK__student__DDDF6446C429FFA8”。不能在对象“dbo.student”中插入重复键。重复键值为 (201215128)*/
错误原因:建表时规定学号唯一,而在建表时已经加入了该学号,所以不能有两个相同学号。
[例3.70]将学生张老三的信息插入到Student表中。
insert into student(sno,sname,ssex,sdept,sage) values('201215124','张老三','男',18,'CS');
select * from student
可省略属性名,但values后数据必须按表格表头的顺序。
insert into course(cno,cname,cpno,ccredit) values ('1','数据库',NULL,4);
select * from crouse
/*违反了 PRIMARY KEY 约束“PK__course__D836175590913535”。不能在对象“dbo.course”中插入重复键。重复键值为 (1 )。*/
cpno是外键,而且引用的是该表的主键cno。参照完整性规则,外键cpno的取值不为空的情况下,与其对应的主键cno必须存在,所以这里cpno故意写的NULL。
[例3.71] 插入一条选课记录( ‘200215128’,'1 ')。
insert into sc(sno,cno) values('201215128','1');
select * from sc
关系数据库管理系统将在新插入记录的Grade列上自动地赋空值。
三、SELECT
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
[3.16]
select sno,sname from student;
[3.17]
select sno,sname,sdept from student;
[3.18]
select sno,sname,ssex,sage,sdept from student;
等价于
select * from student;
查询student表中的所有信息。
[3.19]
select sname,2016-sage from student
通过当年年份和学生年龄查询其出生年份。
[3.20]
select sname,'Year of Birth:',2014-sage,lower(sdept) from student
[3.21]
select sno from sc;
/*等价于*/
select all sno from sc;
如果没有指定distinct,即使sno有重复也会显示。如果指定distingct,则重复的不显示。
[3.22]
select sname from student where sdept='cs'
特别注意:sql语句和其他编程语言的不同在于“=”不是两个等号,由于惯性思维很容易犯错。
[3.23]
select sname,sage from student where sage<20
在student表格中插学年龄小于20的学生名字和年龄:
[3.24]
select distinct sno from sc where grade<60
在sc表格中,查询分数小于60的学生学号,若同一个学生有多门课程分数小于60,则只显示一次。
[3.25]
select sname,sdept,sage from student where sage between 20 and 23
在student表格中查询年龄大于等于20小于等于23的学生的名字,课程,和年龄。
[3.26]
select sname,sdept,sage from student where sage not between 20 and 23
注意在between之前加not,与25正好相反。
[3.27]
select sname,ssex from student where sdept in('cs','ma','is');
in里面的属性之间的关系可以理解为or,即学生表中的学生的专业只要满足in中三个里面其中之一即可显示。
[3.28]
select sname,ssex from student where sdept not in('cs','ma','is');
与27相比,28在in前面加了not,类似between,如果student表格中的学生的专业均不属于该三个类型之一,即可显示查询。
本次练习用时一个小时十分钟,感觉现在sql还在入门阶段目前的问题大都比较容易解决。