建表&插入数据
1. 在SQLserver上运行,观察运行效果,并把代码写到作业中。
2. 写出自己的理解/收获/心得体会(部分比较复杂的例题,建议增加测试方法和测试数据,举一反三)。
作业原地址:作业
1.建立索引
使用CREATE INDEX语句
CREATE [UNIQUE] [CLUSTERER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>:是要建索引的基本表的名字。
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔。
<次序>:可选ASC(升序)或DESC(降序),默认为ASC。
UNIQUE:表示此索引的每一个索引值只对应唯一的数据记录。
CLUSTER:表示要建立的索引是聚簇索引。(插眼——详细概念在7.5.2)
2.修改索引
对于已经建立的索引,如果需要对其进行重命名,可以使用ALTER INDEX语句
ALTER INDEX <旧索引名>RENAME TO<新索引名>;
3.删除索引
删除索引使用DROP INDEX 语句
DROP INDEX <索引名>;
【例3.13】为学生-课程数据库中的Student,Course和SC三个表建立索引。Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
截图:
【例3.14】将SC表的SCno索引名改为SCSno。
ALTER INDEX SCno RENAME TO SCSno; /*×有问题×*/
好像又出错了...
原因:alter不能改变索引名,如若改变索引名就需要调用存储过程。
更改:
EXEC sp_rename @objname = 'student.stusno1', @newname = 'stusno2', @objtype = 'index'
/*或者如下*/
EXEC sp_rename '表名.旧索引名', '新索引名', 'index'
原文链接:https://blog.csdn.net/weixin_30540691/article/details/101091086?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158426904519725219926872%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158426904519725219926872&biz_id=0&utm_source=distribute.pc_search_result.none-task
更换代码:
EXEC sp_rename 'SC.SCno', 'SCSno', 'index'
修改成功:
【例3.15】删除Student表的Stusname索引。
DROP INDEX Stusname; /*×有问题×*/
又出错了...
报错里说要指定表名和索引名,所以试试<表名>.<索引名>,而且Student的索引里没有Stusname,只有Stusno,所以
更换代码:
DROP INDEX Student.Stusno;
删除成功:
插入元组的INSERT语句的格式:
INSERT INTO<表名>[(<属性列1>[,<属性列2>]…)]
VALUES(<常量1>[,<常量2>…]);
其功能是将新元组插入指定表中。
INTO子句中没有出现的属性列,新元组在这些列上将取空值,
注意:在表定义时说明了NOT NULL 的属性列不能取空值,否则会出错。
【例3.69】将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student中。
INSERT
INTO Student (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215128','陈冬','男','IS',18);
【例3.70】将学生张成民的信息插入到Student表中。
INSERT
INTO Student
VALUES('201215126','张成民','男',18,'CS');
【例3.71】插入一条选课记录(‘201215128’,‘1’)。
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1');
新插入的记录的Grade列上自动地赋空值。
或者:
INSERT
INTO SC
VALUES('201215128','1',NULL);
没有指出SC的属性名,在Grade列上要明确给出空值。
以上三例结果:
数据查询是数据库的核心操作。
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…
FROM<表名或者视图名>[,<表名或视图名>…]|(
SELECT语句含义:根据WHERE子的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按 SELECT子句中的目标表达式选出元组中的属性值形成结果表。
1.选择表中的若干列
(1)查询指定列
【例3.16】查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
截图:
【例3.17】查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student
截图:
(2)查询全部列
【例3.18】查询全体学生详细记录。
SELECT *
FROM Student;
等价于:
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
截图:
(3)查询计算过程
【例3.19】查询全体学生的姓名及其出生年份。
SELECT Sname,2014-Sage /*查询结果的第二列是一个算术表达式*/
FROM Student;
截图:
【例3.20】查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
FROM Student;
截图:
用户可以用个指定别名改变查询结果的列标题。
SELECT Sname NAME,'Year or Birth:'BIRTH,2014-Sage BIRTHDAY,
LOWER(Sdept)DEPERTMENT
FROM Student;
截图:
2.选择表中的若干元组
(1)消除取值重复的行
【例3.21】查询选修了课程的学生学号
SELECT Sno
FROM SC;
因为我几个例题删除重做了好几次,做到这儿的时候发现有些数据不小心弄丢了,所以以下例子均已做,不发截图了。
删掉重复行:
SELECT DISTINCT Sno
FROM SC;
(2)查询满足条件的元组
①比较大小
【例3.22】查询计算机科学系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept='CS';
【例3.23】查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
【例3.24】查询考试成绩不及格的学生的学号。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
注:这里使用了DISTINCT 语句,当一个同学有多门课程不及格,他的学号也只列一次。
②确定范围
【例3.25】查询年龄在20~23岁(包括20和23)之间的学生的姓名、系别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
【例3.26】查询年龄不在20~23岁之间的学生的姓名、系别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
③确定集合
【3.27】查询计算机科学系(CS)、数学系(MA)、信息系(IS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
【3.28】查询不是计算机科学系(CS)、数学系(MA)、信息系(IS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA','IS');
总结:这次作业感觉还可以,语句都还短还简单,也没有什么需要特别注意的。唯一麻烦的就是一点一点敲代码,这次截图已经 减少很多了,切屏、截图的时间省下了不少,时间基本都是在敲代码,例题太多了(哭哭哭)。
又遇见了两个错误,通过查资料也全都解决了。
出现的问题就是中英文总出错,中文的()和英文的()超难区分,错了还一时照不出来,得加小心了。
后半段出现了个问题,有些地方出了问题或者不懂,我总会删除之前的数据重新再写一遍,然后就可能在哪里不小心弄丢了一些内容,导致接下来的操作全都有影响。
上期传送阵:【数据库】作业4——SQL练习1 - CREATE / DROP / ALTER
下期传送阵:————
插眼传送:
!插眼修改索引
!插眼删除索引
完成时间:2h25min
————(2020.3.15)