mysql进阶练习
一 .? MySQL進階練習
/*==========================創建班級表=============================*/ CREATE TABLE class (cid int(11) NOT NULL AUTO_INCREMENT,class_name varchar(32) NOT NULL,PRIMARY KEY (cid) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;INSERT INTO class(cid,class_name) VALUES(1,"三級二班"),(2,"三級三班"),(3,"一級二班"),(4,"二級九班");/*創建教師信息表*/ DROP TABLE IF EXISTS teacher; CREATE TABLE teacher(tid int(11) NOT NULL AUTO_INCREMENT,tname varchar(32) NOT NULL,PRIMARY KEY (tid) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO teacher VALUES (1, "張磊老師"), (2, "李平老師"), (3, "劉海燕老師"), (4, "朱云海老師"), (5, "李杰老師");/*========================創建課程信息表=============================*/ CREATE TABLE course (cid int(11) NOT NULL AUTO_INCREMENT,cname varchar(32) NOT NULL,teacher_id int(11) NOT NULL,PRIMARY KEY (cid),KEY fk_course_teacher (teacher_id),CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher(tid) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO course VALUES (1, "生物", 1), (2, "物理", 2), (3, "體育", 3), (4, "美術", 2);/*=====================創建學生信息表================================*/ DROP TABLE IF EXISTS student; CREATE TABLE student (sid int(11) NOT NULL AUTO_INCREMENT,gender char(1) NOT NULL,class_id int(11) NOT NULL,sname varchar(32) NOT NULL,PRIMARY KEY (sid),KEY fk_class (class_id),CONSTRAINT fk_class FOREIGN KEY (class_id) REFERENCES class (cid) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; INSERT INTO student VALUES (1, "男", 1, "理解"), (2, "女", 1, "鋼蛋"),(3, "男", 1, "張三"), (4, "男", 1, "張一"), (5, "女", 1, "張二"), (6, "男", 1, "張四"),(7, "女", 2, "鐵錘"), (8, "男", 2, "李三"),(9, "男", 2, "李一"), (10, "女", 2, "李二"),(11, "男", 2, "李四"), (12, "女", 3, "如花"), (13, "男", 3, "劉三"), (14, "男", 3, "劉一"),(15, "女", 3, "劉二"), (16, "男", 3, "劉四“);/*=====================創建學生成績信息表=========================*/ DROP TABLE IF EXISTS `score`; CREATE TABLE `score` (`sid` int(11) NOT NULL AUTO_INCREMENT,`student_id` int(11) NOT NULL,`course_id` int(11) NOT NULL,`num` int(11) NOT NULL,PRIMARY KEY (`sid`),KEY `fk_score_student` (`student_id`),KEY `fk_score_course` (`course_id`),CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8; INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'),('10', '3', '1', '77'), ('11', '3', '2', '66'),('12', '3', '3', '87'), ('13', '3', '4', '99'),('14', '4', '1', '79'), ('15', '4', '2', '11'),('16', '4', '3', '67'), ('17', '4', '4', '100'),('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'),('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'),('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'),('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'),('44', '11', '3', '43'), ('45', '11', '4', '87'),('46', '12', '1', '90'), ('47', '12', '2', '77'),('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');/*===================練習題目=====================*/sql執行順序:(1)FROM--(2)--ON <join_condition>--(3)<join_type> JOIN <right_table>--(4)WHERE <where_condition>--(5)GROUP BY <group_by_list>--(6)HAVING <having_condition>--(7)SELECT --(8)DISTINCT <select_list>--(9)ORDER BY <order_by_condition>--(10)LIMIT <limit_number>1、查詢所有的課程的名稱以及對應的任課老師姓名 (way1.) select course.cname,teacher.tname from course,teacher where teacher.tid=course.teacher_id; (way2.) SELECTcourse.cname,teacher.tname FROMcourse INNER JOIN teacher ON course.teacher_id = teacher.tid;2、查詢學生表中男女生各有多少人 (way1.) select count(student.gender) from student where student.gender="男"; select count(student.gender) from student where student.gender="女"; (way2.) SELECTgender as 性別,count(1) as 人數 FROMstudent GROUP BYgender;3、查詢物理成績等于100的學生的姓名 (way1.) SELECTstudent.sname FROMstudent WHEREsid IN (SELECTstudent_idFROMscoreINNER JOIN course ON score.course_id = course.cidWHEREcourse.cname = '物理'AND score.num = 100); (way2.) select student.sname from student where sid in (select student_idfrom scorewhere score.num=100 and score.course_id=2);4、查詢平均成績大于八十分的同學的姓名和平均成績select student.sname,score_avg.avg_num from student,(select student_id,avg(score.num) AS avg_numfrom scoregroup by score.student_id having avg(score.num)>80) AS score_avg WHERE student.sid=score_avg.student_id;(way2.) SELECTstudent.sname,t1.avg_num FROMstudent INNER JOIN (SELECTstudent_id,avg(num) AS avg_numFROMscoreGROUP BYstudent_idHAVINGavg(num) > 80 ) AS t1 ON student.sid = t1.student_id;5、查詢所有學生的學號,姓名,選課數,總成績 (way1.) SELECTstudent.sid,student.sname,t2.course_num,t2.total_num FROMstudent LEFT JOIN (SELECTstudent_id,COUNT(course_id) course_num,sum(num) total_numFROMscoreGROUP BYstudent_id )AS t2 ON student.sid = t2.student_id;6、 查詢姓李老師的個數 SELECT COUNT(tid) FROM teacher WHERE tname LIKE "李%";7、 查詢沒有報李平老師課的學生姓名 (way1.) SELECT sname FROM student WHERE student.sid NOT IN (SELECT DISTINCT student_id /*DISTINCT篩選不重復的記錄*/FROM scoreWHERE course_id=2 OR course_id=4); (way2.) SELECTstudent.sname FROMstudent WHEREsid NOT IN (SELECT DISTINCTstudent_idFROMscoreWHEREcourse_id IN (SELECTcourse.cidFROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tidWHEREteacher.tname = '李平老師'));8、 查詢物理課程比生物課程高的學生的學號 (way1.) SELECTtable1.student_id FROM(SELECTstudent_id,numASsubject_numFROMscoreWHEREcourse_id=2) AS table1 INNER JOIN(SELECTstudent_id,numASbiology_numFROMscoreWHEREcourse_id=1) AS table2ONtable1.student_id=table2.student_idWHEREtable1.subject_num>table2.biology_num;(way2.) SELECTt1.student_id FROM(SELECTstudent_id,numFROMscoreWHEREcourse_id = (SELECTcidFROMcourseWHEREcname = '物理')) AS t1 INNER JOIN (SELECTstudent_id,numFROMscoreWHEREcourse_id = (SELECTcidFROMcourseWHEREcname = '生物') ) AS t2 ON t1.student_id = t2.student_id WHEREt1.num > t2.num;9、 查詢沒有同時選修物理課程和體育課程的學生姓名 (way1.) SELECTsname FROMstudent WHEREsid NOT IN(SELECTt1.student_idFROM(SELECTstudent_id,course_idFROMscoreWHEREcourse_idIN (SELECTcidFROMcourseWHEREcname="物理")) AS t1INNER JOIN(SELECTstudent_id,course_idFROMscoreWHEREcourse_idIN (SELECTcidFROMcourseWHEREcname="體育")) AS t2ON t1.student_id=t2.student_id);(way2.) 思路(沒有同時選修指的是選修了一門的,思路是得到物理+體育課程的學生信息表,然后基于學生分組,統計count(課程)=1) SELECTstudent.sname FROMstudent WHEREsid IN (SELECTstudent_idFROMscoreWHEREcourse_id IN (SELECTcidFROMcourseWHEREcname = '物理'OR cname = '體育')GROUP BYstudent_idHAVINGCOUNT(course_id) = 1);10、查詢掛科超過兩門(包括兩門)的學生姓名和班級 (way1.) SELECTclass_name,t1.sname FROMclass INNER JOIN (SELECTsname,class_idFROMstudentWHEREsid IN(SELECTstudent_idFROMscoreWHEREscore.num<60GROUP BYstudent_idHAVING COUNT(num)=2))AS t1 ON class.cid=t1.class_id;(way2.)思路求出<60的表,然后對學生進行分組,統計課程數目>=2SELECTstudent.sname,class.class_name FROMstudent INNER JOIN (SELECTstudent_idFROMscoreWHEREnum < 60GROUP BYstudent_idHAVINGcount(course_id) >= 2 ) AS t1 INNER JOIN class ON student.sid = t1.student_id AND student.class_id = class.cid;11、查詢選修了所有課程的學生姓名 (way1.) selectstudent.sname fromstudent wheresid in(selectstudent_idfromscoregroup bystudent_idhavingcount(course_id)=4); (way2.) SELECTstudent.sname FROMstudent WHEREsid IN (SELECTstudent_idFROMscoreGROUP BYstudent_idHAVINGCOUNT(course_id) = (SELECT count(cid) FROM course));12、查詢李平老師教的課程的所有成績記錄 (way1.) selectcourse_id,num fromscore wherescore.course_id in(selectcidfromcourseinner jointeacheroncourse.teacher_id=teacher.tidwhereteacher.tname="李平老師"); (way2.) SELECT* FROMscore WHEREcourse_id IN (SELECTcidFROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tidWHEREteacher.tname = '李平老師'); 13、查詢全部學生都選修了的課程號和課程名 (way1.) selectcid,cname fromcourse wherecid in(selectcourse_idfromscoregroup bycourse_idhaving count(student_id)= (select count(sid) from student)); (way2.) SELECTcid,cname FROMcourse WHEREcid IN (SELECTcourse_idFROMscoreGROUP BYcourse_idHAVINGCOUNT(student_id) = (SELECTCOUNT(sid)FROMstudent));14、查詢每門課程被選修的次數 (way1.) selectcourse_id,count(student_id) fromscore group bycourse_id;15、查詢只選修了一門課程的學生姓名和學號 selectsid,sname fromstudent wheresid in(selectstudent_idfromscoregroup bystudent_idhavingcount(course_id)=1);16、查詢所有學生考出的總成績并按從高到低排序(成績去重) (way1.) selectsid,sname,t1.num fromstudent left join(selectstudent_id,sum(score.num) as numfromscoregroup bystudent_id) as t1 on student.sid=t1.student_id order by t1.num desc;17、查詢平均成績大于85的學生姓名和平均成績 selectsname,t1.num fromstudent inner join(selectstudent_id,avg(num) as numfromscoregroup bystudent_idhavingavg(num)>85) as t1 on student.sid=t1.student_id;18、查詢生物成績不及格的學生姓名和對應生物分數 (way1.) selectsname,t1.num fromstudent inner join(selectstudent_id,numfromscorewherecourse_id=(select cid from course where cname="生物") and num<60)as t1 on student.sid=t1.student_id; (way2.) SELECTsname 姓名,num 生物成績 FROMscore LEFT JOIN course ON score.course_id = course.cid LEFT JOIN student ON score.student_id = student.sid WHEREcourse.cname = '生物' AND score.num < 60;19、查詢在所有選修了李平老師課程的學生中,這些課程(李平老師的課程,不是所有課程)平均成績最高的學生姓名 (way1.) selectsname fromstudent wheresid in(selectt1.student_idfrom(selectstudent_id,numfromscorewherecourse_id in(selectcidfromcoursewherecourse.teacher_id=(select tid from teacher where tname="李平老師"))group by student_idorder byAVG(num) DESClimit 1)as t1);(way2.) SELECTsname FROMstudent WHEREsid = (SELECTstudent_idFROMscoreWHEREcourse_id IN (SELECTcourse.cidFROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tidWHEREteacher.tname = '李平老師')GROUP BYstudent_idORDER BYAVG(num) DESCLIMIT 1);20、查詢每門課程成績最好的前兩名學生姓名 SELECT* FROMscore ORDER BYcourse_id,num DESC;#表1:求出每門課程的課程course_id,與最高分數first_num SELECTcourse_id,max(num) first_num FROMscore GROUP BYcourse_id;#表2:去掉最高分,再按照課程分組,取得的最高分,就是第二高的分數second_num SELECTscore.course_id,max(num) second_num FROMscore INNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id ) AS t ON score.course_id = t.course_id WHEREscore.num < t.first_num GROUP BYcourse_id;#將表1和表2聯合到一起,得到一張表t3,包含課程course_id與該們課程的first_num與second_num SELECTt1.course_id,t1.first_num,t2.second_num FROM(SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t1 INNER JOIN (SELECTscore.course_id,max(num) second_numFROMscoreINNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t ON score.course_id = t.course_idWHEREscore.num < t.first_numGROUP BYcourse_id ) AS t2 ON t1.course_id = t2.course_id;#查詢前兩名的學生(有可能出現并列第一或者并列第二的情況) SELECTscore.student_id,t3.course_id,t3.first_num,t3.second_num FROMscore INNER JOIN (SELECTt1.course_id,t1.first_num,t2.second_numFROM(SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t1INNER JOIN (SELECTscore.course_id,max(num) second_numFROMscoreINNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t ON score.course_id = t.course_idWHEREscore.num < t.first_numGROUP BYcourse_id) AS t2 ON t1.course_id = t2.course_id ) AS t3 ON score.course_id = t3.course_id WHEREscore.num >= t3.second_num AND score.num <= t3.first_num;#排序后可以看的明顯點 SELECTscore.student_id,t3.course_id,t3.first_num,t3.second_num FROMscore INNER JOIN (SELECTt1.course_id,t1.first_num,t2.second_numFROM(SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t1INNER JOIN (SELECTscore.course_id,max(num) second_numFROMscoreINNER JOIN (SELECTcourse_id,max(num) first_numFROMscoreGROUP BYcourse_id) AS t ON score.course_id = t.course_idWHEREscore.num < t.first_numGROUP BYcourse_id) AS t2 ON t1.course_id = t2.course_id ) AS t3 ON score.course_id = t3.course_id WHEREscore.num >= t3.second_num AND score.num <= t3.first_num ORDER BYcourse_id;#可以用以下命令驗證上述查詢的正確性 SELECT* FROMscore ORDER BYcourse_id,num DESC;?
轉載于:https://www.cnblogs.com/wuxunyan/p/9174535.html
總結
- 上一篇: 痞子衡嵌入式:飞思卡尔i.MX RTyy
- 下一篇: flag -- 诡异的memcache标