神奇的 SQL 之子查询,细节满满 !
前言
开心一刻
有一天,麻雀遇见一只乌鸦。
麻雀问:你是啥子鸟哟 ?
乌鸦说:我是凤凰。
麻雀说:哪有你龟儿子这么黢黑的凤凰 ?
乌鸦说:你懂个铲铲,老子是烧锅炉的凤凰。
子查询
讲子查询之前,我们先来看看视图,何谓视图 ? 视图是基于 SQL 语句的结果集的可视化的表,包含行和列,就像一个真实的表,但只是一张虚拟表,我们可以将其视作为一张普通的表;视图只供数据查询,不能进行数据更改,也不能保存数据,查询数据来源于我们的实体表;说的简单点,视图就是复杂 SELECT 语句的一个代号,为查询提供便利。视图总是显示最近的数据,每当我们查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
那何谓子查询,它与视图又有何关系 ? 视图是持久化的 SELECT 语句,而子查询就是将定义视图的 SELECT 语句直接用于 FROM 子句当中,它是个一次性的视图,在 SELECT 语句执行完之后就会消失。光说概念,可能还是不太好理解,我们来看下视图与子查询的具体示例,通过示例我们就能更好的理解了
假设我们有如下表
CREATE TABLE t_customer_credit ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', login_name VARCHAR(50) NOT NULL COMMENT '登录名', credit_type TINYINT(1) NOT NULL COMMENT '额度类型,1:自由资金,2:冻结资金,3:优惠', amount DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '额度值', create_by VARCHAR(50) NOT NULL COMMENT '创建者', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', update_by VARCHAR(50) NOT NULL COMMENT '修改者', PRIMARY KEY (id) ); INSERT INTO `t_customer_credit` VALUES (1, 'zhangsan', 1, 550.000000, 'system', '2019-7-7 11:30:09', '2019-7-8 20:21:05', 'system'); INSERT INTO `t_customer_credit` VALUES (2, 'zhangsan', 2, 0.000000, 'system', '2019-7-7 11:30:09', '2019-7-7 11:30:09', 'system'); INSERT INTO `t_customer_credit` VALUES (3, 'zhangsan', 3, 0.000000, 'system', '2019-7-7 11:30:09', '2019-7-7 11:30:09', 'system'); INSERT INTO `t_customer_credit` VALUES (4, 'lisi', 1, 0.000000, 'system', '2019-7-7 11:30:09', '2019-7-7 11:30:09', 'system'); INSERT INTO `t_customer_credit` VALUES (5, 'lisi', 2, 0.000000, 'system', '2019-7-7 11:30:09', '2019-7-7 11:30:09', 'system'); INSERT INTO `t_customer_credit` VALUES (6, 'lisi', 3, 0.000000, 'system', '2019-7-7 11:30:09', '2019-7-7 11:30:09', 'system');
以及如下 3 个视图
-- 自由资金 DROP VIEW IF EXISTS view_free; CREATE VIEW view_free(login_name, freeAmount) AS SELECT login_name, amount FROM t_customer_credit WHERE credit_type = 1; -- 冻结资金 DROP VIEW IF EXISTS view_freeze; CREATE VIEW view_freeze(login_name, freezeAmount) AS SELECT login_name, amount FROM t_customer_credit WHERE credit_type = 2; -- 优惠 DROP VIEW IF EXISTS view_promotion; CREATE VIEW view_promotion(login_name, promotionAmount) AS SELECT login_name, amount FROM t_customer_credit WHERE credit_type = 3;