最近去面試,做了一道經典的mysql試題,分享一下。
將測試數據表導入數據庫,其中name字段代表“姓名”,score字段代表“分數”。
1創建表結構和添加基礎測試數據
create table `tb_score` (
`id` double ,
`name` varchar (300),
`score` double
);
insert into `tb_score` (`id`, `name`, `score`) values('1','n1','59');
insert into `tb_score` (`id`, `name`, `score`) values('2','n2','66');
insert into `tb_score` (`id`, `name`, `score`) values('3','n3','78');
insert into `tb_score` (`id`, `name`, `score`) values('4','n1','48');
insert into `tb_score` (`id`, `name`, `score`) values('5','n3','85');
insert into `tb_score` (`id`, `name`, `score`) values('6','n5','51');
insert into `tb_score` (`id`, `name`, `score`) values('7','n4','98');
insert into `tb_score` (`id`, `name`, `score`) values('8','n5','53');
insert into `tb_score` (`id`, `name`, `score`) values('9','n2','67');
insert into `tb_score` (`id`, `name`, `score`) values('10','n4','88');
1.1 單分數最高的人和單分數最低的人
SELECT NAME,MAX(score),MIN(score) FROM tb_score;
1.2 兩門分數加起來的第2至5名
SELECT NAME,SUM(score) FROM tb_score GROUP BY NAME ORDER BY SUM(score) DESC LIMIT 1,4
1.3 兩門總分數在150分以下的人。
SELECT NAME,SUM(score) FROM tb_score GROUP BY NAME HAVING SUM(score)<150
1.4 兩門平均分數介於60和80的人。
SELECT NAME,AVG(score) FROM tb_score GROUP BY NAME HAVING AVG(score) BETWEEN 60 AND 80;
SELECT NAME,AVG(score) FROM tb_score GROUP BY NAME HAVING AVG(score)>60 AND AVG(score)<80;
1.5 總分大於150分,平均分小於90分的人數。
SELECT NAME,SUM(score),AVG(score) FROM tb_score GROUP BY NAME HAVING SUM(score)>150 AND AVG(score)<90
1.6 總分大於150分,平均分小於90分的人數有幾個。
SELECT COUNT(DISTINCT NAME) FROM tb_score GROUP BY NAME HAVING SUM(score)>150 AND AVG(score)<90
2.創建表結構
create table `t_employ` (
`id` int (11),
`work_no` int (255),
`name` varchar (165),
`department` varchar (165),
`type` varchar (60),
`gz` double
);
INSERT INTO `t_employ` VALUES ('1', '1', '張三', '教學部', '老師', '1100');
INSERT INTO `t_employ` VALUES ('2', '2', '張二', '手工部', '鉗工', '1000');
INSERT INTO `t_employ` VALUES ('3', '3', '張三', '教學部', '鉗工', '1700');
INSERT INTO `t_employ` VALUES ('4', '4', '張四', '手工部', '鉗工', '6000');
INSERT INTO `t_employ` VALUES ('5', '5', '張五', '體育部', '游泳', '1400');
INSERT INTO `t_employ` VALUES ('6', '6', '張六', '手工部', '木工', '1200');
INSERT INTO `t_employ` VALUES ('7', '7', '張七', '教學部', '老師', '1300');
INSERT INTO `t_employ` VALUES ('8', '8', '張八', '手工部', '木工', '2500');
INSERT INTO `t_employ` VALUES ('9', '9', '張九', '體育部', '棒球', '3000');
INSERT INTO `t_employ` VALUES ('10', '10', '十弟', '手工部', '鉗工', '2500');
2.1 四種查詢練習
-- 1請用一個SQL語句查詢每個部門的總人數
SELECT department,COUNT(id) FROM t_employ GROUP BY department
-- 2請用一個SQL語句查詢出不同部門的擔任“鉗工”的職工平均工資
SELECT department,AVG(gz) FROM t_employ WHERE TYPE='鉗工' GROUP BY department
-- 3請用一個SQL語句查詢出不同部門的擔任“鉗工”的職工平均工資高於2000的部門
SELECT department,AVG(gz) FROM t_employ WHERE TYPE='鉗工' GROUP BY department HAVING AVG(gz)>2000
-- 4請用一個SQL語句查詢每個部門低於平均工資的員工信息【內連接 on and 和 內連接 on where的使用】
SELECT e.department, e.gz ,e.name FROM t_employ e INNER JOIN
(SELECT department ,AVG(gz) AS avgGz FROM t_employ GROUP BY department) t
ON e.department =t.department WHERE e.gz < t.avgGz
第一個sql
第二個sql
第三個sql
第四個sql
SELECT department ,AVG(gz) AS avgGz FROM t_employ GROUP BY department
SELECT e.department, e.gz ,e.name FROM t_employ e INNER JOIN
(SELECT department ,AVG(gz) AS avgGz FROM t_employ GROUP BY department) t
ON e.department =t.department WHERE e.gz < t.avgGz