博客
关于我
进阶课程Ⅰ复杂的查询
阅读量:151 次
发布时间:2019-02-28

本文共 3874 字,大约阅读时间需要 12 分钟。

今天学习资料的内容比较多,我准备拆成两节分两天学习

资料来自:

1.1 什么是视图(what)

这章比较有意思的是提出‘视图'的概念 

你以为你select的是一个表但其实你操作的是一个视图。怎么理解呢?

举个栗子 

表一:姓名  表二:年龄

我们select两表建立连接出来的 姓名+年龄表 实际上就是视图,而在数据库中的表实际上还是表一和表二

创建之后我们可以直接在这个视图(虚拟表)上做操作

2.1 为什么会有视图(why)

提高效率,可视清晰,不对外公开全部字段保密性强、降低数据的冗余

3.1 创建视图(how)

语法:CREATE VIEW <视图名称>(<列名1>,<列名2>,...) AS <SELECT语句>

注意除mysql之外视图中不能实用ORDER BY

大家应该装好mysql了,首先先把product表建了语句直接复制:

CREATE TABLE product(product_id CHAR(4) NOT NULL, product_name VARCHAR(100) NOT NULL, product_type VARCHAR(32) NOT NULL, sale_price INTEGER , purchase_price INTEGER , regist_date DATE , PRIMARY KEY (product_id));

插入数据:

INSERT INTO product VALUES('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');INSERT INTO product VALUES('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');INSERT INTO product VALUES('0003', '运动T恤', '衣服', 4000, 2800, NULL);INSERT INTO product VALUES('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');INSERT INTO product VALUES('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');INSERT INTO product VALUES('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');INSERT INTO product VALUES('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');INSERT INTO product VALUES('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');COMMIT;

首先感受一下我们的表长这样,不然自己YY真的很痛苦

我们来创建一个单表视图:各品类有多少行

创建之后视图就会出现再views这边

再select一下出来看看

wow! 完美!所以大家最好是边试边学这个就和好记性不如烂笔头一个道理

跟着材料一起再创建一张表 shop_product

CREATE TABLE shop_product(shop_id    CHAR(4)       NOT NULL, shop_name  VARCHAR(200)  NOT NULL, product_id CHAR(4)       NOT NULL, quantity   INTEGER       NOT NULL, PRIMARY KEY (shop_id, product_id));INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000A',	'东京',		'0001',	30);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000A',	'东京',		'0002',	50);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000A',	'东京',		'0003',	15);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0002',	30);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0003',	120);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0004',	20);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0006',	10);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000B',	'名古屋',	'0007',	40);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0003',	20);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0004',	50);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0006',	90);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000C',	'大阪',		'0007',	70);INSERT INTO shop_product (shop_id, shop_name, product_id, quantity) VALUES ('000D',	'福冈',		'0001',	100);

我们需要把product表和shop_product表进行连接需要的表列:品类、售价、售卖地

连接好之后再把创建码往前贴一下

反正记是不可能记住,用的时间长了才行,真用起来想不到就百读呗,所以我感觉还是需要一个整理的文档把语句都放在一起的,待会儿学完这章我就去学习材料里扒拉扒拉

也不知道为什么自己创建的视图怎么看怎么可可爱爱 都给我来看看!!!

然后就可以在这个视图上创建查询了

3.2 修改视图

我们要对product_count 表下手了

把计数列变成售价

语法:ALTER VIEW 标名 AS select......

是不是有点简单  一学就会

3.3 更新视图

更新视图之后原表里的数据也会被更新,因为视图依赖底表嘛

案例:把办公用品的售价改为5000元,UPDATE productsum SET sale_price = '5000' WHERE product_type = '办公用品';

原表、视图都能被更新,但是并不推荐这种使用方式。而且我们在创建视图时也尽量使用限制不允许通过视图来修改表

3.4 删除视图

DROP VIEW productSum; 其实右键也可以删除

3.5 子查询

我真的很讨厌这种一层套一层俄罗斯套娃似的子查询,可是没有困难的工作只有勇敢的打工人。我可以的

SELECT product_type, cnt_productFROM (SELECT *        FROM (SELECT product_type,                      COUNT(*) AS cnt_product                FROM product                GROUP BY product_type) AS productsum       WHERE cnt_product = 4) AS productsum2;

来一段风中凌乱的子查询,看到这种先看最里面的括号里写的什么。还是拆出来结合实际比较容易理解,不要自己默默yy

括起来给他命个名 productsum

再加个select能看懂了

再括起来命名

3.6标量子查询

举个栗子

查询出销售单价高于平均销售单价的商品。这里把子语句当作了一个条件

查找品类、售价和平均单价,这边就把子语句当成了一个列

好了,先到这里结束我要去开周会了,剩下的课程明天再学。

转载地址:http://xaxd.baihongyu.com/

你可能感兴趣的文章
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>
MySQL 的存储引擎有哪些?为什么常用InnoDB?
查看>>
Mysql 知识回顾总结-索引
查看>>
Mysql 笔记
查看>>
MySQL 精选 60 道面试题(含答案)
查看>>
mysql 索引
查看>>
MySQL 索引失效的 15 种场景!
查看>>
MySQL 索引深入解析及优化策略
查看>>
MySQL 索引的面试题总结
查看>>
mysql 索引类型以及创建
查看>>