<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 188,comments - 176,trackbacks - 0

    有關數據庫的一寫操作:
    創建表項就不說了.
    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';
    注:只需要刪除一個主鍵就可以了。其他的記錄會相應的刪除掉。
    刪除表中一個字段:
    ALTER  TABLE  Student DROP column Ssex; 列名;
    修改表中的那一行數據:
    原來的記錄:
    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);
    索引的一點好處:在查詢時候比較方便,在存在的所有記錄中查找一個Sno=1的時候!建立索引的表中就直接查找Sno項比較它是否=1找到后查相關的記錄就比較快。沒有建立索引的需要把所有信息都查找一遍,再在其中找Sno字段,再比較其值=1的相關記錄。

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

    設置成自增長的字段在插入數據的時候不需要插入該字段的值:
    select * from Student order by Sno desc;
    原來沒有設置成自增長插入數據命令:
    insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
    將int型的Sno字段設置成自增長后
    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
    *********************************************************************************/
    查詢表中記錄總數:(無字段名字)
    select count() from usertable;
    或:(userid 為字段名字,結果是字段的總行數)
    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語句查詢的都是在and之間的所有值而IN語句則必須是in括號里面的值.
    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的所有名字對應的的Sno和Ssex值.
    select Sno,Ssex from Student  where Sdept >= 170 and Sname like '%mary%';
    注:mary1,1mary,marydsajdh,等.

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



    disctinct條件查詢
    distinct 這個關鍵字來過濾掉多余的重復記錄只保留一條,

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

    注:distinct必須放在開頭,select id distinct name from table 是錯誤的!

    -------------------------------------------------------------------------------------
    表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 

    結果:
    name1
    aaa
    bbb
    ccc
    ddd
    eee
    distinct這個關鍵字來過濾掉多余的重復記錄只保留一條,但往往只用它來返回不重復記錄的集合,而不是用它來返回不重記錄的所有值。其原因是distinct只能返回它的目標字段,而無法返回其它字段,即上表中只能返回name1字段的所有不重復記錄集合。

    -------------------------------------------------------------------------------------
    如果現在想查詢出表test_1中所有name1不重復的id和name1字段的記錄呢?

    select distinct name, id from table

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

    并不是我們所想要的結果

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

    如果現在想查詢出表test_1中所有name1不重復的所有字段的記錄呢?

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

    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應該是:
    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 可要可不要.這里用內連接實現聯合查詢,也可以用where語句

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

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

    **********************************************************************************
                                         聯合查詢
    **********************************************************************************
    查詢表中的各個字段的值
    select Sno,Sname,Ssex,Sdept from Student;

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

    多表查詢(3個表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';


    ***********************************************************************************
                                         聯合查詢
    ***********************************************************************************

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


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

    左外連接

    /*將books表和表bookstype中的信息聯合查詢,包括在books表中沒有和bookstype表關聯的信息*/
    select * from books left outer join bookstype on bookstype.typeid = books.typeid

    右外連接

    /*將bookstype表和books表中的信息聯合查詢,包括在bookstype表中沒有和books表關聯的信息*/
    select * from books right outer join bookstype on bookstype.typeid = books.typeid

    全連接

    /*將bookstype表和books表中的信息聯合查詢,包括在books表中沒有和bookstype表關聯的信息以及在bookstype表中沒有和books表關聯的信息*/

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


    不等值連接查詢
    /*兩表關聯查詢,查詢表A的cid在表B中沒有對應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

    ***********************************************************************************
                                         聯合查詢
    ***********************************************************************************
    多表查詢應該注意的幾點:
    多表查詢和單表查詢的不同在于多表查詢在查詢某個字段的時候應該帶上表名
    格式是:表名.字段名,表名.字段名
    select bbs.id,bbs.name,bbs.dep,bbsr.id,bbsr.name
    from bbs,bbsr
    where bbs.id=bbsr.id;
    一般的在多表查詢中的表名取的麻煩用別名來代替
    如下:
    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 語句中可以使用group by 子句將行劃分成較小的組,然后,使用聚組函數返回每一個組的匯總信息,另外,可以使用having子句限制返回的結果集。group by 子句可以將查詢結果分組,并返回行的匯總信息SQLServer 按照group by 子句中指定的表達式的值分組查詢結果。

    -------------------------------------------------------------------------------------
    分組查詢一般是用來進行統計需求的,要進行分組查詢必須使用group by子句或having子句,在分組統計時要用到SQL的多行存儲函數。在where條件中不能使用多行存儲函數.

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

    在帶有group by 子句的查詢語句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數.
    ------------------------------------------------------------------------------------

    部門表department:

    department_id    department_name
    10                        開發部
    20                        測試部
    30                        用服部
    40                        財務部
    50                        培訓部

    雇員表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
    ------------------------------------------------------------------------------------

    按部門編號統計出表employees中的每個部門的人數(group by分組查詢)
    select department_id, count(*) from employees
    group by department_id;

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

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

    圖:
    --------------------------------------
        部門號      最低工資      部門人數
        80          6100          34 
        100         6800          6 

    group by 按照哪個字段來排序查詢,一般的group by和having一起使用,注意在查詢中只能查詢與group by和having有關的字段。
    --------------------------------------

      where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。

      having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組

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



    *********************************************************************************
                                      數據排序
    *********************************************************************************

    order by子句中可以用asc(升序)和desc(降序)來完成相應的排序,默認時是按找asc(升序)。
    ---------------------------------------------------------------------------------
    顯示出所有工資大于5000,且部門人數大于5個的部門號,部門最低工資和部門人數,并要求按照部門人數降序排序.

    select department_id 部門號(記住department_id 和部門號之間要空格), min(salary) 最低工資,count(*) 部門人數 from employees
    where salary >5000
    group by department_id
    having count(*)>5
    order by count(*)desc
    -------------------------------------------------------------------
    (注意:當對分組查詢后的結果進行排序時,order by 必須在group by之后)
    -------------------------------------------------------------------

    圖:
    --------------------------------------
        部門號      最低工資      部門人數
        80          6100          34 
        100         6800          30 
        90          6500          28
        70          6300          25

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

    -----------------------------------------------------------------------------------------------------
    子查詢是一個在select查詢中含有其他的select語句,子查詢通常用在where子句中,即將一個查詢結果做為查詢的條件.
    -----------------------------------------------------------------------------------------------------
    統計表employees中所有工資小于平均工資的人數
    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);

    注意在多表查詢中返回的值應該是一個唯一確定的值,而不應該是多中值。
    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的區別:
    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其中一個就可以了,而ALL則必須是小于2000和2500其中任何一個
    。而or則是和and用在一起的.

    ******************************************************************************************
                                            集合運算
    ******************************************************************************************

    ---------------------------------------------------------------------------------
    集合運算是將2個或多個子查詢結果進行(并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,重復行只包括一個,當使用union all時將包括重復行

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

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


    *****************************************************************************************
                                 視圖,存儲過程和觸發器
    *****************************************************************************************

    創建視圖:(查詢數據,用于系統統計報表)
    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;

    存貯過程,觸發器和刪除外鍵

    1).存貯過程:
    存貯過程的路徑:打開Stored Procedures中new一個新的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).觸發器

    打開用戶表項,點設計表,選中其中一個字段,右鍵task點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).刪除外鍵
    打開用戶表項,點設計表,選中其中一個字段,右鍵relationships,在彈出的主鍵和外鍵中選擇就可以了.
    刪除外鍵,需要先刪除主鍵表里面的有關外鍵的字段,再來刪除外鍵的有關字段.




     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    posted on 2007-05-24 11:40 cheng 閱讀(4049) 評論(0)  編輯  收藏 所屬分類: SQLServer
    主站蜘蛛池模板: 国产人在线成免费视频| 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲第一成年网站视频| 亚洲精品国产综合久久一线| 无码人妻一区二区三区免费看 | 亚洲国产精品成人精品无码区| 国产成人免费在线| 特级av毛片免费观看| 亚洲AV日韩AV永久无码绿巨人 | 久久99毛片免费观看不卡| 亚洲av无码一区二区三区天堂古代 | 亚洲国产精品自在自线观看| 亚洲精品无码久久千人斩| 中文字幕人成无码免费视频| 国产成人精品免费大全| 亚洲中文久久精品无码1| 亚洲乱码中文字幕手机在线| 亚洲人成免费电影| 一级黄色毛片免费看| 99久久婷婷国产综合亚洲| 亚洲人成网77777色在线播放| 国产精品极品美女免费观看| 久久久精品2019免费观看| 特黄特色的大片观看免费视频| 亚洲国产情侣一区二区三区| 亚洲午夜国产精品无码老牛影视| 四虎永久在线精品免费网址| 免费人成在线观看网站品爱网| 成人免费网站视频www| 亚洲人av高清无码| 亚洲成a人片在线观| 亚洲国产精品VA在线看黑人| 亚洲AV无码成H人在线观看| 成人性生交大片免费看午夜a| 亚洲精品免费在线观看| 中国videos性高清免费| 日本特黄特色AAA大片免费| 亚洲精品自偷自拍无码| 亚洲伦理中文字幕| 亚洲福利视频一区二区三区| 亚洲AV永久无码精品水牛影视 |