最新消息:

常见SQL面试题

SQL 老鹰 518浏览 0评论

SQL面试题:

1.一条SQL 语句 查询出每门课都大于80 分的学生姓名

DROP TABLE IF EXISTS `scores`;
CREATE TABLE `scores` (
`name` varchar(255) DEFAULT NULL,
`course` varchar(255) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
KEY `score_inx` (`score`),
KEY `name_inx` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

— —————————-
— Records of scores
— —————————-
INSERT INTO `scores` VALUES (‘张三’, ‘数学’, ’75’);
INSERT INTO `scores` VALUES (‘张三’, ‘语文’, ’81’);
INSERT INTO `scores` VALUES (‘李四’, ‘数学’, ’90’);
INSERT INTO `scores` VALUES (‘李四’, ‘语文’, ’76’);
INSERT INTO `scores` VALUES (‘王五’, ‘数学’, ‘100’);
INSERT INTO `scores` VALUES (‘王五’, ‘语文’, ’81’);
INSERT INTO `scores` VALUES (‘王五’, ‘英语’, ’90’);

方案一:

select distinct name from table where name not in (select distinct name from table where fenshu<=80)

Query Execution Plan如下:

explain_1

 

方案二:

select name from table group by name having min(fenshu)>80

explain_2

 

 

 

索引如下:

scores_indexes

问题二:

学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息

解答:

mysql> show create table students_scores\G
*************************** 1. row ***************************
Table: students_scores
Create Table: CREATE TABLE `students_scores` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`num` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`course_num` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`course_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`course_score` int(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)

INSERT INTO `nlx`.`students_scores` (`id`, `num`, `name`, `course_num`, `course_name`, `course_score`) VALUES (‘1′, ‘2005001’, ‘张三’, ’01’, ‘数学’, ’69’);
INSERT INTO `nlx`.`students_scores` (`id`, `num`, `name`, `course_num`, `course_name`, `course_score`) VALUES (‘2′, ‘2005002’, ‘李四’, ’01’, ‘数学’, ’89’);
INSERT INTO `nlx`.`students_scores` (`id`, `num`, `name`, `course_num`, `course_name`, `course_score`) VALUES (‘3′, ‘2005001’, ‘张三’, ’01’, ‘数学’, ’69’);
INSERT INTO `nlx`.`students_scores` (`id`, `num`, `name`, `course_num`, `course_name`, `course_score`) VALUES (‘4′, ‘2005003’, ‘王五’, ’01’, ‘数学’, ’69’);
INSERT INTO `nlx`.`students_scores` (`id`, `num`, `name`, `course_num`, `course_name`, `course_score`) VALUES (‘5′, ‘2005003’, ‘王五’, ’02’, ‘语文’, ’80’);

 

mysql> EXPLAIN SELECT DISTINCT name from scores GROUP BY name HAVING min(score) > 80\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: scores
type: index
possible_keys: name_inx
key: name_inx
key_len: 768
ref: NULL
rows: 7
Extra: NULL
1 row in set (0.00 sec)

 

问题三:

一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.

mysql> SELECT a.name as groupA , b.name as groupB from test_teams a, test_teams b WHERE a.name > b.name;
+——–+——–+
| groupA | groupB |
+——–+——–+
| b | a |
| c | a |
| d | a |
| c | b |
| d | b |
| d | c |
+——–+——–+
6 rows in set (0.00 sec)

转载请注明:冯英胜的博客 » 常见SQL面试题

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址