2006年11月10日

1.       javascript 中的函数

javascript 的 function 对象在调用过程中具有一个 arguments 属性,它是由脚本解释器创建的,这也是创建 arguments 唯一途径。 Arguments 对象可以看作是一个 Array 对象,它具有 length 属性,可以通过序号访问每一个参数。 Arguments 有个 callee 属性,可以获取到执行的 function 对象的引用。

eg :

funtion f1 ( n )

{

       if(n<=0)

{

       return 1;

}else

{

       return n*arguments.callee(n-1);// 实际同 return n*f1(n-1);

}

上例利用 callee 属性实现了匿名的递归调用。

 

2.       apply 和 call 方法:

apply 方法和 call 方法有形似之处,两者都将函数绑定到其他对象上执行。

举例:

obj1.fun1.apply(obj2,[“test”]);

含义:是将 obj1 对象的方法 fun1 绑定到 对象 obj2 上,并使用参数 test 。

obj1.fun1.call(obj2,“test”);

含义同上,他们区别是在 apply 参数以 array 对象传入。而 call 是依次传入参数的。

 

3.       this 和 with

this 在对象的方法被调用时候,指代调用该方法的对象实例。

使用 with 语句时,代码变得更加短且易读:

没有用 with 之前

x = obj.fun1(“a”);

y = obj.fun2(“b”);

用 with 之后,就变成:

with(obj)

{

x=fun1(“a”);

y=fun2(“b”);

}

4.       for in

在 javascript 中可以使用 for in 语句遍历对象中所有属性和方法。例如下面的代码就遍历了 test1 对象的属性和方法,如果是属性则输出属性值,如果是方法则执行方法。

 

for(p in t)

{

       if(typeof(t[p])==”function”)

       {

              t[p]();

       }else

       {

              alert(t[p]);

       }

}

 

二、 javascript 面向对象编程实现

 

       对比 java 中面向对象编程中继承,以及封装,多态等常见概念,进行总结。

1.       类的声明

首先来看下类的实现,前面已经使用了一种声明类的方法。

 

function test1()

{

       this.prop1 = “prop1”;

       this.prop2 =”prop2”;

       this.fun1 = function()

{

       ……

}

}

 

上面代码声明了两个公有属性,和一个方法。大家都知道类里除了公有成员还可能还有一些私有成员变量,但是 javascript 并没有提供相应的机制来定义私有成员变量,不过利用一些 javascript 的小技巧就可以实现私有成员变量。如下:

function test1 ()

{

       var prop3 = “test”;

       this.prop1 = “prop1”;

       this.prop2 =”prop2”;

       this.fun1 = function()

{

       ……

}

}

 

上面代码通过 var 关键字声明了一个局部变量 prop3 ,其作用域是 test1 类定义的内部,这样就实现了变量私有化。

       另外在 javascript 中可以通过下面的方式声明静态属性和静态方法。

       < script LANGUAGE =" JavaScript " >

    function test ( n )

    {

       

    }

    test . staticProp = " static prop test!" ;

    test . staticMechod = function ()

    {

        alert ( "adfadfd" );

    }

   

    alert ( test . staticProp );

    test . staticMechod ();

 

</ script >

实际上没有感觉到 javascript 中静态的必要性(不像 java ),也许是我对书本理解的不够,或者是应用太少。如果有读者朋友,有不同认识,欢迎发表看法,大家交流。

 

如果要声明一个类的实例属性或方法,可以使用 javascript 中对象的 prototype 属性。例如:

test1.prototype.prop1 = “prop1”;

test1.prototype.method1 = function(){}

利用 prototype 属性,可以实现另外一种类的声明方式:

< script LANGUAGE =" JavaScript " >

    function test ()

    {}

        test . prototype =

        {

            p1 : "p1" ,

            p2 : "p2" ,

            f1 : function ()

            {

                alert ( "f1" );

            }

        }

        var te = new test ();

        te . f1 ();

</ script >

上面使用 {} 的方式声明了一个匿名对象,大括号内用逗号将属性与值的列表分隔开。可以看到,采用 prototype 的方式声明类,代码更加简洁明了。因此这种方式在很多 AJAX 框架中得到广泛应用。

 

2.       继承

javascript 本身并没有提供继承,那么如何实现类的继承呢?最直接大方法是复制原方法,然后在里面加入新成员。但这样做实在是落后,因为当原类变化,新继承的类还要手动变化,容易出错。而下面这种用 for in 控制的复制就不那么容易出错了。

 

function test1()

{

       for(p in test.prototype)

       {

              test1.prototype[p] = test.prototype[p];

       }

       test1.prototype.newmethod = function()

{

           alert(“newfunction”);

}

}

 

3.       多态

多态的是实现可以采用和继承类似的方法。首先定义一个抽象类,其中可以调用一些虚方法,虚方法在抽象类中没有定义,而是通过其具体实现类来实现的。

 

< script LANGUAGE =" JavaScript " >

    // 一个继承方法

    Object . extend = function ( destination , source )

    {

        for ( pro in source )

        {

            destination [ pro ] = source [ pro ];

        }

        return destination ;

    }

    // 一个基类

   

    function base (){}

    base . prototype =

    {

        f1 : function ()

        {

            this . oninit ();

        }

    }

    // 扩展1

    function test1 ()

    {

       

    }

    test1 . prototype = Object . extend (

    {

        prop : "prop" ,

        oninit : function ()

        {

            alert ( this . prop );

        }

    }, base . prototype );

    // 扩展2

    function test2 ()

    {

       

    }

    test2 . prototype = Object . extend (

    {

        prop2 : "prop2" ,

        oninit : function ()

        {

            alert ( this . prop2 );

        }

    }, base . prototype );

   

    // 测试

    var t1 = new test1 ();

    t1 . f1 ();

    var t2 = new test2 ();

    t2 . f1 ();

   

</ script >

 

posted @ 2007-06-17 17:31 黑夜ちつ独行者 阅读(200) | 评论 (0)编辑 收藏

工厂模式:
 客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。


建造模式:
 将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。


工厂方法模式:
 核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。


原始模型模式:
 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。  


单例模式:
 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。


适配器(变压器)模式:
 把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。  


桥梁模式:
 将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。


合成模式:
 合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。


装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。


门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。  

享元模式:
 FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

代理模式:
 代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。


责任链模式:
 在责任链模式中,很多对象由每一个对象对其下家的引用而接   起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。


命令模式:
 命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。  


解释器模式:
 给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。  


迭代子模式:
 迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

调停者模式:
 调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。


备忘录模式:
 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。


观察者模式:
 观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

 

状态模式:
 状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。


策略模式:
 策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。


模板方法模式:
 模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。


访问者模式:
 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

 

 

posted @ 2007-03-28 12:02 黑夜ちつ独行者 阅读(196) | 评论 (0)编辑 收藏

   1)建立一个服务器ServerSocket,并同时定义好ServerSocket的监听端口;
   2)ServerSocket 调用accept()方法,使之处于阻塞。
   3)创建一个客户机Socket,并设置好服务器的IP和端口。
   4)客户机发出连接请求,建立连接。
   5)分别取得服务器和客户端ServerSocket 和Socket的InputStream和OutputStream.
   6)  利用Socket和ServerSocket进行数据通信。


 

服务器:
import java.net.*;
import java.io.*;
public class MypwServer {

 public MypwServer() {
  super();
  // TODO Auto-generated constructor stub
 }
    public void Activate() throws Exception{
   
      ServerSocket ss = new ServerSocket(5678);
     
      Socket soc = ss.accept();
      
     BufferedReader br = new BufferedReader(new InputStreamReader(soc.getInputStream()));
     PrintWriter pw = new PrintWriter(soc.getOutputStream());
     while(true){
      String str = br.readLine();
      pw.println(str);
      //pw.flush();
//      if(str.equals("end")){
//       break;
//      }
    // System.out.println(str);
     }
   
    }
   
    public static void main(String[] args){
     MypwServer mys = new MypwServer();
     try {
   mys.Activate();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
     
    }
}




import java.net.*;
import java.io.*;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Client extends JFrame implements ActionListener
{
 
 static String str;
 static String sy;
 static PrintStream p;
 JButton btn,btn1;
 JLabel ble;
 static JTextArea tex  = new JTextArea();
 static JTextArea tex1 = new JTextArea();
 public Client()
 {
  this.setTitle("聊天室");
  this.setSize(500,420);
  this.setLocation(230,60);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setResizable(false);
  this.setLayout(null);
  
  Container con = this.getContentPane();
  btn  = new JButton("发送");
  btn1 = new JButton("关闭");
  btn.addActionListener(this);
  btn1.addActionListener(this);
  btn.setBounds(20,360,60,20);
  btn1.setBounds(120,360,60,20);
  tex.setBounds(0,0,250,150);
  tex1.setBounds(0,180,250,160);
  con.add(btn);
  con.add(btn1);
  con.add(tex);
  con.add(tex1);
  
  this.setVisible(true);
 }
 
 
 客户机:
 public static void main(String[] args) throws Exception
 {
  new Client();
  Socket so = new Socket("localhost",5678);
  BufferedReader br = new BufferedReader(new InputStreamReader(so.getInputStream()));
  
  p = new PrintStream(so.getOutputStream());
  BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
  
  while(true)
  {
   
   str = tex1.getText();
   
   if (str.equals(null))
    break;
  }
  so.close();
 }
 
 
 public void actionPerformed(ActionEvent a)
 {
  Object obj = a.getSource();
  
  if(obj == btn)
  {
   p.println(str);
   tex.append(str + "\n");
   tex1.setText("");
  }
  
  if(obj == btn1)
  {
   System.exit(0);
  }
 }
}

posted @ 2006-11-26 20:43 黑夜ちつ独行者 阅读(1146) | 评论 (0)编辑 收藏

   首先我们先建立一个接口StudnetDao
  public interfaces StudentDao{
            public void insert(Student student);
}

再用一个类来实现该接口

public class StudentDaoimp implements StudentDao{
         public void insert(Student student){
      }
}

用一个工厂来产生对象

public class DaoFactory{
      public static StudentDao getStudentDao(){
            return new StudentDaoimp();         
      }
}

public class Student{
      private int studentID;

   public int getStudentID() {
     return studentID;
 }
 public void setStudentID(int age) {
     this.studentID= studentID;
 }


}

posted @ 2006-11-26 20:23 黑夜ちつ独行者 阅读(230) | 评论 (0)编辑 收藏

常见排序法:

public class Sort{
   public static int count=0;

   public boolean LT(int num1,int num2){
      return num1<num2;
   }
   public void output(int[] array){
      System.out.print("第"+count+"次排序:");
      for(int i=0;i<array.length;i++)
      System.out.print(array[i]+"    ");
      System.out.println();
   }

   //冒泡排序法
   public void BubbleSort(int[] array){
      boolean swap=true;
      int index=0;

      int i=0;
      while(i<array.length-1){
         int temp=array[i];
         for(int j=i;j<array.length;j++){
            if(!LT(array[i],array[j])){
            int temp2=array[i];
            array[i]=array[j];
            array[j]=temp2;
            swap=true;
            index=j;
            }else{
            swap=false;
            }
         }
         i++;
         if(swap){
         array[i]=array[index];
         array[index]=temp;
         i++;
         }
   output(array);
   }
   }


//直接插入排序法
public void InsertSort(int[] array){
   for(int i=1;i<array.length;++i){
      if (LT(array[i],array[i-1])){
         int temp=array[i];
         array[i]=array[i-1];
         array[i-1]=temp;
         for(int j=i-1;j>0;--j){
            if(LT(array[j],array[j-1])){
               array[j]=array[j-1];
               array[j-1]=temp;
            }else{
                  break;
                    }
         }
   output(array);
   }
}
}


//快速排序法
private int Partition(int array[],int low,int high){
   int temp=array[low];
   int pivotkey=array[low];

   while(low<high){
      while(low<high&&array[high]>pivotkey) --high;
      array[low]=array[high];
      while(low<high&&array[low]<=pivotkey) ++low;
      array[high]=array[low];
   }
   array[low]=temp;
   output(array);
   return low;
}


public void QSort(int array[],int low,int high){
   if(low<high){
      int pivotloc=Partition(array,low,high);
      QSort(array,low,pivotloc-1);
      QSort(array,pivotloc+1,high);
   }
}


void QuickSort(int array[]){
   QSort(array,0,array.length-1);
}

public static void main(String args[]){
   int array[]={49,38,65,97,76,13,27,49};
   Sort sort=new Sort();

   System.out.println("===================================");
   sort.output(array);
   System.out.println("优化冒泡排序法");
   sort.BubbleSort(array);

   System.out.println();
   System.out.println("===================================");
   array=new int[]{49,38,65,97,76,13,27,49};
   sort.output(array);
   System.out.println("直接插入排序法");
   sort.InsertSort(array);

   System.out.println();
   System.out.println("===================================");
   array=new int[]{49,38,65,97,76,13,27,49};
   sort.output(array);
   System.out.println("快速排序法");
   sort.QuickSort(array);
}
}

 

posted @ 2006-11-10 23:03 黑夜ちつ独行者 阅读(410) | 评论 (0)编辑 收藏

4.1    添加新的数据
         格式:insert   into   表名   (列名) values (要赋的值);

4.2     更新已经存在的数据
         格式:update   表名   set   新的列值   where   过滤条件;

                     或update   表名 

                         set   列1=新值 1     列2=新值2    列3=新值3 
                         where   过滤条件;

4.3      删除数据

          使用selete删除行
                格式:  selete   from   表名   where   过滤条件;

                              (如果不指定WHERE子句,表中所有行将被删除)

                              (为了保持引用的完整性,删除的必须是没有被连接的行)

         使用truncate语句删除行

                  格式:truncate   table   表名;

         selete和truncate的比较

      truncate执行起来比selete要快,因为它不留下详细的删除记录日志。是永久性的删除,不
可以回的。 
  
      selete删除行是要保留下详细的删除记录日志的,所以用selete  删除的行是可以恢复的。

posted @ 2006-11-10 20:18 黑夜ちつ独行者 阅读(260) | 评论 (0)编辑 收藏

3.1、创建表
格式:create table 表名;

3.2、删除表
格式:drop table 表名;

3.3、创建临时表
格式:create gkoabl temporary table temp
AS
select Name,PhoneNo from friend;

3.4、复制表
格式:create table My_friend AS select*from friend;

3.5 、创建非空约束 ( not null )

3.6、指定默认值 ( default '默认值内容' )

3.7、设定主键 ( primary key )

3.8、设置唯一约束 ( 语句后面加 unipue )

3.9、设置检查约束
格式:age int check(age between 20 and 50);
或 sex varchar check(sex in ('男','女'));

3.10 、使用序列 ( sequences)
格式:
create sequences friendidseq;
(序列的初始值为1,增量为1)

create sequences friendidseq increment by 1
start with 1000;
(序列的初始值为1000,增量为1)
显示最后一个序列值
select friendidseq.currval from dual;

3.11、使用自动编号字段
格式:create sequences seq;

create or replace trigger autonumber
before insert on friend
for each row
begin
select seq.nextval
into :new.friendid from dual;
end;

3.12、外键约束
关键字:constraint   foreign key()
                 references 
举例
         create   table   student(
         studentid   int   not   null   primary   key,
         name   varchar(20)   not   null
         );
         
         create   table   phone(
         phoneid   int   not   null   primary   key,
         studentid   int   not   null,
         phone   varchar(14),

         constraint   fid_fk   foreign   key(srudentid)
             references    student(studentid)        
         ) ;

3.13、创建索引
         格式:create   index   nameindex   on   student (name);   (创建非唯一索引)
                     create   unique   index   nameindex   on   student(name);   (创建唯一索引)  
                     
        查询索引:
                      select   student.name   from   student   where   name = '但是';    
  
                      select   student.name   from   student   where   name =  '%电' ;
        删除索引
                      drop   index   nameindex;   
               

posted @ 2006-11-10 20:16 黑夜ちつ独行者 阅读(340) | 评论 (0)编辑 收藏

5.1   返回所有列
         select   *from   表名;

5.2   指定目标数据库
         select   *from   scott.emp;

5.3   返回单列
         select   列名   from   表名;
         举例:select   name   from   student;
                     select   student.name   from   student;(在存在多个表的时候用)

5.4      返回多列
         select   列1   列2   列3   from   表名;
         举例:select   studentid,name,age   from   student;

5.5      使用别名
          语法: select   列1   as   列名 ,  列2   as   列名   from  表名   as   表名;
                 或  select  T. 列1   as   列名 , T. 列2   as   列名   from  表名   as   T;
   
           举例:select   studentid   as   stuid ,name   as   stuname   from   student   as   class;
            语句返回的列名为stuid和stuname  

5.6       连接字符串
               oracle使用 || 来连接;

5.7        数据排序
            排序的值可以是字母、数字、时间等;
            语法:
                  select   列1,列2   from   表   order   by   列1   asc;
                  (按照列1中的值升序排列,其中asc 可以忽略) 
                  select   列1,列2   from   表   order   by   列1   desc;     
                  (按照列1中的值降序排列,其中desc不 可以忽略) 

5.8      使用distinct排除重复数据
               语法:select distinct   列1   from   表;
               例:select   distinct   name   from   student;



5.9



      

posted @ 2006-11-10 20:16 黑夜ちつ独行者 阅读(258) | 评论 (0)编辑 收藏

DataArchitect模块是PowerDesigner的核心工具,它在需求分析阶段可以用来绘制实体联系图(E—R 图),即系统的概念数据模型。

它描述系统中的实体以及实体之间的关系,是系统的静态特征。系统分析员通过实体联系图表达对系统静态特征的理解。它实际上相当于系统的一个初步的数据字典。由实体联系图所表达的数据模型与数据流程图所表达的功能模型结合在一起就构成了系统完整的逻辑模型。

系统进一步的开发将以此为基础。当系统的开发进入设计阶段时,开发人员必须提出系统的物理数据模型,这时DataArchitect 可以实现概念数据模型向物理数据模型的
自动转换,设计人员可以在物理数据模型的基础上,进行数据库的后台设计。


<一>数据规范的原因?
目的:防止数据丢失和不一致性数据,减少数据冗于。


<二>理解三种范式
第一范式:
1)任何给定行的列必须是只包含一个值;
2)表中的每一行必须有相同数量的列;
3)表中的每一行必须是唯一的即是不相同的;
第二范式:
1)必须满足第一范式;
2)表中的所有非主键必须依赖一整个主键;
第三范式:
1)必须满足第二范式;
2)表中的所有非主键必须相互独立;
范式中还有复合主键的用法;

<三> 存在的关系哪些?
1)一对一关系;(多用于在数据敏感,列太多或要求性能高的时候)
2)一对多关系;
3)多对多关系;

<四> 数据建模的四个步骤是什么?
1)识别将会在数据库中出现的潜在的实体;
2)规范已经识别的实体中的数据;
3)识别表之间的关系;
4)改进数据模型,确保全规范化;


posted @ 2006-11-10 20:15 黑夜ちつ独行者 阅读(8584) | 评论 (0)编辑 收藏

视图的简介
         视图提供了一种数据库表中的数据进行半持久性改造的方式,我们可以使用访问视图来代替直接访问表。这种方式的优点就是给了用户一个附加抽象层,这意味着我们可以以一种更一致的方式格式数据;同时,采用这种方式使用户仅可以访问视图,而不是下层数据,从而增强了数据的安全性。视图有时被称为拟表。

视图的优点
      1)将用户的注意力集中到特定的数据上,以到达保护数据安全性的目的。因为视图可以限制用户从表中所检查的内容;而不是表中存储的所有数据。
         2)简化了数据的查询和处理操作。
         3)有利于数据的交换操作。我们可以自己定义一个视图,把需要交换的数据集中到一个视图,从而简化了数据的交换操作。
         4)有利于简化对用户的权限管理。

创建视图
          语法:create view  视图名 as query
           举例:
     创建        create view studentsummary
                     as
                     select studnet.studentid,student.name,
                           count(*) as examstaken
                      from student
                      inner join studentexam
                      on student.studentid=studentexam.studentid
                      group by student.studentid,student.name

            使用:select studentid,name,examstaken from studentexam




posted @ 2006-11-10 20:13 黑夜ちつ独行者 阅读(417) | 评论 (0)编辑 收藏

存储过程概述

      单个存储过程包含了增添数据、修改数据、执行计算、返回数据等多行命令语句。通过存储过程我们可以使得对数据库的管理、显示关于数据库及其用户信息的工作变得容易
      存储过程是SQL语句和可选控制语句的预编译集合。

存储过程的优点
  1)允许模块化程序设计:在程序设计中只要创建一次并将其存储在数据库中,以后即可在程序中多次调用该过程。
  2)允许更快执行:在一个程序中如果存在大量的重复代码,就可以使用存储过程来代替;存储过程在调用以后将在内存中,下次调用该过程就变得很快,就无须在次从客户端发送,这样就进行了编译和优化。
  3)减少了网络流量:存储过程将代替大量的重复代码。
  4)可作用于安全机制:即使在没有直接执行的存储过程中的语句的权限用户,也可授予我们执行该存储过程的权限。

创建存储过程
语法:create procedure  存储过程名 参数表
            as
             begin
                     存储过程主体
              end;

使用存储过程
         call  insertstudent(400,'忽忽');
          call  deleterow(2)     删除一行

修改和删除存储过程
   drop  procedure  procname;(删除)
   alter  procedure  procname;(修改)

posted @ 2006-11-10 20:12 黑夜ちつ独行者 阅读(160) | 评论 (0)编辑 收藏