七郎's JavaBlog

          草木竹石皆可為劒。至人之用人若鏡,不將不迎,應(yīng)而不藏,故能勝物而不傷。
          posts - 60, comments - 14, trackbacks - 0, articles - 0

          <base href="<?xml version="1.0" encoding="gb2312"?>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
          <html xmlns="<head>
          <title>DWMX Tutor --- A Simple Menu</title>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
          <script>// Example: obj = findObj("image1");
          function findObj(theObj, theDoc)
          {
            var p, i, foundObj;
           
            if(!theDoc) theDoc = document;
            if( (p = theObj.indexOf("?")) > 0 && parent.frames.length)
            {
              theDoc = parent.frames[theObj.substring(p+1)].document;
              theObj = theObj.substring(0,p);
            }
            if(!(foundObj = theDoc[theObj]) && theDoc.all) foundObj = theDoc.all[theObj];
            for (i=0; !foundObj && i < theDoc.forms.length; i++)
              foundObj = theDoc.forms[i][theObj];
            for(i=0; !foundObj && theDoc.layers && i < theDoc.layers.length; i++)
              foundObj = findObj(theObj,theDoc.layers[i].document);
            if(!foundObj && document.getElementById) foundObj = document.getElementById(theObj);
           
            return foundObj;
          }
          </script>
          <style type="text/css">
          <!--
          .folder {
              font-family: "Verdana", "Arial", "Helvetica", "sans-serif";
              font-size: 10px;
              background-image: url(e.gif);
              background-repeat: no-repeat;
              background-position: left;
              padding-left: 40px;
              cursor: hand;
          }
          .collapsedFolder {
              font-family: "Verdana", "Arial", "Helvetica", "sans-serif";
              font-size: 10px;
              background-image: url(c.gif);
              background-repeat: no-repeat;
              background-position: left;
              padding-left: 40px;
              cursor: hand;
          }
          .submenu {
              padding-left: 18px;
          }
          .iefile {
              background-image: url(ie.gif);
              background-repeat: no-repeat;
              background-position: left;
              padding-left: 20px;
              font-family: "Verdana", "Arial", "Helvetica", "sans-serif";
              font-size: 9px;
          }
          a {
              color: #003399;
              text-decoration: none;
              border: 1px solid #FFFFFF;
          }
          a:hover {
              color: #FF0000;
              background-color: #eeeeee;
              border: 1px solid #006699;
          }
          body {
              margin: 0px;
              background-color: buttonface;
              overflow: hidden;
              border: 0px;
          }
          .ctrlbar {
              border: 1px inset;
          }
          .explorer {
              background-color: #FFFFFF;
              border: 1px inset;
          }
          -->
          </style>
          <style type="text/css">
          <!--
          .ctbutton {
              font-family: Arial, Helvetica, sans-serif;
              font-size: 8px;
              background-color: #eeeeee;
              border-width: 1px;
              width: 9px;
              height: 100px;
              margin-bottom: 100px;
          }
          -->
          </style>
          <base target="browserframe"/>
          </head>

          <body>
          <table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
            <tr>
              <td width="150" align="center" valign="top" class="explorer" id="menubar">
             
             </td>
              <td width="1" class="ctrlbar"><button class="ctbutton" onFocus="blur();" onMouseUp="with(findObj('menubar').style){display=display=='none'?'':'none';this.innerText=display=='none'?'>':'<'}" onMouseOver="this.style.backgroundColor='#ffffff'" onMouseOut="this.style.backgroundColor='#eeeeee'"><</button></td>
              <td class="explorer">
          <iframe name="browserframe" id="browserframe" width="100%" height="100%" scrolling="auto" frameborder="0">

          </iframe></td>
            </tr>
          </table>
          </body>
          </html>

          posted @ 2007-07-27 17:24 七郎歸來 閱讀(420) | 評論 (0)編輯 收藏

          create table t1(cid int,cname varchar2(100));
          insert into t1 values (1,'1');
          create table t2(cid int,cname varchar2(100));
          insert into t2 values(1,'3');       
          insert into t2 values(2,'4'); 


          MERGE INTO t1 a
                USING t2 b
              on (a.cid=b.cid)
              WHEN MATCHED  THEN
                  UPDATE SET a.cname=b.cname
              WHEN NOT MATCHED THEN
                  INSERT (a.cid,a.cname ) VALUES ( b.cid,b.cname );

          posted @ 2007-06-14 11:57 七郎歸來 閱讀(222) | 評論 (0)編輯 收藏

          public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            String perCode="sgyyfj123";
            Connection con;
            Statement stmt;
            ResultSet rs;
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@10.194.129.49:1521:test", "gdcrm", "gdcrm");
            stmt = con.createStatement();
            rs = stmt.executeQuery("select * from bbscs_userinfo where username='"+perCode+"'");
            if(rs.next()){
             System.out.print("有有有有有");
            }else{
             System.out.print("沒沒沒沒沒");
             stmt.execute("insert into bbscs_userinfo(ID,USERNAME,NICKNAME,PASSWD,REPASSWD,EMAIL,QUESTION,ANSWER,LOGINTIME,LOGOUTTIME,LOGINTIMES,POST,EXP,EXPRESSION,ARTICLENUM,STAYTIME,POWER,HPOWER) " +
               "values(BBSCS_USERINFO_SEQ.NEXTVAL,'"+perCode+"','"+perCode+"',000,000,'admin@crm.gdcrm.com.cn','admin','gdcrm',10,10,10,10,10,10,10,10,10,10)");
            }
             

          }

          posted @ 2007-05-18 17:04 七郎歸來 閱讀(254) | 評論 (0)編輯 收藏

          select count(distinct v_yjhm)
            from (select v_yjhm
                    from zjjk_t_yssj_o_his a
                   where n_yjzl > 0
                     and d_sjrq between to_date('20070301', 'yyyymmdd') and
                         to_date('20070401', 'yyyymmdd')
                     and v_yjzldm like '40%'
                     and not exists(select 'a' from INST_TRIG_ZJJK_T_YSSJ_O b where a.v_yjtm=b.yjbh)
                     --and v_yjtm not in (select yjbh from INST_TRIG_ZJJK_T_YSSJ_O)
                  union
                  select v_yjhm
                    from zjjk_t_yssj_u_his a
                   where n_yjzl > 0
                     and d_sjrq between to_date('20070301', 'yyyymmdd') and
                         to_date('20070401', 'yyyymmdd')
                     and v_yjzldm like '40%'
                     and not exists(select 'a' from INST_TRIG_ZJJK_T_YSSJ_U b where a.v_yjtm=b.yjbh))
                     --and v_yjtm not in (select yjbh from INST_TRIG_ZJJK_T_YSSJ_U))
           
          說明:1、zjjk_t_yssj_o_his 、zjjk_t_yssj_u_his  的d_sjrq 上都有一個(gè)索引了
                   2、zjjk_t_yssj_o_his 、zjjk_t_yssj_u_his   的v_yjtm 都為 not null 字段
                  3、INST_TRIG_ZJJK_T_YSSJ_O、INST_TRIG_ZJJK_T_YSSJ_U 的 yjbh 為PK
               
          優(yōu)化建議:
          1、什么是DISTINCT ?   就是分組排序后取唯一值   ,底層行為  分組排序
          2、什么是 UNION 、 UNION ALL  ?  UNION : 對多個(gè)結(jié)果集取DISTINCT ,生成一個(gè)不含重復(fù)記錄的結(jié)果集,返回給前端,UNION ALL :不對結(jié)果集進(jìn)行去重復(fù)操作     底層行為:分組排序
          3、什么是 COUNT(*)   ?   累加
          4、需要有什么樣的索引?   S_sjrq + v_yjzldm  : 理由: 假如全省的數(shù)據(jù)量在表中全部數(shù)為1000萬,查詢月數(shù)據(jù)量為200萬,1000萬中特快占50%, 則 通過 beween 時(shí)間(d_sjrq)+ 種類( v_yjzldm ),可過濾出約100萬,這是最好的檢索方式了。
          5、兩表都要進(jìn)行一次 NOT EXISTS 運(yùn)算,如何做最優(yōu)?   NOT EXISTS 是不好做的運(yùn)算,但是我們可以合并兩次的NOT EXISTS 運(yùn)算。讓這費(fèi)資源的活只干一次。
           
          綜合以上,我們可以如下優(yōu)化這個(gè)SQL:
            1、內(nèi)部的UNION 也是去重復(fù),外部的DISTINCT 也是去重復(fù),可左右去掉一個(gè),建議內(nèi)部的改為 UNION ALL , 這里稍請注意一下,如果V_YJHM 有NULL的情況,可能會引起COUNT值不對實(shí)際數(shù)的情況。
            2、建一個(gè) D_SJRQ+V_YJZLDM 的復(fù)合索引
            3、將兩個(gè)子查詢先 UNION ALL 聯(lián)結(jié) , 另兩個(gè)用來做 NOT EXISTS 的表也 UNION ALL  聯(lián)結(jié)
            4、在3的基礎(chǔ)上再做 NOT EXISTS
            5、將NOT EXISTS 替換為NOT IN ,同時(shí)加提示 HASH_AJ 做半連接HASH運(yùn)算
            6、最后為外層的COUNT(DISTINCT … 獲得結(jié)果數(shù)
           
           
          SQL書寫如下:
          select count(distinct v_yjhm)
            from (select v_yjtm, v_yjhm
                    from zjjk_t_yssj_o_his a
                   where n_yjzl > 0
                     and d_sjrq between to_date('20070301', 'yyyymmdd') and
                         to_date('20070401', 'yyyymmdd')
                     and v_yjzldm like '40%'
                  union all
                  select v_yjtm, v_yjhm
                    from zjjk_t_yssj_u_his a
                   where n_yjzl > 0
                     and d_sjrq between to_date('20070301', 'yyyymmdd') and
                         to_date('20070401', 'yyyymmdd')
                     and v_yjzldm like '40%'
                  ) a
           where a.v_yjtm not IN
                 (select /*+ HASH_AJ */
                   yjbh
                    from (select yjbh
                            from INST_TRIG_ZJJK_T_YSSJ_O
                          union all
                          select yjbh from INST_TRIG_ZJJK_T_YSSJ_U))

          經(jīng)過上述改造,原來這個(gè)SQL的執(zhí)行時(shí)間如果為2分鐘的話,現(xiàn)在應(yīng)該20秒足夠!

          posted @ 2007-04-28 10:47 七郎歸來 閱讀(585) | 評論 (0)編輯 收藏

          SELECT AVG(ticket_key) , ticket_title
          FROM srweb_ticket_ticket
          GROUP BY ticket_title

          以上這句是按照投票的標(biāo)題排序,體現(xiàn)在GROUP BY ticket_title,執(zhí)行完上序之后得出如下的結(jié)果
          328       蘋果
          328       葡萄
          327       西瓜

          如果加上having條件的話會出現(xiàn)如下的結(jié)果,having是出現(xiàn)在group by之后的條件的
          SELECT AVG(ticket_key) , ticket_title
          FROM srweb_ticket_ticket
          GROUP BY ticket_title having AVG(ticket_key)>327

          328       蘋果
          328       葡萄

          如果再加上where條件的話會出現(xiàn)下面的結(jié)果
          SELECT AVG(ticket_key) , ticket_title
          FROM srweb_ticket_ticket
          where ticket_title not in('葡萄') GROUP BY ticket_title having AVG(ticket_key)>327

          328       蘋果

          通過分析,式子。。首先是執(zhí)行where條件去掉一些不滿足的,之后通過group by按照類型進(jìn)行分組運(yùn)算,之后在分組求了數(shù)的基礎(chǔ)上再用having去掉一些數(shù)據(jù)

          posted @ 2007-04-27 16:48 七郎歸來 閱讀(9405) | 評論 (1)編輯 收藏


          表操作

           

          例 1 對于表的教學(xué)管理數(shù)據(jù)庫中的表 STUDENTS ,可以定義如下:

             CREATE TABLE STUDENTS

             (SNO      NUMERIC (6, 0) NOT NULL

             SNAME    CHAR (8) NOT NULL

             AGE      NUMERIC(3,0)

             SEX      CHAR(2)

             BPLACE CHAR(20)

             PRIMARY KEY(SNO))

          例 2 對于表的教學(xué)管理數(shù)據(jù)庫中的表 ENROLLS ,可以定義如下:

                  CREATE TABLE ENROLLS

                  (SNO      NUMERIC(6,0) NOT NULL

                  CNO     CHAR(4) NOT NULL

                  GRADE   INT

                  PRIMARY KEY(SNO,CNO)

                  FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO)

                  FOREIGN KEY(CNO) REFERENCES COURSES(CNO)

                  CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100)))

          例 3 根據(jù)表的 STUDENTS 表,建立一個(gè)只包含學(xué)號、姓名、年齡的女學(xué)生表。

                  CREATE TABLE GIRL

                  AS SELECT SNO, SNAME, AGE

                  FROM STUDENTS

                  WHERE SEX=' 女 ';


           

          例 4 刪除教師表 TEACHER 。

                  DROP TABLE TEACHER

          例 5 在教師表中增加住址列。

                 ALTER TABLE TEACHERS

                 ADD (ADDR CHAR(50))

          例 6 把 STUDENTS 表中的 BPLACE 列刪除,并且把引用 BPLACE 列的所有視圖和約束也一起刪除。

                  ALTER TABLE STUDENTS

                  DROP BPLACE CASCADE

          例 7 補(bǔ)充定義 ENROLLS 表的主關(guān)鍵字。

                 ALTER TABLE ENROLLS

                 ADD PRIMARY KEY (SNO,CNO) ;

           

          視圖操作(虛表)

           

          例 9 建立一個(gè)只包括教師號、姓名和年齡的視圖 FACULTY 。 ( 在視圖定義中不能包含 ORDER BY 子句 )

                  CREATE VIEW FACULTY

                  AS SELECT TNO, TNAME, AGE

                  FROM TEACHERS

          例 10 從學(xué)生表、課程表和選課表中產(chǎn)生一個(gè)視圖 GRADE_TABLE , 它包括學(xué)生姓名、課程名和成績。

                  CREATE VIEW GRADE_TABLE

                  AS SELECT SNAME,CNAME,GRADE

                  FROM STUDENTS,COURSES,ENROLLS

                  WHERE STUDENTS.SNO = ENROLLS.SNO AND

                  COURSES.CNO=ENROLLS.CNO

          例 11 刪除視圖 GRADE_TABLE

                  DROP VIEW GRADE_TABLE RESTRICT

           

          索引操作

           

          例 12 在學(xué)生表中按學(xué)號建立索引。

                  CREATE  UNIQUE  INDEX  ST

                  ON STUDENTS (SNO,ASC)

          例 13 刪除按學(xué)號所建立的索引。

                  DROP INDEX ST

           

          數(shù)據(jù)庫模式操作

           

          例 14 創(chuàng)建一個(gè)簡易教學(xué)數(shù)據(jù)庫的數(shù)據(jù)庫模式  TEACHING_DB ,屬主為 ZHANG 。

                  CREATE SCHEMA TEACHING_DB  AUTHRIZATION  ZHANG

          例 15 刪除簡易教學(xué)數(shù)據(jù)庫模式 TEACHING_DB 。(( 1 )選用 CASCADE ,即當(dāng)刪除數(shù)據(jù)庫模式時(shí),則本數(shù)據(jù)庫模式和其下屬的基本表、視圖、索引等全部被刪除。( 2 )選用 RESTRICT ,即本數(shù)據(jù)庫模式下屬的基本表、視圖、索引等事先已清除,才能刪除本數(shù)據(jù)庫模式,否則拒絕刪除。)

                  DROP SCHEMA TEACHING_DB CASCADE

          單表操作

           

          例 16 找出 3 個(gè)學(xué)分的課程號和課程名。

                   SELECT CNO, CNAME

                   FROM   COURSES

                   WHERE   CREDIT = 3

          例 17 查詢年齡大于 22 歲的學(xué)生情況。

                   SELECT *

                   FROM   STUDENTS

                   WHERE AGE > 22

          例 18   找出籍貫為河北的男生的姓名和年齡。

                   SELECT SNAME, AGE

                   FROM   STUDENTS

                   WHERE   BPLACE = ' 河北 '  AND SEX = ' 男 '

          例 19 找出年齡在 20 ~ 23 歲之間的學(xué)生的學(xué)號、姓名和年齡,并按年齡升序排序。 (ASC (升序)或 DESC (降序)聲明排序的方式,缺省為升序。 )

                   SELECT SNO, SNAME, AGE

                   FROM   STUDENTS

                   WHERE AGE BETWEEN 20 AND 23

                   ORDER BY  AGE

          例 20 找出年齡小于 23 歲、籍貫是湖南或湖北的學(xué)生的姓名和性別。(條件比較運(yùn)算符=、< 和邏輯運(yùn)算符 AND (與),此外還可以使用的運(yùn)算符有:>(大于)、>=(大于等于)、<=(小于等于)、<>(不等于)、 NOT (非)、 OR (或)等。

          謂詞 LIKE 只能與字符串聯(lián)用,常常是 “ <列名>  LIKE pattern” 的格式。特殊字符 “_” 和 “%” 作為通配符。

          謂詞 IN 表示指定的屬性應(yīng)與后面的集合(括號中的值集或某個(gè)查詢子句的結(jié)果)中的某個(gè)值相匹配,實(shí)際上是一系列的 OR (或)的縮寫。謂詞 NOT IN 表示指定的屬性不與后面的集合中的某個(gè)值相匹配。

          謂詞 BETWEEN 是 “ 包含于 … 之中 ” 的意思。)

                  SELECT SNAME, SEX

                  FROM   STUDENTS

                  WHERE AGE < 23 AND BPLACE LIKE' 湖% '

                  或

                  SELECT SNAME, SEX

                  FROM   STUDENTS

                  WHERE AGE < 23 AND BPLACE IN ( ' 湖南 ' , ' 湖北 ' )

          例 22 找出學(xué)生表中籍貫是空值的學(xué)生的姓名和性別。(在 SQL 中不能使用條件:<列名>= NULL 。在 SQL 中只有一個(gè)特殊的查詢條件允許查詢 NULL 值:)

                 SELECT SNAME, SEX

                 FROM   STUDENTS

                 WHERE BPLACE IS NULL


           

          多表操作

           

          例 23 找出成績?yōu)?95 分的學(xué)生的姓名。(子查詢)

                  SELECT SNAME

                  FROM   STUDENTS

                  WHERE   SNO =

                        (SELECT SNO

                         FROM   ENROLLS

                         WHERE GRADE = 95)

          例 24 找出成績在 90 分以上的學(xué)生的姓名。

                 SELECT SNAME

                  FROM   STUDENTS

                  WHERE SNO IN

                          (SELECT SNO

                          FROM ENROLLS

                          WHERE GRADE > 90)

                  或

                  SELECT SNAME

                  FROM   STUDENTS

                  WHERE SNO = ANY

                          (SELECT SNO

                          FROM ENROLLS

                          WHERE GRADE > 90)

          例 25 查詢?nèi)繉W(xué)生的學(xué)生名和所學(xué)課程號及成績。(連接查詢)

                  SELECT SNAME, CNO, GRADE

                  FROM   STUDENTS, ENROLLS

                  WHERE STUDENTS.SNO = ENROLLS.SNO

          例 26 找出籍貫為山西或河北,成績?yōu)?90 分以上的學(xué)生的姓名、籍貫和成績。(當(dāng)構(gòu)造多表連接查詢命令時(shí),必須遵循兩條規(guī)則。第一,連接條件數(shù)正好比表數(shù)少 1 (若有三個(gè)表,就有兩個(gè)連接條件 ) ;第二,若一個(gè)表中的主關(guān)鍵字是由多個(gè)列組成,則對此主關(guān)鍵字中的每一個(gè)列都要有一個(gè)連接條件(也有少數(shù)例外情況))

                  SELECT SNAME, BPLACE, GRADE

                  FROM   STUDENTS, ENROLLS

                  WHERE BPLACE IN (‘ 山西 ’ , ‘ 河北 ’) AND GRADE >= 90 AND   STUDENTS.SNO=ENROLLS.SNO

          例 28 查出課程成績在 80 分以上的女學(xué)生的姓名、課程名和成績。( FROM 子句中的子查詢)

                  SELECT SNAME,CNAME, GRADE

                  FROM   (SELECT SNAME, CNAME , GRADE

                                  FROM STUDENTS, ENROLLS,COURSES

                                  WHERE SEX = ' 女 ')

                  AS TEMP (SNAME, CNAME,GRADE)

                  WHERE GRADE > 80

           

           

           

           

          表達(dá)式與函數(shù)的使用

           

          例 29 查詢各課程的學(xué)時(shí)數(shù)。(算術(shù)表達(dá)式由算術(shù)運(yùn)算符+、-、 * 、/與列名或數(shù)值常量所組成。)

                  SELECT CNAME,COURSE_TIME = CREDIT*16

                  FROM   COURSES

          例 30 找出教師的最小年齡。(內(nèi)部函數(shù): SQL 標(biāo)準(zhǔn)中只使用 COUNT 、 SUM 、 AVG 、 MAX 、 MIN 函數(shù),稱之為聚集函數(shù)( Set Function )。 COUNT 函數(shù)的結(jié)果是該列統(tǒng)計(jì)值的總數(shù)目, SUM 函數(shù)求該列統(tǒng)計(jì)值之和, AVG 函數(shù)求該列統(tǒng)計(jì)值之平均值, MAX 函數(shù)求該列最大值, MIN 函數(shù)求該列最小值。)

                  SELECT MIN(AGE)

                  FROM   TEACHERS

          例 31 統(tǒng)計(jì)年齡小于等于 22 歲的學(xué)生人數(shù)。(統(tǒng)計(jì))

                  SELECT COUNT(*)

                  FROM   STUDENTS

                  WHERE AGE < = 22

          例 32 找出學(xué)生的平均成績和所學(xué)課程門數(shù)。

                  SELECT SNO, AVG(GRADE), COURSES = COUNT(*)

                  FROM   ENROLLS

                  GROUP BY SNO

           

          例 34 找出年齡超過平均年齡的學(xué)生姓名。

          SELECT SNAME

          FROM STUDENTS

          WHERE AGE >

                (SELECT AVG(AGE)

                  FROM   STUDENTS)


           

          例 35 找出各課程的平均成績,按課程號分組,且只選擇學(xué)生超過 3 人的課程的成績。( GROUP BY 與 HAVING

                  GROUP BY 子句把一個(gè)表按某一指定列(或一些列)上的值相等的原則分組,然后再對每組數(shù)據(jù)進(jìn)行規(guī)定的操作。

                  GROUP BY 子句總是跟在 WHERE 子句后面,當(dāng) WHERE 子句缺省時(shí),它跟在 FROM 子句后面。

                  HAVING 子句常用于在計(jì)算出聚集之后對行的查詢進(jìn)行控制。)

                   SELECT CNO, AVG(GRADE), STUDENTS = COUNT(*)

                   FROM ENROLLS

                   GROUP BY CNO

                   HAVING COUNT(*) >= 3

           

          相關(guān)子查詢

           

          例 37 查詢沒有選任何課程的學(xué)生的學(xué)號和姓名。(當(dāng)一個(gè)子查詢涉及到一個(gè)來自外部查詢的列時(shí),稱為相關(guān)子查詢( Correlated Subquery) 。相關(guān)子查詢要用到存在測試謂詞 EXISTS 和 NOT EXISTS ,以及 ALL 、 ANY ( SOME )等。)

                  SELECT SNO, SNAME

                  FROM   STUDENTS

                  WHERE NOT EXISTS

                        (SELECT *

                        FROM ENROLLS

                        WHERE ENROLLS.SNO=STUDENTS.SNO)

          例 38   查詢哪些課程只有男生選讀。

                  SELECT DISTINCT CNAME

                  FROM   COURSES C

                  WHERE ' 男 ' = ALL

                         (SELECT SEX

                          FROM ENROLLS , STUDENTS

                          WHERE ENROLLS.SNO=STUDENTS.SNO AND

                                ENROLLS.CNO=C.CNO)

          例 39 要求給出一張學(xué)生、籍貫列表,該表中的學(xué)生的籍貫省份,也是其他一些學(xué)生的籍貫省份。

                  SELECT SNAME, BPLACE

                  FROM   STUDENTS A

                  WHERE EXISTS

                         (SELECT *

                           FROM STUDENTS B

                           WHERE A.BPLACE=B.BPLACE AND

                                 A.SNO < > B.SNO)


           

           

          例 40 找出選修了全部課程的學(xué)生的姓名。

                  本查詢可以改為:查詢這樣一些學(xué)生,沒有一門課程是他不選修的。

                  SELECT SNAME

                  FROM   STUDENTS

                  WHERE NOT EXISTS

                         (SELECT *

                          FROM COURSES

                          WHERE NOT EXISTS

                                  (SELECT *

                                   FROM ENROLLS

                                   WHERE ENROLLS.SNO = STUDENTS.SNO

                                       AND ENROLLS.CNO = COURSES.CNO))

          關(guān)系代數(shù)運(yùn)算

           

          例 41 設(shè)有某商場工作人員的兩張表:營業(yè)員表 SP_SUBORD 和營銷經(jīng)理表 SP_MGR ,其關(guān)系數(shù)據(jù)模式如下:

                  SP_SUBORD (SALPERS_ID, SALPERS_NAME, MANAGER_ID, OFFICE)

                  SP_MGR (SALPERS_ID, SALPERS_NAME, MANAGER_ID, OFFICE)

                  其中,屬性 SALPERS_ID 為工作人員的編號 , SALPERS_NAME 為工作人員的姓名 , MANAGER_ID 為所在部門經(jīng)理的編號 , OFFICE 為工作地點(diǎn)。

          若查詢?nèi)可虉龉ぷ魅藛T,可以用下面的 SQL 語句:

                  (SELECT * FROM SP_SUBORD)

                  UNION

                  (SELECT * FROM SP_MGR)

                  或等價(jià)地用下面的 SQL 語句:

                  SELECT *

                  FROM (TABLE SP_SUBORD UNION TABLE SP_MGR)

          ( 2 ) INTERSECT

                   (SELECT * FROM SP_SUBORD)

                   INTERSECT

                   (SELECT * FROM SP_MGR)

                  或等價(jià)地用下面的 SQL 語句:

                  SELECT *

                  FROM (TABLE SP_SUBORD INTERSECT TABLE SP_MGR)

                  或用帶 ALL 的 SQL 語句:

                  (SELECT * FROM SP_SUBORD)

                 INTERSECT ALL

                  (SELECT * FROM SP_MGR)

                  或

                  SELECT *

                  FROM (TABLE SP_SUBORD INTERSECT ALL TABLE SP_MGR)

          ( 3 ) EXCEPT

                  (SELECT * FROM SP_MGR)

                  EXCEPT

                  (SELECT * FROM SP_SUBORD)

                  或等價(jià)地用下面的 SQL 語句:

                  SELECT *

                  FROM (TABLE SP_MGR EXCEPT TABLE SP_ SUBORD)

                  或用帶 ALL 的 SQL 語句:

                  (SELECT * FROM SP_MGR)

                  EXCEPT ALL

                  (SELECT * FROM SP_SUBORD)

          例 42 查詢籍貫為四川、課程成績在 80 分以上的學(xué)生信息及其成績。(自然連接)

                  (SELECT * FROM STUDENTS

                   WHERE BPLACE=‘ 四川 ’)

                  NATURAL JOIN

                  (SELECT * FROM ENROLLS

                   WHERE GRADE >=80)

          例3.43          列出全部教師的姓名及其任課的課程號、班級。

          (外連接與外部并外連接允許在結(jié)果表中保留非匹配元組,空缺部分填以 NULL 。外連接的作用是在做連接操作時(shí)避免丟失信息。

                  外連接有 3 類:

          ( 1 )左外連接( Left Outer Join )。連接運(yùn)算謂詞為 LEFT [OUTER] JOIN ,其結(jié)果表中保留左關(guān)系的所有元組。

          ( 2 )右外連接( Right Outer Join )。連接運(yùn)算謂詞為 RIGHT [OUTER] JOIN ,其結(jié)果表中保留右關(guān)系的所有元組。

          ( 3 )全外連接( Full Outer Join )。連接運(yùn)算謂詞為 FULL [OUTER] JOIN ,其結(jié)果表中保留左右兩關(guān)系的所有元組。)

                    SELECT TNAME, CNO, CLASS

                    FROM TEACHERS LEFT OUTER JOIN TEACHING USING (TNO)

           

          SQL 的數(shù)據(jù)操縱

           

          例 44 把教師李映雪的記錄加入到教師表 TEACHERS 中。(插入)

                  INSERT INTO TEACHERS

                  VALUES(1476 , ' 李映雪 ' , 44 , ' 副教授 ')

          例 45 成績優(yōu)秀的學(xué)生將留下當(dāng)教師。

                  INSERT INTO TEACHERS (TNO , TNAME)

                  SELECT DISTINCT SNO , SNAME

                  FROM   STUDENTS , ENROLLS

                  WHERE STUDENTS.SNO = ENROLLS.SNO AND GRADE >= 90

          例 47 把所有學(xué)生的年齡增加一歲。(修改)

                  UPDATE STUDENTS

                  SET AGE = AGE+1

          例 48 學(xué)生張春明在數(shù)據(jù)庫課考試中作弊,該課成績應(yīng)作零分計(jì)。

                  UPDATE ENROLLS

                  SET GRADE = 0

                  WHERE CNO = 'C1' AND

                       ' 張春明 ' =

                       (SELECT SNAME

                       FROM STUDENTS

                       WHERE STUDENTS.SNO=ENROLLS.SNO)

          例 49 從教師表中刪除年齡已到 60 歲的退休教師的數(shù)據(jù)。(刪除)

                  DELETE FROM TEACHERS

                  WHERE AGE >= 60

           

          SQL 的數(shù)據(jù)控制

           

          例 50 授予 LILI 有對表 STUDENTS 的查詢權(quán)。(表/視圖特權(quán)的授予

                  一個(gè) SQL 特權(quán)允許一個(gè)被授權(quán)者在給定的數(shù)據(jù)庫對象上進(jìn)行特定的操作。授權(quán)操作的數(shù)據(jù)庫對象包括:表 / 視圖、列、域等。授權(quán)的操作包括: INSERT 、 UPDATE 、 DELETE 、 SELECT 、 REFERENCES 、 TRIGGER 、 UNDER 、 USAGE 、 EXECUTE 等。其中 INSERT 、 UPDATE 、 DELETE 、 SELECT 、 REFERENCES 、 TRIGGER 有對表做相應(yīng)操作的權(quán)限,故稱為表特權(quán)。)

                  GRANT SELECT ON STUDENTS

                  TO LILI

                  WITH GRANT OPTION

          例 51 取消 LILI 的存取 STUDENTS 表的特權(quán)。

                  REVOKE ALL

                  ON STUDENTS

                  FROM LILI CASCADE

           


          不斷補(bǔ)充中:
          1.  模糊查找:
          它判斷列值是否與指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等類型查詢。
            可使用以下通配字符:
            百分號%:可匹配任意類型和長度的字符,如果是中文,請使用兩個(gè)百分號即%%。
            下劃線_:匹配單個(gè)任意字符,它常用來限制表達(dá)式的字符長度。
            方括號[]:指定一個(gè)字符、字符串或范圍,要求所匹配對象為它們中的任一個(gè)。[^]:其取值也[] 相同,但它要求所匹配對象為指定字符以外的任一個(gè)字符。
             例如:
            限制以Publishing結(jié)尾,使用LIKE '%Publishing'
            限制以A開頭:LIKE '[A]%'
            限制以A開頭外:LIKE '[^A]%'

          2.更改表格 
                   ALTER TABLE table_name 
                  ADD COLUMN column_name DATATYPE 
                  說明:增加一個(gè)欄位(沒有刪除某個(gè)欄位的語法。)
                  ALTER TABLE table_name
                  ADD PRIMARY KEY (column_name)
                  說明:更改表得的定義把某個(gè)欄位設(shè)為主鍵。
                  ALTER TABLE table_name
                  DROP PRIMARY KEY (column_name)
                  說明:把主鍵的定義刪除。

          3.group by

          在select 語句中可以使用group by 子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個(gè)組的匯總信息,另外,可以使用having子句限制返回的結(jié)果集。group by 子句可以將查詢結(jié)果分組,并返回行的匯總信息Oracle 按照group by 子句中指定的表達(dá)式的值分組查詢結(jié)果。

          在帶有g(shù)roup by 子句的查詢語句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數(shù)

          select max(sal),job emp group by job;
          (注意max(sal),job的job并非一定要出現(xiàn),但有意義)

          查詢語句的select 和group by ,having 子句是聚組函數(shù)唯一出現(xiàn)的地方,在where 子句中不能使用聚組函數(shù)。

          select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

          當(dāng)在gropu by 子句中使用having 子句時(shí),查詢結(jié)果中只返回滿足having條件的組。在一個(gè)sql語句中可以有where子句和having子句。having 與where 子句類似,均用于設(shè)置限定條件

          where 子句的作用是在對查詢結(jié)果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),條件中不能包含聚組函數(shù),使用where條件顯示特定的行。
          having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組,也可以使用多個(gè)分組標(biāo)準(zhǔn)進(jìn)行分組。

          查詢每個(gè)部門的每種職位的雇員數(shù)
          select deptno,job,count(*) from emp group by deptno,job;

          4.外連接與內(nèi)連接

          有時(shí)候,即使在連接的表中沒有相應(yīng)的行,用戶可能想從一張表中看數(shù)據(jù),Oracle提供了外連接實(shí)現(xiàn)該功能。
          內(nèi)連接是指連接查詢只顯示完全滿足連接條件的記錄,即等值連接,外連接的查詢結(jié)果是內(nèi)連接查詢結(jié)果的擴(kuò)展。外連接不僅返回滿足連接條件的所有記錄而且也返回了一個(gè)表中那些在另一個(gè)表中沒有匹配行的記錄。外連接的操作符是“+”。“+”號放在連接條件中信息不完全的那一邊(即沒有相應(yīng)行的那一邊)。運(yùn)算符“+”影響NULL行的建立。建一行或多行NULL來匹配連接的表中信息完全的行。

          外連接運(yùn)算符“+”只能出現(xiàn)在where子句中表達(dá)式的一邊。

          假如在多張表之間有多個(gè)連接條件,外連接運(yùn)算符不能使用or,in邏輯運(yùn)算符與其它條件組合。


          假如emp表中deptno=10的ename為空值,dept表中deptno=20的loc為空值:

          1.

          select
          ename,dept.deptno,loc
          from
          emp,dept
          where
          emp.depno(+)=dept.deptno;

          如果在dept.deptno中有的數(shù)值在emp.deptno中沒有值,則在做外連接時(shí),
          結(jié)果中ename會產(chǎn)生一個(gè)空值。(emp.deptno=10)

          2.

          select
          ename,dept.deptno,loc
          from
          emp,dept
          where
          emp.depno=dept.deptno(+);

          如果在emp.deptno中有的數(shù)值在dept.deptno中沒有值,則在做外連接時(shí),
          結(jié)果中l(wèi)oc會產(chǎn)生一個(gè)空值。。(dept.deptno=20)


          5.自連接

          自連接是指同一張表的不同行間的連接。該連接不受其他表的影響。用自連接可以比較同一張表中不同行的某一列的值。因?yàn)樽赃B接查詢僅涉及到某一張表與其自身的連接。所以在from子句中該表名出現(xiàn)兩次,分別用兩個(gè)不同的別名表示,兩個(gè)別名當(dāng)作兩張不同的表進(jìn)行處理,與其它的表連接一樣,別名之間也使用一個(gè)或多個(gè)相關(guān)的列連接。為了區(qū)分同一張表的不同行的列,在名前永別名加以限制。

          select
          worker.ename,
          manager.ename manager
          from
          emp worker,
          emp manager
          where
          work.mgr=manager.empno;

          6.集合運(yùn)算

          基合運(yùn)算符可以用于從多張表中選擇數(shù)據(jù)。

          ①UNION運(yùn)算
          用于求兩個(gè)結(jié)果集合的并集(兩個(gè)結(jié)果集合的所有記錄),并自動去掉重復(fù)行。

          select ename,sal from account where sal>2000
          union
          select ename,sal from research where sal>2000
          union
          select ename,sal from sales where sal>2000;

          注:ename,sal 是必須一致的。

          ②UNION ALL運(yùn)算
          用于求兩個(gè)結(jié)果集合的并集(兩個(gè)結(jié)果集中的所有記錄),并且不去掉重復(fù)行。

          select ename,sal from account where sal>2000
          union
          select ename,sal from research where sal>2000
          union
          select ename,sal from sales where sal>2000;

          ③INTERSECT運(yùn)算
          intersect運(yùn)算返回查詢結(jié)果中相同的部分。

          各部門中有哪些相同的職位?

          select Job from account
          intersect
          select Job from research
          intersect
          select Job from sales;


          ④MINUS運(yùn)算
          minus返回兩個(gè)結(jié)果集的差集。(在第一個(gè)結(jié)果集中存在的,而在第二個(gè)結(jié)果集中不存在的行。)

          有那些職位是財(cái)務(wù)部中有,而在銷售部門中沒有?

          select Job from account
          minus
          select Job from sales;

          posted @ 2007-04-26 10:33 七郎歸來 閱讀(668) | 評論 (0)編輯 收藏

          為了大家更容易理解我舉出的SQL語句,本文假定已經(jīng)建立了一個(gè)學(xué)生成績管理數(shù)據(jù)庫,全文均以學(xué)生成績的管理為例來描述。

            1.在查詢結(jié)果中顯示列名:

            a.用as關(guān)鍵字:select name as '姓名' from students order by age

            b.直接表示:select name '姓名' from students order by age

            2.精確查找:

            a.用in限定范圍:select * from students where native in ('湖南', '四川')

            b.between...and:select * from students where age between 20 and 30

            c.“=”:select * from students where name = '李山'

            d.like:select * from students where name like '李%' (注意查詢條件中有“%”,則說明是部分匹配,而且還有先后信息在里面,即查找以“李”開頭的匹配項(xiàng)。所以若查詢有“李”的所有對象,應(yīng)該命令:'%李%';若是第二個(gè)字為李,則應(yīng)為'_李%'或'_李'或'_李_'。)

            e.[]匹配檢查符:select * from courses where cno like '[AC]%' (表示或的關(guān)系,與"in(...)"類似,而且"[]"可以表示范圍,如:select * from courses where cno like '[A-C]%')

            3.對于時(shí)間類型變量的處理

            a.smalldatetime:直接按照字符串處理的方式進(jìn)行處理,例如:
          select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'

            4.集函數(shù)

            a.count()求和,如:select count(*) from students (求學(xué)生總?cè)藬?shù))

            b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’

            c.max(列)和min(列),求最大與最小

            5.分組group

            常用于統(tǒng)計(jì)時(shí),如分組查總數(shù):

            select gender,count(sno)

            from students

            group by gender

            (查看男女學(xué)生各有多少)

            注意:從哪種角度分組就從哪列"group by"

            對于多重分組,只需將分組規(guī)則羅列。比如查詢各屆各專業(yè)的男女同學(xué)人數(shù) ,那么分組規(guī)則有:屆別(grade)、專業(yè)(mno)和性別(gender),所以有"group by grade, mno, gender"

            select grade, mno, gender, count(*)

            from students

            group by grade, mno, gender

            通常group還和having聯(lián)用,比如查詢1門課以上不及格的學(xué)生,則按學(xué)號(sno)分類有:

            select sno,count(*) from grades

            where mark<60

            group by sno

            having count(*)>1

            6.UNION聯(lián)合

            合并查詢結(jié)果,如:

            SELECT * FROM students

            WHERE name like ‘張%’

            UNION [ALL]

            SELECT * FROM students

            WHERE name like ‘李%’

            7.多表查詢

            a.內(nèi)連接

            select g.sno,s.name,c.coursename

            from grades g JOIN students s ON g.sno=s.sno

            JOIN courses c ON g.cno=c.cno

            (注意可以引用別名)

            b.外連接

            b1.左連接

            select courses.cno,max(coursename),count(sno)

            from courses LEFT JOIN grades ON courses.cno=grades.cno

            group by courses.cno

            左連接特點(diǎn):顯示全部左邊表中的所有項(xiàng)目,即使其中有些項(xiàng)中的數(shù)據(jù)未填寫完全。

            左外連接返回那些存在于左表而右表中卻沒有的行,再加上內(nèi)連接的行。

            b2.右連接

            與左連接類似

            b3.全連接

            select sno,name,major

            from students FULL JOIN majors ON students.mno=majors.mno

            兩邊表中的內(nèi)容全部顯示

            c.自身連接

            select c1.cno,c1.coursename,c1.pno,c2.coursename

            from courses c1,courses c2 where c1.pno=c2.cno

            采用別名解決問題。

            d.交叉連接

            select lastname+firstname from lastname CROSS JOIN firstanme

            相當(dāng)于做笛卡兒積

          posted @ 2007-04-26 10:26 七郎歸來 閱讀(186) | 評論 (0)編輯 收藏

          在前人的基礎(chǔ)上,我對比較優(yōu)秀的sql語句進(jìn)行了重新的編輯和整理,力求精短易學(xué)。希望大家可以舉一反三,更好學(xué)習(xí)sql語句,如果有問題,還請翻閱相關(guān)書籍。下列語句部分是Mssql語句,不可以在access中使用。
          注:搜集來自網(wǎng)絡(luò),為了方便查詢,我將此文發(fā)在我的網(wǎng)站里http://www.ekuaiji.com/articleDetail.asp?id=529,隨時(shí)更新。
          歡迎大家發(fā)帖,接龍!

          SQL分類:
          DDL—數(shù)據(jù)定義語言(CREATE,ALTER,DROP,DECLARE)
          DML—數(shù)據(jù)操縱語言(SELECT,DELETE,UPDATE,INSERT)
          DCL—數(shù)據(jù)控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)

          首先,簡要介紹基礎(chǔ)語句:
          1、說明:創(chuàng)建數(shù)據(jù)庫
          CREATE DATABASE database-name
          2、說明:刪除數(shù)據(jù)庫
          drop database dbname
          3、說明:備份sql server
          --- 創(chuàng)建 備份數(shù)據(jù)的 device
          USE master
          EXEC sp_addumpdevice 'disk', 'testBack',  'c:\mssql7backup\MyNwind_1.dat'
          --- 開始 備份
          BACKUP DATABASE pubs TO testBack  
          4、說明:創(chuàng)建新表
          create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
          根據(jù)已有的表創(chuàng)建新表:
             A:create table tab_new like tab_old (使用舊表創(chuàng)建新表)
             B:create table tab_new as select col1,col2… from tab_old definition only
          5、說明:刪除新表drop table tabname
          6、說明:增加一個(gè)列
          Alter table tabname add column col type
          注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長度。
          7、說明:添加主鍵: Alter table tabname add primary key(col)
          說明:刪除主鍵: Alter table tabname drop primary key(col)
          8、說明:創(chuàng)建索引:create [unique] index idxname on tabname(col….) 
          刪除索引:drop index idxname
          注:索引是不可更改的,想更改必須刪除重新建。
          9、說明:創(chuàng)建視圖:create view viewname as select statement
          刪除視圖:drop view viewname
          10、說明:幾個(gè)簡單的基本的sql語句
          選擇:select * from table1 where 范圍
          插入:insert into table1(field1,field2) values(value1,value2)
          刪除:delete from table1 where 范圍
          更新:update table1 set field1=value1 where 范圍
          查找:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!
          排序:select * from table1 order by field1,field2 [desc]
          總數(shù):select count(*) as totalcount from table1
          求和:select sum(field1) as sumvalue from table1
          平均:select avg(field1) as avgvalue from table1
          最大:select max(field1) as maxvalue from table1
          最小:select min(field1) as minvalue from table1
          11、說明:幾個(gè)高級查詢運(yùn)算詞
          A: UNION 運(yùn)算符
          UNION 運(yùn)算符通過組合其他兩個(gè)結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 UNION 一起使用時(shí)(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
          B: EXCEPT 運(yùn)算符
          EXCEPT 運(yùn)算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時(shí) (EXCEPT ALL),不消除重復(fù)行。 
          C: INTERSECT 運(yùn)算符
          INTERSECT 運(yùn)算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時(shí) (INTERSECT ALL),不消除重復(fù)行。
          注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。
          12、說明:使用外連接
          A、left outer join:
          左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。
          B:right outer join:
          右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。
          C:full outer join:
          全外連接:不僅包括符號連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。


          其次,大家來看一些不錯的sql語句
          1、說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b) (Access可用)
          法一:select * into b from a where 1<>1
          法二:select top 0 * into b from a

          2、說明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標(biāo)表名:b) (Access可用)
          insert into b(a, b, c) select d,e,f from b;

          3、說明:跨數(shù)據(jù)庫之間表的拷貝(具體數(shù)據(jù)使用絕對路徑) (Access可用)
          insert into b(a, b, c) select d,e,f from b in ‘具體數(shù)據(jù)庫’  where 條件
          例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

          4、說明:子查詢(表名1:a 表名2:b)
          select a,b,c from a where a IN (select d from b )  或者:  select a,b,c from a where a IN (1,2,3)

          5、說明:顯示文章、提交人和最后回復(fù)時(shí)間
          select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

          6、說明:外連接查詢(表名1:a 表名2:b)
          select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

          7、說明:在線視圖查詢(表名1:a )
          select * from (SELECT a,b,c FROM a) T where t.a > 1;

          8、說明:between的用法,between限制查詢數(shù)據(jù)范圍時(shí)包括了邊界值,not between不包括
          select * from table1 where time between time1 and time2
          select a,b,c, from table1 where a not between 數(shù)值1 and 數(shù)值2

          9、說明:in 的使用方法
          select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

          10、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息
          delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

          11、說明:四表聯(lián)查問題:
          select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

          12、說明:日程安排提前五分鐘提醒
          SQL: select * from 日程安排 where datediff('minute',f開始時(shí)間,getdate())>5

          13、說明:一條sql 語句搞定數(shù)據(jù)庫分頁
          select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

          14、說明:前10條記錄
          select top 10 * form table1 where 范圍

          15、說明:選擇在每一組b值相同的數(shù)據(jù)中對應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績排名,等等.)
          select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

          16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表
          (select a from tableA ) except (select a from tableB) except (select a from tableC)

          17、說明:隨機(jī)取出10條數(shù)據(jù)
          select top 10 * from tablename order by newid()

          18、說明:隨機(jī)選擇記錄
          select newid()

          19、說明:刪除重復(fù)記錄
          Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

          20、說明:列出數(shù)據(jù)庫里所有的表名
          select name from sysobjects where type='U'

          21、說明:列出表里的所有的
          select name from syscolumns where id=object_id('TableName')

          22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,類似select 中的case。
          select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
          顯示結(jié)果:
          type  vender   pcs
          電腦   A        1
          電腦   A        1
          光盤   B        2
          光盤   A        2
          手機(jī)   B        3
          手機(jī)   C        3

          23、說明:初始化表table1
          TRUNCATE TABLE table1

          24、說明:選擇從10到15的記錄
          select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

          posted @ 2007-04-26 10:25 七郎歸來 閱讀(163) | 評論 (0)編輯 收藏

          Oracle高級查詢

          使用Oracle特有的查詢語法, 可以達(dá)到事半功倍的效果

          1. 樹查詢
          create table tree (
              id 
          number(10not null primary key,
              name 
          varchar2(100not null,
              super 
          number(10not null                // 0 is root
          );
          -- 從子到父
          select * from tree start with id = ? connect by id = prior super 
          -- 從父到子
          select * from tree start with id = ? connect by prior id = suepr
          -- 整棵樹
          select * from tree start with super = 0 connect by prior id = suepr

          2. 分頁查詢
          select * from ( 
              
          select my_table.*, rownum  my_rownum from ( 
                  
          select name, birthday from employee order by birthday
              ) my_table 
          where rownum < 120 
          where my_rownum >= 100;

          3. 累加查詢, 以scott.emp為例
          select empno, ename, sal, sum(sal) over(order by empno) result from emp;
           
               EMPNO ENAME             SAL     RESULT
          ---------- ---------- ---------- ----------
                7369 SMITH             800        800
                
          7499 ALLEN            1600       2400
                
          7521 WARD             1250       3650
                
          7566 JONES            2975       6625
                
          7654 MARTIN           1250       7875
                
          7698 BLAKE            2850      10725
                
          7782 CLARK            2450      13175
                
          7788 SCOTT            3000      16175
                
          7839 KING             5000      21175
                
          7844 TURNER           1500      22675
                
          7876 ADAMS            1100      23775
                
          7900 JAMES             950      24725
                
          7902 FORD             3000      27725
                
          7934 MILLER           1300      29025

          4. 高級group by
          select decode(grouping(deptno),1,'all deptno',deptno) deptno,
                 decode(
          grouping(job),1,'all job',job) job,
                 
          sum(sal) sal
          from emp 
          group by ROLLUP(deptno,job);
          DEPTNO                                   JOB              SAL
          ---------------------------------------- --------- ----------
          10                                       CLERK           1300
          10                                       MANAGER         2450
          10                                       PRESIDENT       5000
          10                                       all job         8750
          20                                       CLERK           1900
          20                                       ANALYST         6000
          20                                       MANAGER         2975
          20                                       all job        10875
          30                                       CLERK            950
          30                                       MANAGER         2850
          30                                       SALESMAN        5600
          30                                       all job         9400
          all deptno                               all job        29025

          5. use hint
          當(dāng)多表連接很慢時(shí),用ORDERED提示試試,也許會快很多
          SELECT /*+ ORDERED */* 
            
          FROM a, b, c, d 
           
          WHERE  

          posted @ 2007-04-26 10:16 七郎歸來 閱讀(352) | 評論 (0)編輯 收藏

          用hibernate封裝oracle的clob類型操作起來很不方便,但是新的oracle10g的jdbc驅(qū)動,對此有很多改進(jìn)。

          環(huán)境 :wodows2000、oracle9.2、oracle10gJDBC驅(qū)動(必須)、hibernate3.1.2

          oracle官方網(wǎng)站的clob操作方法:http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/ClobManipulationIn10g.java.html

          建表腳本:

          /*==============================================================*/
          /* Table: StoreFile                                             */
          /*==============================================================*/
          create table StoreFile  (
             uuid                 VARCHAR2(128)                   not null,
             name                 VARCHAR2(200),
             text                 CLOB,
             constraint PK_STOREFILE primary key (uuid)
          );

          hibernate.cfg.xml:(注意多了個(gè)SetBigStringTryClob設(shè)置,其它沒有什么特殊的了

          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "
          http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
          <hibernate-configuration>
              <session-factory>
                  <property name="hibernate.cglib.use_reflection_optimizer">true</property>
                  <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
                  <property name="hibernate.connection.password">java</property>
                  <property name="hibernate.connection.url">jdbc:oracle:thin:@10.128.4.69:1521:kf</property>
                  <property name="hibernate.connection.username">java</property>
                  <property name="hibernate.connection.SetBigStringTryClob">true</property>
                  <property name="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
                  <property name="hibernate.show_sql">true</property>
                  <property name="hibernate.format_sql">true</property>
                  <property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
                  <mapping resource="com/study/database/hb/map/File.hbm.xml"/>
              </session-factory>
          </hibernate-configuration>

          File.hbm.xml文件

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "
          http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <!-- Generated 2006-3-13 17:57:00 by Hibernate Tools 3.1.0.beta4 -->
          <hibernate-mapping>
              <class name="com.study.database.hb.map.File" table="StoreFile" batch-size="0">
                  <id name="uuid" type="string">
                      <column name="UUID" length="128" />
                      <generator class="uuid.hex"></generator>
                  </id>
                  <property name="name" type="string" lazy="false">
                      <column name="NAME" length="200"/>
                  </property>
                  <property name="file" type="string" lazy="false">
                      <column name="text" />
                  </property>
              </class>
          </hibernate-mapping>

          File.java文件

          package com.study.database.hb.map;
          // Generated 2006-3-13 17:57:00 by Hibernate Tools 3.1.0.beta4

          import java.sql.Clob;
          /**
           * File generated by hbm2java
           */

          public class File
              implements java.io.Serializable
          {
            // Fields

            private String uuid;
            private String name;
            private String file;
            // Constructors

            /** default constructor */
            public File()
            {
            }
            /** full constructor */
            public File(String name,String file)
            {
              this.name=name;
              this.file=file;
            }
            // Property accessors

            public String getUuid()
            {
              return this.uuid;
            }
            public void setUuid(String uuid)
            {
              this.uuid=uuid;
            }
            public String getName()
            {
              return this.name;
            }
            public void setName(String name)
            {
              this.name=name;
            }
            public String getFile()
            {
              return this.file;
            }
            public void setFile(String file)
            {
              this.file=file;
            }
          }
          //比以前特殊的地方是hibernate.cfg.xml多了個(gè)SetBigStringTryClob設(shè)置。

          //把clob映射成string類型,這樣在多過4000個(gè)字符時(shí)也不會出錯了。操作方法和普通的string類型一樣。 

          posted @ 2007-04-16 15:37 七郎歸來 閱讀(1932) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          主站蜘蛛池模板: 盘山县| 濉溪县| 明水县| 太保市| 安西县| 上高县| 滕州市| 中江县| 泗水县| 民丰县| 徐汇区| 永泰县| 大渡口区| 台南市| 无为县| 云南省| 平泉县| 林西县| 高雄县| 兰坪| 泸西县| 申扎县| 龙门县| 浠水县| 奉新县| 北安市| 江达县| 阳新县| 赣榆县| 东乌| 湘西| 石屏县| 包头市| 青川县| 涡阳县| 那坡县| 商南县| 调兵山市| 贵溪市| 茶陵县| 河北省|