【2019-2020春学期】数据库作业5:SQL练习2 - INDEX / INSERT / SELECT

INDEX

建立索引

CREATE [UNIQUE][CLUSTERED] INDEX <索引名> ON <表名><列名>[<次序>][,<列名>[<次序>]]....;

UNIQUE 唯一;CLUSTERED 聚簇索引
索引名 自定义即可
表名与列名要相互对应,不同列之间要用逗号分隔开。
次序关系:升序ASC,降序DESC,缺省默认为ASC
例3.13
分别给三表建立索引,学生表和课程表分别按照学号和课序号进行升序排列,而SC表按照学号升序,课程号降序建立唯一索引。(补充说明:在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);

修改序列

ALTER INDEX <旧索引名> RENAME TO <新索引名>;
报错:“RENAME”附近有语法错误。

因此,在MySQL中并没有提供修改索引的直接指令,一般情况下,我们需要先删除掉原索引,再根据需要创建一个同名的索引,从而变相地实现修改索引操作。
例3.14
将SC表的SCno索引名改为SCSno.

DROP INDEX SC.SCno;
CREATE UNIQUE INDEX SCSno ON SC(Sno ASC,Cno DESC);

删除序列
在进行修改序列时得知,删除序列时要有表名和序列名。

DROP INDEX <表名.索引名>;

例3.15
删除Student表中的Stusname索引。

DROP INDEX Student.Stusname;

删除索引时,系统同时从数据字典中删去有关该索引的描述。

INSERT

插入元组

INSERT
INTO <表名>[(<属性列1>[,<属性列2>]...)]
VALUES(<常量1>[,<常量2>]...);

再插入时一定要注意主码以及是否唯一性和是否为空值,要避免重复出现或者出现空值的情况,导致报错。
在有INTO <表名>后有属性列时,VALUES出现的常量要一一对应;如果后没有属性列时,就将常量值的次序要与CREATE TABLE中的次序相同。

例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,'IS');

例3.71
插入一条选课记录(‘201215128’,‘1’)。

INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1');
INSERT
INTO SC
VALUES('201215128','1',NULL);

总结,INTO属性列有时,VALUES常量值要与之一一对应;INTO属性列没有时,VALUES常量值要与CREATE TABLE中的次序一一对应。
INTO属性列有几个就在VALUES常量值对应几个,没有的属性值系统默认为NULL;而在VALUES属性列没有列出时,对于不知道取值的属性列,要明确给出空值NULL。
注意主码,唯一值,空值。

SELECT

选择表中的若干列
(1)查询指定列

SELECT <列名>[,<列名2>,....]
FROM <表名>;

例3.16
查询全体学生的学号与姓名

SELECT Sno,Sname
FROM Student;

例3.17
查询全体学生的姓名、学号、所在系。

SELECT Sno,Sname,Sdept
FROM Student;

(2)查询全部列

SELECT *
FROM <表名>;

*则代表着全部列的统称。
例3.18
查询全体学生的详细记录。

SELECT *
FROM Student;

(3)查询经过计算的值

SELECT <函数表达式>
FROM <表名>;

例3.19
查询全体学生的姓名及其出生年份。

SELECT Sname,2020-Sage
FROM Student;

总结,SELECT后的<目标列表达式>可以是列名,*,算术表达式,还可以是字符串常量、函数等。
例3.20
查询全体学生的姓名、出生年月和所在的院系,要求用小写字母表示系名以及定义标题。

SELECT Sname NAME,'Year of Birth:' BIRTH,2020-Sage BIRTHDEY,LOWER(Sdept) DEPARTMENT
FROM Student;

结果为
【2019-2020春学期】数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第1张图片若想要定义标题,就在属性之后空一格写出想要的标题名即可。

选择表中的若干元组
(1)消除取值重复的行
有时投影出来有多行重复元组,看起来累赘,因此我们可以借用DISTINCT消除他们。默认值为ALL,即保留结果表中取值重复的行。
例3.21
查询选修了课程的学生号。

SELECTALL) Sno
FROM SC;

删除重复行

SELECT DISTINCT Sno
FROM SC;

(2)查询满足条件的元组
查询满足指定条件的元组可以通过WHERE子句实现。
【2019-2020春学期】数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第2张图片1、比较大小。(=,>,<等等)
例3.22
查询计算机科学系全体学生的名单。

SELECT Sname
FROM Student
WHERE Sdept='CS';

例3.23
查询所有年龄在20岁以下的学生姓名及其年龄。

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

例3.24

查询考试成绩不及格的学生的学号。

SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;

2、确定范围(BETWEEN…AND…和NOT BETWEEN…AND…)

例3.25
查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;

例3.26
查询年龄不在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;

3、确定集合(IN)
例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');

参考文献:
【1】王珊 萨师煊.数据库系统概论(第5版).高等教育出版社
【2】https://www.cnblogs.com/drizzlewithwind/p/8951790.html

东西很多,很杂,但是分类还是明确的,感觉重要的地方强调了一下,课本上的东西并不一定适用于MySQL中,因此还是要多运行试试,就可以掌握一定的方法了。

你可能感兴趣的:(【2019-2020春学期】数据库作业5:SQL练习2 - INDEX / INSERT / SELECT)