太久没有在数据库做一些复杂的sql了,基本上将数据库的查询逻辑全放在了Java里做,
一来呢,可以减轻数据库的负担,二来呢,在java写,逻辑感会更强,数据类型更丰富也容易操作。
然而。。。面试却喜欢靠复杂的sql ,好吧,即便我不想,但复习一波还是免不了的。
常用的关系型数据库有 MySQL和Oracle 。Oracle 比较喜欢使用存储过程做业务 ,当然,MySQL也可以,但是没怎么用,
自从工程使用mybatis框架,就不再使用存储过程了,业务基本是增删改查,查询数据的逻辑都是从数据库取相应数据出来后用Java计算,
再从数据库获取最终想要的数据,本来是本着减轻数据库负担才这样做的,并发操作会用上积极锁【乐观锁】,因此也就不需要担心 脏数据问题。
MySQL和Oracle的语法部分是不同的,有时候用着MySQL,写着写着就用上了Oracle的语法,还一脸懵逼的查了半天到底哪里错,不常使用的东西就是容易忘。
总结: (1)Oracle 使用nvl() 函数,MySQL使用 ifnull() 函数 来对数据进行判断是否为空, 如果是空则使用替代的数据 ,参数一样 ,如if(x.age,0),意思是如果年龄字段为空则 输出 0 . (2)sum()函数是运算函数,允许 加减乘除计算 ,如果要使用,则必须使用 group by 分组 ,限定好分组 sum获取的计算数据才不会错,否则将会导致全表计算在一起。 (3)avg()函数是计算平均数的,用法根据需要与 group by 分组配合使用, 如果是计算全表某字段的平均分,则不要使用。
(4)having 关键字可以筛选分组后的各组数据,也就是说可对分组完成后的数据做逻辑条件判断 ,与where类似,但是where无法这样使用,因为where关键字无法与聚合函数一起使用
2.复习题
数据库源码
/* Navicat MySQL Data Transfer Source Server : cen Source Server Version : 50528 Source Host : localhost:3306 Source Database : kktest Target Server Type : MYSQL Target Server Version : 50528 File Encoding : 65001 Date: 2020-06-17 08:21:15 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for bjb -- ---------------------------- DROP TABLE IF EXISTS `bjb`; CREATE TABLE `bjb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of bjb -- ---------------------------- INSERT INTO `bjb` VALUES ('1', '一班'); INSERT INTO `bjb` VALUES ('2', '2班'); INSERT INTO `bjb` VALUES ('3', '3班'); -- ---------------------------- -- Table structure for cjb -- ---------------------------- DROP TABLE IF EXISTS `cjb`; CREATE TABLE `cjb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_sx` int(11) DEFAULT NULL, `yw` int(11) DEFAULT NULL, `sx` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of cjb -- ---------------------------- INSERT INTO `cjb` VALUES ('1', '1', '77', '67'); INSERT INTO `cjb` VALUES ('2', '2', '32', '27'); INSERT INTO `cjb` VALUES ('3', '3', '98', '78'); INSERT INTO `cjb` VALUES ('4', '4', '68', '63'); INSERT INTO `cjb` VALUES ('5', '5', '66', '77'); INSERT INTO `cjb` VALUES ('6', '6', '99', '88'); INSERT INTO `cjb` VALUES ('7', '7', '75', '45'); INSERT INTO `cjb` VALUES ('8', '8', '77', '88'); INSERT INTO `cjb` VALUES ('9', '9', '65', '81'); INSERT INTO `cjb` VALUES ('10', '10', '83', '89'); -- ---------------------------- -- Table structure for xsb -- ---------------------------- DROP TABLE IF EXISTS `xsb`; CREATE TABLE `xsb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `id_banji` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of xsb -- ---------------------------- INSERT INTO `xsb` VALUES ('1', '岑', '1'); INSERT INTO `xsb` VALUES ('2', 'cen', '1'); INSERT INTO `xsb` VALUES ('3', 'y', '2'); INSERT INTO `xsb` VALUES ('4', 'u', '3'); INSERT INTO `xsb` VALUES ('5', 'yue', '2'); INSERT INTO `xsb` VALUES ('6', 'kk', '2'); INSERT INTO `xsb` VALUES ('7', 'tom', '1'); INSERT INTO `xsb` VALUES ('8', 'lili', '1'); INSERT INTO `xsb` VALUES ('9', 'kile', '3'); INSERT INTO `xsb` VALUES ('10', 'jack', '2'); INSERT INTO `xsb` VALUES ('11', 'hh', '2'); -- ---------------------------- -- Procedure structure for sp_add3 -- ---------------------------- DROP PROCEDURE IF EXISTS `sp_add3`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_add3`(a int, b int,out c int) begin set c=a+ b; end ;; DELIMITER ;