sql是測試從業者必備的技能之一,基本上也是筆試必考內容。
所以,不要讓sql拖了后腿,有些測友一遇到多表關聯查詢就犯暈,甚至連單表的執行順序都沒搞懂,下面簡單介紹下,順便給一些題供大家練習。
單表執行順序
select distinct 字段1,...,字段n from 庫.表 where 條件 group by 分組字段 having 過濾 order by 排序字段 limit n;
執行順序
from where group by having select distinct order by limit
多表關聯的幾個概念
交叉連接:無任何匹配條件,生成笛卡爾積
內連接:共同部分
左連接:在內連接的基礎上保留左表的記錄
右連接:在內連接的基礎上保留右表的記錄
全外連接:在內連接的基礎上保留左右兩表沒有對應關系的記錄
練習題表結構
創建表
班級表
DROP TABLE IF EXISTS `class`; CREATE TABLE `class` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `caption` varchar(255) NOT NULL, `grade_id` int(11) NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
年級表
DROP TABLE IF EXISTS `class_grade`; CREATE TABLE `class_grade` ( `gid` int(11) NOT NULL AUTO_INCREMENT, `gname` varchar(255) NOT NULL, PRIMARY KEY (`gid`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
課程表
DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cid` int(11) NOT NULL, `cname` varchar(255) NOT NULL, `teacher_id` int(11) NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
成績表
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, `score` varchar(255) DEFAULT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;
學生表
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` varchar(255) NOT NULL, `gender` enum('女','男') NOT NULL DEFAULT '男', `class_id` int(11) NOT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
老師表
DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `tid` int(11) NOT NULL, `tname` varchar(255) DEFAULT NULL, PRIMARY KEY (`tid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
班級任職表
DROP TABLE IF EXISTS `teacher2cls`; CREATE TABLE `teacher2cls` ( `tcid` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL, `cid` int(11) NOT NULL, PRIMARY KEY (`tcid`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
關於表數據,建議自己造,加深對表結構的理解。
常見筆試題
01、查詢同時選修了物理課和生物課的學生id和姓名 02、查詢“2”課程分數小於60,按分數降序排列的同學學號 03、查詢有兩門及以上課程超過60分的學生id及其平均成績 04、查詢沒有帶過任何班級的老師id和姓名 05、查詢沒有學生選修的課程的課程號和課程名 06、查詢至少選修兩門課程的學生學號 07、查詢各個課程及相應的選修人數 08、查詢課程編號為“2”且課程成績在80分以上的學生的學號和姓名 09、查詢課程名稱為“生物”,且分數低於60的學生姓名和分數 10、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列 11、查詢同名同姓學生名單,並統計同名人數 12、查詢男生、女生的人數,按倒序排列; 13、查詢選修了2門以上課程的全部學生的學號和姓名 14、查詢每門課程被選修的學生數 15、查詢至少學過學號為“1”同學所選課程中任意一門課的其他同學學號和姓名 16、查詢沒有學全所有課的同學的學號、姓名 17、查詢有課程成績小於60分的同學的學號、姓名 18、查詢所帶班級數最多的老師id和姓名 19、查詢課程編號“2”的成績比課程編號“1”課程低的所有同學的學號、姓名 20、查詢帶過超過2個班級的老師的id和姓名 21、查詢沒有帶過高年級的老師id和姓名 22、查詢學過編號‘1’課程和編號‘2’課程的同學的學號、姓名 23、查詢教授課程超過2門的老師的id和姓名 24、查詢學過‘張老師’老師2門課以上的同學的學號、姓名 25、查詢班級信息,包括班級id、班級名稱、年級、年級級別(12為低年級,34為中年級,56位高年級) 26、查詢班級數小於5的年級id和年級名 27、查詢每位學生的學號,姓名,選課數,平均成績 28、查詢每個年級的學生人數 29、查詢每個年級的班級數,取出班級數最多的前三個年級 30、查詢“生物”課程和“物理”課程成績都及格的學生id和姓名
補充:查詢成績表里不同課程的成績倒數5名
參考答案
01:
select s.sid,s.sname from student s where s.sid in( select s.student_id from score s join course c on c.cid = s.course_id where c.cname in ('體育','生物') group by s.student_id having count(s.student_id)=2 );
...
最好先自己做一遍,如需要參考答案,請微信聯系作者。
原文已更新:https://www.cnblogs.com/uncleyong/p/14758383.html