朋友的朋友的SQL笔试题
题:以下是年,月份和数量的表格(sales),根据该表格完成以下问题
数据一下解题都是基于MySQL来做的
1.在数据库中创建sales表并完成数据初始化,写出sql脚本
上图已经给出创建后的数据截图,下面给出脚本内容
CREATE TABLE `sales` (
`year` int(11) DEFAULT NULL,
`month` int(11) DEFAULT NULL,
`amount` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ------------------------------ Records of sales-- ----------------------------
INSERT INTO `sales` VALUES ('2015', '1', '1.1');
INSERT INTO `sales` VALUES ('2015', '2', '1.2');
INSERT INTO `sales` VALUES ('2015', '3', '1.3');
INSERT INTO `sales` VALUES ('2015', '4', '1.4');
INSERT INTO `sales` VALUES ('2016', '1', '2.1');
INSERT INTO `sales` VALUES ('2016', '2', '2.2');
INSERT INTO `sales` VALUES ('2016', '3', '2.3');
INSERT INTO `sales` VALUES ('2016', '4', '2.4');
2.介绍存储过程的优点,并写出一个存储过程查询2015年的数据
1.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
4.更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。
http://blog.csdn.net/jackmacro/article/details/5688687 可以看更多介绍
创建存储过程sp_sales
CREATE PROCEDURE sp_sales()
BEGIN
SELECT * FROM sales s WHERE s.`year`=2015;
END
调用存储过程sp_sales
CALL sp_sales
3.根据上面的表格,在数据库控制台打印以下结果,并给出相应的SQL脚本
cmd窗口查询结果+------+------+------+------+------+
| year | 1 | 2 | 3 | 4 |
+------+------+------+------+------+
| 2015 | 1.1 | 1.2 | 1.3 | 1.4 |
| 2016 | 2.1 | 2.2 | 2.3 | 2.4 |
+------+------+------+------+------+
根据数据和图,基本可以判断是行转列查询。
SELECT s.`year`,
MAX(CASE s.`month` WHEN '1' THEN s.amount ELSE 0 END) '1',
MAX(CASE s.`month` WHEN '2' THEN s.amount ELSE 0 END) '2',
MAX(CASE s.`month` WHEN '3' THEN s.amount ELSE 0 END) '3',
MAX(CASE s.`month` WHEN '4' THEN s.amount ELSE 0 END) '4' FROM sales s GROUP BY s.`year`