三张数据表分别是:student,course,SC(即学生表,课程表,选课表) # 表结构如下:
| CREATE DATABASE SQL查询语句27道 GO USE SQL查询语句27道 --创建学生表 CREATE TABLE student ( Sno VARCHAR(20) PRIMARY KEY NOT NULL, Sname VARCHAR(50) NOT NULL, Ssex VARCHAR(10) NOT NULL, Sage INT NOT NULL, Sdept VARCHAR(50) NOT NULL ) -- 创建课程表 CREATE TABLE course ( Cno VARCHAR(20) NOT NULL PRIMARY KEY, Cname VARCHAR(50) NOT NULL, Hours INT NOT NULL ) GO -- 创建选课表 CREATE TABLE SC ( Sno VARCHAR(20) FOREIGN KEY (Sno) REFERENCES student (Sno), Cno VARCHAR(20) FOREIGN KEY (Cno) REFERENCES course (Cno), Grade INT NULL ) GO USE [SQL查询语句27道] GO INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) VALUES (9512101, '李勇', '男', 19, '计算机系'), (9512102, '刘晨', '男', 20, '计算机系'), (9512103, '王敏', '女', 20, '计算机系'), (9521101, '张立', '男', 22, '信息系'), (9521102, '吴宾', '女', 21, '信息系'), (9521103, '张海', '男', 20, '信息系'), (9531101, '钱小力', '女', 18, '数学系'), (9531102, '王大力', '男', 19, '数学系') GO INSERT INTO course (Cno, Cname, Hours) VALUES ('C01', '计算机文化学', 70), ('C02', 'VB', 90), ('C03', '计算机网络', 80), ('C04', '数据库基础', 108), ('C05', '高等数学', 180), ('C06', '数据结构', 72) GO INSERT INTO SC (Sno, Cno, Grade) VALUES (9512101, 'C01', 90), (9512101, 'C02', 86), (9512101, 'C06', NULL), (9512102, 'C02', 78), (9512102, 'C04', 66), (9521102, 'C01', 82), (9521102, 'C02', 75), (9521102, 'C04', 92), (9521102, 'C05', 50), (9521103, 'C02', 68), (9521103, 'C06', NULL), (9531101, 'C01', 80), (9531101, 'C05', 95), (9531102, 'C05', 85) |
| with t1(cno, 最大值, count_person) as ( select cno, max(grade) '最大值', count(*) as count_person from sc group by cno ) select cname '课程', t1.count_person '选修人数', t1.最大值 from course join t1 on course.cno = t1.cno |
| SELECT Cname 课程名, COUNT(*) 修课人数, MAX(Grade) 考试最高分 FROM SC, course WHERE course.Cno = SC.Cno GROUP BY course.Cname -- 请注意该表用于分组的字段!,当使用cno进行分组时,无法通过 |
| SELECT sname, count(*) AS '选课数' FROM sc JOIN student ON sc.sno = student.sno GROUP BY sname ORDER BY count(*) asc -- 这一个算法和上一题的第二个算法相同 |
| SELECT student.Sname 学生姓名, student.Sno 学生学号, COUNT(SC.Sno) 选课门数 FROM student inner join SC ON SC.Sno = student.Sno GROUP BY student.Sname, student.Sno ORDER BY COUNT(SC.Sno) ASC |
| SELECT sname, Count(*) '选课数目', AVG(Grade) '平均成绩' FROM SC JOIN student on sc.sno = student.sno GROUP BY sname HAVING COUNT(*) > 2 |
| SELECT Student.Sname,AVG(Sc.Grade) 平均成绩,COUNT(SC.Sno) 选课门数 FROM SC --内联接join或inner join,内联系是比较运算符,只返回符合条件的行 JOIN Student ON (SC.Sno = Student.Sno) JOIN Course ON (SC.Cno = Course.Cno) GROUP BY Student.Sname HAVING COUNT(distinct Course.Cno) >2--分组条件 |
| SELECT Sname,Cname,SC.Cno FROM student s JOIN SC ON s.Sno=SC.Sno JOIN course c ON SC.Cno=c.Cno WHERE SC.Cno='C02' |
| SELECT Sname, Cno, Grade FROM student s INNER JOIN SC ON s.Sno = SC.Sno WHERE Grade >= 80 ORDER BY Grade |
| SELECT a.Sname, a.Sage FROM student a join student b ON a.Sage = b.Sage ORDER BY a.Sage |
| SELECT Cno, Cname FROM course WHERE Cno NOT IN ( SELECT DISTINCT Cno FROM SC) |
| SELECT s.Sname, c.Cname, SC.Grade INTO new_sc FROM student s JOIN SC ON s.Sno = SC.Sno JOIN course c ON SC.Cno = c.Cno WHERE SC.Grade IS NOT NULL |
| SELECT Sname, Ssex, Cname, Grade FROM student s JOIN SC ON s.Sno = SC.Sno JOIN course c ON SC.Cno = c.Cno WHERE Sdept IN ('计算机系', '信息系') ORDER BY Sdept, Sname, Ssex, Grade |
| SELECT Sname, Sdept FROM student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = 'C01') |
| SELECT s.Sno, Sname FROM student s JOIN SC ON s.Sno = SC.Sno WHERE Cno IN (SELECT Cno FROM course WHERE Cname = '高等数学' ) AND Grade >= 80 |
| UPDATE SC SET Grade+=10 WHERE Cno IN ( SELECT Cno FROM course WHERE Cname = 'VB') |