CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名> (<列名>[<次序>][,<列名>[<次序>]]...);
次序:ASC(升序),DESC(降序)
UNIQUE:每个文本只包含唯一文本
CLUSTER:表示要建立的索引是聚簇索引
1 2 3 4
-- 为学生-课程数据库的Student、Course和SC三个表建立索引 CREATEUNIQUE INDEX Stusno ON Student(Sno); CREATEUNIQUE INDEX Coucuo ON Course(Cno); CREATEUNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
1 2
-- 将SC表的SCno索引名改为SCSno ALTER INDEX SCno RENAME TO SCSno;
删除索引
DROP INDEX <索引名>;
1 2
-- 删除Stuname索引 DROP INDEX Stuname;
数据查询
1 2 3 4 5 6 7 8 9 10
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]... FROM<表名或视图名>[,<表名或视图名>...]|(<SELECT语句>)[AS]<别名> [WHERE<条件表达式>] [GROUPBY<列名1>[HAVING<条件表达式>]] [ORDERBY<列名2> [ASC|DESC]]; /* 根据WHERE子句的条件表达式从FROM语句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表表达式选出元组中的属性值形成结果表。 GROUP BY 结果会按照列名1的值进行分组 ORDER BY 结果还要按照列名2进行升序或降序排序 */
单表查询
选择表中的若干列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-- 查询全体学生的姓名、学号和所在系 SELECT Sname,Sno FROM Student;
-- 查询全部列 SELECT* FROM Student;
-- 查询经过计算的值 -- 查询全体学生的姓名及出生年月(假设2020年) SELECT Sname,2020-Sage FROM Student;
-- 查询全体学生的姓名、出生年份和所在院系,院系用小写字母 SELECT Sname,'Year of Birth:',2020-Sage,LOWER(Sdept) FROM Student; -- 指定别名 SELECT Sname NAME,'Year of Birth:' BIRTH,2020-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;
选择表中的若干元组
1 2 3 4 5 6
-- 查询选修了课程的若干元组 SELECT Sno FORM SC; -- 去除重复结果,不指定DISTINCT则默认为ALL SELECTDISTINCT Sno FORM SC;
-- 查询与“刘晨”在同一个系学习的学生 SELECT Sno,Sname,Sdept FORM Student WHERE Sdept IN (SELECT Sdept FORM Student WHERE Sname='刘晨' ); -- 通过自身连接 SELECT S1.Sno,S1.Sname,S1.Sdept FOMR Student S1,Student S2 WHERE S1.Dept=S2.Dept AND S2.Sname='刘晨';
-- 查询选修了课程名为“信息系统”的学生学号和姓名 SELECT Sno,Sname FOMR Student WHERE Sno IN (SELECT Sno FORM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname='信息系统' ) ); -- 通过连接实现 SELECT Student,Sno,Sname FORM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname='信息系统';
带有比较运算符的子查询
1 2 3 4 5 6 7
-- 找出每个学生超过他自己选修课程平均成绩的课程号 SELECT Sno,Cno FORM SC X WHERE Grade>= (SELECTAVG(Grade) FORM SC y WHERE Y.Sno=X.Sno);
带ANY或ALL谓词的子查询
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 查询非计科系比计科系任意一个学生年龄小的学生姓名和年龄 SELECT Sname,Sage FORM Student WHERE Sdept!='CS'AND Sage<ANY(SELECT Sage FORM Student WHERE Sdept='CS'); -- 查询非计科系比计科系所有一个学生年龄小的学生姓名和年龄 SELECT Sname,Sage FORM Student WHERE Sdept!='CS'AND Sage<ALL(SELECT Sage FORM Student WHERE Sdept='CS');
-- 查询选修了1号课程的的学生姓名 SELECT Sname FROM Student WHEREEXISTS (SELECT* FROM SC WHERE Sno=Student.Sno AND Cno='1'); -- 查询没有选修了1号课程的的学生姓名 SELECT Sname FROM Student WHERENOTEXISTS (SELECT* FROM SC WHERE Sno=Student.Sno AND Cno='1'); -- 查询选修了全部课程的学生的姓名 SELECT Sname FROM Student WHERENOTEXISTS (SELECT* FOMR Course WHERENOTEXISTS (SELECT* FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno));
SELECTDISTINCT Sno FROM SC SCX WHERENOT EXISITS (SELECT* FROM SC SCY WHERE SCY.Sno='201215122'ANDNOTEXISTS (SELECT* FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));
-- 查询计算机科学系的学生及不大于19岁学生 SELECT*FROM Student WHERE Sdept='CS' UNION SELECT* FROM Student WHERE Sage<=19;
-- 查询选修了课程1或者课程2的学生 SELECT Sno FROM SC WHERE Cno='1' UNION SELECT Sno FROM SC WHERE Cno='2';
-- 查询计算机科学系的学生与年龄不大于19岁的学生的交集 -- MYSQL不存在INTERSECT,用嵌套解决 SELECT* FROM Student WHERE Sdept='CS' INTERSECT SELECT* FROM Student WHERE Sage<=19;
-- 查询既选修了课程1又选修了课程2的学生 SELECT Sno FROM SC WHERE Cno='1' INTERSECT SELECT Sno FROM SC WHERE Sno='2';
/*嵌套实现*/ SELECT Sno FROM SC WHERE SC='1'AND Sno IN (SELECT Sno FROM SC WHERE Cno='2'); -- 查询计算机科学系的学生与年龄不大于19岁学生的差集 SELECT* FORM Student WHERE Sdept='CS' EXCEPT SELECT* FROM Student WHERE Sage<=19;
-- 超出每个学生超过他自己选修课程平均成绩的课程号 SELECT Sno,Cno FROM SC,(SELECT Sno,Avg(Grade) FROM SC GROUPBY Sno) AS Avg_sc(avg_sno,avg_grade) WHERE SC.Sno=Avg_sc.avg_sno AND SC.Grade>=Avg_sc.avg_grade;
-- 简历信息系学生的视图 CREATEVIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS'; /*CREATE VIEW只是把视图定义存入数据字典,并不执行其中的SELECT语句*/
-- 建立信息系的学生视图,并要求进行修改和插入时仍需保证该视图只有信息系的学生 CREATEVIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS' WITHCHECK OPTION;
-- 建立信息系选修了1号课程的学生的视图 CTEATE VIES IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE SC.Cno='1'AND Sdept='IS'AND Student.Sno=SC.Sno;
-- 建立信息系选修了1号课程且成绩在90分以上学生的视图 CREATEVIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;
--定义一个反应学生出生年份的视图 CREATEVIEW BT_S(Sno,Sname,Sage) AS SELECT Sno,Sname,2020-Sage FROM Student;
-- 将学生的学号及平均成绩定义为一个视图 CREATEVIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUPBY Sno;
-- 将Student的所有女生定义为一个视图 CREATEVIEW F_Student AS SELECT* FROM Student WHERE Ssex='女';