MySQL视图介绍

一. 视图概述
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。

  视图:查看图形或文档的方式。

  视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。

  所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。

  视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。

  当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

  视图有很多优点,主要表现在:
  •视点集中
  •简化操作
  •定制数据
  •合并分割数据
  •安全性
当然视图也存在一些缺点,最大的缺点就是视图带来的更新负担,比如源数据改了,那么视图中要做相应更新,视图中数据改了源数据也要做同步,这和MySQL的Cache差不多。

二. 创建视图——CREATE VIEW

1. 语法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]通过该语句可以创建视图,若给定了[OR REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。

表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

2. 使用举例

Eg. 本例创建一个产品表(product)和一个购买记录表(purchase),再通过视图purchase_detail查询出购买的详细信息。

CREATE TABLE product

(

product_id INT NOT NULL,

name VARCHAR(50) NOT NULL,

price DOUBLE NOT NULL

);

INSERT INTO product VALUES(1, ‘apple ‘, 5.5);

CREATE TABLE purchase

(

id INT NOT NULL,

product_id INT NOT NULL,

qty INT NOT NULL DEFAULT 0,

gen_time DATETIME NOT NULL

);

INSERT INTO purchase VALUES(1, 1, 10, NOW());

CREATE VIEW purchase_detail AS SELECT product.name as name, product .price as price, purchase.qty as qty, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;

创建成功后,输入:SELECT * FROM purchase_detail;

运行效果如下:

+——-+——-+—–+————-+

| name | price | qty | total_value |

+——-+——-+—–+————-+

| apple | 5.5 | 10 | 55 |

+——-+——-+—–+————-+

1 row in set (0.01 sec)

3. 注意事项

创建视图存在如下注意事项:

(1) 运行创建视图的语句需要用户具有创建视图(CRATE VIEW)的权限,若加了[OR REPLACE]时,还需要用户具有删除视图(DROP VIEW)的权限;

(2) SELECT语句不能包含FROM子句中的子查询;

(3) SELECT语句不能引用系统或用户变量;

(4) SELECT语句不能引用预处理语句参数;

(5) 在存储子程序内,定义不能引用子程序参数或局部变量;

(6) 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句;

(7) 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;

(8) 在视图定义中命名的表必须已存在;

(9) 不能将触发程序与视图关联在一起;

(10) 在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。

三. 修改视图——ALTER VIEW

1. 语法

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。

2. 使用举例

Eg. 将上一小节中中创建的视purchase_detail进行修改,去掉qty列,语句如下:

ALTER VIEW purchase_detail AS SELECT product.name as name, product .price as price, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;

此时通过语句:select * from purchase_detail;对视图进行查询时,结果如下:

+——-+——-+————-+
| name | price | total_value |

+——-+——-+————-+

| apple | 5.5 | 55 |

+——-+——-+————-+

3. 注意事项

修改视图的注意事项除了第一条外跟创建视图的注意事项是一样的。第(1)条应改为:

该语句需要具有针对视图的CREATE VIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。

四. 删除视图——DROP VIEW

1. 语法

DROP VIEW [IF EXISTS] view_name [, view_name] … [RESTRICT | CASCADE]该语句用户删除视图,可一次删除多个视图。[IF EXISTS]选项确保语句正确运行。若没有该子句,当指定的视图不存在时,将发生错误。

2. 使用举例

Eg1. 删除在前面的小节中创建的视图purchase_detail:DROP VIEW purchase_detail;

Eg2. 删除一个未知的视图:DROP VIEW IF EXISTS test_view;

Eg3. 删除多个视图:DROP VIEW IF EXISTS test_view1, test_view2;

3. 注意事项

必须对要删除的一个或多个视图拥有DROP VIEW的权限。

发表在 Database | 标签为 | 一条评论

Blog迁到Linode,新空间,新开始

很久没有认证的写博客了,原因是多方面的,一方面因为工作比较忙,最近在死磕一个电子商务的项目,对于不适合人类阅读的代码,花了很大的力气去重构,当然我也只能重构一些我用到的部分,这部分重构只能保证与我相关的这些特性能够在未来的一段时间内降低维护的成本,更深层次的重构,有专门的团队在负责,还有一个原因是过年吃多了,又长胖了,人胖了就不想动,变懒了,于是赶紧买了一辆自行车,只要不下雨,上下班都骑车,还特意在自行车上装了一个码表,蛮便宜的,十几块钱,能清楚记录我平均速度,总里程,总时间,当前行车速度,当前温度等等信息,建议骑车的人去买一个,安装也非常方便,淘宝上可以买到。

昨天晚上把Blog迁往Linode,关于Linode的详细介绍,请关注百度的Blogkid同学的介绍,这个VPS是和老王神仙等人一起合租的,差不多每个人300人民币一年,速度还可以,从我的测试来看,比我之前用的VPS稍微慢一点,比起它的资源和性能,总的性价比还是不错的,如果有需要的朋友可以考虑一下,一个人买有点贵,当然如果你不差钱的话,那就无所谓了。

最近还发现一个神奇的现象,我的Blog流量在最近一个月增加了一倍多,新增流量主要来自百度搜索,但奇怪的是,google webmaster tools 中显示,订阅用户也增加了一倍多,看来订阅用户和访问量基本上没啥关系,怪不得那么多人在feed中添加广告,不过feed能够做到更精准的营销,这是当你在Blogbus 6周年跨界融合大会上,碰到的Feedsky创始人吕欣欣,他老人家说的。当时还和他合影了,不过照片不知道去哪里了……

关于以后,我会把更多的业余时间投入到数据库上去,先从MySQL入手开始搞,所以以后Blog可能更多的出现数据库方面的文章,当然PHP是我的职业语言,关于这方面的心得,我会继续发布在Blog上,关于编程语言可能还有Python,这个是不错的语言,Blog上还有可能出现的内容可能就是一些读书笔记。

发表在 Life Diary | 标签为 | 留下评论

django Settings cannot be imported 错误解决

在命令行中直接敲入Python命令进入交互模式,然后使用

from django.template import  Template ,Context
t  = Template(“Test is {{test}}”)

会导致:ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.原因是django的配置信息没有初始化
有两种解决方法,

一种是切换到你项目或者APP所在的目录使用manage.py shell命令启动交互窗口

还有一种是手动将django的配置初始化:

>>> from django.conf import settings
>>> settings.configure()

发表在 Programming | 标签为 , | 留下评论

代码格式规范的List

《代码大全》是本好书啊,推荐所有有志于改善自己的程序,或者在编码上寻找进一步提高的人应该仔细研究研究。以下是摘抄自《代码大全》第二版中谈到关于怎样的代码格式更适合人类阅读,更能令人愉悦的Check List。对照List进行自检和反省,令人欣慰的是List中80%以上我都做到了,在我的上一个项目中做得比较失败,由于时间的原因,很多注释没有加上,逻辑也不够清晰。在重构中解决,借此反省。
一般问题:
格式化主要是为了展现代码的逻辑结构吗?
2、你的布局方案能统一运行吗?
3、 你的布局方案能让代码易于维护吗?
4、你的布局方案是否有利于代码的可读性?
控制结构的布局
1、你的代码中避免begin-end 或对{}的双重缩进了吗?
2、相邻的块之间用空行分割了吗?
3、对复杂表达式格式化时考虑到可读性吗?
4、对只有一条语句的块布局始终如一吗?
5、case语句与其他控制结构的格式化保持一致了吗?
6、对goto语句格式化是否让其显眼了呢?
还好目前PHP只有5.3以上版本才会有goto
单条语句的布局:

1、为逻辑表达式、数组下标和子程序参数的可读性使用了空格了吗?
2、不完整的语句在行末似乎以明显又错的方式结束吗?
3、后续行按照标准数码缩进了吗?
4、每行顶多只有一条语句吗?
这一点是团队中比较头痛的问题,很多人不按照这个规则来做,结果它成了一种风气
5、所写的每个语句都没有副作用吗?
6、每行顶多只声明一个数据吗?
注释布局:
1、注释与其所注释的代码所尽量相同吗?
2、注释风格便于维护吗?
子程序的布局:
1、你对每个子程序的参数格式化方式便于看懂、修改、注释吗?
2、采用空行分割子程序各部分了吗?
4、文件中子程序用空行清楚分开了吗?
5、在没有更好的组织形式的场合,所有子程序都按字母排列了吗?
这一点我没有做到,没有做到是没有想到这一点,以后编码注意了……

发表在 Study & Reading | 标签为 , | 3 条评论

为Firefox 3.6修改的两个小扩展

在本子上装了window 7 ,索性就装了一下最新版的firefox 3.6,结果一些常用的扩展不支持了,有些就懒得要了,反正也不常用,等着作者更新吧,有两个扩展对我来说,没有是很郁闷的,一个是Hide Menu Bar,一个是Super Drag And Go ,顾名思义,前面一个是隐藏firefox的菜单栏的,对于我这样的宽屏用户来说,能扩大一点面积,算一点。后面一个是用来拖拽的,比如你看到一个新鲜的名词不知道什么东西,你可能需要打开一个新的标签,然后输入搜索引擎地址,然后复制,然后搜索,有了这个扩展之后,只要选中这个词,随便一拖,就自动到你默认的firefox 搜索引擎上去了,并且打开一个新标签,非常爽,这玩意的功能不仅仅这么简单,假如你拖的是个URL地址的话,就自动在新标签打开这个地址,还有其他的一些功能,非常小巧实用的。

我修改的这两个插件可以适用于3.*版本,都是基于原作者最新版修改的。

Hide Menu Bar: 下载地址:http://dl.dropbox.com/u/140847/hide_menubar-1.0.20091221-fx%2Btb.xpi

Super Drag And Go : 下载地址: http://dl.dropbox.com/u/140847/super_dragandgo-0.2.6-fx.xpi

发表在 Tools | 标签为 , | 2 条评论

上海Think In Lamp 聚会记

关于创业

1、创业不是因为钱多,而是在现在的岗位上可能遇到天花板或者因为兴趣

2、25岁还没创业,那么只能等到35岁了,主要理由是,年轻的冲劲没了,就只能等到真正稳定下来才能去创业,当然前面的年龄只是个描述,并不是严格的界限,只是为了说明在年轻的几年中,有一段时间出去创业的几率很小,而且成本很高

3、盯住小众而高端的市场并一定比大众的市场来钱少,反而更容易做口碑。

4、目前的体制下,政府或者国企的钱最好赚

5、中国穷人多,富人也多,有人愿意出钱玩玩

6、不做培育市场的事情,创业之前做好在中国这个山寨文化很浓的国家被人模仿和抄袭的准备

7、创业是很痛苦的,也是走向更高层次的最好机会之一

关于职业发展:

1、在一个公司的发展是有限的,盯着那个位置不一定能坐到,跳槽或许是捷径

2、薪水是影响选择职位的一个因素,但不是最重要的元素,开心和有成就感更能留住一个人。

3、跳出IT圈子,IT不过是一个工具,不管是电子商务,还是内容提供,娱乐提供等,最需要工具的并不是互联网,而是传统行业,做传统行业更能带来效益和收获。

4、国内的企业和国外的企业还是有很大差距的,不仅仅是薪水,最重要的职业发展方面,国外的企业很舍得花钱在IT方面,来提高生产效率,会为员工提供更多的培训机会和学习机会,甚至有强制学习制度保证员工不断进步和提升

5、站在传统行业看互联网行业的一些技术工作从事者,很多纯粹似乎自虐,大部分企业系统根本不需要承受千万PV,根本不需要负载均衡,根本不需要浏览器兼容,什么也不需要,他们只要能用就行,能快速解决问题、能带来效率提升的就是最好的。

6、每个人的职业都有天花板,或许出去创业一下,更能知道自己想要什么

7、创业不成功者去面试一个更高层次的岗位时,往往能得到更多的信赖和机会

发表在 Life Diary | 标签为 , | 2 条评论

使用Firefox+foxyProxy+SSH翻山越岭

每次我说能够自动进行代理访问一些被和谐的网站时候,别人都要问我一遍怎么弄,如果是身边,倒是好说,我随便帮你弄下就好了,如果是通过IM工具来问的朋友,我就不知道该怎么回答了,如果对方仅仅是为了翻山,而且计算机基础一般的话,那就更说不清了,我觉得我有必要搞个图文并茂的文章,下次,别人问我的时候,我就可以直接把这个链接给他了。

PS:转载请注明出处,请各位手续留情,谢谢。

完成配置的前提是你必须要有一个可以使用的SSH帐号,并且服务器是在墙外,比如美国、香港等地,如果你没有,你可以在此留言或者联系我,我不能保证你能获取到一个免费的SSH帐号,可能我可以告诉你一些获取途径和方法。

1、下载firefox, 并且双击安装好,如果你已经有firefox,省略此步,下载地址:http://www.mozilla.com/

2、安装FoxyProxy扩展:如果你已经有这个扩展,省略此步,安装地址:https://addons.mozilla.org/zh-CN/firefox/addon/2464 ,点击打开的页面上的“安装到Firefox”,然后会问你是否允许,点击允许,如果没安装,再点一下“安装到firefox”按钮,重启firefox

3、下载MyEnTunnel, 你也可以使用Putty 或者 plink这样的工具,但是会多出来一个黑乎乎的窗口,很烦,这个小软件可以避免这样的问题,下载地址: http://dl.dropbox.com/u/140847/setup_myentunnel.exe ,下载完成后双击安装文件,完成安装。

4、启动MyEnTunnel, 在setting选项卡中,大致的设置如下图:
MyEnTunnel

SSH server中填入你的SSH服务器IP地址,SSH port是SSH帐号端口,一般默认即可,后面是你的用户名和密码,其他的设置正常情况下照抄即可

5、设置foxyproxy,点击firefox右下角黄色的狐狸图标,按照下面的图示进行设置:

新建代理服务器:
new

设置代理服务器名称,推荐勾选上perform remote dns的选项,防止DNS劫持:
add

设置代理服务器地址及端口,如果你的MyEnTunnel按照我上面的图配置,并且连接成功,那么此配置依然可以照抄。
port

设置代理模板,在访问Web的时候,foxyproxy会自动根据你访问的地址,来跟这个模板进行匹配,如果成功,则使用代理,如果不成功则不使用,这样做的好处是,当你的时间大部分是在浏览没有被和谐的网站时,就不用走代理服务器,这样既能给你带来速度也给代理服务器节省流量,一举多得啊。
添加模板
通配符
上图中我用了一个twitter的例子,按照上面的设置,你在访问twitter时,会自动使用代理,访问其他网站则不会使用代理,非常方便。

这仅仅是个新手的教程,老鸟请略过,前面说了,只是为了以后给新手普及翻山越岭本领的时候,少说几句。

发表在 Tools | 标签为 , | 11 条评论

程序语言评估标准

1、可读性。判断一个语言的优劣的一个最重要的标准是用它写的程序要好读,好懂。
一种语言的整体简单性极大的影响着他的可读性。一种具有大量基本结构的语言较只有少量基本结构的语言要难学得多,当然,过少也会非常难学,汇编就是如此。
2、正交性。正交性是指使用该语言中一组相对少量的基本结构,经过相对少的组合步骤,可以构成该语言的控制结构与数据接哦股。而且,它的基本结构的任何组合都是合法和有意义的。
3、控制语句。在20世纪50年代和60年代,一批程序设计语言由于缺乏控制语句,导致很差的可读性。随后的语言都兴起了结构化程序设计的革命。尤其是人们普遍意识到滥用goto会降低程序设计的可读性。
4、数据类型和数据结构。在程序设计语言中给出定义数据类型和数据结构的合理机制,是语言可读性的又一个重要辅助。
5、可写性。可写性是程序设计语言的在应用领域产生程序的难以程度的一种度量。大多数影响可读性的语言特征可以影响可写性。
6、支持抽象。抽象指的是以合法的省略许多细节的方式,来定义并且使用复杂结构或复杂运算的能力。
7、表达性。语言的表达性可以指语言中几种不同特征。一种是具有一些功能很强的运算符。一种是程序语言具有相对方便,非繁琐的方式来说明运算。
8、可靠性。如果一个程序在任何条件下的运行都能 达到他的说明标准。我们称这饿程序是可靠的。
9.代价。第一是训练程序员使用这种语言的代价。第二是使用这种语言来编写程序的代价。第三是编译程序的代价。第四是程序运行的代价。

发表在 Study & Reading | 标签为 , | 留下评论

软件构建中的理想设计特征

1、最小复杂度。设计的手艺好目标就是要复杂度最小,避免作出“聪明的”设计,因为“聪明的”设计常常难以理解

2、易于维护。 易于维护意味着在设计时为做维护的程序员着想。

3、松散耦合。松散耦合意味着在设计时让程序各个组织称部分之间的管理关系最小。通过应用类接口中合理还凑向、封装及信息隐藏等原则设计出相互关联尽可能小的类。减少关联也就是减少了集成、测试和维护时的工作量。

3、可扩展性。可扩展性是只可以增强系统功能而无须改变底层结构,可以改变某一个方面功能而不影响其他部分。

4、可重用性。可重用意味着代码可以在其他系统的组成部分中重复使用,降低整体的成本和提高生产效率。

5、高扇入。高扇入就是说让大量的类是有那个某个给定的类。这就是意味着设计出的系统很好的利用较低层次上的工具类。

6、低扇出。低扇出就是让一个类里少量或者适中的使用其他的类。高扇出说明了一个类使用了大量其他的类,因此可能变得过于复杂。

7、可移植性。可移植性是说应该设计的系统很方便的移植到其他的环境中。

8、精简性。精简就意味着系统没有多余的部分。这样有利于后面的单元测试。

9、层次性。层次性就意味着尽量保持系统各个层次保持可分解,使你能在任何层面观察系统。

10、标准技术。一个系统所依赖的外来的,古怪的东西越多,别人在第一次想要理解它的时候就越头痛。尽量使用标准化,常用的方法,让整个系统给人一种熟悉的感觉。

发表在 Excellence Article | 标签为 , | 留下评论

varnish安装记录

varnish和squid相比最大的优势就是简单快速,简单是安装和配置都简单,快速是运行速度比squid更快,当然,快的前提是varnish比squid占用更多的内存,估计当年设计squid的时候内存还是很贵的东西,所以更多的侧重硬盘,使用内存多,当然还有一个很显而易见的弱点是机器冷启动时候恢复缓存的时间相比squid要长。

wget http://downloads.sourceforge.net/project/varnish/varnish/2.0.6/varnish-2.0.6.tar.gz?use_mirror=ncu

tar zxvf varnish-2.0.6.tar.gz
cd varnish-2.0.6
./configure  –prefix=/srv/varnish
make
make install

启动命令:
/srv/varnish/sbin/varnishd -a :8088 -b localhost:8080

由于我指定了安装目录,所以加上了路径,-a参数表示varnish的监听端口,正常情况下应该监听是80端口,也就是web服务端口,我测试机上被使用掉了,所以用了8088端口, -b 是表示后端(backend)的地址,如果backend在这里指定,那么只能指定一个后端,如果使用的配置文件可以指定多个backend,我的配置文件位置位于/srv/varnish/etc/varnish。

在web服务器的目录中创建一个index.html文件,然后通过varnish进行代理访问.

第一次访问结果如下:

2

第二次访问结果如下:
3

根据请求头,我们看到的确是通过vanish来代理访问后端的,第一次访问age 为0 ,第二次访问age为71,说明这个文件已经在varnish中缓存了,此时可以通过/srv/varnish/bin/varnishstat 来查看一些参数,其中Hitrate 一行应该为1,因为命中了一次。
varnish 配置文件还是很有搞头的一个东西,有点类似与Nginx的语法,虽然不是很像,比如对正则的支持,可以绑定和去除head、Cookie等等功能,有时间的话,翻译一下varnish的introduction

发表在 Operating System | 标签为 | 一条评论