博客
关于我
进阶课程Ⅰ复杂的查询
阅读量: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 基础模块的面试题总结
查看>>
MySQL 备份 Xtrabackup
查看>>
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>