一、索引的建立与删除
建立索引格式:
CREATE [UNIQUE] [CLUSTERED] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
ASC是升序,DESC是降序,默认值为ASC。
当输入如下语句时,一直显示REMAME附近有语法错误:
ALTER INDEX SCno RENAME TO SCSno;
我很疑惑🤔,于是百度查到原因:alter不能改变索引名,如若改变索引名就需要调用存储过程。(不懂就要问,那alter index到底还能不能用了???)
正确代码如下:
EXEC sp_rename 'SC.SCno','SCSno','index'
/*或者如下*/
EXEC sp_rename @objname = 'SC.SCno',@newname = 'SCSno',
@objtype = 'index'
我用的前一种方法,成功啦!
调用存储过程时会出现:
这时命令已经成功过执行了。
(原文:https://www.cnblogs.com/Neavotre/articles/11463366.html)
一般格式:
DROP INDEX Stusname;
执行后会显示:
所以应该为:
DROP INDEX Student.Stusname;
(告诉我们什么呢!一定要严谨!!!😤)
二、插入数据
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈东','男','IS',18)
INSERT
INTO Student
VALUES('201215126','张成民','男',18,'CS')
这两个例子说明:
1、INTO子句中没有出现的属性列,新元组在这些列上将取空值,但如果表定义时,定义的not null,则不能为空,否则会错误。
2、如果INTO字句上没有任何属性值,那么新插入的元组必须在每个属性列上均有值,且与CREATE TABLE中属性列的次序一一对应。
3、字符串常数要用单引号括起来(英文符号哦)。
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1')
当执行时发生错误:
是因为外键约束!注意啦!!!我这里SC表里的Sno和Cno有外键约束,分别引用于Course表的主键Cno和Student表的主键Sno,那么在向SC表插入数据时,插入的数据必须分别为Course表和Student表中已经存在的值,如过向SC表中存放一个Course表或Student表没有的值,则会报违反外键约束!!!
当我把数据补充完整后则执行成功。😎
三、数据查询
(1)查询指定列:
SELECT Sno,Sname
FROM Student;
查询结果展示:
SELECT Sname,Sno,Sdept
FROM Student;
查询结果展示:
查询时各个列的顺序可以和表的不一致。
(2)查询全部列:
SELECT *
FROM Student;
/*等价于*/
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
查询结果展示:
(3)查询经过计算的值:
SELECT Sname,2014-Sage
FROM Student;
查询结果展示:
<目标列表达式>不仅可以是算术表达式,还可以是字符串常量、函数等。
SELECT Sname,'Year of Birth',2014-Sage,
LOWER(Sdept)
FROM Student;
查询结果展示:
用户可以通过指定别名来改变查询结果的列标题。比如上题可以写成这种形式:
SELECT Sname NAME,'Year of Birth:'BIRTH,
2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
查询结果展示:
(4)消除取值重复的行:
SELECT DISTINCT Sno
FROM SC;
如果没有指定DISTINCT,则默认为ALL,即保留取值结果中重复的值。
(5)查询满足条件的元组:
SELECT Sname
FROM Student
WHERE Sdept='CS';
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
这里使用了DISTINCT语句,当有一个学生多门成绩不及格时,只显示一次学号。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
谓词BETWEEN…AND…和NOT BETWEEN…AND…可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限,.AND是范围的上限。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA','IS');
谓词IN可以用来查找属性值属于指定集合的元组。
与IN相对的谓词是NOT IN。