博客
关于我
进阶课程Ⅰ复杂的查询
阅读量: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 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>