Python:MySQL练习题
MySQL练习题
MySQL测试题
一、表关系
请创建如下表,并创建相关约束

二、操作表
1、自行创建测试数据 2、查询“生物”课程比“物理”课程成绩高的所有学生的学号; 3、查询平均成绩大于60分的同学的学号和平均成绩; 4、查询所有同学的学号、姓名、选课数、总成绩; 5、查询姓“李”的老师的个数; 6、查询没学过“叶平”老师课的同学的学号、姓名; 7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; 8、查询学过“叶平”老师所教的所有课的同学的学号、姓名; 9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; 10、查询有课程成绩小于60分的同学的学号、姓名; 11、查询没有学全所有课的同学的学号、姓名; 12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名; 13、查询至少学过学号为“001”同学所选课程中任意一门课的其他同学学号和姓名; 14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名; 15、删除学习“叶平”老师课的SC表记录; 16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩; 17、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分; 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分; 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序; 20、课程平均分从高到低显示(现实任课老师); 21、查询各科成绩前三名的记录:(不考虑成绩并列情况) 22、查询每门课程被选修的学生数; 23、查询出只选修了一门课程的全部学生的学号和姓名; 24、查询男生、女生的人数; 25、查询姓“张”的学生名单; 26、查询同名同姓学生名单,并统计同名人数; 27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列; 28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩; 29、查询课程名称为“数学”,且分数低于60的学生姓名和分数; 30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; 31、求选了课程的学生人数 32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩; 33、查询各个课程及相应的选修人数; 34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩; 35、查询每门课程成绩最好的前两名; 36、检索至少选修两门课程的学生学号; 37、查询全部学生都选修的课程的课程号和课程名; 38、查询没学过“叶平”老师讲授的任一门课程的学生姓名; 39、查询两门以上不及格课程的同学的学号及其平均成绩; 40、检索“004”课程分数小于60,按分数降序排列的同学学号; 41、删除“002”同学的“001”课程的成绩;
MySQL练习题参考答案
导出现有数据库数据:
- mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 # 结构+数据
- mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径 # 结构
导入现有数据库数据:
- mysqldump -uroot -p密码 数据库名称 < 文件路径
1 /* 2 Navicat Premium Data Transfer 3 4 Source Server : localhost 5 Source Server Type : MySQL 6 Source Server Version : 50624 7 Source Host : localhost 8 Source Database : sqlexam 9 10 Target Server Type : MySQL 11 Target Server Version : 50624 12 File Encoding : utf-8 13 14 Date: 10/21/2016 06:46:46 AM 15 */ 16 17 SET NAMES utf8; 18 SET FOREIGN_KEY_CHECKS = 0; 19 20 -- ---------------------------- 21 -- Table structure for `class` 22 -- ---------------------------- 23 DROP TABLE IF EXISTS `class`; 24 CREATE TABLE `class` ( 25 `cid` int(11) NOT NULL AUTO_INCREMENT, 26 `caption` varchar(32) NOT NULL, 27 PRIMARY KEY (`cid`) 28 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 29 30 -- ---------------------------- 31 -- Records of `class` 32 -- ---------------------------- 33 BEGIN; 34 INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班'); 35 COMMIT; 36 37 -- ---------------------------- 38 -- Table structure for `course` 39 -- ---------------------------- 40 DROP TABLE IF EXISTS `course`; 41 CREATE TABLE `course` ( 42 `cid` int(11) NOT NULL AUTO_INCREMENT, 43 `cname` varchar(32) NOT NULL, 44 `teacher_id` int(11) NOT NULL, 45 PRIMARY KEY (`cid`), 46 KEY `fk_course_teacher` (`teacher_id`), 47 CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`) 48 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 49 50 -- ---------------------------- 51 -- Records of `course` 52 -- ---------------------------- 53 BEGIN; 54 INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2'); 55 COMMIT; 56 57 -- ---------------------------- 58 -- Table structure for `score` 59 -- ---------------------------- 60 DROP TABLE IF EXISTS `score`; 61 CREATE TABLE `score` ( 62 `sid` int(11) NOT NULL AUTO_INCREMENT, 63 `student_id` int(11) NOT NULL, 64 `course_id` int(11) NOT NULL, 65 `num` int(11) NOT NULL, 66 PRIMARY KEY (`sid`), 67 KEY `fk_score_student` (`student_id`), 68 KEY `fk_score_course` (`course_id`), 69 CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`), 70 CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`) 71 ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8; 72 73 -- ---------------------------- 74 -- Records of `score` 75 -- ---------------------------- 76 BEGIN; 77 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'); 78 COMMIT; 79 80 -- ---------------------------- 81 -- Table structure for `student` 82 -- ---------------------------- 83 DROP TABLE IF EXISTS `student`; 84 CREATE TABLE `student` ( 85 `sid` int(11) NOT NULL AUTO_INCREMENT, 86 `gender` char(1) NOT NULL, 87 `class_id` int(11) NOT NULL, 88 `sname` varchar(32) NOT NULL, 89 PRIMARY KEY (`sid`), 90 KEY `fk_class` (`class_id`), 91 CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) 92 ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; 93 94 -- ---------------------------- 95 -- Records of `student` 96 -- ---------------------------- 97 BEGIN; 98 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', '刘四'); 99 COMMIT; 100 101 -- ---------------------------- 102 -- Table structure for `teacher` 103 -- ---------------------------- 104 DROP TABLE IF EXISTS `teacher`; 105 CREATE TABLE `teacher` ( 106 `tid` int(11) NOT NULL AUTO_INCREMENT, 107 `tname` varchar(32) NOT NULL, 108 PRIMARY KEY (`tid`) 109 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 110 111 -- ---------------------------- 112 -- Records of `teacher` 113 -- ---------------------------- 114 BEGIN; 115 INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师'); 116 COMMIT; 117 118 SET FOREIGN_KEY_CHECKS = 1;
``` CREATE TABLE class ( cid int(11) NOT NULL AUTO_INCREMENT, caption varchar(32) NOT NULL, PRIMARY KEY (cid) )ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO class VALUES (1, '三年二班'), (2,'三年三班'), (3,'一年二班'), (4,'二年九班'); ``` 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); ``` 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); ``` create table student(sid int(11) not null auto_increment, gender char(1) not null, class_id int(11) not null, sname varchar(32), 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, '刘四'); ``` CREATE TABLE teacher ( tid int(11) NOT NULL AUTO_INCREMENT, tname varchar(32) NOT NULL, PRIMARY KEY (tid) )ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; insert into teacher values (1,'张磊老师'),(2,'李平老师'),(3,'刘海燕老师'),(4,'朱云海老师'),(5,'李杰老师');
2、查询“生物”课程比“物理”课程成绩高的所有学生的学号; 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据【学号】连接两个临时表: 学号 物理成绩 生物成绩 然后再进行筛选 select A.student_id,sw,ty from (select student_id,num as sw from score left join course on score.course_id = course.cid where course.cname = '生物') as A left join (select student_id,num as ty from score left join course on score.course_id = course.cid where course.cname = '体育') as B on A.student_id = B.student_id where sw > if(isnull(ty),0,ty); 3、查询平均成绩大于60分的同学的学号和平均成绩; 思路: 根据学生分组,使用avg获取平均值,通过having对avg进行筛选 select student_id,avg(num) from score group by student_id having avg(num) > 60 4、查询所有同学的学号、姓名、选课数、总成绩; select score.student_id,sum(score.num),count(score.student_id),student.sname from score left join student on score.student_id = student.sid group by score.student_id 5、查询姓“李”的老师的个数; select count(tid) from teacher where tname like '李%' select count(1) from (select tid from teacher where tname like '李%') as B 6、查询没学过“叶平”老师课的同学的学号、姓名; 思路: 先查到“李平老师”老师教的所有课ID 获取选过课的所有学生ID 学生表中筛选 select * from student where sid not in ( select DISTINCT student_id from score where score.course_id in ( select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老师' ) ) 7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; 思路: 先查到既选择001又选择002课程的所有同学 根据学生进行分组,如果学生数量等于2表示,两门均已选择 select student_id,sname from (select student_id,course_id from score where course_id = 1 or course_id = 2) as B left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1 8、查询学过“叶平”老师所教的所有课的同学的学号、姓名; 同上,只不过将001和002变成 in (叶平老师的所有课) 9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; 同第1题 10、查询有课程成绩小于60分的同学的学号、姓名; select sid,sname from student where sid in ( select distinct student_id from score where num < 60 ) 11、查询没有学全所有课的同学的学号、姓名; 思路: 在分数表中根据学生进行分组,获取每一个学生选课数量 如果数量 == 总课程数量,表示已经选择了所有课程 select student_id,sname from score left join student on score.student_id = student.sid group by student_id HAVING count(course_id) = (select count(1) from course) 12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名; 思路: 获取 001 同学选择的所有课程 获取课程在其中的所有人以及所有课程 根据学生筛选,获取所有学生信息 再与学生表连接,获取姓名 select student_id,sname, count(course_id) from score left join student on score.student_id = student.sid where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id 13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名; 先找到和001的学过的所有人 然后个数 = 001所有学科 ==》 其他人可能选择的更多 select student_id,sname, count(course_id) from score left join student on score.student_id = student.sid where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id having count(course_id) = (select count(course_id) from score where student_id = 1) 14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名; 个数相同 002学过的也学过 select student_id,sname from score left join student on score.student_id = student.sid where student_id in ( select student_id from score where student_id != 1 group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1) ) and course_id in (select course_id from score where student_id = 1) group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1) 15、删除学习“叶平”老师课的score表记录; delete from score where course_id in ( select cid from course left join teacher on course.teacher_id = teacher.tid where teacher.name = '叶平' ) 16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩; 思路: 由于insert 支持 inset into tb1(xx,xx) select x1,x2 from tb2; 所有,获取所有没上过002课的所有人,获取002的平均成绩 insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2) from student where sid not in ( select student_id from score where course_id = 2 ) 17、按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分; select sc.student_id, (select num from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy, (select num from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl, (select num from score left join course on score.course_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty, count(sc.course_id), avg(sc.num) from score as sc group by student_id desc 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分; select course_id, max(num) as max_num, min(num) as min_num from score group by course_id; 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序; 思路:case when .. then select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc; 20、课程平均分从高到低显示(现实任课老师); select avg(if(isnull(score.num),0,score.num)),teacher.tname from course left join score on course.cid = score.course_id left join teacher on course.teacher_id = teacher.tid group by score.course_id 21、查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join ( select sid, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 3,1) as second_num from score as s1 ) as T on score.sid =T.sid where score.num <= T.first_num and score.num >= T.second_num 22、查询每门课程被选修的学生数; select course_id, count(1) from score group by course_id; 23、查询出只选修了一门课程的全部学生的学号和姓名; select student.sid, student.sname, count(1) from score left join student on score.student_id = student.sid group by course_id having count(1) = 1 24、查询男生、女生的人数; select * from (select count(1) as man from student where gender='男') as A , (select count(1) as feman from student where gender='女') as B 25、查询姓“张”的学生名单; select sname from student where sname like '张%'; 26、查询同名同姓学生名单,并统计同名人数; select sname,count(1) as count from student group by sname; 27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列; select course_id,avg(if(isnull(num), 0 ,num)) as avg from score group by course_id order by avg asc,course_id desc; 28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩; select student_id,sname, avg(if(isnull(num), 0 ,num)) from score left join student on score.student_id = student.sid group by student_id; 29、查询课程名称为“数学”,且分数低于60的学生姓名和分数; select student.sname,score.num from score left join course on score.course_id = course.cid left join student on score.student_id = student.sid where score.num < 60 and course.cname = '生物' 30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; select * from score where score.student_id = 3 and score.num > 80 31、求选了课程的学生人数 select count(distinct student_id) from score select count(c) from ( select count(student_id) as c from score group by student_id) as A 32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩; select sname,num from score left join student on score.student_id = student.sid where score.course_id in (select course.cid from course left join teacher on course.teacher_id = teacher.tid where tname='张磊老师') order by num desc limit 1; 33、查询各个课程及相应的选修人数; select course.cname,count(1) from score left join course on score.course_id = course.cid group by course_id; 34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩; select DISTINCT s1.course_id,s2.course_id,s1.num,s2.num from score as s1, score as s2 where s1.num = s2.num and s1.course_id != s2.course_id; 35、查询每门课程成绩最好的前两名; select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join ( select sid, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num from score as s1 ) as T on score.sid =T.sid where score.num <= T.first_num and score.num >= T.second_num 36、检索至少选修两门课程的学生学号; select student_id from score group by student_id having count(student_id) > 1 37、查询全部学生都选修的课程的课程号和课程名; select course_id,count(1) from score group by course_id having count(1) = (select count(1) from student); 38、查询没学过“叶平”老师讲授的任一门课程的学生姓名; select student_id,student.sname from score left join student on score.student_id = student.sid where score.course_id not in ( select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '张磊老师' ) group by student_id 39、查询两门以上不及格课程的同学的学号及其平均成绩; select student_id,count(1) from score where num < 60 group by student_id having count(1) > 2 40、检索“004”课程分数小于60,按分数降序排列的同学学号; select student_id from score where num< 60 and course_id = 4 order by num desc; 41、删除“002”同学的“001”课程的成绩; delete from score where course_id = 1 and student_id = 2
练习二:
测试表格 --1.学生表 Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号 --3.教师表 Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名 --4.成绩表 SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数 创建测试数据 学生表 Student create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10)) insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男') insert into Student values('02' , N'钱电' , '1990-12-21' , N'男') insert into Student values('03' , N'孙风' , '1990-05-20' , N'男') insert into Student values('04' , N'李云' , '1990-08-06' , N'男') insert into Student values('05' , N'周梅' , '1991-12-01' , N'女') insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女') insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女') insert into Student values('08' , N'王菊' , '1990-01-20' , N'女') 科目表 Course create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10)) insert into Course values('01' , N'语文' , '02') insert into Course values('02' , N'数学' , '01') insert into Course values('03' , N'英语' , '03') 教师表 Teacher create table Teacher(T# varchar(10),Tname nvarchar(10)) insert into Teacher values('01' , N'张三') insert into Teacher values('02' , N'李四') insert into Teacher values('03' , N'王五') 成绩表 SC create table SC(S# varchar(10),C# varchar(10),score decimal(18,1)) insert into SC values('01' , '01' , 80) insert into SC values('01' , '02' , 90) insert into SC values('01' , '03' , 99) insert into SC values('02' , '01' , 70) insert into SC values('02' , '02' , 60) insert into SC values('02' , '03' , 80) insert into SC values('03' , '01' , 80) insert into SC values('03' , '02' , 80) insert into SC values('03' , '03' , 80) insert into SC values('04' , '01' , 50) insert into SC values('04' , '02' , 30) insert into SC values('04' , '03' , 20) insert into SC values('05' , '01' , 76) insert into SC values('05' , '02' , 87) insert into SC values('06' , '01' , 31) insert into SC values('06' , '03' , 34) insert into SC values('07' , '02' , 89) insert into SC values('07' , '03' , 98)
50道练习题 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 1.1 查询同时存在" 01 "课程和" 02 "课程的情况 1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况 2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 3. 查询在 SC 表存在成绩的学生信息 4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null ) 4.1 查有成绩的学生信息 5. 查询「李」姓老师的数量 6. 查询学过「张三」老师授课的同学的信息 7. 查询没有学全所有课程的同学的信息 8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息 9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息 10. 查询没学过"张三"老师讲授的任一门课程的学生姓名 11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 12. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息 13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 14. 查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 15. 按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次 16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺 17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比 18. 查询各科成绩前三名的记录 19. 查询每门课程被选修的学生数 20. 查询出只选修两门课程的学生学号和姓名 21. 查询男生、女生人数 22. 查询名字中含有「风」字的学生信息 23. 查询同名同性学生名单,并统计同名人数 24. 查询 1990 年出生的学生名单 25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 26. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩 27. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数 28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况) 29. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数 30. 查询不及格的课程 31. 查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名 32. 求每门课程的学生人数 33. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 34. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 35. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 36. 查询每门功成绩最好的前两名 37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)。 38. 检索至少选修两门课程的学生学号 39. 查询选修了全部课程的学生信息 40. 查询各学生的年龄,只按年份来算 41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一 42. 查询本周过生日的学生 43. 查询下周过生日的学生 44. 查询本月过生日的学生 45. 查询下月过生日的学生
select A.*,B.C#,B.score from (select * from SC where C#='01')A left join(select * from SC where C#='02')B on A.S#=B.S# where A.score>B.score --1 查询“ 01 ”课程比" 02 "课程成绩高的学生的信息及课程分数 select * from (select * from SC where C#='01')A left join (select * from SC where C#='02')B on A.S#=B.S# where B.S# is not null --1.1 查询同时存在" 01 "课程和" 02 "课程的情况 select * from (select * from SC where C#='01')A left join (select * from SC where C#='02')B on A.S#=B.S# --1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为null) select * from SC where C#='02'and S# not in(select S# from SC where C#='01') --1.3 查询不存在" 01 "课程但存在" 02 "课程的情况 select A.S#,B.Sname,A.dc from(select S#,AVG(score)dc from SC group by S#)A left join Student B on A.S#=B.S# where A.dc>=60 --2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 select * from Student where S# in (select distinct S# from SC) --3. 查询在 SC 表存在成绩的学生信息 select B.S#,B.Sname,A.选课总数,A.总成绩 from (select S#,COUNT(C#)选课总数,sum(score)总成绩 from SC group by S#)A right join Student B on A.S#=B.S# --4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null) select A.S#,B.Sname,A.选课总数,A.总成绩 from (select S#,COUNT(C#)选课总数,sum(score)总成绩 from SC group by S#)A left join Student B on A.S#=B.S# --4.1 查有成绩的学生信息 select COUNT(*)李姓老师数量 from Teacher where Tname like '李%' --5.查询「李」姓老师的数量 select * from Student where S# in(select distinct S# from SC where C#=(select C# from Course where T#=(select T# from Teacher where Tname='张三'))) --6.查询学过「张三」老师授课的同学的信息 select * from Student where S# in(select S# from SC group by S# having COUNT(C#)<3) --7.查询没有学全所有课程的同学的信息 select * from Student where S# in(select distinct S# from SC where C# in(select C# from SC where S#='01') ) --8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息 select * from Student where S# in(select S# from SC where C# in(select distinct C# from SC where S#='01') and S#<>'01' group by S# having COUNT(C#)>=3) --9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息 select Sname from Student where S# not in(select S# from SC where C# in(select C# from Course where T# in(select T# from Teacher where Tname='张三') ) )--10. 查询没学过「张三」老师讲授的任一门课程的学生姓名 select A.S#,A.Sname,B.平均成绩 from Student A right join (select S#,AVG(score)平均成绩 from SC where score<60 group by S# having COUNT(score)>=2)B on A.S#=B.S#--11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 select S#,score from SC where C#='01' and score<60 order by score desc --12.检索" 01 "课程分数小于 60 ,按分数降序排列的学生信息 select S#,max(case C# when '01' then score else 0 end)'01', max(case C# when '02' then score else 0 end)'02', MAX(case C# when '03' then score else 0 end)'03',AVG(score)平均分 from SC group by S# order by 平均分 desc --13. (静态写法)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 select distinct A.C#,Cname,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 from SC A left join Course on A.C#=Course.C# left join (select C#,MAX(score)最高分,MIN(score)最低分,AVG(score)平均分 from SC group by C#)B on A.C#=B.C# left join (select C#,(convert(decimal(5,2),(sum(case when score>=60 then 1 else 0 end)*1.00)/COUNT(*))*100)及格率 from SC group by C#)C on A.C#=C.C# left join (select C#,(convert(decimal(5,2),(sum(case when score >=70 and score<80 then 1 else 0 end)*1.00)/COUNT(*))*100)中等率 from SC group by C#)D on A.C#=D.C# left join (select C#,(convert(decimal(5,2),(sum(case when score >=80 and score<90 then 1 else 0 end)*1.00)/COUNT(*))*100)优良率 from SC group by C#)E on A.C#=E.C# left join (select C#,(convert(decimal(5,2),(sum(case when score >=90 then 1 else 0 end)*1.00)/COUNT(*))*100)优秀率 from SC group by C#)F on A.C#=F.C# --14.查询各科成绩最高分、最低分和平均分: --以如下形式显示:课程 ID ,课程 name ,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 --及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 select *,RANK()over(order by score desc)排名 from SC --15. 按各科成绩进行排序,并显示排名,Score 重复时保留名次空缺 select *,DENSE_RANK()over(order by score desc)排名 from SC --15.1 按各科成绩进行排序,并显示排名,Score 重复时合并名次 select *,RANK()over(order by 总成绩 desc)排名 from( select S#,SUM(score)总成绩 from SC group by S#)A --16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺 select *,dense_rank()over(order by 总成绩 desc)排名 from( select S#,SUM(score)总成绩 from SC group by S#)A --16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺 select distinct A.C#,B.Cname,C.[100-85],C.所占百分比,D.[85-70],D.所占百分比,E.[70-60],E.所占百分比,F.[60-0],F.所占百分比 from SC A left join Course B ON A.C#=B.C# left join (select C#,sum(case when score>85 and score<=100 then 1 else null end)[100-85], convert(decimal(5,2),(sum(case when score>85 and score<100 then 1 else null end))*1.00/COUNT(*))*100 所占百分比 from SC group by C#)C on A.C#=C.C# left join (select C#,sum(case when score>70 and score<=85 then 1 else null end)[85-70], convert(decimal(5,2),(sum(case when score>70 and score<=85 then 1 else null end))*1.00/COUNT(*))*100 所占百分比 from SC group by C#)D on A.C#=D.C# left join (select C#,sum(case when score>60 and score<=70 then 1 else null end)[70-60], convert(decimal(5,2),(sum(case when score>60 and score<=70 then 1 else null end))*1.00/COUNT(*))*100 所占百分比 from SC group by C#)E on A.C#=E.C# left join (select C#,sum(case when score>0 and score<=60 then 1 else null end)[60-0], convert(decimal(5,2),(sum(case when score>0 and score<=60 then 1 else null end))*1.00/COUNT(*))*100 所占百分比 from SC group by C#)F on A.C#=F.C# --17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比 select * from(select *,rank()over (partition by C# order by score desc)A from SC)B where B.A<=3 --18. 查询各科成绩前三名的记录(方法 1) select a.S#,a.C#,a.score from SC a left join SC b on a.C#=b.C# and a.score<b.score group by a.S#,a.C#,a.score having COUNT(b.S#)<3 order by a.C#,a.score desc --18. 查询各科成绩前三名的记录(取 a 的最高分与本表比较)(方法 2) select * from SC a where (select COUNT(*)from SC where C#=a.C# and score>a.score)<3 order by a.C#,a.score desc --18. 查询各科成绩前三名的记录(取 a)(方法 3) select C#,COUNT(S#)学生数 from SC group by C# --19. 查询每门课程被选修的学生数 select S#,Sname from Student where S# in(select S# from(select S#,COUNT(C#)课程数 from SC group by S#)A where A.课程数=2) --20. 查询出只选修两门课程的学生学号和姓名 select Ssex,COUNT(Ssex)人数 from Student group by Ssex --21. 查询男生、女生人数 select * from Student where Sname like '%风%' --22. 查询名字中含有「风」字的学生信息 select A.*,B.同名人数 from Student A left join (select Sname,Ssex,COUNT(*)同名人数 from Student group by Sname,Ssex)B on A.Sname=B.Sname and A.Ssex=B.Ssex where B.同名人数>1 --23. 查询同名同性学生名单,并统计同名人数 select * from Student where YEAR(Sage)=1990 --24.查询 1990 年出生的学生名单 select C#,AVG(score)平均成绩 from SC group by C# order by 平均成绩 desc,C# --25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 select A.S#,A.Sname,B.平均成绩 from Student A left join (select S#,AVG(score)平均成绩 from SC group by S#)B on A.S#=B.S# where B.平均成绩>85 --26. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩 select B.Sname,A.score from(select * from SC where score<60 and C#=(select C# from Course where Cname='数学'))A left join Student B on A.S#=B.S# -- 27. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数 select A.S#,B.C#,B.score from Student A left join SC B on A.S#=B.S# -- 28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况) select A.Sname,D.Cname,D.score from (select B.*,C.Cname from(select * from SC where score>70)B left join Course C on B.C#=C.C#)D left join Student A on D.S#=A.S# -- 29. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数 select * from SC where score<60 -- 30. 查询不及格的课程 select A.S#,B.Sname from (select * from SC where score>80 and C#=01)A left join Student B on A.S#=B.S# --31. 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名 select C#,COUNT(*)学生人数 from SC group by C# --32. 求每门课程的学生人数 select top 1* from SC where C#=(select C# from Course where T#=(select T# from Teacher where Tname='张三')) order by score desc --33. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 select *from(select *,DENSE_RANK()over (order by score desc)A from SC where C#=(select C# from Course where T#=(select T# from Teacher where Tname='张三')))B where B.A=1 --34. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 select C.S#,max(C.C#)C#,max(C.score)score from SC C left join(select S#,avg(score)A from SC group by S#)B on C.S#=B.S# where C.score=B.A group by C.S# having COUNT(0)=(select COUNT(0)from SC where S#=C.S#) --35. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 select * from (select *,ROW_NUMBER()over(partition by C# order by score desc)A from SC)B where B.A<3 --36. 查询每门功成绩最好的前两名 select C#,COUNT(S#)选修人数 from SC group by C# having COUNT(S#)>5 order by 选修人数 desc,C# --37.统计每门课程的学生选修人数(超过5人的课程才统计)。 --要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 select S# from SC group by S# having COUNT(C#)>=2 --38. 检索至少选修两门课程的学生学号 select S# from SC group by S# having count(C#)=(select distinct COUNT(0)a from Course) --39. 查询选修了全部课程的学生信息 select S#,datediff(yy,Sage,GETDATE())年龄 from Student --40. 查询各学生的年龄,只按年份来算 select *,(case when convert(int,'1'+substring(CONVERT(varchar(10),Sage,112),5,8)) <convert(int,'1'+substring(CONVERT(varchar(10),GETDATE(),112/*112是将格式转化为yymmdd*/),5,8)) then datediff(yy,Sage,GETDATE()) else datediff(yy,Sage,GETDATE())-1 end)age from Student --41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一 --方法是把时间转化成 Int 格式来做条件比较大小,判断是否超期, select *,(case when datename(wk,convert(datetime,(convert(varchar(10),year(GETDATE()))+substring(convert(varchar(10),Sage,112),5,8))))=DATENAME(WK,GETDATE()) then 1 else 0 end)生日提醒 from Student --42. 查询本周过生日的学生 --方法:采取将生日转化为当年日期,再转化为本年中的第几个星期进行判断搜出结果 select *,(case when datename(wk,convert(datetime,(convert(varchar(10),year(GETDATE()))+ substring(convert(varchar(10),Sage,112),5,8))))=DATENAME(WK,GETDATE())+1 then 1 else 0 end)生日提醒 from Student --43. 查询下周过生日的学生 select *,(case when month(convert(datetime,(convert(varchar(10),year(GETDATE()))+substring(convert(varchar(10),Sage,112),5,8))))=month(GETDATE()) then 1 else 0 end)生日提醒 from Student --44. 查询本月过生日的学生 select *,(case when month(convert(datetime,(convert(varchar(10),year(GETDATE()))+substring(convert(varchar(10),Sage,112),5,8))))=month(GETDATE())+1 then 1 else 0 end)生日提醒 from Student --45. 查询下月过生日的学生 ————————————————
SQL常见面试题
1.用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
A: select distinct name from table where name not in (select distinct name from table where fenshu<=80)
select name from table group by name having min(fenshu)>80
2. 学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息
A: delete tablename where 自动编号 not in(select min( 自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)
3.一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?
答:select a.name, b.name
from team a, team b
where a.name < b.name
4.请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。
AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。
数据库名:JcyAudit ,数据集:Select * from TestDB
答:select a.*
from TestDB a
,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b
where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur
************************************************************************************
5.面试题:怎么把这样一个表儿
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
答案一、
select year,
(select amount from aaa m where month=1 and m.year=aaa.year) as m1,
(select amount from aaa m where month=2 and m.year=aaa.year) as m2,
(select amount from aaa m where month=3 and m.year=aaa.year) as m3,
(select amount from aaa m where month=4 and m.year=aaa.year) as m4
from aaa group by year
*******************************************************************************
6. 说明:复制表( 只复制结构, 源表名:a新表名:b)
SQL: select * into b from a where 1<>1 (where1=1,拷贝表结构和数据内容)
Oracle:create table b
As
Select * from a where 1=2
比较两个表达式。 当使用此运算符比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE。 否则,结果为 FALSE。]
7. 说明:拷贝表( 拷贝数据, 源表名:a目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from a;
8. 说明:显示文章、提交人和最后回复时间
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
9. 说明:外连接查询( 表名1 :a表名2 :b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUTER JOIN b ON a.a = b.c
ORACLE:select a.a, a.b, a.c, b.c, b.d, b.f from a ,b
where a.a = b.c(+)
10. 说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f 开始时间,getdate())>5
11. 说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
Delete from info where not exists (select * from infobz where info.infid=infobz.infid )
*******************************************************************************
12.有两个表A 和B ,均有key 和value 两个字段,如果B 的key 在A 中也有,就把B 的value 换为A 中对应的value
这道题的SQL 语句怎么写?
update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from b,a where b.key=a.key);
***************************************************************************
13.高级sql 面试题
原表:
courseid coursename score
-------------------------------------
1 Java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
-------------------------------------
为了便于阅读, 查询此表后的结果显式如下( 及格分数为60):
courseid coursename score mark
---------------------------------------------------
1 Java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
---------------------------------------------------
写出此查询语句
select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course
完全正确
SQL> desc course_v
Name Null? Type
----------------------------------------- -------- ----------------------------
COURSEID NUMBER
COURSENAME VARCHAR2(10)
SCORE NUMBER
SQL> select * from course_v;
COURSEID COURSENAME SCORE
---------- ---------- ----------
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
SQL> select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course_v;
COURSEID COURSENAME SCORE MARK
---------- ---------- ---------- ----
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
SQL面试题(1)
create table testtable1
(
id int IDENTITY,
department varchar(12)
)
select * from testtable1
insert into testtable1 values('设计')
insert into testtable1 values('市场')
insert into testtable1 values('售后')
/*
结果
id department
1 设计
2 市场
3 售后
*/
create table testtable2
(
id int IDENTITY,
dptID int,
name varchar(12)
)
insert into testtable2 values(1,'张三')
insert into testtable2 values(1,'李四')
insert into testtable2 values(2,'王五')
insert into testtable2 values(3,'彭六')
insert into testtable2 values(4,'陈七')
/*
用一条SQL语句,怎么显示如下结果
id dptID department name
1 1 设计 张三
2 1 设计 李四
3 2 市场 王五
4 3 售后 彭六
5 4 黑人 陈七
*/
答案:
SELECT testtable2.* , ISNULL(department,'黑人')
FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID
也做出来了可比这方法稍复杂。
sql面试题(2)
有表A,结构如下:
A: p_ID p_Num s_id
1 10 01
1 12 02
2 8 01
3 11 01
3 8 03
其中:p_ID为产品ID,p_Num为产品库存量,s_id为仓库ID。请用SQL语句实现将上表中的数据合并,合并后的数据为:
p_ID s1_id s2_id s3_id
1 10 12 0
2 8 0 0
3 11 0 8
其中:s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。如果该产品在某仓库中无库存量,那么就是0代替。
结果:
select p_id ,
sum(case when s_id=1 then p_num else 0 end) as s1_id
,sum(case when s_id=2 then p_num else 0 end) as s2_id
,sum(case when s_id=3 then p_num else 0 end) as s3_id
from myPro group by p_id
SQL面试题(3)
1.触发器的作用?
答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
2。什么是存储过程?用什么来调用?
答:存储过程是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL ,使用存储过程比单纯SQL 语句执行要快。可以用一个命令对象来调用存储过程。
3。索引的作用?和它的优点缺点是什么?
答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
3。什么是内存泄漏?
答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new 等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free 或者delete 释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。
4。维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
答:我是这样做的,尽可能使用约束,如check, 主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
5。什么是事务?什么是锁?
答:事务就是被绑定在一起作为一个逻辑工作单元的SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID 测试,即原子性,一致性,隔离性和持久性。
锁:在所以的 DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
6。什么叫视图?游标是什么?
答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
7。为管理业务培训信息,建立3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄
C(C#,CN)C#,CN分别代表课程编号,课程名称
SC(S#,C#,G) S#,C#,G分别代表学号,所选的课程编号,学习成绩
(1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?
答案:select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’税收基础’)
(2) 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?
答:select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’
(3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?
答:select sn,sd from s where s# not in(select s# from sc where c#=’c5’)
(4)查询选修了课程的学员人数
答:select 学员人数=count(distinct s#) from sc
(5) 查询选修课程超过5门的学员学号和所属单位?
答:select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)
SQL面试题(4)
1.查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:
select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A
2.查询表A中存在ID重复三次以上的记录,完整的查询语句如下:
select * from(select count(ID) as count from table group by ID)T where T.count>3
SQL面试题(5)
在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题。它们按照从易到难的顺序排列。当你问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下。
你能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗?
你希望听到的答案包括这样一些对象:表格、视图、用户定义的函数,以及存储过程;如果他们还能够提到像触发器这样的对象就更好了。如果应聘者不能回答这个基本的问题,那么这不是一个好兆头。
NULL是什么意思?
NULL(空)这个值是数据库世界里一个非常难缠的东西,所以有不少应聘者会在这个问题上跌跟头您也不要觉得意外。
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。
什么是索引?SQL Server 2000里有什么类型的索引?
任何有经验的数据库开发人员都应该能够很轻易地回答这个问题。一些经验不太多的开发人员能够回答这个问题,但是有些地方会说不清楚。
简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。这个行标识符是一个指向磁盘上数据的指针。它允许每个表格有多个非聚集索引。
什么是主键?什么是外键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。
什么是触发器?SQL Server 2000有什么不同类型的触发器?
让未来的数据库开发人员知道可用的触发器类型以及如何实现它们是非常有益的。
触发器是一种专用类型的存储过程,它被捆绑到SQL Server 2000的表格或者视图上。在SQL Server 2000里,有INSTEAD-OF和AFTER两种触发器。INSTEAD-OF触发器是替代数据操控语言(Data Manipulation Language,DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。
AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
这个与关系相关的问题有两个可能的答案。第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。
对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
你正在寻找进行与数据操控有关的应聘人员。对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
你可以用什么来确保表格里的字段只接受特定范围里的值?
这个问题可以用多种方式来回答,但是只有一个答案是“好”答案。您希望听到的回答是Check限制,它在数据库表格里被定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。
如果应聘者能够正确地回答这个问题,那么他的机会就非常大了,因为这表明他们具有使用存储过程的经验。
返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。
什么是相关子查询?如何使用这些查询?
经验更加丰富的开发人员将能够准确地描述这种类型的查询。
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。
SQL面试题(6)
原表:
courseid coursename score
-------------------------------------
1 java 70
2 oracle 90
3 xml 40
4 jsp 30
5 servlet 80
-------------------------------------
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseid coursename score mark
---------------------------------------------------
1 java 70 pass
2 oracle 90 pass
3 xml 40 fail
4 jsp 30 fail
5 servlet 80 pass
---------------------------------------------------
写出此查询语句
ORACLE : select courseid, coursename ,score ,decode(sign(score-60),-1,'fail','pass') as mark from course
(DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数)
(SQL: select courseid, coursename ,score ,(case when score<60 then 'fail' else 'pass' end) as mark from course )

浙公网安备 33010602011771号