准备数据:
CREATE TABLE Student( Sno INT(11) auto_increment PRIMARY KEY, Sname VARCHAR(20), Ssex VARCHAR(20), Sage INT(3), Sdept VARCHAR(20)); CREATE TABLE Course( Cno INT(11) auto_increment PRIMARY KEY, Cname VARCHAR(20), Cpno INT(11) REFERENCES Course(Cno), Ccredit INT(2)); CREATE TABLE SC( Sno INT(11) REFERENCES Student(Sno), Cno INT(11) REFERENCES Course(Cno), Grade FLOAT(3), PRIMARY KEY(Sno,Cno)); INSERT INTO Student VALUES(95001,"李勇","男",20,"CS"); INSERT INTO Student VALUES(95003,"王名","男",20,"MA"); INSERT INTO Student VALUES(95002,"刘晨","男",19,"IS"); INSERT INTO Student VALUES(95004,"张立","男",18,"IS"); INSERT INTO Student VALUES(95006,"牛德华","女",20,"IS"); INSERT INTO Student VALUES(95005,"聂小轩","男",28,"CS"); INSERT INTO Student VALUES(95007,"张三三","男",18,"CS"); INSERT INTO Student VALUES(95008,"李思思","女",16,"MA"); INSERT INTO Student VALUES(95009,"张呜呜","男",19,"MA"); INSERT INTO Course VALUES(1,"数据库",5,4); INSERT INTO Course VALUES(2,"数学",null,2); INSERT INTO Course VALUES(3,"信息系统",1,4); INSERT INTO Course VALUES(4,"操作系统",6,3); INSERT INTO Course VALUES(5,"数据结构",7,4); INSERT INTO Course VALUES(6,"数据处理",null,2); INSERT INTO Course VALUES(7,"PASCAL语言",6,4); INSERT INTO Course VALUES(8,"C_C++语言",null,4); INSERT INTO SC VALUES(95001,1,60); INSERT INTO SC VALUES(95002,1,90); INSERT INTO SC VALUES(95001,2,80); INSERT INTO SC VALUES(95002,2,99); INSERT INTO SC VALUES(95002,3,45); INSERT INTO SC VALUES(95001,4,40); INSERT INTO SC VALUES(95002,4,88); INSERT INTO SC VALUES(95004,4,null); INSERT INTO SC VALUES(95005,4,45); INSERT INTO SC VALUES(95002,5,88); INSERT INTO SC VALUES(95003,5,89); INSERT INTO SC VALUES(95005,5,54); INSERT INTO SC VALUES(95001,6,82); INSERT INTO SC VALUES(95004,6,null); INSERT INTO SC VALUES(95005,6,99.5); INSERT INTO SC VALUES(95003,7,99); INSERT INTO SC VALUES(95004,7,45); INSERT INTO SC VALUES(95005,7,75); INSERT INTO SC VALUES(95006,1,60); INSERT INTO SC VALUES(95006,4,90);
练习题
# 查询与“刘晨”同一个系学习的学生 SELECT sno,sname FROM student WHERE sdept = (SELECT sdept FROM student WHERE sname = "刘晨"); SELECT s1.sno,s1.sname FROM student s1 JOIN student s2 ON s1.Sdept = s2.Sdept WHERE s2.sname="刘晨"; SELECT s1.sno,s1.sname FROM student s1 ,student s2 WHERE s1.Sdept = s2.Sdept AND s2.sname="刘晨"; # 查询选修了课程名为‘信息系统’的学生学号和姓名 SELECT student.sno,sname FROM student, sc, course WHERE student.sno = sc.sno AND course.cno = sc.cno AND course.cname = '信息系统'; SELECT sno,sname FROM student WHERE sno IN (SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE cname='信息系统')); # 查询其他系中比IS系任一学生年龄小的学生名单。 SELECT sname,sage FROM student WHERE Sdept <> 'IS' AND Sage < ANY(SELECT sage FROM student WHERE Sdept = 'IS'); SELECT sname,sage FROM student WHERE Sdept <> 'IS' AND Sage < (SELECT MAX(sage) FROM student WHERE Sdept = 'IS'); # 查询其他系中比IS系所有学生年龄都小的学生名单。 SELECT sname,sage FROM student WHERE Sdept <> 'IS' AND Sage < ALL(SELECT sage FROM student WHERE Sdept = 'IS'); # 组函数比ANY ALL要高效。 SELECT sname,sage FROM student WHERE Sdept <> 'IS' AND Sage < (Select MIN(Sage) FROM student WHERE Sdept = 'IS');