風(fēng)雨無阻

          Group By SQL

           

          我們現(xiàn)在回到函數(shù)上。記得我們用 SUM 這個指令來算出所有的 Sales (營業(yè)額)吧!如果我們的需求變成是要算出每一間店 (store_name) 的營業(yè)額 (sales),那怎么辦呢?在這個情況下,我們要做到兩件事:第一,我們對于 store_name 及 Sales 這兩個欄位都要選出。第二,我們需要確認(rèn)所有的 sales 都要依照各個 store_name 來分開算。這個語法為:

          SELECT "欄位1", SUM("欄位2")
          FROM "表格名"
          GROUP BY "欄位1"

          在我們的示范上,

          Store_Information 表格
          store_name Sales Date
          Los Angeles $1500 Jan-05-1999
          San Diego $250 Jan-07-1999
          Los Angeles $300 Jan-08-1999
          Boston $700 Jan-08-1999

          我們就打入,

          SELECT store_name, SUM(Sales)
          FROM Store_Information
          GROUP BY store_name

          結(jié)果:

          store_name SUM(Sales)
          Los Angeles $1800
          San Diego $250
          Boston $700

          當(dāng)我們選不只一個欄位,且其中至少一個欄位有包含函數(shù)的運(yùn)用時,我們就需要用到 GROUP BY 這個指令。在這個情況下,我們需要確定我們有 GROUP BY 所有其他的欄位。換句話說,除了有包括函數(shù)的欄位外,我 們都需要將其放在 GROUP BY 的子句中。

          posted @ 2008-03-23 10:00 秋楓故事 閱讀(198) | 評論 (0)編輯 收藏

          java排序

          冒泡排序:
          /*
            * 冒泡排序:
            */
           public static void sort(int[] data) {
            for (int i = 0; i < data.length; i++) {
             for (int j = data.length - 1; j > i; j--) {
              if (data[j] < data[j - 1]) {
               
               int tmp = data[j];
               data[j] = data[j-1];
               data[j-1] = tmp;
              }
             }
            }
           }

          posted @ 2008-03-22 00:22 秋楓故事 閱讀(142) | 評論 (0)編輯 收藏

          為什么要使用“外連接”

          之前我們看到的左連接 (left join),又稱內(nèi)部連接 (inner join)。在這個情況下,要兩個表格內(nèi)都有同樣的值,那一筆資料才會被選出。那如果我們想要列出一個表格中每一筆的資料,無論它的值在另一個表格中有沒有出現(xiàn),那該怎么辦呢?在這個時候,我們就需要用到 SQL OUTER JOIN (外部連接) 的指令。

          外部連接的語法是依數(shù)據(jù)庫的不同而有所不同的。舉例來說,在 Oracle 上,我們會在 WHERE 子句中要選出所有資料的那個表格之后加上一個 "(+)" 來代表說這個表格中的所有資料我們都要。

          假設(shè)我們有以下的兩個表格:

          Store_Information 表格
          store_name Sales Date
          Los Angeles $1500 Jan-05-1999
          San Diego $250 Jan-07-1999
          Los Angeles $300 Jan-08-1999
          Boston $700 Jan-08-1999

          Geography 表格
          region_name store_name
          East Boston
          East New York
          West Los Angeles
          West San Diego

          我們需要知道每一間店的營業(yè)額。如果我們用一個普通的連接,我們將會漏失掉 'New York'這個店,因?yàn)樗⒉淮嬖谟?Store_Information 這個表格。所以,在這個情況下,我們需要用外部連接來串聯(lián)這兩個表格:

          SELECT A1.store_name, SUM(A2.Sales) SALES
          FROM Georgraphy A1, Store_Information A2
          WHERE A1.store_name = A2.store_name (+)
          GROUP BY A1.store_name

          我們在這里是使用了 Oracle 的外部連接語法。

          如果換成了Mysql:
          select a1.store_name,sum(a2.sales) from geography a1 left join store_information a2
          on a1.store_name=a2.store_name group by a1.store_name;


          結(jié)果:

          store_name SALES
          Boston $700
          New York
          Los Angeles $1800
          San Diego $250

          請注意: 當(dāng)?shù)诙€表格沒有相對的資料時,SQL 會傳回 NULL 值。在這一個例子中, 'New York' 并不存在于 Store_Information 表格,所以它的 "SALES" 欄位是 NULL。

          posted @ 2008-03-20 20:07 秋楓故事 閱讀(620) | 評論 (0)編輯 收藏

          內(nèi)連接和外連接區(qū)別

          在之前,我對MSSQL中的內(nèi)連接和外連接所得出的數(shù)據(jù)集不是很清楚。這幾天重新溫習(xí)了一下SQL的書本,現(xiàn)在的思路應(yīng)該是很清楚了,現(xiàn)在把自己的理解發(fā)出來給大家溫習(xí)下。希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫助。(發(fā)這么菜的教程,各位大大們別笑話偶了,呵:D )

          有兩個表A和表B。
          表A結(jié)構(gòu)如下:
          Aid:int;標(biāo)識種子,主鍵,自增ID
          Aname:varchar

          數(shù)據(jù)情況,即用select * from A出來的記錄情況如下圖1所示:


          圖1:A表數(shù)據(jù)

          表B結(jié)構(gòu)如下:
          Bid:int;標(biāo)識種子,主鍵,自增ID
          Bnameid:int

          數(shù)據(jù)情況,即用select * from B出來的記錄情況如下圖2所示:



          圖2:B表數(shù)據(jù)

          為了把Bid和Aid加以區(qū)分,不讓大家有誤解,所以把Bid的起始種子設(shè)置為100。
          有SQL基本知識的人都知道,兩個表要做連接,就必須有個連接字段,從上表中的數(shù)據(jù)可以看出,在A表中的Aid和B表中的Bnameid就是兩個連接字段。
          下圖3說明了連接的所有記錄集之間的關(guān)系:



          圖3:連接關(guān)系圖

          現(xiàn)在我們對內(nèi)連接和外連接一一講解。
          1.內(nèi)連接:利用內(nèi)連接可獲取兩表的公共部分的記錄,即圖3的記錄集C
          語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
          運(yùn)行結(jié)果如下圖4所示:



          圖4:內(nèi)連接數(shù)據(jù)

          其實(shí)select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的運(yùn)行結(jié)果是一樣的。
          2.外連接:外連接分為兩種,一種是左連接(Left JOIN)和右連接(Right JOIN)
            (1)左連接(Left JOIN):即圖3公共部分記錄集C+表A記錄集A1。     
               語句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
               運(yùn)行結(jié)果如下圖5所示:



          圖5:左連接數(shù)據(jù)

               說明:
                     在語句中,A在B的左邊,并且是Left Join,所以其運(yùn)算方式為:A左連接B的記錄=圖3公共部分記錄集C+表A記錄集A1
                     在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8           
                     圖1中即表A所有記錄集A中存在的Aid為:1 2 3 4 5 6 7 8 9
                     表A記錄集A1中存在的Aid=(圖1中即A表中所有Aid)-(圖3中即記錄集C中存在的Aid),最終得出為:1 4 5 9
                     由此得出圖5中A左連接B的記錄=圖3公共部分記錄集C+表A記錄集A1,
                     最終得出的結(jié)果圖5中可以看出Bnameid及Bid非NULL的記錄都為圖3公共部分記錄集C中的記錄;Bnameid及Bid為NULL的Aid為1 4 5 9的四筆記錄就是表A記錄集A1中存在的Aid。

            (2)右連接(Right JOIN):即圖3公共部分記錄集C+表B記錄集B1。
               語句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
               運(yùn)行結(jié)果如下圖6所示:



          圖6:右連接數(shù)據(jù)

               說明:
                     在語句中,A在B的左邊,并且是Right Join,所以其運(yùn)算方式為:A右連接B的記錄=圖3公共部分記錄集C+表B記錄集B1
                     在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8           
                     圖2中即表B所有記錄集B中存在的Bnameid為:2 3 6 7 8 11
                     表B記錄集B1中存在的Bnameid=(圖2中即B表中所有Bnameid)-(圖3中即記錄集C中存在的Aid),最終得出為:11
                     由此得出圖6中A右連接B的記錄=圖3公共部分記錄集C+表B記錄集B1,
                     最終得出的結(jié)果圖6中可以看出Aid及Aname非NULL的記錄都為圖3公共部分記錄集C中的記錄;Aid及Aname為NULL的Aid為11的記錄就是表B記錄集B1中存在的Bnameid。
               
          總結(jié):

          通過上面的運(yùn)算解說,相信很多人已經(jīng)想到,上面的情況(包括圖3的關(guān)系圖)說明的都只是A在B的左邊的情況,
          以下語句B在A的右邊的又會出現(xiàn)什么情況呢??
          select * from B Left JOIN A ON A.Aid=B.Bnameid
          select * from B Right JOIN A ON A.Aid=B.Bnameid

          其實(shí)對圖3左右翻轉(zhuǎn)一下就可以得出以下結(jié)論:
          select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的記錄集是一樣的

          select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的記錄集也是一樣的。

          posted @ 2008-03-20 17:06 秋楓故事 閱讀(3668) | 評論 (3)編輯 收藏

          用jdom解析xml文件時如何解決中文問題

          import java.io.*;

          public class DOMTest {

           private String outFile = "c:\\people.xml";

           public static void main(String args[]) {
            new DOMTest();
           }

           public DOMTest() {
            try {
             javax.xml.parsers.DocumentBuilder builder =

             javax.xml.parsers.DocumentBuilderFactory.newInstance()
               .newDocumentBuilder();
             org.w3c.dom.Document doc = builder.newDocument();
             org.w3c.dom.Element root = doc.createElement("老師");
             org.w3c.dom.Element wang = doc.createElement("王");
             wang.appendChild(doc.createTextNode("我是王老師"));
             root.appendChild(wang);
             doc.appendChild(root);
             javax.xml.transform.Transformer transformer = javax.xml.transform.TransformerFactory
               .newInstance().newTransformer();
             transformer.setOutputProperty(
               javax.xml.transform.OutputKeys.ENCODING, "gb2312");
             transformer.setOutputProperty(
               javax.xml.transform.OutputKeys.INDENT, "yes");

             transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
               new

               javax.xml.transform.stream.StreamResult(outFile));
            } catch (Exception e) {
             System.out.println(e.getMessage());
            }
           }
          }

          posted @ 2008-03-19 16:59 秋楓故事 閱讀(861) | 評論 (0)編輯 收藏

          JAVA內(nèi)部類

          public class Aqiang {

          // 靜態(tài)內(nèi)部類
           static class Test
           {
            private int i ;
            public Test()
            {
             i = 2;
            }
           }
           class TestB
           {
            private int i = 3;
           }

           private int j;

           public static void main(String args[]) {
            
            // 靜態(tài)內(nèi)部類(Inner Class)意味著1創(chuàng)建一個static內(nèi)部類的對象,不需要一個外部類對象
            Aqiang.Test test = new Aqiang.Test();
            System.out.println("test" + test.i);
            
            // 而非靜態(tài)內(nèi)部類,需要選創(chuàng)建一個外部類對象,然后才能創(chuàng)建內(nèi)部內(nèi)對象
            Aqiang aqiang = new Aqiang();
            Aqiang.TestB tb = aqiang.new TestB();
            System.out.println("testb" + tb.i);

           }
          }

          posted @ 2008-03-18 23:28 秋楓故事 閱讀(131) | 評論 (0)編輯 收藏

          Java IO中字節(jié)流和字符流的區(qū)別

           
          1
          流是一個有序的字節(jié)序列,可作為一個輸入源,也可作為一個輸出的目的地。
          字節(jié)流以字節(jié)為單位輸入輸出,字節(jié)流類名含有stream,字符流以字符為單位輸入輸出,字節(jié)流
          類名含有reader或writer.為了通用性,java中字符是16位的unicode字符,所以8位的字節(jié)流必
          須和16位的字符流進(jìn)行轉(zhuǎn)換。字節(jié)流到字符流的轉(zhuǎn)換使用InputStreamReader類:
          public InputStreamReader(InputStream in);
          public InputStreamReader(InputStream in,String encoding);
          public OuputStreamWriter(OnputStream in);
          public OnputStreamWriter(OnputStream in,String encoding);
          Reader和Writer類允許用戶在程序中無縫的支持國際字符集,如果要讀區(qū)的文件是別國語言,
          要使用字符流。
          JavaI/O字節(jié)流與字符流就是java 實(shí)現(xiàn)輸入/輸出 數(shù)據(jù) 字節(jié)流是一個字節(jié)一個字節(jié)的輸入/輸出 數(shù)據(jù) (兩個字節(jié)組成一個漢字)所以在用字節(jié)流讀一串漢字時會出現(xiàn)亂碼問題,
          同樣字符流是一個字符一個字符流(一個字符=兩個字節(jié))的輸入/輸出 數(shù)據(jù) 用字符流讀一串漢字可以解決亂碼問題.

          posted @ 2008-03-18 18:24 秋楓故事 閱讀(5365) | 評論 (3)編輯 收藏

          實(shí)例:設(shè)備,設(shè)備類型,設(shè)備端口

          有以下三個對象:
          US設(shè)備對象:USDevie
          US設(shè)備類型對象:USDeviceModle
          US設(shè)備端口對象:USDevicePort
          class USDevice
          {
          ....
          // US設(shè)備類型
          USDeviceModel model;

          // US設(shè)備端口對象集合
          Set<USDevicePort> devicePortSet = new HashSet();

          }

          /**
          US設(shè)備類型說明每種設(shè)備都有不同的端口數(shù)目
          */
          class USDeviceModel
          {
          ....

          // 設(shè)備端口數(shù)目
          int deviceport;
          }

          class USDevicePort
          {
          private int deviceId;
          private int devicePort;
          }

                         1              :                    1                    :                    n
          一種US設(shè)備(device)----->設(shè)備類型(model)------>不同數(shù)目的設(shè)備端口
          US設(shè)備:設(shè)備類型:設(shè)備端口數(shù)目 = 1:1:n
          所以,如果新增設(shè)備的時候,要根據(jù)設(shè)備類型,得到相應(yīng)的設(shè)備端口數(shù)目,
          然后在USDevicePort對應(yīng)的數(shù)據(jù)庫表中插入記錄.
          編輯設(shè)備的時候,如果編輯了US設(shè)備類型,則相應(yīng)的設(shè)備端口就會改變,這種
          情況除了更新USDevice對應(yīng)的數(shù)據(jù)表中設(shè)備類型外,因?yàn)樵赨SDevicePort表中
          存放在以前設(shè)備類型的端口記錄,所以應(yīng)該先刪除之前的端口記錄,然后再插入
          現(xiàn)在類型所對應(yīng)的端口記錄.
          其實(shí)只需:

          //這一步根據(jù)具體設(shè)備id,從數(shù)據(jù)庫中取出相應(yīng)的設(shè)備對象
          USDevice device = .....

          // 得到US設(shè)備端口對象集合
          Set devicePortSet = device.getDevicePortSet();

          // 先清空以前所有的端口記錄
          devicePortSet.clear();

          // 根據(jù)編輯后類型ID,得到設(shè)備類型對象,并可以得到此種類型上的端口數(shù)目
          USDeviceModel usModle = ....


          // 根據(jù)上面得到的端口數(shù)據(jù),構(gòu)造"設(shè)備端口數(shù)目"對象,并把所有的設(shè)備端口對象添加到集合中

          //最后更新US設(shè)備


          這樣,每當(dāng)編輯一個US設(shè)備的類型后,在設(shè)備端口表中,這種設(shè)備編輯之前的類型所對應(yīng)的端口記錄
          就會被刪除,而保持只有新的設(shè)備類型端口記錄.

          注意在配置USDevice.hbm.xml文件時,要將<set name="devicePortSet " casecade="all-orphan-delete" .../>
          因?yàn)樗鼤⒑蚒SDevice沒有關(guān)聯(lián)的對象從數(shù)據(jù)中刪除,這也與程序中devicePortSet.clear()相對應(yīng).

           

           

           


           

          posted @ 2008-03-14 23:53 秋楓故事 閱讀(384) | 評論 (0)編輯 收藏

          Hashtable真的能存儲對象嗎?

           

          看一看下面的很簡單的代碼,先是聲明了一個HashtableStringBuffer對象,然后分四次把StriingBuffer對象放入到Hashtable表中,在每次放入之前都對這個StringBuffer對象append()了一些新的字符串:

          package reference;

          import java.util.*;

          public class HashtableAdd{

              public static void main(String[] args){

                  Hashtable ht = new Hashtable();

                  StringBuffer sb = new StringBuffer();

                  sb.append("abc,");

                  ht.put("1",sb);    

                  sb.append("def,");

                  ht.put("2",sb);

                  sb.append("mno,");

                  ht.put("3",sb);

                  sb.append("xyz.");

                  ht.put("4",sb);

                 

                  int numObj=0;

                  Enumeration it = ht.elements();

                  while(it.hasMoreElements()){

                      System.out.print("get StringBufffer "+(++numObj)+" from Hashtable: ");

                      System.out.println(it.nextElement());

                  }

              }

          }

          如果你認(rèn)為輸出的結(jié)果是:
          get StringBufffer 1 from Hashtable: abc,
          get StringBufffer 2 from Hashtable: abc,def

          get StringBufffer 3 from Hashtable: abc,def,mno,
          get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

          那么你就要回過頭再仔細(xì)看一看上一個問題了,把對象時作為入口參數(shù)傳給函數(shù),實(shí)質(zhì)上是傳遞了對象的引用,向Hashtable傳遞StringBuffer對象也是只傳遞了這個StringBuffer對象的引用!每一次向Hashtable表中put一次StringBuffer,并沒有生成新的StringBuffer對象,只是在Hashtable表中又放入了一個指向同一StringBuffer對象的引用而已。

          Hashtable表存儲的任何一個StringBuffer對象(更確切的說應(yīng)該是對象的引用)的改動,實(shí)際上都是對同一個"StringBuffer"的改動。所以Hashtable并不能真正存儲能對象,而只能存儲對象的引用。也應(yīng)該知道這條原則對與Hashtable相似的Vector, List, Map, Set等都是一樣的。

          上面的例程的實(shí)際輸出的結(jié)果是:

          /* RUN RESULT

          get StringBufffer 1 from Hashtable: abc,def,mno,xyz.

          get StringBufffer 2 from Hashtable: abc,def,mno,xyz.

          get StringBufffer 3 from Hashtable: abc,def,mno,xyz.

          get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

          */

          posted @ 2008-03-14 10:45 秋楓故事 閱讀(578) | 評論 (0)編輯 收藏

          關(guān)于標(biāo)簽

          在做編輯功能 的時候,往往會通過一個主鍵ID得到相應(yīng)的對象信息,然后顯示到編輯頁面中。如果涉及到<html:select>標(biāo)簽,
          表示點(diǎn)編輯的時候,選擇下拉框會顯示相應(yīng)的選項(xiàng)。
          JSP頁面一般這樣顯示:
          <html:select property="busiSetId" style="width:120px;">
           <option value="">請選擇</option>
            <logic:present name="ret">
                     <logic:iterate id="model" name="ret">
               <option value="<bean:write name="model" property="ID"/>"><bean:write name="model" property="name"/></option>
                      </logic:iterate>
             </logic:present>
          </html:select>
          但這是樣子總是顯示第一條數(shù)據(jù),解決這個問題最簡單的方法是在JSP頁面最后添加下面語句:
          <script language="javascript">
          document.all("busiSetId").value="<bean:write name='CustomerSetForm' property='busiSetId'/>";
          </script>

          因?yàn)檫@段代碼表示手動設(shè)置busiSetId元素,也就是<html:select>控件的值為要顯示的值,而且這個代碼是放到JSP最后面,
          每次都會執(zhí)行。

          標(biāo)簽嵌套使用注意事項(xiàng):
          <logic:equal value="<bean:write name='customer' property='cusId'/>" >
          注意雙引號內(nèi)只能使用單引號了。

          posted @ 2008-03-13 09:48 秋楓故事 閱讀(267) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          新聞檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 荥经县| 阿巴嘎旗| 莱州市| 高陵县| 定兴县| 景洪市| 娄烦县| 常山县| 榕江县| 伊金霍洛旗| 长汀县| 色达县| 南安市| 新建县| 延川县| 西宁市| 日喀则市| 台北县| 房产| 芷江| 边坝县| 宜章县| 津市市| 瑞金市| 高平市| 建水县| 昌邑市| 靖边县| 金乡县| 浮山县| 丰宁| 金沙县| 河津市| 蓝田县| 滦南县| 胶州市| 远安县| 中山市| 清原| 横山县| 同德县|