mysql查詢語句面試題二

先給出SQL語句正確的執行順序:

from *tables*

where *predicae1*

group by *columns*

having *predicae1*

select *columns*

order by *columns*

limit *start*, *offset*;

三個表

  • 學生表student(id,name)
  • 課程表course(id,name)
  • 學生課程表student_course(sid,cid,score)

 

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '語文');
INSERT INTO `course` VALUES ('2', '數學');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '張三');
INSERT INTO `student` VALUES ('2', '李四');
INSERT INTO `student` VALUES ('3', '王五');
INSERT INTO `student` VALUES ('4', '李六');
INSERT INTO `student` VALUES ('6', '李六');
INSERT INTO `student` VALUES ('7', '張三');

-- ----------------------------
-- Table structure for student_course
-- ----------------------------
DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
  `sid` int(10) unsigned NOT NULL,
  `cid` int(10) unsigned NOT NULL,
  `score` int(10) unsigned NOT NULL,
  PRIMARY KEY (`sid`,`cid`),
  KEY `cid` (`cid`),
  CONSTRAINT `student_course_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `student` (`id`),
  CONSTRAINT `student_course_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `course` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of student_course
-- ----------------------------
INSERT INTO `student_course` VALUES ('1', '1', '80');
INSERT INTO `student_course` VALUES ('1', '2', '92');
INSERT INTO `student_course` VALUES ('2', '1', '90');
INSERT INTO `student_course` VALUES ('2', '2', '70');
INSERT INTO `student_course` VALUES ('3', '1', '90');
INSERT INTO `student_course` VALUES ('3', '2', '65');
INSERT INTO `student_course` VALUES ('4', '1', '95');
INSERT INTO `student_course` VALUES ('4', '2', '92');

 

 

查詢題:

#1、查詢student表中重名的學生,結果包含id和name,按name,id升序
SELECT id,name FROM student WHERE `name` in 
(SELECT name FROM student GROUP BY name HAVING(COUNT(*) > 1) ) 
ORDER BY `name`;

我們經常需要查詢某一列重複的行,一般通過group by(有重複的列)然後取count>1的值。

#2、在student_course表中查詢平均分>79的學生,列出學生id和平均分
SELECT sid,avg(score) avg_sc FROM student_course GROUP BY sid HAVING avg_sc > 79 ;

where子句中不能用聚集函數作爲條件表達式,但是having短語可以,where和having的區別在於對用對象不同,where作用於記錄,having作用於組。

#3、在student_course表中查詢每門課成績都不低於80的學生id
SELECT DISTINCT sid FROM student_course WHERE sid not in(
SELECT sid FROM student_course WHERE score < 80
);

#4、查詢每個學生的總成績,結果列出學生id,姓名和總成績 
SELECT s.id, s.name,sum(sc.score) FROM student s LEFT JOIN student_course sc 
on s.id = sc.sid GROUP BY s.id;

#5、總成績最高的學生,結果列出學生id和總成績
SELECT sid,SUM(score) sum_sc FROM student_course GROUP BY sid ORDER BY  sum_sc desc LIMIT 1;

#6、在student_course表查詢課程id爲1成績第2高的學生,如果第2高的不止一個則列出所有的學生
SELECT * FROM student_course WHERE score = (
SELECT score FROM student_course WHERE cid = 1 GROUP BY score  ORDER BY score DESC LIMIT 1,1
);

查詢第N大數的問題,先查詢出第二高的分數,然後再查第二高分數的學生

#7、在student_course表查詢各科成績最高的學生,結果列出學生id、課程id和對應的成績
SELECT * FROM student_course x WHERE score >= (
SELECT MAX(score) FROM student_course y WHERE x.cid = y.cid
) ORDER BY cid;

有人可能會這樣寫 select sid,cid,max(score) from student_course group by cid;  
然而上面是不對的,因爲 使用了group by的查詢字段只能是group by中的字段或者聚集函數或者是每個分組內均相同的字段。 雖然不會報錯,但是sid是無效的,如果去掉sid的話只能查出每門課程的最高分,不包含學生id。

#8、在student_course表中查詢每門課的前2名,結果按課程id升序,同一課程按成績降序 
SELECT * FROM student_course x WHERE 2>(
SELECT COUNT(*) FROM student_course y 
WHERE y.cid = x.cid AND
y.score > x.score
);


取每組的前N條紀錄,相關嵌套查詢,對於每一個分數,如果同一門課程下只有0個、1個分數比這個分數還高,那麼這個分數肯定是前2名之一

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章