SQL 索引 视图
INSERT INTO Book(bid, bName, price, bTypeId) VALUES(2, '射雕英雄传', 39.62, 10); INSERT INTO Book(bid, bName, price, bTypeId) VALUES(3, '天龙八部', 50.02, 10); INSERT INTO Book(bid, bName, price, bTypeId) VALUES(4, '雪花女神', 103.00, 10); INSERT INTO Book(bid, bName, price, bTypeId) VALUES(5, '小李飞刀', 129.00, 10); -- 创建视图 CREATE OR REPLACE VIEW my_book_view AS SELECT b.bname, bt.name FROM Book b INNER JOIN BookType bt ON b.bTypeId = bt.id WHERE price > 100; SELECT * FROM my_book_view; -- 修改视图,实现查询价格在90‐120之间的书名和价格 CREATE OR REPLACE VIEW my_book_view AS SELECT bname, price FROM Book WHERE price BETWEEN 30 AND 120; -- 第二种方法 ALTER VIEW my_book_view AS SELECT bname, price FROM Book WHERE price BETWEEN 90 AND 130; -- 6. 删除刚才创建的视图 DROP VIEW IF EXISTS my_book_view; -- 创建考上Peking University的学生的视图 CREATE OR REPLACE VIEW beida (id,name,mark,sch) AS SELECT stu_mark.s_id,stu_mark.s_name,stu_mark.mark, sign.s_sign_sch FROM stu_mark ,sign WHERE stu_mark.s_id=sign.s_id AND stu_mark.mark>=41 AND sign.s_sign_sch='peking university'; -- 2. 创建考上Tsinghua University的学生的视图 CREATE VIEW qinghua (id,name,mark,sch) AS SELECT stu_mark.s_id, stu_mark.s_name, stu_mark.mark, sign.s_sign_sch FROM stu_mark ,sign WHERE stu_mark.s_id=sign.s_id AND stu_mark.mark>=40 AND sign.s_sign_sch='Tsinghua University'; -- 3. Xiaowang的成绩在录入的时候因录入错误多录了50分,对其成绩进行更正 uPDATE stu_mark SET mark=mark-50 WHERE stu_mark.s_name ='Xiaowang'; -- 2. 函数 -- 1. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 -- 这里只用根据学生ID把成绩分组,对分组中的score求平均值,最后在选取结果中AVG大于60的即可. 注 -- 意,这里必须要给计算得到的AVG结果一个alias.(AS ss) -- 得到学生信息的时候既可以用join也可以用一般的联合搜索 -- 第一种写法 select student.SId,sname,ss from student,( select SId, AVG(score) as ss from sc GROUP BY SId HAVING AVG(score)> 60 )r where student.sid = r.sid; -- 第二种写法 select Student.SId, Student.Sname, r.ss from Student right join( select SId, AVG(score) AS ss from sc GROUP BY SId HAVING AVG(score)> 60 )r on Student.SId = r.SId; -- 2. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的成绩总和 select student.sid, student.sname,r.coursenumber,r.scoresum from student, (select sc.sid, sum(sc.score) as scoresum, count(sc.cid) as coursenumber from sc group by sc.sid)r where student.sid = r.sid; -- 3. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 select student.sid, student.sname, AVG(sc.score) from student,sc where student.sid = sc.sid and sc.score<60 group by sc.sid having count(*)>1; -- 4. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 select * from sc left join ( select sid,avg(score) as avscore from sc group by sid )r on sc.sid = r.sid order by avscore desc; -- 5. 查询 1990 年出生的学生名单 select * from student where YEAR(student.Sage)=1990; -- 6. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 select sc.cid, course.cname, AVG(SC.SCORE) as average from sc, course where sc.cid = course.cid group by sc.cid order by average desc,cid asc; -- 7. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩 select student.sid, student.sname, AVG(sc.score) as aver from student, sc where student.sid = sc.sid group by sc.sid having aver > 85; -- 8. 查询本周过生日的学生 select * from student where WEEKOFYEAR(student.Sage)=WEEKOFYEAR(CURDATE()); -- 9. 查询下周过生日的学生 select * from student where WEEKOFYEAR(student.Sage)=WEEKOFYEAR(CURDATE())+1; -- 10. 查询本月过生日的学生 select * from student where MONTH(student.Sage)=MONTH(CURDATE()); -- 11. 查询下月过生日的学生 select * from student where MONTH(student.Sage)=MONTH(CURDATE())+1;
-- 1. 查询没学过"张三"老师讲授的任一门课程的学生姓名 select * from student where student.sid not in( select sc.sid from sc where sc.cid in( select course.cid from course where course.tid in( select teacher.tid from teacher where tname = "张三" ) ) ); -- 2. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 select * from sc left join ( select sid,avg(score) as avscore from sc group by sid )r on sc.sid = r.sid order by avscore desc; -- 3. 科成绩进行排序,并显示排名, Score 重复时保留名次空缺 -- 这一道题有点tricky,可以用变量,但也有更为简单的方法,即自交(左交) 用sc中的score和 -- 自己进行对比,来计算“比当前分数高的分数有几个”。 select a.cid, a.sid, a.score, count(b.score)+1 as rank from sc as a left join sc as b on a.score<b.score and a.cid = b.cid group by a.cid, a.sid,a.score order by a.cid, rank ASC; -- 4. 查询各科成绩前三名的记录 select * from sc where ( select count(*) from sc as a where sc.cid = a.cid and sc.score<a.score )< 3 order by cid asc, sc.score desc; -- 5. 嵌套查询列出同名的全部学生的信息 select * from student where sname in ( select sname from student group by sname having count(*)>1 ); -- 6. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 select sc.cid, course.cname, AVG(SC.SCORE) as average from sc, course where sc.cid = course.cid group by sc.cid order by average desc,cid asc; -- 7. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩(having也可以用来截取结果表, -- 在这里就先得到平均成绩总表,再截取AVG大于85的即可.) select student.sid, student.sname, AVG(sc.score) as aver from student, sc where student.sid = sc.sid group by sc.sid having aver > 85; -- 8. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数 select student.sname, sc.score from student, sc, course where student.sid = sc.sid and course.cid = sc.cid and course.cname = "数学" and sc.score < 60;