怎么样来实现动态修改sql server表结构?如字段长度,字段类型,主键,外键等等,请大家各自发挥..

解决方案 »

  1.   

    这么不竟气!!那俺也占二楼!!
    ALTER TABLE table
      

  2.   

    想知道各位的一些经验才发的,要这么简单的回答就不用了。
    SQL基本要領SQL(Structured Query Language)資料型態(SQL Data Type)
        資料型態代表資料放在資料中的格式,Local Interbase 資料型態共有十種◆SMALLINT:為2Bytes的整數(16 位元的整數),其範圍值為  -32768~32767
        使用於較小的整數欄位以省硬碟空間,並可加快資料理的度
      例 貨品編號(goods_no) 為 SMALLINT
        goods_no  SMALLINT
    ◆INTEGER:為4Bytes的整數(32 位元的整數),其範圍值為   
              -2147483648~2147483647
        使用於較大的整數欄位,改善 SMALLINT 存放整數值大的缺點
        若在貨品編號大於32767,無法以 SMALLINT表示則可訂貨品編號為INTEGER
      例 goods_no INTEGER 
    ◆NUMERIC:數值資料可指定整數及小數位數
        p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)
        大小值,s是指小數後有幾位數。如果沒有特別指定,則繫統會設為 
        p=5; s=0 
      NUMERIC及DECIMAL可儲放190 進位的數值資料
      例 NUMERIC[precision[,scale]]
        若小數未指定,則內定值為0;
        若未指定精確度(整數位數)及小數點位數,則NUMERIC將自動轉為INTEGER
        例員工薪資欄位為15位整數,2位小數如下
          salary NUMERIC(15,2)
    ◆DECIMAL:數值資料可指定整數及小數位數
      例 DECIMAL[precision[,scale]]
        若小數未指定,則內定值為0;
        若未指定精確度(整數位數)及小數點位數,則NUMERIC將自動轉為INTEGER
        例員工薪資欄位為15位整數,2位小數如下
          salary NUMERIC(15,2)
    ◆DOUBLE PRECISION:64位元雙精確變數其範圍值1.7x10-3808~1.7x10308
    ◆CHAR:固定長度的字串型態,長度限制為值1~32767位元組
      固定長度資料型態,存放的資料為系統採用的字元集(ASCII及EBCDIC)中的任意 
      字元,使用CHAR的資料型態時必須指定字元資料長度
      例 部門編號欄位
         DEPT_NO CHAR(3)
         當字元資料宣告為固定長度時,
         若輸入的資料小於資料欄位長度,將自動以空白字元補滿欄位;
         若輸入的資料大於資料欄位長度,超過部份將自動被捨去
    ◆VARCHAR:變數長度的字串,長度限制為值1~32765★★★★★★(書D_6 15_7)
      存放變數長度的字元資料,宣告時必須指定欄位可能的最大長度,當輸入者的
      資料小於欄位長度時,只存放輸入的字元,故佔用較少的空間
      例 員工的國別(job_country)為VARCHAR(15)
         job_country VARCHAR(15)
      註:CHAR 較浪費磁碟空間,但執行效率高
         VARCHAR:較節省磁碟空間,但執行效率低
    ◆DATE:日期型態,其範圍值為  Jan 1, 100~Dec 11,5941
        存放日期格式資料(包含了 年份、月份、日期)
        例員工雇用日期(hire_date)
           hire_date Date Default 'Now' Not Null
           Default 設欄位的初值 
           Now為 Interbase 的特殊用法,代表系統日期,也就是hire_date 的
                  初始值系統日期;
           Not Null 代表欄位新增資料時,必須指定欄位值◆FLOAT:存放浮點數,同REAL型態(32位元的實數)
      Interbase 的FLOAT資料型態最大8位有效數字,超過有效數字時,則以科學
        符號表示
      例  1.23456789e+08
    ◆BLOB大型物件資料型態,通常用以存放備忘資料,聲音 影像等多媒體資料
      可儲存大型物件的資料型態備忘資料(memo)聲音(Wave)影像(image/picture)
      例 CREATE TABLE IMAGE_PRODUCT
         (FILENAME CHAR(12) NOT NULL PRIMARY KEY,
          MEMO BOLOB SUB_TYPE 1,
          BITMAP BOLOB SUB_TYPE -1,
          EXEjob_BOLOB SUB_TYPE -2)
      Interbase 將BOLOB欄位分為數種子型態(SUB_TYPE),子型態
        1代表備忘資料欄,負整數的子型態為使用者定義的子型態
       -1為可存放點陣圖的欄位型態
       -2可存放像執行檔的資料型態建立資料庫(Create Table)
      1、建資料表:
        create table table_name(column1_name data_type [DEFAULT data_value]                             
                                [null | not null [,...] )
          說明:table_type 資料表這資料表包含一個或多個指定資料型態的欄位
            DEFAULT 指定欄位初始值data_value 
            null表示是否允許資料的值為null當指定欄位not null時,資料庫系統將
            拒絕新增 null 資料至該欄位
          例 CREATE TABLE customer(First_Name char(50),Last_Name char(50),
          Address char(50),City char(50),Country char(25),Birth_Date date) 
      2、更改資料表  
        alter table table_name add column column_name datatype 
        說明:增加一個欄位(沒有刪除某個欄位的語法。)
        lter table table_name add primary key (column_name)
        說明:更改表得的定義把某個欄位設為主鍵。
        alter table table_name drop primary key (column_name)
        說明:把主鍵的定義刪除。
      3、建立索引  
        create UNIQUE index empno_idx on table_name(emp_no)
        說明:對某個表格的欄位建立索引以增加查詢時的速度。
      4、刪除  
        drop Table table_name //刪除資料表 
        drop Table temp       //刪除temp資料表
        drop Index index_name //刪除索引資料操作語言 DQL(Data Manipulation Language)常用、主要的SQL指令:
    ●Select(選取資料,屬DQL)
      資料查詢
         SELCET * FROM Table ;                   //過濾顯示所有資料庫
         SELCET Name, Tel FROM Table ;           //過濾顯示 Name Tel 資料
         SELCET DISTINCT dept_no FROM table_name //DISTINCT 取消重復部份
         SELCET DISTINCT au_lname FROM authors WHERE au_lname="Ringer"  
         SELCET full_name, salsry*12 FROM table_name //全名及計算年薪
         SELCET full_name, salsry*12 AS year_salary FROM table_name
          //在ISO 的SQL 語法標準中允許使用AS子句重新命名欄位名稱 
         SELCET * FROM table_name WHERE column1 = xxx [and column2 > yyy] 
                  [or column3 <> zzz]
    ------------------------------------------------------------------
      整合性的查詢:
        SELCET count (*) FROM table_name WHERE column_name = xxx
          //查詢符合條件的資料共有幾筆。
        SELCET SUM(column1) FROM table_name
          說明:
          1.計算出總和,所選的欄位必須是可數的數字形態。
          2.除此以外還有 avg() 是計算平均、max()、min()計算最大最小值的
            整合性查詢。
    ------------------------------------------------------------------
      

  3.   

    組合查詢
        組合查詢是指所查詢得資料來源並不隻有單一的表格,而是聯合一個以上
            的表格纔能夠得到結果的。
        SELCET * FROM table1,table2 WHERE table1.colum1=table2.column1
          說明:
          1.查詢兩個表格中其中 column1 值相同的資料。
          2.當然兩個表格相互比較的欄位,其資料形態必須相同。
          3.一個復雜的查詢其動用到的表格可能會很多個。
    ------------------------------------------------------------------
      復合性的查詢
        SELCET * FROM table_name1 WHERE exists ( SELCET * FROM 
                table_name2 WHERE conditions )
          說明:1.where 的 conditions 可以是另外一個的 query。
                2.exists 在此是指存在與否。
        SELCET * FROM table_name1 WHERE column1 IN ( SELCET column1 
                 FROM table_name2 WHERE conditions )
          說明:1. in 後面接的是一個集合,表示column1 存在集合裡面。
                2. select 出來的資料形態必須符合 column1。 
    ------------------------------------------------------------------
      其他查詢
        SELCET * FROM table_name1 WHERE column1 LIKE 'x%' 
          //說明:like 必須和後面的'x%' 相呼應表示以 x為開頭的字串。
        SELCET * FROM table_name1 WHERE column1 IN ('xxx','yyy',..)
          //說明:in 後面接的是一個集合,表示column1 存在集合裡面。
        SELCET * FROM table_name1 WHERE column1 BETWEEN xx AND yy
          //說明:between 表示 column1 的值介於 xx 和 yy 之間。 
        SELCET * FROM 程式基本資料 WHERE 陽上姓名 LIKE "% 楊 %";
          //過濾不特定"徐"的資料
        SELCET * FROM Table WHERE Name LIKE "*徐*" ;
          //過濾特定"徐"之中的資料
        SELCET full_name,hire_dat,phone_exit FROM table_name
           WHERE lase_name LIKE 'Le#%' ESCAPE '#';
          //ESCAPE 比對符號要檢查lase_name是否內含'Le#% 的字串
        SELCET full_name,hire_dat,phone_exit FROM table_name
           WHERE lase_name LIKE 'L%';    
        //lase_name LIKE 'L%' 代表第一個字母須以L字母為開頭其餘可任意字串    //lase_name NOT LIKE 'L%' 代表第一個字母不得為L字母 
        //lase_name LIKE 'L%' 代表第一個字母須以L字母為開頭其餘可任意字串
        //lase_name LIKE 'L__' 姓氏須三個字元第一個字元為 L
                               (底線字元'_'類似DOS下的'?'字元)  
        //lase_name LIKE '%ee%'代表任何內含'ee'字串 
        //lase_name LIKE '%e'最後一個字元須為'e'
    ------------------------------------------------------------------
      資料篩選
       資7料單一搜尋
         SELCET full_name, hire_date,phone_exit FROM table_name 
                WHERE dept_no=600 //顯示部門代號等於600的所有員工....
         SELCET full_name,hire_dat,phone_exit FROM table_name
                WHERE phone_exit IS NULL 
            //列出所有沒有分機號碼的員工姓名(雇員)  
         SELCET full_name,hire_dat,phone_exit FROM table_name
                WHERE phone_exit IS NOT NULL 
            //列出所有有分機號碼的員工姓名<非NULL值>
    ------------------------------------------------------------------
       資料多重搜尋
         SELCET full_name,phone_exit FROM table_name
                WHERE phone_exit IS NULL AND hire_date > '20-jan-1992';
                 //未有分機且進入公司(雇員)日期之後員工
         <多資料表連結>
         SELCET full_name, job_country, currency FROM table_name,             
                table_name1 WHERE job_country = table_name1
         SELCET full_name, job_country, currency FROM table_name,             
                LEFT JOIN country ON job_country = table_name1
    ------------------------------------------------------------------
       搜尋資料範圍
         SELCET full_name,salary FROM table_name 
                WHERE salary BETWEEN 100000 AND 200000; 
                 //列出薪資在100000至200000的員工
         SELCET full_name,salary FROM table_name 
                WHERE salary >= 100000 AND salary <= 200000;
                 //比較運算的查詢語言
         SELCET full_name,job_country FROM table_name//集合成員運算(IN子句)
                WHERE job_country IN('Italy France')//義大利及法國員工
    ------------------------------------------------------------------
     資料排序結果
      單一排序資料
        SELCET full_name,salary,dept_no FROM table_name ORDER BY dept_no
          //依各部門代號順序列出員工姓名及薪資
        SELCET column1,column2 FROM table_name order by column2 [desc]
          //說明:order by 是指定以某個欄位做排序,[desc]是指從大到小排列,
              若沒有指明,則是從小到大排列
        SELCET * FROM Table Order By Age Desc;  
          //以年齡欄反排序
      多欄排序資料
        SELCET full_name,salary,dept_no FROM table_name ORDER BY 
               dept_no, salary DESC;
          //部門代號由小而大,薪資由大而小輸出所有員工姓名
    ------------------------------------------------------------------
      

  4.   

    SQL合計函數(aggregate function)
        AVG  :平均值
        COUNT:筆數
        MIN  :最小值
        MAX  :最大值
        SUM  :加總值
        SELECT dept_no COUNT(salary)FROM table_name //錯誤的
        SELECT dept_no MAX(salary)FROM table_name   //錯誤的
        SELECT dept_no MAX(salary)FROM table_name GROUP BY dept_no//正確的 
        < COUNT 的應用 >
        SELECT COUNT(*)FROM table_name WHERE dept_no = 100
           //合計代號100的部門中有幾位員工
        < COUNT(DISTINCT) 的應用 >
        SELECT COUNT(DISTINCT dept_no) FROM table_name 
           //公司共有幾個部門
        < COUNT及SUM 的應用 >
        SELECT COUNT(*),SUM(salsry)FROM table_name WHERE dept_no = 100
           //部門代號為100的員工人數及薪資總數
        < MIN,MAX,AVG 的應用 >
        SELECT MIN(salsry),MAX(salsry),AVG(salsry)FROM table_name 
               WHERE dept_no = 100
           //部門代號為100的員工的最低薪資和最高薪資及平均薪資
        < GROUP BY子句應用 >
        SELECT COUNT(*),MIN(salsry),MAX(salsry),SUM(salsry)
               FROM table_name GROUP BY dept_no 
           //找出所有部門的人數最低薪資  最高薪資  薪資總數
        < HAVING子句應用 >
        SELECT COUNT(*),MIN(salsry),MAX(salsry),SUM(salsry)
               FROM table_name GROUP BY dept_no HAVING COUNT(dept_no)>2
           //找出所有部門的人數大於2個人的最低薪資  最高薪資  薪資總數
    ------------------------------------------------------------------
    ●Insert(新增資料,屬DML)
      INSERT INTO 資料表名稱 Values (欄位1, 欄位2,...);
      INSERT INTO table_name VALUES('Taiwan','NTD');
      INSERT INTO table_name(country,currency)VALUES('Taiwan','NTD');
         //table_name中有country,currency 兩個欄位 
      INSERT INTO table_name[(column_list)] SELECT column_list FROM 
             another_table_name...... 
         //複製多筆資料至另一資料表
      INSERT INTO table_name1 SELECT *  FROM table_name 
               //table_name 資料表所有資料加入table_name1中
      INSERT INTO Table Values ("陳建中","037-271135","苗市中路","40");
      INSERT INTO table_name(column1,column2,...)values(value1,value2,...)
        說明:1.若沒有指定column 繫統則會按表格內的欄位順序填入資料。
              2.欄位的資料形態和所填入的資料必須吻合。
              3.table_name 也可以是景觀 view_name。
      INSERT INTO table_name (column1,column2,...) select 
                 columnx,columny,... from another_table
        說明:也可以經過一個子查詢(subquery)把別的表格的資料填入。●Update(更新資料,屬DML)
        < 允許更新己存在的資料表資料>
        UPDATE table_name SET coumn_name1=data_value1[,coumn_name2 
                   =data_value2,.........] WHERE search_condition]
          //table_name 須為資料表或可更新的view名稱
          //SET 欲更新欄位名稱
          //WHERE 子句用指定更條件(可省略)WHERE 子句中search_condition
            條件符合會更新資料;更新的欄位值須以欄位所定義的資料型庇相容 
        < 更新所有資料>
        UPDATE table_name SET salary =salary*1.05;
          //員工薪資依物價上漲年增率5%調整  
        < 更新指定資料>
        UPDATE table_name SET salary =salary*1.1 WHERE dept_no=100;
          //所有部門代號100的員工薪資調升 1.1
        < 更新多個欄位> 
        UPDATE table_name SET job_grade=1 =salary= 11000 WHERE emp_no=2;
          //編號2號員工職級2級晉升為1級 ,薪資並調升110000
        UPDATE table_name SET column1='xxx' WHERE conditoins
        說明:
          1.更改某個欄位設定其值為'xxx'。
          2.conditions 是所要符合的條件、若沒有 where 則整個 table 的那個
            欄位都會全部被更改。
    ●Delete(刪除資料,屬DML)
        < 刪除指定的資料>
        DELETE FROM table_name WHERE dept_no=621;
           //部門代號621被裁撤
        < 刪除所有的資料>
        DELETE FROM table_name
        DELETE * FROM table_name//錯誤的
        DELETE FROM table_name WHERE conditions
          說明:刪除符合條件的資料。
          說明:關於where條件後面如果包含有日期的比較,不同數據庫有不同的
                表達式。具體如下:
           (1)如果是access數據庫,則為:where mydate>#2000-01-01# 
           (2)如果是oracle數據庫,則為:where mydate>cast('2000-01-01' 
              as date) 或:where mydate>to_date('2000-01-01','yyyy-mm-dd')
       在delphi中寫成:
        thedate='2000-01-01';
        query1.sql.add('select * from abc where 
                        mydate>cast('+''+thedate+''+' as date)'); 
        如果比較日期時間型,則為:
        query1.sql.add('select * from abc 
        where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd 
                                  hh24:mi:ss')
      

  5.   

    老兄,其实,SQL帮助也写的不错!!
      

  6.   

    哈哈,lijinghe1(副乡长),你也来了,好象比我还经常来database啊,给点建议,比如修改数据库结构之类的,只要关于数据库的操作,是经典的我都喜欢,谢了。
      

  7.   

    ALTER TABLE
    通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法
    ALTER TABLE table 
    { [ ALTER COLUMN column_name 
        { new_data_type [ ( precision [ , scale ] ) ]
            [ COLLATE < collation_name > ]
            [ NULL | NOT NULL ]
            | {ADD | DROP } ROWGUIDCOL }
        ] 
        | ADD
            { [ < column_definition > ]
            | column_name AS computed_column_expression
            } [ ,...n ]
        | [ WITH CHECK | WITH NOCHECK ] ADD
            { < table_constraint > } [ ,...n ] 
        | DROP
            { [ CONSTRAINT ] constraint_name 
                | COLUMN column } [ ,...n ] 
        | { CHECK | NOCHECK } CONSTRAINT
            { ALL | constraint_name [ ,...n ] }
        | { ENABLE | DISABLE } TRIGGER
            { ALL | trigger_name [ ,...n ] } 
    }< column_definition > ::=
        { column_name data_type }
        [ [ DEFAULT constant_expression ] [ WITH VALUES ]
        | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
            ] 
        [ ROWGUIDCOL ]
        [ COLLATE < collation_name > ]
        [ < column_constraint > ] [ ...n ]< column_constraint > ::=
        [ CONSTRAINT constraint_name ]
        { [ NULL | NOT NULL ]
            | [ { PRIMARY KEY | UNIQUE }
                [ CLUSTERED | NONCLUSTERED ]
                [ WITH FILLFACTOR = fillfactor ]
                [ ON { filegroup | DEFAULT } ]
                ] 
            | [ [ FOREIGN KEY ]
                REFERENCES ref_table [ ( ref_column ) ]
                [ ON DELETE { CASCADE | NO ACTION } ]
                [ ON UPDATE { CASCADE | NO ACTION } ]
                [ NOT FOR REPLICATION ]
                ] 
            | CHECK [ NOT FOR REPLICATION ]
                ( logical_expression ) 
        }< table_constraint > ::=
        [ CONSTRAINT constraint_name ]
        { [ { PRIMARY KEY | UNIQUE }
            [ CLUSTERED | NONCLUSTERED ]
            { ( column [ ,...n ] ) } 
            [ WITH FILLFACTOR = fillfactor ]
            [ ON { filegroup | DEFAULT } ]
            ] 
            |    FOREIGN KEY
                [ ( column [ ,...n ] ) ]
                REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
                [ ON DELETE { CASCADE | NO ACTION } ]
                [ ON UPDATE { CASCADE | NO ACTION } ]
                [ NOT FOR REPLICATION ]
            | DEFAULT constant_expression
                [ FOR column ] [ WITH VALUES ]
            |    CHECK [ NOT FOR REPLICATION ]
                ( search_conditions ) 
        }参数
    table是要更改的表的名称。
    ALTER COLUMN指定要更改给定列。column_name是要更改、添加或除去的列的名称new_data_type是要更改的列的新数据类型。
    precision是指定数据类型的精度。有关有效精度值的更多信息,请参见精度、小数位数和长度。 scale是指定数据类型的小数位数。有关有效小数位数值的更多信息,请参见精度、小数位数和长度。COLLATE < collation_name >为更改列指定新的排序规则。 SCHEMABOUND 视图或函数引用了此列。 
    有关 COLLATE 子句的更多信息,请参见 COLLATE。NULL | NOT NULL指定该列是否可接受空值。
    [ {ADD | DROP} ROWGUIDCOL ]指定在指定列上添加或除去 ROWGUIDCOL 属性。ROWGUIDCOL 是一个关键字,表示列是行全局唯一标识符列。对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能指派给 uniqueidentifier 列。
    ADD指定要添加一个或多个列定义、计算列定义或者表约束。computed_column_expression是一个定义计算列的值的表达式。n是表示前面的项可重复 n 次的占位符。WITH CHECK | WITH NOCHECK指定表中的数据是否用新添加的或重新启用的 FOREIGN KEY 或 CHECK 约束进行验证。如果没有指定,对于新约束,假定为 WITH CHECK,对于重新启用的约束,假定为 WITH NOCHECK。
    DROP { [CONSTRAINT] constraint_name | COLUMN column_name }指定从表中删除 constraint_name 或者 column_name。如果兼容级别小于或等于 65,将不允许 DROP COLUMN。可以列出多个列或约束。下面的列不能除去: { CHECK | NOCHECK} CONSTRAINT指定启用或禁用 constraint_name。如果禁用,将来插入或更新该列时将不用该约束条件进行验证。此选项只能与 FOREIGN KEY 和 CHECK 约束一起使用。 ALL 
    指定使用 NOCHECK 选项禁用所有约束,或者使用 CHECK 选项启用所有约束。 
    {ENABLE | DISABLE} TRIGGER指定启用或禁用 trigger_name。当一个触发器被禁用时,它对表的定义依然存在;然而,当在表上执行 INSERT、UPDATE 或 DELETE 语句时,触发器中的操作将不执行,除非重新启用该触发器。 ALL 
    指定启用或禁用表中所有的触发器。trigger_name 
    指定要启用或禁用的触发器名称。 
    column_name data_type新列的数据类型。data_type 可以是任何 Microsoft&reg; SQL Server&#8482; 数据类型或用户定义数据类型。DEFAULT是指定列默认值的关键字。DEFAULT 定义可用于为表中现有行的新列提供值。DEFAULT 定义不能添加到具有 timestamp 数据类型、IDENTITY 属性、现有 DEFAULT 定义或绑定默认值的列。如果列已有默认值,必须除去旧默认值后才能添加新默认值。为同 SQL Server 先前版本保持兼容性,向 DEFAULT 赋予约束名是可能的。IDENTITY指定新列是标识列。Seed 
    是用于表中所装载的第一行的值。Increment 
    是添加到前一行的标识值的增量值。 
    NOT FOR REPLICATION指定当复制登录(如 sqlrepl)向表中插入数据时,不强制 IDENTITY 属性。也可对约束指定 NOT FOR REPLICATION。当复制登录向表中插入数据时,不检查约束条件。CONSTRAINT指定 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 约束的开始,或者指定 DEFAULT 定义的开始。constrain_name是新约束。约束的名称必须符合标识符规则,但其名称的首字符不能为 #。如果没有提供 constraint_name,约束使用系统生成的名称。PRIMARY KEY是通过唯一索引对给定的一列或多列强制实体完整性的约束。对每个表只能创建一个 PRIMARY KEY 约束。UNIQUE是通过唯一索引为给定的一列或多列提供实体完整性的约束。CLUSTERED | NONCLUSTERED指定为 PRIMARY KEY 或 UNIQUE 约束创建聚集或非聚集索引。PRIMARY KEY 约束默认为 CLUSTERED;UNIQUE 约束默认为 NONCLUSTERED。
    WITH FILLFACTOR = fillfactor指定 SQL Server 存储索引数据时每个索引页的充满程度。 ON {filegroup | DEFAULT}指定为约束创建的索引的存储位置。
    FOREIGN KEY...REFERENCES是为列中数据提供引用完整性的约束。FOREIGN KEY 约束要求列中的每个值在被引用表的指定列中都存在。ref_table是 FOREIGN KEY 约束所引用的表。ref_column是新 FOREIGN KEY 约束所引用的一列或多列(置于括号中)。ON DELETE {CASCADE | NO ACTION}指定当表中被更改的行具有引用关系,并且该行所引用的行从父表中删除时,要对被更改行采取的操作。默认设置为 NO ACTION。 ON UPDATE {CASCADE | NO ACTION}指定当表中被更改的行具有引用关系,并且该行所引用的行在父表中更新时,要对被更改行采取的操作。默认设置为 NO ACTION。 [ASC | DESC]指定加入到表约束中的一列或多列的排序次序。默认设置为 ASC。WITH VALUES指定在添加到现有行的新列中存储 DEFAULT constant_expression 中所给定的值。
    column[,...n]是新约束所用的一列或多列(置于括号中)。constant_expression是用作列的默认值的字面值、NULL 或者系统函数。FOR column指定与表级 DEFAULT 定义相关联的列。CHECK是通过限制可输入到一列或多列中的可能值强制域完整性的约束。logical_expression是用于 CHECK 约束的返回 TRUE 或 FALSE 的逻辑表达式。用于 CHECK 约束的 Logical_expression 不能引用其它表,但可引用同一表中同一行的其它列。==================================
    sql的联机帮助,上面多的呢
      

  8.   

    按照sql语句来,这个还有什么要讨论的?
      

  9.   

    谢谢cow8063(天涯远不远?不远!人在天涯,天涯怎会远) 的解释,
    to  soaringsouth(栈桥捉鳖),那做数据库还不是天天用sql,但是天天都可以讨论啊,
    我的意思是想请教一下高手们,可能他们遇到的特殊情况或特殊的解决办法。
      

  10.   

    查询全攻略书下载:http://bbs.2ccc.com/topic.asp?topicid=82713
    宇宙中最强悍的Delphi资料专辑:  /*站长增加*/
    本地下载1:http://www.eFile.com.cn/eFile/other/5415(dfw).rar
    大小:9.34M
    }
    下载地址2:宇宙中最强悍的Delphi资料专辑
    下载地址3:宇宙中最强悍的Delphi资料专辑简介:
    有史以来最强悍的delphi资料包!
    我并没有把我全部的资料交给您!因为资料在于精而不再于多!只要您能踏踏实实的看完这些
    资料包里的内容,并且能够完整清晰的讲述给别人听,并且别人也听懂了,我想你已经是一个Delphi的高手了。一个并不亚于你偶像的高手了!资料包括:
    1: 查询数据库的最完美技巧 中文版
    2: Delphi 6 的帮助文件 中文版
    3: Delphi 6 函数介绍 中文版
    4: 最完整的Object Pascal语言介绍 中文版 
    5: 拥有魔力的FastReport的帮助文件 中文版
    6: InterBase的经典问答资料文件 中文版
    7: MySQL的最详细帮助文件 中文版 
    8: 地球上最有名、最受推崇、最多人使用并且从中受益的程式设计用书 当然也是中文版
    (注意:其中有些资料重复,请考虑是否有用!by giver)
    >>>>>>>>>恢复下载!2003.6.15 20:40<<<<<<<<<<
      

  11.   

    Select
    用途: 从指定表中取出指定的列的数据语法: SELECT column_name(s) FROM table_name
      解释:从数据库中选取资料列,并允许从一或多个资料表中,选取一或多个资料列或资料行。SELECT 陈述式的完整语法相当复杂,但主要子句可摘要为:SELECT select_list 
    [ INTO new_table ] 
    FROM table_source 
    [ WHERE search_condition ] 
    [ GROUP BY group_by_expression ] 
    [ HAVING search_condition ] 
    [ ORDER BY order_expression [ ASC | DESC ] ] 例: “Persons” 表中的数据有LastName
     FirstName
     Address
     City
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     
    Pettersen
     Kari
     Storgt 20
     Stavanger
     选出字段名” LastName”、” FirstName” 的数据SELECT LastName,FirstName FROM Persons
     返回结果:LastName
     FirstName
     
    Hansen
     Ola
     
    Svendson
     Tove
     
    Pettersen
     Kari
     选出所有字段的数据SELECT * FROM Persons
     返回结果: LastName
     FirstName
     Address
     City
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     
    Pettersen
     Kari
     Storgt 20
     Stavanger
        Where
    用途:被用来规定一种选择查询的标准语法:SELECT column FROM table WHERE column condition value
     下面的操作符能被使用在WHERE中:=,<>,>,<,>=,<=,BETWEEN,LIKE注意: 在某些SQL的版本中不等号< >能被写作为!=解释:  SELECT语句返回WHERE子句中条件为true的数据例:从” Persons”表中选出生活在” Sandnes” 的人SELECT * FROM Persons WHERE City='Sandnes'
      "Persons" 表中的数据有:LastName
     FirstName
     Address
     City
     Year
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     1951
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     1978
     
    Svendson
     Stale
     Kaivn 18
     Sandnes
     1980
     
    Pettersen
     Kari
     Storgt 20
     Stavanger
     1960
     返回结果:LastName
     FirstName
     Address
     City
     Year
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     1951
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     1978
     
    Svendson
     Stale
     Kaivn 18
     Sandnes
     1980
        
      

  12.   

    And & Or
    用途:在WHERE子句中AND和OR被用来连接两个或者更多的条件解释:AND在结合两个布尔表达式时,只有在两个表达式都为 TRUE 时才传回 TRUE  OR在结合两个布尔表达式时,只要其中一个条件为 TRUE 时,OR便传回 TRUE例:  "Persons" 表中的原始数据:
    LastName
     FirstName
     Address
     City
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     
    Svendson
     Stephen
     Kaivn 18
     Sandnes
       用AND运算子来查找"Persons" 表中FirstName为”Tove”而且LastName为” Svendson”的数据SELECT * FROM Persons
    WHERE FirstName='Tove'
    AND LastName='Svendson'
     返回结果: LastName
     FirstName
     Address
     City
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     用OR运算子来查找"Persons" 表中FirstName为”Tove”或者LastName为” Svendson”的数据SELECT * FROM Persons
    WHERE firstname='Tove'
    OR lastname='Svendson'
     返回结果: LastName
     FirstName
     Address
     City
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     
    Svendson
     Stephen
     Kaivn 18
     Sandnes
       你也能结合AND和OR (使用括号形成复杂的表达式),如:SELECT * FROM Persons WHERE
    (FirstName='Tove' OR FirstName='Stephen')
    AND LastName='Svendson'
     返回结果:LastName
     FirstName
     Address
     City
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     
    Svendson
     Stephen
     Kaivn 18
     Sandnes
      Between…And
    用途: 指定需返回数据的范围语法:SELECT column_name FROM table_name
    WHERE column_name
    BETWEEN value1 AND value2
     例:“Persons”表中的原始数据LastName
     FirstName
     Address
     City
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     
    Nordmann
     Anna
     Neset 18
     Sandnes
     
    Pettersen
     Kari
     Storgt 20
     Stavanger
     
    Svendson
     Tove
     Borgvn 23
     Sandnes
     用BETWEEN…AND返回LastName为从”Hansen”到”Pettersen”的数据:SELECT * FROM Persons WHERE LastName 
    BETWEEN 'Hansen' AND 'Pettersen'
     返回结果:LastName
     FirstName
     Address
     City
     
    Hansen
     Ola
     Timoteivn 10
     Sandnes
     
    Nordmann
     Anna
     Neset 18
     Sandnes
     
    Pettersen
     Kari
     Storgt 20
     Stavanger
      为了显示指定范围之外的数据,也可以用NOT操作符:SELECT * FROM Persons WHERE LastName 
    NOT BETWEEN 'Hansen' AND 'Pettersen'
     返回结果:LastName
     FirstName
     Address
     City
     
    Svendson
     Tove
     Borgvn 23
     Sandnes