mysql学习之视图篇

本文讲述MySql5.x中视图的使用,包括创建视图、修改视图和删除视图的相关知识,包括命令的语法、使用举例以及注意事项。

一. 视图概述

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

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

二. 创建视图——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的权限。

Jquery表单取值赋值的一些基本操作

  1. /*获得TEXT.AREATEXT的值*/
  2.      var textval = $("#text_id").attr("value");
  3. //或者
  4.      var textval = $("#text_id").val();
  5. /*获取单选按钮的值*/
  6.      var valradio = $("input[@type=radio][@checked]").val();
  7. /*获取一组名为(items)的radio被选中项的值*/
  8.      var item = $('input[@name=items][@checked]').val();
  9. /*获取复选框的值*/
  10.     var checkboxval = $("#checkbox_id").attr("value")
  11. /*获取下拉列表的值*/
  12.      var selectval = $('#select_id').val();
  13.  
  14. //文本框,文本区域:
  15. $("#text_id").attr("value",'');//清空内容
  16. $("#text_id").attr("value",'test');//填充内容
  17. //多选框checkbox:
  18. $("#chk_id").attr("checked",'');//使其未勾选
  19. $("#chk_id").attr("checked",true);//勾选
  20. if($("#chk_id").attr('checked')==true) //判断是否已经选中
  21.  
  22. //单选组radio:
  23.  
  24. $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
  25.  
  26. //下拉框select:
  27. $("#select_id").attr("value",'test');//设置value=test的项目为当前选中项
  28. $("<option value='test'>test</option><option value='test2'>test2</option>").appendTo("#select_id")//添加下拉框的option
  29. $("#select_id").empty()//清空下拉框
  30.  
  31. 获取一组名为(items)radio被选中项的值
  32. var item = $('input[@name=items][@checked]').val();//若未被选中 则val() = undefined
  33. 获取select被选中项的文本
  34. var item = $("select[@name=items] option[@selected]").text();
  35. select下拉框的第二个元素为当前选中值
  36. $('#select_id')[0].selectedIndex = 1;
  37. radio单选组的第二个元素为当前选中值
  38. $('input[@name=items]').get(1).checked = true;
  39.  
  40. //重置表单
  41. $("form").each(function(){
  42.        .reset();
  43.         });

SourceForge 不能访问下载的解决办法

进来中国电信对国外网站的封锁可谓疯狂,一些敏感的网站封掉也罢,可是就连freebsd和sourceforge这样的纯技术类站点也封杀掉了,做软件开发和网站开发的人都知道SourceForge 是全球最大的开放源代码软件开发平台和仓库。它集成了很多开放源代码应用程序,为软件开发提供了整套生命周期服务。SourceForge.net是开放源代码软件的开发者进行开发管理的集中式场所,也是源代码仓库。
自从学PHP以来,这些年经常在这里找一些开源的软件包、类库,非常方便日常的开发工作,也可以学到很多东西,但现在被河蟹掉了,据说只是因为这个网站上有一个叫Freenet的代理服务器开源软件项目,牢骚发多少都没用,还是想办法解决问题吧,碰到这种情况我首先想到的是用代理或者自由门之类的软件,这次也不例外,在代理中国的网站上试了一圈没有满意的,朋友给我推荐一个firefox的插件gladder,一个在线代理的插件,很好用。
兼容FireFox3.0,装上这个之后可以访问中文维基百科

如果还不能下载上面的软件的话可以通过SourceForge的镜像来下载,列表一目了然,按字母排序,查找非常方便。

《久石让·宫崎骏动漫视听交响音乐会》

久石让·宫崎骏动漫视听交响音乐会 演奏:中国广播电影交响乐团
乐团指挥:范 焘
乐团首席:吴正明
音乐会演奏的都是一些耳熟能详的曲目,跟我预料中的一样是开篇是《天空之城》,实在太喜欢这个曲子了,手机铃声一直用的它,投影屏幕上放的是动画的剪辑,画面配合音乐让我又回到了从前一样,宫崎骏和久石让合作的八部电影中的经典音乐片段被编配整合为八首组曲,《天空之城》、《风之谷》、《魔女宅急便》、《龙猫》、《幽灵公主》、《千与千寻》、《猫的报恩》、《哈尔的移动城堡》,这些作品曾经在上学时一口气看完,现在来听现场演奏却是一样的感受。

关于演出介绍点这里
关于久石让,关于宫崎骏非常常识性的介绍

Xp Vista下IE8 IE7 IE6 IE5.5 共存的方法

IETester

令用css布局网站的朋友最头疼的事莫过于对着电脑在不同的浏览器里调试网页的效果了,随着IE7、IE8 的发布我们网站设计制作人员的工作量也越来越大了,要考虑用户不同浏览器版本的兼容性问题,然而最让人郁闷的是微软的操作系统并不能让不同版本的IE共存,这就给我们的工作带来很大的麻烦,要么在不同的电脑上装不同版本的IE来查看效果,要么就装一个所谓的IE6绿色版,勉强可以使用。

终于今天在网上闲逛的时候看到了一个非常方便调试网页的程序ietester,此软件为免费软件,能够让IE8 IE7 IE6 IE5.5友好共存

PHP SQLServer TEXT字段被截断

一、针对MS SQL SERVER数据库

      有两种解决方案,如下:

修改php.ini来实现:
      打开php.ini,可看到mssql.textsize,mssql.textlimit两个选项:

      ; Valid range 0 - 2147483647. Default = 4096.

      ;mssql.textlimit = 4096

      ; Valid range 0 - 2147483647. Default = 4096.
      ;mssql.textsize = 4096

      可以看到默认配置为4096字节,也就是经常碰到的被截断为4K,将之改为合适的大小,去掉前面的分号,然后保存并重起WEB服务器即可。

      从上面两个选项可看到范围为:0 - 2147483647字节,其实-1也可以的,查看一下PHP源代码即可发现-1表示无限制 :)

      if (MS_SQL_G(textlimit) != -1) {
            sprintf(buffer, “%li”, MS_SQL_G(textlimit));
            if (DBSETOPT(mssql.link, DBTEXTLIMIT, buffer)==FAIL) {
                  efree(hashed_details);
                  dbfreelogin(mssql.login);
                  RETURN_FALSE;
            }
      }
      if (MS_SQL_G(textsize) != -1) {
            sprintf(buffer, “SET TEXTSIZE %li”, MS_SQL_G(textsize));
            dbcmd(mssql.link, buffer);
            dbsqlexec(mssql.link);
            dbresults(mssql.link);
      }

在PHP中查询之前执行SET TEXTSIZE 合适的大小:
      只需在SELECT之前执行

      mssql_query(”SET TEXTSIZE 65536″);

      从上面PHP源代码中可看到其实也是执行SET TEXTSIZE的 :)

二、针对Sybase数据库

      由于该扩展在php.ini没有像SQL SERVER那样的选项可配置,所以只有采用上面的第二种方法,即:

      在SELECT之前执行

      sybase_query(”SET TEXTSIZE 65536″);

php-mysql输出xml中文乱码问题

今天在弄新版电台的程序时遇到一个问题:

通过PHP将MYSQL中的音乐信息输出成可以供JW-MP3 PLAYER调用的xml播放列表文件,英文没有问题,但中文和日文就不行,总是乱码。

最后百度、google一番终于解决问题,经验仅供参考,不保证是正确的 :-)
关键语句如下:
header("Content-type:text/xml;charset=UTF-8");
echo "<"."?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n";
$db->query("SET NAMES 'gb2312';");
echo iconv('GBK','UTF-8',$rs["field"]);

53个CSS技巧-转

CSS-Technique 

原文链接:http://www.smashingmagazine.com/2007/01/19/53-css-techniques-you-couldnt-live-without/

这个网站还有很多值得学习的地方,可惜英文还是跟不上,也激励我连英文一起学习

汾河美图俩张

得此2图,心情有所好转

汾河美景

汾河美景

XajaxBook By PHP+Mysql+Xajax+Adodb+Smarty

历时三天的XajaxBook终于发布了,这只是一个学习的作品,所以用到了一些类库和框架,先放出这个带分页功能不带管理功能的Ajax留言本程序,程序中已经有较详细的注释,本作品供初学Xajax+Adodb+Smarty 开发的朋友参考,欢迎达人对这个本本抛砖。
演示:http://www.im502.com/demo/XajaxBook/
下载:在全文最下面
废话少说,看目录结构:

|+adodb
|+smarty
|+templates
|+templates_c
|+xajax
|-init.php
|-db.config.php
|-index.php

db.config.php

<?php
/**
 * XajaxBook 留言簿数据库配置文件
 * ============================================================================
 * 版权所有 (C) 2007
im502@126.com,并保留所有权利。
 * 网站地址:
http://www.im502.com
 * ============================================================================
 * @file:       db.config.php
 * @author:     im502 <
im502@126.com>
 * @version:    V1.0 Beta
 * @update:     2007-10-26
 * ---------------------------------------------
*/

// database host
$db_host   = 'localhost';
 
// database name
$db_name   = 'mydb';
 
// database username
$db_user   = 'root';
 
// database password
$db_pass   = 'password';
?>

init.php

<?php
/**
 * XajaxBook 留言簿公用文件
 * ============================================================================
 * 版权所有 (C) 2007
im502@126.com,并保留所有权利。
 * 网站地址:
http://www.im502.com
 * ============================================================================
 * @file:       init.php
 * @author:     im502 <
im502@126.com>
 * @version:    V1.0 Beta
 * @update:     2007-10-26
 * ---------------------------------------------
*/

 
/*包含数据库连接文件,adodb类库,Smarty类库,xajax类库*/
include_once("db.config.php");
require_once("adodb/adodb.inc.php");
require_once("smarty/Smarty.class.php");
require_once("xajax/xajax.inc.php");
 
/* 初始化数据库类 */
$db = &NewADOConnection('mysql');
$db->Connect($db_host, $db_user, $db_pass, $db_name) or die("Connect database failed");
$db->query("SET NAMES 'gb2312';");
$db->debug = 0;//是否开启mysql侦错
 
 
/* 创建 Smarty 对象。*/
$smarty = new Smarty;
if (!file_exists('templates/caches'))
{
    @
mkdir('templates/caches');
    @
chmod('templates/caches', 0777);
}
if (!file_exists('templates_c'))
{
    @
mkdir('templates_c');
    @
chmod('templates_c', 0777);
}
clearstatcache();
$smarty->template_dir   = 'templates';
$smarty->cache_dir      = 'templates/caches';
$smarty->compile_dir    =  'templates_c';
$smarty->caching        = false;
$smarty->compile_force  = false;
$smarty->left_delimiter  = "<{"; //为防止与js冲突,使用<{}> 这样的定界符 替换默认的{}
$smarty->right_delimiter = "}>";
$smarty->compile_check = 1;
$smarty->register_resource("db", array("db_get_template", "db_get_timestamp", "db_get_secure", "db_get_trusted"));
?>

Read More