面試筆試常考的MySQL資料庫操作group by
IT 面試中,資料庫的相關問題基本上屬於必考問題,而其中關於sql語句也是經常考察的一個重要知識點。
下面介紹下sql語句中一個比較重要的操作group by,他的重要行一方面體現在他的理解困難度,一方面體現應用中的長見性。
--------------------------------------分割線 --------------------------------------
Ubuntu 14.04下安裝MySQL
《MySQL權威指南(原書第2版)》清晰中文掃描版 PDF
Ubuntu 14.04 LTS 安裝 LNMP Nginx\PHP5 (PHP-FPM)\MySQL
Ubuntu 14.04下搭建MySQL主從伺服器
Ubuntu 12.04 LTS 構建高可用分布式 MySQL 叢集
Ubuntu 12.04下原始碼安裝MySQL5.6以及Python-MySQLdb
MySQL-5.5.38通用二進位安裝
--------------------------------------分割線 --------------------------------------
首先,給出一個studnet學生表:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`sex` tinyint(1) DEFAULT '0',
`score` int(10) NOT NULL,
`dept` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
添加一些測試資料:
mysql> select * from student where id<10;
+----+------+------+-------+---------+
| id | name | sex | score | dept |
+----+------+------+-------+---------+
| 1 | a | 1 | 90 | dev |
| 2 | b | 1 | 90 | dev |
| 3 | b | 0 | 88 | design |
| 4 | c | 0 | 60 | sales |
| 5 | c | 0 | 89 | sales |
| 6 | d | 1 | 100 | product |
+----+------+------+-------+---------+
給出需求,寫出sql:
給出各個部門最高學生的分數。
要想得到各個部門學生,首先就要分組,按照部門把他們分組,然後在各個部門中找到分數最高的就可以了。
所以sql語句為:
mysql> select *, max(score) as max from student group by dept order by name;
+----+------+------+-------+---------+------+
| id | name | sex | score | dept | max |
+----+------+------+-------+---------+------+
| 1 | a | 1 | 90 | dev | 90 |
| 3 | b | 0 | 88 | design | 88 |
| 4 | c | 0 | 60 | sales | 89 |
| 6 | d | 1 | 100 | product | 100 |
+----+------+------+-------+---------+------+
4 rows in set (0.00 sec)
這隻是個簡單的例子,我們可以再把這個例子複雜化,比如分數最高的必須是女生,即sex列值必須為1才挑選出,這時的sql語句應該為:
mysql> select *,max(score) as max from student group by dept having sex='1' order by name;
+----+------+------+-------+---------+------+
| id | name | sex | score | dept | max |
+----+------+------+-------+---------+------+
| 1 | a | 1 | 90 | dev | 90 |
| 6 | d | 1 | 100 | product | 100 |
+----+------+------+-------+---------+------+
2 rows in set (0.46 sec)
這裡我們沒有用where語句而是用了having,這裡簡單說明一下,因為我們的條件是在分組後進行的,其實分組前挑選出sex='1',然後再按照dept部門分組,也是可行的,這裡就要看題目是怎麼要求的:
mysql> select *,max(score) as max from student where sex='1' group by dept order by name;
+----+------+------+-------+---------+------+
| id | name | sex | score | dept | max |
+----+------+------+-------+---------+------+
| 1 | a | 1 | 90 | dev | 90 |
| 6 | d | 1 | 100 | product | 100 |
+----+------+------+-------+---------+------+
2 rows in set (0.05 sec)
更多詳情見請繼續閱讀下一頁的精彩內容: