温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

雪山飞鹄

温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

BlogJava 首页 新随笔 联系 聚合 管理
  215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks

#

本文转自:http://blog.renhao.org/2010/07/use-vsftpd-to-build-ftp-server-on-ubuntu/
需要在一台新的服务器上配置FTP服务。这台服务器装的是Ubuntu系统,且FTP的要求并不高。于是,简单方便的vsftpd就成了第一选择。

要在Ubuntu下安装vsftpd很简单,首先输入下面的命令进行安装:

#apt-get install vsftpd

接下来需要进行简单的配置,我们先编辑它的配置文件/etc/vsftpd.conf:

#vim /etc/vsftpd.conf

这个配置文件里面很多内容都可以保持默认,不过为了进一步加深理解,我们还是来了解一下常用的选项吧!

listen=YES:这个表示是否监听端口,我们就是要架设FTP服务器,当然YES啦!

anonymous_enable=NO:这个标识是否启用匿名用户,一般我们自己的服务器肯定都是不允许匿名登录的,那样多危险啊!所以这里保持NO。当然如果您需要启动匿名用户,别忘记这里改为YES。

local_enable=YES:这个表示是否允许本地用户登录。我们当然需要让本地用户登录啦,因为他们都是有用户名和密码的。这样就不用去额外添加FTP账号了,直接创建Linux用户即可。

write_enable=YES:是否允许写入数据。这个如果为YES,那么用户就可以进行上传文件、修改文件、删除文件等操作;否则就全部只能看到文件、下载文件,但是不允许执行修改、删除、上传的操作。

local_umask=077:这是将文件上传之后,文件的权限,默认为077。除非有特殊需要,建议保持不变。

anon_upload_enable=YES:这是是否启用匿名用户的上传权限。如果您希望匿名用户也能上传文件的话,启用这项即可。

anon_mkdir_write_enable=YES:同样是给匿名用户的权限,是可以创建目录,写入、修改、删除文件的总开关。一般情况下匿名用户不能使用这样的权限,会带来潜在的风险。

dirmessage_enable=YES:用户进入一个目录后,是否给出信息提示。默认YES,默认即可。

use_localtime=YES:是否使用服务器本地的时间,保持默认YES即可。

xferlog_enable=YES:是否记录FTP用户的操作记录,为了方便追溯和安全起见,建议YES。

connect_from_port_20=YES:是否允许从20端口连接,保持YES即可,除非你确定不用这个20端口。

chown_uploads=YES:是否改变上传文件的归属,默认是注释掉不生效的,如果你需要将上传的文件权限更改为某个账户,可以选择YES启用它。

chown_username=whoever:这项是承接上一个选项的,是改变为哪个用户的权限。注意:改变为root用户权限是不推荐的!

xferlog_file=/var/log/vsftpd.log:日志记录的文件名,保持默认即可。

idle_session_timeout=600:空闲多少时间自动断开FTP连接,单位是秒。默认值是600秒也就是10分钟。

data_connection_timeout=120:数据传输超时的时间,单位也是秒。是指数据传输过程中,多长时间内接收不到数据,就认为超时,然后断开连接。

ftpd_banner=Welcome to blah FTP service.这个是连接FTP的时候,服务器给出的欢迎信息。

chroot_local_user=YES:这个选项很重要,他决定了登录的FTP用户是否可以“漫游”到自己目录以外的目录,除非特别需要,否则强烈推荐设置为YES,将用户锁定在他们自己的目录内,避免他们看到或者修改系统文件。

基本上上面这些配置完后,vsftpd就算可以正常运作了。这个时候输入下面的命令让设置生效:

#/etc/init.d/vsftpd restart

然后如果要创建新的FTP用户,只需要使用Linux本身的adduser即可。

posted @ 2010-11-15 14:56 雪山飞鹄 阅读(1587) | 评论 (2)编辑 收藏

要使putty连接ubuntu,需要开启ssh-server.
打开终端输入:
sudo apt-get install openssh-server

ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。

然后确认sshserver是否启动了:

ps -e |grep ssh

如果只有ssh-agent那ssh-server还没有启动,需要/etc/init.d/ssh start,如果看到sshd那说明ssh-server已经启动了。

ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务:

sudo /etc/init.d/ssh resart

设置putty中文乱码


posted @ 2010-11-12 16:06 雪山飞鹄 阅读(3644) | 评论 (0)编辑 收藏


velocity开发eclipse插件  http://code.google.com/p/veloeclipse/

目录结构
点我下载工程代码

俩实体类不用说了
看CustomerVelocityServlet类
package com.velocity.servlet;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.servlet.VelocityViewServlet;

import com.velocity.bean.Department;
import com.velocity.bean.Employee;

@SuppressWarnings(
"serial")
public class CustomerVelocityServlet extends VelocityViewServlet{

    
    
//设置返回视图为text/html编码为gbk
    @Override
    
protected void setContentType(HttpServletRequest request,
            HttpServletResponse response) {
        response.setContentType(
"text/html;charset=gbk");
    }
    
    
//处理请求
    @Override
    
protected Template handleRequest(HttpServletRequest request,
            HttpServletResponse response, Context ctx) 
throws Exception {
        ctx.put(
"username""张三");
        ctx.put(
"password""123456789");
        ctx.put(
"age""20");
        ctx.put(
"address""陕西西安"); 
        ctx.put(
"blog""http://blogjava.net/sxyx2008");
        
        List
<Employee> list=new ArrayList<Employee>();
        list.add(
new Employee(1,"张三","陕西西安",18,new Department(1,"软件研发部1")));
        list.add(
new Employee(2,"张三","陕西西安",19,new Department(2,"软件研发部2")));
        list.add(
new Employee(3,"张三","陕西西安",20,new Department(3,"软件研发部3")));
        list.add(
new Employee(4,"张三","陕西西安",21,new Department(4,"软件研发部4")));
        list.add(
new Employee(5,"张三","陕西西安",22,new Department(5,"软件研发部5")));
        list.add(
new Employee(6,"张三","陕西西安",23,new Department(6,"软件研发部6")));
        list.add(
new Employee(7,"张三","陕西西安",24,new Department(7,"软件研发部7")));
        list.add(
new Employee(8,"张三","陕西西安",25,new Department(8,"软件研发部8")));
        list.add(
new Employee(9,"张三","陕西西安",26,new Department(9,"软件研发部9")));
        list.add(
new Employee(10,"张三","陕西西安",27,new Department(10,"软件研发部10")));
        
        ctx.put(
"list", list);
        
//调用父类的方法getTemplate()
        return getTemplate("demo.vm""gbk");
    }
    
}
继承org.apache.velocity.tools.view.servlet.VelocityViewServlet,覆写setContentType和handleRequest方法,其中setContentType用于设置浏览器的响应,handleRequest处理用户的请求,返回Template,我们调用父类中的getTemplate()方法返回
在WEB-INF目录下创建一vm目录,用于存放模板文件
在WEB-INF目录下创建velocity.properties(名字可以任意取)
内容为
resource.loader = webapp  
webapp.resource.loader.
class = org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.path
=/WEB-INF/vm/  
input.encoding
="gbk"
output.encoding
="gbk"
resource.loader = webapp 加载方式为webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader    webapp方式加载处理类
webapp.resource.loader.path=/WEB-INF/vm/   模板文件目录
input.encoding="gbk"  输入字符编码
output.encoding="gbk"  输出字符编码

配置web.xml
<servlet>
        
<servlet-name>customerVelocityServlet</servlet-name>
        
<servlet-class>com.velocity.servlet.CustomerVelocityServlet</servlet-class>
        
<init-param>
            
<param-name>org.apache.velocity.properties</param-name>
            
<param-value>/WEB-INF/velocity.properties</param-value>
        
</init-param>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>customerVelocityServlet</servlet-name>
        
<url-pattern>/customerVelocityServlet</url-pattern>
    
</servlet-mapping>

<init-param>
   <param-name>org.apache.velocity.properties</param-name>
   <param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
加载自定义的velocity.properties

demo.vm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 
<HEAD>
  
<TITLE> velocity </TITLE>
 
</HEAD>

##嘿嘿,我是velocity中的注释噢
#*
    嘿嘿,我也是velocity中的注释噢
*#

 
<BODY>
    
<h1>hehe,这是经过由servlet返回的velocity视图</h1>
    hello ${username},这是你的信息
    
<ul>
        
<li>用户密码为:${password}</li>
        
<li>年龄为:${age}</li>
        
<li>出生地址为:${address}</li>
        
<li>个人主页为:<href='${blog}'>${blog}</a></li>
    
</ul>
    
    
<br/>
    
    #foreach($emp in $!{list})
        $!{velocityCount}
&nbsp;&nbsp;&nbsp;&nbsp;
        $!{emp.id} 
&nbsp;&nbsp;&nbsp;&nbsp;
        $!{emp.ename} 
&nbsp;&nbsp;&nbsp;&nbsp;
        $!{emp.eaddress} 
&nbsp;&nbsp;&nbsp;&nbsp;
        $!{emp.age} 
&nbsp;&nbsp;&nbsp;&nbsp;
        $!{emp.department.id} 
&nbsp;&nbsp;&nbsp;&nbsp;
        $!{emp.department.deptname} 
<hr/>
    #end
    
 
</BODY>
</HTML>

http://localhost:8080/velocityweb/customerVelocityServlet

效果图

点我下载工程代码
posted @ 2010-11-11 16:51 雪山飞鹄 阅读(6078) | 评论 (2)编辑 收藏

velocity使用基本来说比较简单,但在加载模板时老出问题,很多初学者经常会遇到找不到模板这种异常。本文就针对目前常用的三种模板加载方式做以说明。
velocity官方帮助文档
其工程目录结构大致为
点我下载示例代码

一、velocity默认的加载方式(文件加载方式)
package com.velocity.test;

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

/**
 * 从文件中加载模板文件,即velocity默认的模板文件加载方式
 * 
@author welcome
 *
 
*/
public class LoaderFromFile {
    
    
public static void main(String[] args) throws Exception{
        
//初始化参数
        Properties properties=new Properties();
        
//设置velocity资源加载方式为file
        properties.setProperty("resource.loader""file");
        
//设置velocity资源加载方式为file时的处理类
        properties.setProperty("file.resource.loader.class""org.apache.velocity.runtime.resource.loader.FileResourceLoader");
        
//实例化一个VelocityEngine对象
        VelocityEngine velocityEngine=new VelocityEngine(properties);
        
        
//实例化一个VelocityContext
        VelocityContext context=new VelocityContext();
        
//向VelocityContext中放入键值
        context.put("username""张三");
        context.put(
"password""123456789");
        context.put(
"age""20");
        context.put(
"address""陕西西安"); 
        context.put(
"blog""http://blogjava.net/sxyx2008");
        
//实例化一个StringWriter
        StringWriter writer=new StringWriter();
        
//从vm目录下加载hello.vm模板,在eclipse工程中该vm目录与src目录平级
        velocityEngine.mergeTemplate("vm/hello.vm""gbk", context, writer);
        System.out.println(writer.toString());
        
    }
}
二、从类路径加载模板文件
package com.velocity.test;

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

/**
 * 从class(类路径)中加载模板文件
 * 
@author welcome
 *
 
*/
public class LoaderFromClass {
    
    
public static void main(String[] args) throws Exception{
        
//初始化参数
        Properties properties=new Properties();
        
//设置velocity资源加载方式为class
        properties.setProperty("resource.loader""class");
        
//设置velocity资源加载方式为file时的处理类
        properties.setProperty("class.resource.loader.class""org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        
//实例化一个VelocityEngine对象
        VelocityEngine velocityEngine=new VelocityEngine(properties);
        
        
//实例化一个VelocityContext
        VelocityContext context=new VelocityContext();
        
//向VelocityContext中放入键值
        context.put("username""张三");
        context.put(
"password""123456789");
        context.put(
"age""20");
        context.put(
"address""陕西西安"); 
        context.put(
"blog""http://blogjava.net/sxyx2008");
        
//实例化一个StringWriter
        StringWriter writer=new StringWriter();
        
        
//从src目录下加载hello.vm模板
        
//假若在com.velocity.test包下有一个hello.vm文件,那么加载路径为com/velocity/test/hello.vm
        velocityEngine.mergeTemplate("com/velocity/test/hello.vm""gbk", context, writer);
        
        
//velocityEngine.mergeTemplate("hello.vm", "gbk", context, writer);
        System.out.println(writer.toString());
    }
}
三、从jar文件中加载模板文件
package com.velocity.test;

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

/**
 * 从jar文件中加载模板文件
 * 
@author welcome
 *
 
*/
public class LoaderFromJar {
    
    
public static void main(String[] args) throws Exception{
        
//初始化参数
        Properties properties=new Properties();
        
//设置velocity资源加载方式为jar
        properties.setProperty("resource.loader""jar");
        
//设置velocity资源加载方式为file时的处理类
        properties.setProperty("jar.resource.loader.class""org.apache.velocity.runtime.resource.loader.JarResourceLoader");
        
//设置jar包所在的位置
        properties.setProperty("jar.resource.loader.path""jar:file:WebRoot/WEB-INF/lib/vm.jar");
        
//实例化一个VelocityEngine对象
        VelocityEngine velocityEngine=new VelocityEngine(properties);
        
        
//实例化一个VelocityContext
        VelocityContext context=new VelocityContext();
        
//向VelocityContext中放入键值
        context.put("username""张三");
        context.put(
"password""123456789");
        context.put(
"age""20");
        context.put(
"address""陕西西安"); 
        context.put(
"blog""http://blogjava.net/sxyx2008");
        
//实例化一个StringWriter
        StringWriter writer=new StringWriter();
        
//从/WebRoot/WEB-INF/lib/vm.jar中加载hello.vm模板  vm.jar的目录结构为vm/hello.vm
        velocityEngine.mergeTemplate("vm/hello.vm""gbk", context, writer);
        System.out.println(writer.toString());
    }
}

请读者朋友自行运行程序。
点我下载示例代码
posted @ 2010-11-11 13:29 雪山飞鹄 阅读(12432) | 评论 (8)编辑 收藏

Microsoft SQL Server 2008 基本安装说明

安装SQL2008的过程与SQL2005的程序基本一样,只不过在安装的过程中部分选项有所改变,当然如果只熟悉SQL2000安装的同志来说则是一个革命性的变动,

一、安装前的准备
1. 需要.Net Framework 3.5,若在Vista或更高的OS上需要3.5 SP1的支持(在SQL2008安装的前会自动更新安装)
2. 需要Widnows PowerShell的支持,WPS是一个功能非常强大的Shell应用,命令与DOX/UNIX兼容并支持直接调用.NET模块做行命令编辑,是非常值得深入研究的工具(在SQL2008安装时会自动更新安装)
3. 需要确保Windows Installer的成功启动,需要4.5以上版本(需要检查服务启动状态service.msc)
4. 需要MDAC2.8 sp1的支持(XP以上系统中已集成)
5. 若机器上已经安装Visual studio 2008则需要VS 2008 sp1以上版本的支持(需要自己从MS的网站上下载安装http://www.microsoft.com/downloads/details.aspx?familyid=FBEE1648-7106-44A7-9649-6D9F6D58056E&displaylang=en

二、安装配置过程
1.进行SQL Server安装中心,选择"安装"选项,在新的电脑上安装SQL2008可以直接选择“全新SQL Server独立安装或向现有安装功能",将会安装一个默认SQL实列,如下图

2.功能选择,对于只安装数据库服务器来说,功能的选择上可以按实际工作需要来制定,本人一般选择:数据库引擎服务、客户端工具连接、SQL Server 联机丛书、管理工具-基本、管理工具-完整
     其中数据库引擎服务是SQL数据库的核心服务,Analysis及Reporting服务可按部署要求安装,这两个服务可能需要IIS的支持。如下图

3.实列设置,可直接选择默认实例进行安装,或则若同一台服务器中有多个数据服务实列可按不同实列名进行安装。如图

4.服务器配置,服务器配置主要是服务启动帐户的配置,服务的帐户名推荐使用NT AUTHORITY\SYSTEM的系统帐户,并指定当前选择服务的启动类型,如图

5.数据库引擎配置,在当前配置中主要设置SQL登录验证模式及账户密码,与SQL的数据存储目录,身份验证模式推荐使用混合模式进行验证,在安装过程中内置的SQL Server系统管理员帐户(sa)的密码比较特殊,SQL2008对SA的密码强度要求相对比较高,需要有大小写字母、数字及符号组成,否则将不允许你继续安装。在"指定Sql Server管理员"中最好指定本机的系统管理员administrator。如图

posted @ 2010-11-09 20:10 雪山飞鹄 阅读(1717) | 评论 (1)编辑 收藏

     摘要: vml是什么,大家自己baidu、google vml.zip 下图为用vml在IE浏览器下实现的效果图 ellipserVML.js //点的对象: function point(x0,y0) {     this.x = x0;     this.y ...  阅读全文
posted @ 2010-11-08 17:25 雪山飞鹄 阅读(2416) | 评论 (0)编辑 收藏

Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END

这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a')       THEN '第二类'
ELSE'其他' END

下面我们来看一下,使用Case函数都能做些什么事情。

一,已知数据按照另外一种方式进行分组,分析。

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)
国家(country) 人口(population)
中国 600
美国 100
加拿大 100
英国 200
法国 300
日本 250
德国 200
墨西哥 50
印度 250

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
人口
亚洲 1100
北美洲 250
其他 700

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT  SUM(population),
CASE country
WHEN '中国'     THEN '亚洲'
WHEN '印度'     THEN '亚洲'
WHEN '日本'     THEN '亚洲'
WHEN '美国'     THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END
FROM    Table_A
GROUP BY CASE country
WHEN '中国'     THEN '亚洲'
WHEN '印度'     THEN '亚洲'
WHEN '日本'     THEN '亚洲'
WHEN '美国'     THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END;

同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600  THEN '2'
WHEN salary > 600 AND salary <= 800  THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM    Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600  THEN '2'
WHEN salary > 600 AND salary <= 800  THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;

二,用一个SQL语句完成不同条件的分组。

有如下数据
国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60

按照国家和性别进行分组,得出结果如下
国家
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60

普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。
下面是一个是用Case函数来完成这个功能的例子
SELECT country,
SUM( CASE WHEN sex = '1' THEN
population ELSE 0 END),  --男性人口
SUM( CASE WHEN sex = '2' THEN
population ELSE 0 END)   --女性人口
FROM  Table_A
GROUP BY country;

这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。

三,在Check中使用Case函数。

在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary > 1000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )

如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK
( sex = '2' AND salary > 1000 )

女职员的条件倒是符合了,男职员就无法输入了。
四,根据条件有选择的UPDATE。

例,有如下更新条件
  1. 工资5000以上的职员,工资减少10%
  2. 工资在2000到4600之间的职员,工资增加15%
很容易考虑的是选择执行两次UPDATE语句,如下所示
--条件1
UPDATE Personnel
SET salary = salary * 0.9
WHERE salary >= 5000;
--条件2
UPDATE Personnel
SET salary = salary * 1.15
WHERE salary >= 2000 AND salary < 4600;

但是事情没有想象得那么简单,假设有个人工资5000块。首先,按照条件1,工资减少10%,变成工资4500。接下来运行第二个SQL时候,因为这个人的工资是4500在2000到4600的范围之内, 需增加15%,最后这个人的工资结果是5175,不但没有减少,反而增加了。如果要是反过来执行,那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞,如果想要一个SQL 语句实现这个功能的话,我们需要用到Case函数。代码如下:
UPDATE Personnel
SET salary = CASE WHEN salary >= 5000
             THEN salary * 0.9
WHEN salary >= 2000 AND salary < 4600
THEN salary * 1.15
ELSE salary END;

这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。
这种方法还可以在很多地方使用,比如说变更主键这种累活。
一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。
p_key col_1 col_2
a 1 张三
b 2 李四
c 3 王五


假设有如上数据,需要把主键ab相互交换。用Case函数来实现的话,代码如下
UPDATE SomeTable
SET p_key = CASE WHEN p_key = 'a'
THEN 'b'
WHEN p_key = 'b'
THEN 'a'
ELSE p_key END
WHERE p_key IN ('a', 'b');

同样的也可以交换两个Unique key。需要注意的是,如果有需要交换主键的情况发生,多半是当初对这个表的设计进行得不够到位,建议检查表的设计是否妥当。

五,两个表数据是否一致的检查。

Case函数不同于DECODE函数。在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而 实现更多的功能。
下面具个例子来说明,有两个表,tbl_A,tbl_B,两个表中都有keyCol列。现在我们对两个表进行比较,tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到, 返回结果'Matched',如果没有找到,返回结果'Unmatched'。
要实现下面这个功能,可以使用下面两条语句
--使用IN的时候
SELECT keyCol,
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
--使用EXISTS的时候
SELECT keyCol,
CASE WHEN EXISTS ( SELECT * FROM tbl_B
WHERE tbl_A.keyCol = tbl_B.keyCol )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;

使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。

六,在Case函数中使用合计函数

假设有下面一个表
学号(std_id) 课程ID(class_id) 课程名(class_name) 主修flag(main_class_flg)
100 1 经济学 Y
100 2 历史学 N
200 2 历史学 N
200 3 考古学 Y
200 4 计算机 N
300 4 计算机 N
400 5 化学 N
500 6 数学 N

有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。
现在我们要按照下面两个条件对这个表进行查询
  1. 只选修一门课程的人,返回那门课程的ID
  2. 选修多门课程的人,返回所选的主课程ID

简单的想法就是,执行两条不同的SQL语句进行查询。
条件1
--条件1:只选择了一门课程的学生
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*) = 1;

执行结果1
STD_ID   MAIN_class
------   ----------
300      4
400      5
500      6

条件2
--条件2:选择多门课程的学生
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y' ;

执行结果2
STD_ID  MAIN_class
------  ----------
100     1
200     3

如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示
SELECT  std_id,
CASE WHEN COUNT(*) = 1  --只选择一门课程的学生的情况
THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flg = 'Y'
THEN class_id
ELSE NULL END
)
END AS main_class
FROM Studentclass
GROUP BY std_id;

运行结果
STD_ID   MAIN_class
------   ----------
100      1
200      3
300      4
400      5
500      6

通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。
最后提醒一下使用Case函数的新手注意不要犯下面的错误
CASE col_1
WHEN 1        THEN 'Right'
WHEN NULL  THEN 'Wrong'
END


在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。

posted @ 2010-11-06 19:39 雪山飞鹄 阅读(11360) | 评论 (2)编辑 收藏

SQL SELECT INTO 语句可用于创建表的备份复件。
SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

SQL SELECT INTO 语法
您可以把所有的列插入新表:

SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
或者只把希望的列插入新表:

SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
SQL SELECT INTO 实例 - 制作备份复件
下面的例子会制作 "Persons" 表的备份复件:

SELECT *
INTO Persons_backup
FROM Persons
IN 子句可用于向另一个数据库中拷贝表:

SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:

SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
SQL SELECT INTO 实例 - 带有 WHERE 子句
我们也可以添加 WHERE 子句。

下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
SQL SELECT INTO 实例 - 被连接的表
从一个以上的表中选取数据也是可以做到的。

下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

posted @ 2010-11-06 19:26 雪山飞鹄 阅读(1208) | 评论 (0)编辑 收藏

SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
下面的例子中使用的原始表:
Employees_China:
E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:
E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill
使用 UNION 命令
实例
列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
结果
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。
UNION ALL
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

SQL Statement 1
UNION ALL
SQL Statement 2
使用 UNION ALL 命令
实例:
列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
结果
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

posted @ 2010-11-06 19:22 雪山飞鹄 阅读(1771) | 评论 (0)编辑 收藏

http://dean.edwards.name/packer/
据说jquery就是使用它来压缩,以减小体积的,大家不妨试试,很不错的.
posted @ 2010-11-03 11:32 雪山飞鹄 阅读(2453) | 评论 (2)编辑 收藏

仅列出标题
共22页: First 上一页 5 6 7 8 9 10 11 12 13 下一页 Last