INDEX/INSERT/SELECT语句的使用

1.建立索引 CREATE INDEX

语句:

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

解释:

  1. 次序分为 ASC → 升序,DESC → 降序。默认的情况下是ASC升序
  2. UNIQUE 表示每个索引值对应唯一数据记录。
  3. CLUSTER 表示聚簇索引。

【例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);

最后一行,建立选课表的索引,不是指同时既按学号的升序,也按课程号的降序,如果该表没有严格按照这种情况排列,那么这样看上去是矛盾的。这里建立索引的次序表示先按学号升序排列,如果学号取值相同,就进行第二个选项,也就是再按照课程号的降序排列。(学号不是这里的主码,(学号,课程号)才是,所以最好有可能相等)。
创建好的索引如下:(只展示一个)
在这里插入图片描述

2.修改索引 ALTER INDEX

语句:

ALTER INDEX <旧索引名> RENAME TO <新索引名>;

【例3.14】

ALTER INDEX SCno RENAME TO SCSno;

在SQL上运行会出现错误
ERROR:Incorrect syntax near ‘RENAME’.

百度一下:
在这里插入图片描述(该图片截自百度知道)

  1. ‘object_name’表示旧索引名,格式为表名.旧索引名(注意一定要加表名做限定,不然会出错)
  2. ‘new_name’表示对象的新名称
  3. 'object_type’指更改对象类型,更改索引,就是index。

以上语句可简化为:

EXEC sp_rename '表名.旧索引名','新索引名','index'
--EXEC是EXECUTE(执行)的缩写,表示执行一个存储过程。

语句:

EXEC sp_rename 'SCno','SCSno','index';

索引名更改成功↓
在这里插入图片描述
另一种修改索引名的方式就是删掉重建。

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

注意!这里删除索引,一定要指明是哪个表下的,不然会出现错误↓
Must specify the table name and index name for the DROP INDEX statement.

3.删除索引 DROP INDEX

语句:

DROP INDEX <表名.索引名>;

【例3.15】删除Student的Stusname索引
先创立Student的Stusname索引:

CREATE UNIQUE INDEX Stusname ON Student(Sname);

在这里插入图片描述删除:

DROP INDEX Student.Stusname;

emmm…不知道是不是我的问题,用课本上的方法做,总是失败。这里必须添加表名,才可通过命令。

4.插入数据 INSERT

语句:

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

INTO后面加表名,属性列名可以与表中属性列排列顺序不一致,如【例3.69】,但VALUES后跟的值必须与所给属性列相对应,也可以省去,如【例3.70】,但省去后,VALUES后面跟的元组值必须与表中顺序完全一致

【例3.69】

INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS',18);

表中的顺序是这样的↓
在这里插入图片描述这里添加的顺序不一致,但是上下要相互对应。

【例3.70】
(INTO子句不写明属性名的情况)

INSERT INTO Student VALUES ('201215126','张老三','男',18,'CS');

没有写明属性名,按表中属性列的顺序。

【例】向课程表Course中插入信息。

INSERT INTO Course(Cno,Cname,Cpno,Ccredit)
VALUES('1','数据库','5',4);
--会出现错误,改为下述语句

INSERT INTO Course(Cno,Cname,Cpno,Ccredit)
VALUES('1','数据库',NULL,4);

这里因为是插入课程表的第一条记录,先行课Cpno是Cno的外码,根据参照完整性,Cpno只能取空或者Cno的值,所以这里Cpno取5错,为了防止这种错误,录入数据时将Cpno都置为空,而后再做修改。

【例3.71】插入一条选课记录(‘200215128’,‘1’)

INSERT INTO SC(Sno,Cno)
VALUES('200215128','1');
--或者
INSERT INTO SC
VALUES('200215128','1',NULL);

没有写的属性列,RDBMS会自动为他赋值为空。

5.SELECT查询(部分)

该部分主要写了关于SELECT…FROM…(WHERE语句)的使用。
语句:

SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...|(SELECT语句)[AS]<别名>
[WHERE<条件表达式>]

1.查找指定列—>相当于关系代数中的投影

【例3.16】查询全体学生的学号和姓名

SELECT Sno,Sname
FROM Student;

结果如下:
在这里插入图片描述【例3.17】查询全体学生的姓名、学号、所在系

SELECT Sname,Sno,Sdept
FROM Student;

在这里插入图片描述2.查询全部列使用 *

【例3.18】

SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
--等价于
SELECT *
FROM Student;

3.SELECT子句的<目标表达式>不仅可以是属性列,还可以是表达式。即可以查询经过计算的结果值

【例3.19】查全体学生的姓名及出生年份。

SELECT Sname,2020-Sage
FROM Student;

结果:
在这里插入图片描述可以出现计算结果值,但是没有列名。

【例3.20】

SELECT Sname,'Year of Birth',2020-Sage,LOWER(Sdept)
--'Year of Birth'纯用来显示,增强可读性
--LOWER(Sdept),LOWER是变成小写字母的函数
FROM Student;

在这里插入图片描述4.可以使用列别名改变查询结果的列标题。

【例】

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

列别名,直接跟在目标表达式后面用空格分开。
在这里插入图片描述5.使用DISTINCT消除重复的元组(行)。

DISTINCT 可以消除重复的元组,ALL表示显示全部,缺省值为ALL。

【例3.21】查询选修了课程的学生学号。

SELECT Sno FROM SC;
--等价于
SELECT ALL Sno FROM SC;

--消除重复行
SELECT DISTINCT Sno FROM SC;

采用ALL或缺省:
在这里插入图片描述
采用DISTINCT:
在这里插入图片描述
6.WHERE语句可以加限制条件,以查询满足条件的元组。

①比较大小——比较运算符
【例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; 

②确定范围——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岁之间的学生的姓名、系别和年龄

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

在这里插入图片描述
③确定集合——IN , NOT IN (集合)
【例3.27】查询系别CS,MA的学生姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA');

在这里插入图片描述
【例3.28】查询不在CS,MA系别的学生姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA');

在这里插入图片描述
———————————————————————————
【小体会】
这次的作业难度自我感觉不是很大,但是写完这次作业我还是用了将近三个小时,我是分两次完成的,感觉压力没有很大,甚至写到最后SELECT时感觉还蛮有趣的,喜欢敲键盘的感jio,而且没有那么多错误。以后还是要多多提高效率,缩短时间。虽然老师说截图省去,但做了感觉不截很不舒服的感觉,放在博客里,写完了还蛮有自豪感的~再接再厉!

发布了10 篇原创文章 · 获赞 11 · 访问量 3630

猜你喜欢

转载自blog.csdn.net/fu_GAGA/article/details/104755163