mysql笔试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面试笔试常考的mysql 数据库操作group by
分类:数据库2014-08-06 16:38 773人阅读评论(0) 收藏举报面试数据库mysql
IT 面试中,数据库的相关问题基本上属于必考问题,而其中关于sql 语句也是经常考察的一个重要知识点。
下面介绍下sql语句中一个比较重要的操作group by,他的重要行一方面体现在他的理解困难度,一方面体现应用中的长见性。
首先,给出一个studnet学生表:
[sql]view plaincopyprint?
1.CREATE TABLE `student` (
2. `id` int(11) NOT NULL AUTO_INCREMENT,
3. `name` varchar(30) DEFAULT NULL,
4. `sex` tinyint(1) DEFAULT'0',
5. `score` int(10) NOT NULL,
6. `dept` varchar(10) DEFAULT NULL,
7.PRIMARY KEY (`id`)
8.) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
添加一些测试数据:
[sql]view plaincopyprint?
1.mysql> select * from student where id<10;
2.+----+------+------+-------+---------+
3.| id | name | sex | score | dept |
4.+----+------+------+-------+---------+
5.| 1 | a | 1 | 90 | dev |
6.| 2 | b | 1 | 90 | dev |
7.| 3 | b | 0 | 88 | design |
8.| 4 | c | 0 | 60 | sales |
9.| 5 | c | 0 | 89 | sales |
10.| 6 | d | 1 | 100 | product |
11.+----+------+------+-------+---------+
给出需求,写出sql:
给出各个部门最高学生的分数。
要想得到各个部门学生,首先就要分组,按照部门把他们分组,然后在各个部门中找到分数最高的就可以了。
所以sql语句为:
[sql]view plaincopyprint?
1.mysql> select *, max(score) as max from student group by dept order by name
;
2.+----+------+------+-------+---------+------+
3.| id | name | sex | score | dept | max |
4.+----+------+------+-------+---------+------+
5.| 1 | a | 1 | 90 | dev | 90 |
6.| 3 | b | 0 | 88 | design | 88 |
7.| 4 | c | 0 | 60 | sales | 89 |
8.| 6 | d | 1 | 100 | product | 100 |
9.+----+------+------+-------+---------+------+
10. 4 rows in set (0.00 sec)
这只是个简单的例子,我们可以再把这个例子复杂化,比如分数最高的必须是女生,即sex列值必须为1才挑选出,这时的sql语句应该为:
[sql]view plaincopyprint?
1.mysql> select *,max(score) as max from student group by dept having sex='1'
order by name;
2.+----+------+------+-------+---------+------+
3.| id | name | sex | score | dept | max |
4.+----+------+------+-------+---------+------+
5.| 1 | a | 1 | 90 | dev | 90 |
6.| 6 | d | 1 | 100 | product | 100 |
7.+----+------+------+-------+---------+------+
8. 2 rows in set (0.46 sec)
这里我们没有用where语句而是用了having,这里简单说明一下,因为我们的条件是在分组后进行的,其实分组前挑选出sex='1',然后再按照dept部门分组,也是可行的,这里就要看题目是怎么要求的:
[sql]view plaincopyprint?
1.mysql> select *,max(score) as max from student where sex='1'group by dept o
rder by name;
2.+----+------+------+-------+---------+------+
3.| id | name | sex | score | dept | max |
4.+----+------+------+-------+---------+------+
5.| 1 | a | 1 | 90 | dev | 90 |
6.| 6 | d | 1 | 100 | product | 100 |
7.+----+------+------+-------+---------+------+
8. 2 rows in set (0.05 sec)
查询出的结果时一致的,如果把选择条件改为必须部门所有人的分数之和大于150才能把分数最高的部门的人列出来,这里就必须使用