posts - 188,comments - 176,trackbacks - 0

          有關(guān)數(shù)據(jù)庫(kù)的一寫操作:
          創(chuàng)建表項(xiàng)就不說(shuō)了.
          CREATE   TABLE  Student
              (Sno CHAR(5) NOT NULL UNIQUE,
               Sname CHAR(20),
               Ssex CHAR(1),
               Sage INT,
               Sdept CHAR(15));
          插入記錄:
          insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
          刪除記錄:
          delete from Student where Sno = 'aaa';
          注:只需要?jiǎng)h除一個(gè)主鍵就可以了。其他的記錄會(huì)相應(yīng)的刪除掉。
          刪除表中一個(gè)字段:
          ALTER  TABLE  Student DROP column Ssex; 列名;
          修改表中的那一行數(shù)據(jù):
          原來(lái)的記錄:
          Sno  Sname  Ssex  Sdept
          aaa  mary    f     172
          update Student set Sname='mary1', Ssex='m' where Sno='aaa';
          修改后:
          Sno  Sname  Ssex  Sdept
          aaa  mary1    m     172


          desc倒敘排列:
          建立索引:
          create unique index Sno on Student(Sno);
          索引的一點(diǎn)好處:在查詢時(shí)候比較方便,在存在的所有記錄中查找一個(gè)Sno=1的時(shí)候!建立索引的表中就直接查找Sno項(xiàng)比較它是否=1找到后查相關(guān)的記錄就比較快。沒(méi)有建立索引的需要把所有信息都查找一遍,再在其中找Sno字段,再比較其值=1的相關(guān)記錄。

          默認(rèn)是ASC。
          按表中哪個(gè)字段倒敘排序:
          select * from Student order by Sno desc;
          注意:要排序的字段必須是int型。

          設(shè)置成自增長(zhǎng)的字段在插入數(shù)據(jù)的時(shí)候不需要插入該字段的值:
          select * from Student order by Sno desc;
          原來(lái)沒(méi)有設(shè)置成自增長(zhǎng)插入數(shù)據(jù)命令:
          insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
          將int型的Sno字段設(shè)置成自增長(zhǎng)后
          insert into Student (Sname,Ssex,Sdept) values('mary1','f','172');
          insert into Student (Sname,Ssex,Sdept) values('mar1y','f','172');
          insert into Student (Sname,Ssex,Sdept) values('ma1ry','f','172');
          insert into Student (Sname,Ssex,Sdept) values('m1ary','f','172');

          在表中的排序如下:
          Sno   Sname  Ssex  Sdept
          1     mary1   f     172
          2     mar1y   f     172
          3     ma1ry   f     172
          4     m1ary   f     172
          /*********************************************************************************
          2006.7.20
          *********************************************************************************/
          查詢表中記錄總數(shù):(無(wú)字段名字)
          select count() from usertable;
          或:(userid 為字段名字,結(jié)果是字段的總行數(shù))
          select count(*) userid from Student;

          查詢字段的平均值:
          selecet avg(Sno) from Student;
          select avg(字段名)from 表名;

          給出查詢的字段的平均值取別名:
          select avg(字段名) as (別名) from (表名);

          查找指定的字段的其他字段
          select Sdept,Ssex,Sname
          from Student
          where Sno=3;
          (where Sname='mary1';或則where Sname like 'mary1';)

          在between語(yǔ)句查詢的都是在and之間的所有值而IN語(yǔ)句則必須是in括號(hào)里面的值.
          select Sno,Ssex,Sname from Student  where Sdept between 180 and 190;

          select Sno,Ssex,Sname  from Student  where Sdept  in (172,190);

          查詢Student表中的所有的名字中的Sno和Ssex值.
          select Sno,Ssex from Student  where Sdept >= 170 and Sname like '%%';
          注:%%之間是把所有的String類型的值


          like和where條件查詢
          select last_name,salsry,department_id from employees where last_name like 'G%' and salary>3000;

          查詢Student表中的所有的名字中間有mary的所有名字對(duì)應(yīng)的的Sno和Ssex值.
          select Sno,Ssex from Student  where Sdept >= 170 and Sname like '%mary%';
          注:mary1,1mary,marydsajdh,等.

          注意:and or not 用的時(shí)候,and是用在連接并列條件的2個(gè)不同的字段
          or是用在選擇的2個(gè)不同的字段之間,not一般用于not in(180,190)之間.
          order by 和asc|desc的一點(diǎn)不同:
          order by是按先進(jìn)先排,desc是先進(jìn)后排,asc和desc是排列順序不一樣.



          disctinct條件查詢
          distinct 這個(gè)關(guān)鍵字來(lái)過(guò)濾掉多余的重復(fù)記錄只保留一條,

          select distinct name from table 表示將返回table表中name字段不重復(fù)的所有字段的集合。

          注:distinct必須放在開(kāi)頭,select id distinct name from table 是錯(cuò)誤的!

          -------------------------------------------------------------------------------------
          表TEST_1:
          id         name1         name2   
          9         aaa                11
          8         bbb               22
          3         ccc                33
          4         ccc                44   
          5         bbb               55
          6         ddd               66
          7         eee                77
          -------------------------------------------------------------------------------------

          select distinct(name1) from test_1 

          結(jié)果:
          name1
          aaa
          bbb
          ccc
          ddd
          eee
          distinct這個(gè)關(guān)鍵字來(lái)過(guò)濾掉多余的重復(fù)記錄只保留一條,但往往只用它來(lái)返回不重復(fù)記錄的集合,而不是用它來(lái)返回不重記錄的所有值。其原因是distinct只能返回它的目標(biāo)字段,而無(wú)法返回其它字段,即上表中只能返回name1字段的所有不重復(fù)記錄集合。

          -------------------------------------------------------------------------------------
          如果現(xiàn)在想查詢出表test_1中所有name1不重復(fù)的id和name1字段的記錄呢?

          select distinct name, id from table

          結(jié)果:
          name1     id
          aaa           9   
          bbb          5
          bbb          8
          ccc           3
          ccc           4
          ddd          6
          eee           7

          并不是我們所想要的結(jié)果

          select distinct name,id  from table 作用了兩個(gè)字段,也就是必須得id與name都相同的才會(huì)被排除,即返回去除table表中id和name兩個(gè)字段同時(shí)相同情況下所有集合。
          -------------------------------------------------------------------------------------

          如果現(xiàn)在想查詢出表test_1中所有name1不重復(fù)的所有字段的記錄呢?

          對(duì)于
          select   *   from   test_1 where   name1   in   (select   distinct   name1  from   tablename) 
          等價(jià)于
          select   *   from   test_1 where   name1   in   ('aaa','bbb','ccc','ddd','eee')
          我們很可能認(rèn)為它是可行的,但實(shí)際上結(jié)果卻是:

          id         name1         name2   
          9         aaa                11
          8         bbb               22
          3         ccc                33
          4         ccc                44   
          5         bbb               55
          6         ddd               66
          7         eee                77

          正確sql應(yīng)該是:
          select *  from test_1 inner join (select  min(id)  as  id  from  test_1  group  by  name1 order by id )  T  on  test_1.id = T.id

          min(id)或max(id)都行,order by id 可要可不要.這里用內(nèi)連接實(shí)現(xiàn)聯(lián)合查詢,也可以用where語(yǔ)句

          select *  from test_1 ,(select  min(id)  as  id  from  test_1  group  by  name1 order by id )  where   test_1.id = T.id

          -------------------------------------------------------------------------------------

          **********************************************************************************
                                               聯(lián)合查詢
          **********************************************************************************
          查詢表中的各個(gè)字段的值
          select Sno,Sname,Ssex,Sdept from Student;

          多表查詢(2個(gè)表,publishtable和publishtable,給表起了別名)
          select u.userid,u.age,u.username,p.publishname from usertable u,publishtable p where u.userid = p.publishid;

          多表查詢(3個(gè)表employees,departments和locations表,給表起別名)
          (從多表中查詢出所有姓smith的雇員的名字,所在部門以及部門所在的城市)
          select e.first_name,e.last_name,d.department_name,l.city from employees e,departments d,locations l where e.department_id = d.department_id and d.location_id = l.location_id and e.last_name = 'smith';


          ***********************************************************************************
                                               聯(lián)合查詢
          ***********************************************************************************

          等值連接
          /*將books表和表bookstype中的信息聯(lián)合查詢,條件是聯(lián)系鍵相等*/
          select * from books,bookstype where bookstype.typeid = books.typeid


          內(nèi)連接
          /*將books表和表bookstype中的信息聯(lián)合查詢,條件是聯(lián)系鍵相等,和等值連接等價(jià)*/
          select * from books inner join  bookstype on books.typeid = bookstype.typeid

          左外連接

          /*將books表和表bookstype中的信息聯(lián)合查詢,包括在books表中沒(méi)有和bookstype表關(guān)聯(lián)的信息*/
          select * from books left outer join bookstype on bookstype.typeid = books.typeid

          右外連接

          /*將bookstype表和books表中的信息聯(lián)合查詢,包括在bookstype表中沒(méi)有和books表關(guān)聯(lián)的信息*/
          select * from books right outer join bookstype on bookstype.typeid = books.typeid

          全連接

          /*將bookstype表和books表中的信息聯(lián)合查詢,包括在books表中沒(méi)有和bookstype表關(guān)聯(lián)的信息以及在bookstype表中沒(méi)有和books表關(guān)聯(lián)的信息*/

          select * from books full outer join bookstype on bookstype.typeid = books.typeid


          不等值連接查詢
          /*兩表關(guān)聯(lián)查詢,查詢表A的cid在表B中沒(méi)有對(duì)應(yīng)cid的表A的信息SQL*/
          SQLServer:
          select * from mvc_catalog c where c.cid not in (select m.cid from mvc_book m);

          ORACLE:
          select * from mvc_catalog c where not exists (select m.cid from mvc_book m where m.cid = c.cid);


          備注:在oracle中
          左外連接也可以寫為:
          select * from books b,bookstype c where b.cid = c.cid(+)
          右外連接可以寫為:
          select * from books b,bookstype c where b.cid(+) = c.cid

          ***********************************************************************************
                                               聯(lián)合查詢
          ***********************************************************************************
          多表查詢應(yīng)該注意的幾點(diǎn):
          多表查詢和單表查詢的不同在于多表查詢?cè)诓樵兡硞€(gè)字段的時(shí)候應(yīng)該帶上表名
          格式是:表名.字段名,表名.字段名
          select bbs.id,bbs.name,bbs.dep,bbsr.id,bbsr.name
          from bbs,bbsr
          where bbs.id=bbsr.id;
          一般的在多表查詢中的表名取的麻煩用別名來(lái)代替
          如下:
          select b.id,b.name,b.dep,c.id,c.name
          from bbs as b ,bbsr as c // from bbs b,bbsr c***注意取別名也可以用空格或則用as.
          where b.id=c.id;

          *************************************************************************************
                                              分組查詢
          *************************************************************************************

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

          -------------------------------------------------------------------------------------
          分組查詢一般是用來(lái)進(jìn)行統(tǒng)計(jì)需求的,要進(jìn)行分組查詢必須使用group by子句或having子句,在分組統(tǒng)計(jì)時(shí)要用到SQL的多行存儲(chǔ)函數(shù)。在where條件中不能使用多行存儲(chǔ)函數(shù).

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

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

          部門表department:

          department_id    department_name
          10                        開(kāi)發(fā)部
          20                        測(cè)試部
          30                        用服部
          40                        財(cái)務(wù)部
          50                        培訓(xùn)部

          雇員表employees:(department_id為外鍵)

          id     employees_name   department_id
          1      cheng                     10
          2      zhou                       50
          3      liguo                       10 
          4      wang                      20
          5      feng                        30
          6      ling                         30
          7      wu                          20 
          8      tang                        20
          9      yang                        40
          10    tan                          50
          ------------------------------------------------------------------------------------

          按部門編號(hào)統(tǒng)計(jì)出表employees中的每個(gè)部門的人數(shù)(group by分組查詢)
          select department_id, count(*) from employees
          group by department_id;

          顯示出部門人數(shù)少于5人的部門編號(hào)以及人數(shù)( 按照department_id來(lái)分組,having count(*)<5做為限制條件 )
          select department_id 部門號(hào), count(*) 部門人數(shù) from employees
          group by department_id
          having count(*)<5;
          --------------------------------------
          (注意:having必須在group by子句的后面)
          --------------------------------------
          圖:
              部門號(hào)       部門人數(shù)
          ------------------------------
               10            2
               20            3
               30            2
               40            1    
               50            2
          -------------------------------------------------------------------------------------
          where子句和having子句可以同時(shí)使用,where子句是對(duì)要分組的行進(jìn)行過(guò)濾,即選擇要分組的行;
          而having子句是對(duì)分組后的數(shù)據(jù)進(jìn)行過(guò)濾。此時(shí)where子句必須在group by...having子句之前
          -------------------------------------------------------------------------------------
          顯示出所有工資大于5000,且部門人數(shù)大于5個(gè)的部門號(hào),部門最低工資和部門人數(shù)

          select department_id 部門號(hào)(記住department_id 和部門號(hào)之間要空格), min(salary) 最低工資,count(*) 部門人數(shù) from employees
          where salary >5000
          group by department_id
          having count(*)>5;

          圖:
          --------------------------------------
              部門號(hào)      最低工資      部門人數(shù)
              80          6100          34 
              100         6800          6 

          group by 按照哪個(gè)字段來(lái)排序查詢,一般的group by和having一起使用,注意在查詢中只能查詢與group by和having有關(guān)的字段。
          --------------------------------------

            where 子句的作用是在對(duì)查詢結(jié)果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過(guò)濾數(shù)據(jù),條件中不能包含聚組函數(shù),使用where條件顯示特定的行。

            having 子句的作用是篩選滿足條件的組,即在分組之后過(guò)濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組,也可以使用多個(gè)分組標(biāo)準(zhǔn)進(jìn)行分組

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



          *********************************************************************************
                                            數(shù)據(jù)排序
          *********************************************************************************

          order by子句中可以用asc(升序)和desc(降序)來(lái)完成相應(yīng)的排序,默認(rèn)時(shí)是按找asc(升序)。
          ---------------------------------------------------------------------------------
          顯示出所有工資大于5000,且部門人數(shù)大于5個(gè)的部門號(hào),部門最低工資和部門人數(shù),并要求按照部門人數(shù)降序排序.

          select department_id 部門號(hào)(記住department_id 和部門號(hào)之間要空格), min(salary) 最低工資,count(*) 部門人數(shù) from employees
          where salary >5000
          group by department_id
          having count(*)>5
          order by count(*)desc
          -------------------------------------------------------------------
          (注意:當(dāng)對(duì)分組查詢后的結(jié)果進(jìn)行排序時(shí),order by 必須在group by之后)
          -------------------------------------------------------------------

          圖:
          --------------------------------------
              部門號(hào)      最低工資      部門人數(shù)
              80          6100          34 
              100         6800          30 
              90          6500          28
              70          6300          25

          *******************************************************************************
                                                子查詢
          *******************************************************************************

          -----------------------------------------------------------------------------------------------------
          子查詢是一個(gè)在select查詢中含有其他的select語(yǔ)句,子查詢通常用在where子句中,即將一個(gè)查詢結(jié)果做為查詢的條件.
          -----------------------------------------------------------------------------------------------------
          統(tǒng)計(jì)表employees中所有工資小于平均工資的人數(shù)
          select count(*)工資 from employees
          where salary <
          (select avg(salary) from employees)
          圖:
          ----------------
             工資
             56
             49
             36

          Select MIN(Salary),Manager_id
          from Employee
          group by Manager_id
          having MIN(Salary) >
                              (Select MIN(Salary)
                               From Employee
                               where Manager_id=004);

          注意在多表查詢中返回的值應(yīng)該是一個(gè)唯一確定的值,而不應(yīng)該是多中值。
          select Employee_id,Last_name,Salary,Manager_id
          from Employee
          WHERE Salary>
                           (select Salary
                            from Employee
                            where Manager_id=003)
          and 
               Last_name=  (select Last_name
                            from Employee
                            where Last_name like 'mary');

          注意在any,or,all的區(qū)別:
          Select Salary,Manager_id,Last_name,Employee_id
          from Employee
          where Salary < any
                              (Select Salary
                               From Employee
                               where Manager_id=005);

          Select Salary
                               From Employee
                               where Manager_id=005;返回的是2000,2500
          就是在工資中小于2000.2500其中一個(gè)就可以了,而ALL則必須是小于2000和2500其中任何一個(gè)
          。而or則是和and用在一起的.

          ******************************************************************************************
                                                  集合運(yùn)算
          ******************************************************************************************

          ---------------------------------------------------------------------------------
          集合運(yùn)算是將2個(gè)或多個(gè)子查詢結(jié)果進(jìn)行(并union),交(intersect)和減(minus)
          ---------------------------------------------------------------------------------
          (并union):
          select employee_id,empname from emp1
          union
          select employee_id,name from emp2

          圖:
          -----------------
          employee_id       empname
          100                    king1
          1000                  king2
          1000                  king3
          10000                king4
          100000              king5
          1000000            king6
            
          注:使用union,重復(fù)行只包括一個(gè),當(dāng)使用union all時(shí)將包括重復(fù)行

          交(intersect):2個(gè)或多個(gè)子查詢的公共行
          select employee_id,empname from emp1
          intersect
          select employee_id,name from emp2

          減(minus):從第一個(gè)查詢結(jié)果中去掉出現(xiàn)在第二個(gè)查詢結(jié)果中的行:
          select employee_id,empname from emp1
          minus
          select employee_id,name from emp2


          *****************************************************************************************
                                       視圖,存儲(chǔ)過(guò)程和觸發(fā)器
          *****************************************************************************************

          創(chuàng)建視圖:(查詢數(shù)據(jù),用于系統(tǒng)統(tǒng)計(jì)報(bào)表)
          create view dept_sum_vu
             (name,minsal,maxsal,avgsal)
          as select d.department_name,min(e.salary),max(e.salary),avg(e.salary)
             from employees e,departments d
          where e.department_id = d.department_id
          group by d.department_name;

          存貯過(guò)程,觸發(fā)器和刪除外鍵

          1).存貯過(guò)程:
          存貯過(guò)程的路徑:打開(kāi)Stored Procedures中new一個(gè)新的Stored Procedures,中間填寫代碼,代碼如下:
          CREATE PROCEDURE sa.bbsTest AS

          select  Bbsid ,content , area_id , name  FROM BBs  a  JOIN   bbs_area  b
          on a.area_id =  b.id


          CREATE PROCEDURE bbsTest  AS

          select  Bbsid ,content , area_id , name  FROM  BBs  a  JOIN   bbs_area  b
          on a.area_id =  b.id

          2).觸發(fā)器

          打開(kāi)用戶表項(xiàng),點(diǎn)設(shè)計(jì)表,選中其中一個(gè)字段,右鍵task點(diǎn)manager triggers,在彈出的表單中寫代碼:
          CREATE TRIGGER [tD_bbs_area] ON [dbo].[bbs_area]
          FOR  DELETE
          AS
          BEGIN
           DELETE rebbs
           FROM  bbs, deleted
           WHERE rebbs.bbs_id = bbs.bbsid
                 AND bbs.area_id = deleted.id

           DELETE bbs
           FROM  deleted
           WHERE bbs.area_id = deleted.id

          END

          3).刪除外鍵
          打開(kāi)用戶表項(xiàng),點(diǎn)設(shè)計(jì)表,選中其中一個(gè)字段,右鍵relationships,在彈出的主鍵和外鍵中選擇就可以了.
          刪除外鍵,需要先刪除主鍵表里面的有關(guān)外鍵的字段,再來(lái)刪除外鍵的有關(guān)字段.




           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

          posted on 2007-05-24 11:40 cheng 閱讀(4054) 評(píng)論(0)  編輯  收藏 所屬分類: SQLServer
          主站蜘蛛池模板: 什邡市| 汕头市| 承德市| 泰安市| 博湖县| 罗甸县| 玉环县| 奇台县| 闽清县| 肥乡县| 菏泽市| 蓝田县| 九台市| 兴隆县| 武穴市| 德庆县| 安龙县| 盐源县| 新津县| 武胜县| 阿图什市| 肥乡县| 图木舒克市| 丰城市| 鹤山市| 成武县| 哈巴河县| 宽甸| 玛沁县| 彝良县| 宜城市| 梅河口市| 武功县| 临泉县| 三穗县| 中宁县| 都昌县| 湖口县| 邹城市| 玉林市| 富顺县|