SQL Sever创建表

165 阅读4分钟

开始前,先说明一下:
SQL语句大小写不敏感(不区分大小写)。
SQL语句最后的分号可有可无
SQL语句中没有 "" ,只有 ''

创建基本表的语法:

CREATE  TABLE  <表名><列名>  <数据类型>  [ <列级完整性约束条件> ]  
   [,<列名>   <数据类型>  [ <列级完整性约束条件>] ] …  
   [,<表级完整性约束条件> ] );

常用数据类型:

1.bit类型

可以取值为1、0或NULL的整数数据类型。
备注:sQL Server 数据库引擎包优化 bit 列的存储。如果表中的列为 8 bit 或更少,则这些列作为1个字节存储。如果列为9到16 bit,则这些列作为2个字节存储,以此类推。
字符串值TRUE 和FALSE 可以转换为以下 bit值:TRUE转换为1,FALSE转换为0。

2.char与varchar类型

固定长度或可变长度的字符数据类型。

char [ ( n ) ]

固定长度,非Unicode字符数据,长度为n个字节。n的取值范围为1至8,000(存储大小是n个字节。

varchar [ ( n | max ) ]

可变长度,非Unicode字符数据。n的取值范围为1至8,000。max 指示最大存储大小是2^31-1个字节。存储大小是输入数据的实际长度加2个字节。

如果列的各行大小一致,则使用char。
如果列的各行大小差异相当大,则使用varchar。
如果列的各行大小相差很大,而且大小可能超过8000字节,请使用varchar(max)。

3.decimal 和 numeric类型

带固定精度和小数位数的数值数据类型。
decimal[ (p[ ,s]) ]和numeric[ (p[ , s]) ]
固定精度和小数位数。使用最大精度时,有效值从–10^38+1到10^38- 1。 numeric在功能上等价于decimal。

p(精度)
最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从1到最大精度38之间的值。默认精度为18。

s (小数位数)
小数点右边可以存储的十进制数字的最大位数。小数位数必须是从О到 p之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为0﹔因此,0<=s<=p。最大存储大小基于精度而变化。

更多数据类型可参照:

SQL 数据类型 (w3school.com.cn)

定义表的属性时需要指明其数据类型及长度 。

如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。

主码(主键):Primary Key,简称PK。
如果一个表中存在多个码,可任意指定一个为主码。
外码(外键): Foreign Key,简称FK。
取值参照其他列的列。

1.创建主键的方式:

建立“学生”表Student,学号是主码,姓名取值唯一。
方式一:

CREATE TABLE Student          
	  ( Sno   CHAR(9) PRIMARY KEY, /* 列级完整性约束*/                    
            Sname  CHAR(20) UNIQUE/* Sname取唯一值*/  
            Ssex    CHAR(2),  
            Sage   SMALLINT,  
            Sdept  CHAR(20)  
           ); 

方式二

CREATE TABLE Student          
	  ( Sno   CHAR(9),
            Sname  CHAR(20) UNIQUE,
            Ssex    CHAR(2),
            Sage   SMALLINT,
            Sdept  CHAR(20),
            PRIMARY KEY (Sno)  /* 表级完整性约束*/        
           ); 

方式三:

CREATE TABLE Student          
	  ( PRIMARY KEY (Sno) , /* 表级完整性约束*/   
            Sno   CHAR(9),
            Sname  CHAR(20) UNIQUE,
            Ssex    CHAR(2),
            Sage   SMALLINT,
            Sdept  CHAR(20)   
           ); 

如果主码由两个属性构成,必须作为表级完整性进行定义。
如建立“学生选课”表

CREATE TABLE  SC
      (Sno  CHAR(9), 
       Cno  CHAR(4),  
       Grade    SMALLINTPRIMARY  KEY (Sno,Cno))  

2.创建外键的方式:

建立“课程”表
方式一:

CREATE TABLE  Course
     ( Cno  CHAR(4) PRIMARY KEY,
       Cname  CHAR(40),            
       Cpno CHAR(4) FOREIGN KEY REFERENCES Course(Cno),/*Cpno是外码,被参照表是Course,被参照列是Cno*/
       Ccredit  SMALLINT
      ); 

方式二:

CREATE TABLE  Course
               ( Cno  CHAR(4)  PRIMARY KEY,
                 Cname  CHAR(40),            
                 Cpno  CHAR(4),               	                      
                 Ccredit  SMALLINTFOREIGN KEY (Cpno) REFERENCES  Course(Cno) 
               ); 

建立“学生选课”表

CREATE TABLE  SC
      (Sno  CHAR(9), 
       Cno  CHAR(4),  
       Grade    SMALLINT,
       PRIMARY  KEY (Sno,Cno),/* 主码由两个属性构成,必须作为表级完整性进行定义*/
       FOREIGN  KEY (Sno)  REFERENCES  Student(Sno),/* 表级完整性约束条件,Sno是外码,被参照表是Student */
       FOREIGN  KEY (Cno)  REFERENCES  Course(Cno)  /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
      ); 

特别强调:SQL2008外码属性的类型和宽度,一定要与所参照的主属性的类型和宽度相同。

3.在定义表结构时可以为列设置默认值。

方式一:

CREATE  TABLE  Student          
	  ( Sno   CHAR(9) PRIMARY KEY,
            Sname  CHAR(20) UNIQUE,
            Ssex   CHAR(2) default ‘男’,  /*设置Ssex的默认值为男。*/
            Sage   SMALLINT,
            Sdept  CHAR(20) default  ‘CS’  /*设置Sdept的默认值为CS。*/
           );

方式二:

CREATE  TABLE  Student          
	  ( Sno   CHAR(9) PRIMARY KEY,
            Sname  CHAR(20) UNIQUE,
            Ssex   CHAR(2) constraint DEF_sex default ‘男’,  /*设置Ssex的默认值为男。默认值名为DEF_sex*/
            Sage   SMALLINT,
            Sdept  CHAR(20) constraint DEF_sdept default  ‘CS’  /*设置Sdept的默认值为CS。默认值名为DEF_sdept*/
           );

4.在定义表结构时可以添加CHECK约束,用于限制列中的值的范围。

方式一:

CREATE TABLE  SC
        (Sno  CHAR(9), 
         Cno  CHAR(4),  
         Grade SMALLINT CHECK (Grade>=0  AND  Grade<=100) ,/*为Grade增加约束,取值范围为0~100*/
         PRIMARY  KEY (Sno,Cno),  
	 FOREIGN  KEY (Sno) REFERENCES  Student(Sno),
	 FOREIGN  KEY (Cno)  REFERENCES  Course(Cno)
  ); 

方式二:

CREATE TABLE  SC
        (Sno  CHAR(9), 
         Cno  CHAR(4),  
         Grade SMALLINT constraint CHK_grade CHECK (Grade>=0  AND  Grade<=100) ,/*为Grade增加约束,取值范围为0~100,约束名为CHK_grade*/
         PRIMARY  KEY (Sno,Cno),  
	 FOREIGN  KEY (Sno) REFERENCES  Student(Sno),
	 FOREIGN  KEY (Cno)  REFERENCES  Course(Cno)
  ); 

5.在定义表结构时可以为列设置唯一值。

CREATE TABLE Student          
	  ( Sno   CHAR(9) PRIMARY KEY, /* 列级完整性约束*/                    
            Sname  CHAR(20) UNIQUE/* Sname取唯一值*/  
            Ssex    CHAR(2),  
            Sage   SMALLINT,  
            Sdept  CHAR(20)  
           ); 

注:实际创建表时,要注意先后顺序:被引用(参考)的表在前。
primary key、foreign key、unique、default、check都属于约束。

6.在定义表结构时可以为列设置位空值。

CREATE  TABLE  Student          
	  ( Sno   CHAR(9) PRIMARY KEY,
            Sname  CHAR(20) UNIQUE,
            Ssex   CHAR(2) not null,
            Sage   SMALLINT,
            Sdept  CHAR(20) null
           );

关于空值(NULL)
空值不等于零、空白或零长度的字符串。NULL值意味着没有输入,通常表明值是未知的或未定义的。
如果某一列向一个表中插入数据行时,没有给允许为NULL值的列提供值,SQL Server则自动将其赋值为NULL。
如果某一列不允许为空值,用户在向表中插入数据时必须为该列提供一个值,否则插入会失败。

任何两个空值均不相等。但如果数据库的ANSI_NULLS选项配置为False,则空值之间的比较(如NULL=NULL)等于TRUE。
空值与任何其他数据类型之间的比较等于FALSE。

由于空值会导致查询和更新时使事情复杂,所以为了减少SQL语句的复杂性,建议尽量不要允许使用空值。
——如:学生成绩表(表名XSCJ)表中成绩列可以设置它不允许空值,为其创建一个默认值,如“-1”,这样对于没有确定的成绩就会取值“-1”,而不是空值。

6.在定义表结构时可以为列设置identity属性。

语法:IDENTIEY [ ( seed , increment ) ]

seed:装载到表中的第一个行使用的值。(起始值、种子值)
increment:与前一个加载的行的标识值相加的增量值。(增量、步长)

seed、increment都为整数,可正可负。
必须同时指定种子和增量,或者二者都不指定。如果二者都未指定,则取默认值(1,1)。
identity属性列不需要赋值。

即使表中的所有行全部被删除,之后再insert 数据时,该列的值依然是“上一个值+increment”。
一个表只能有一个标识符列。
当设置id2为标识列后,原来的标识列id1自动被取消,变为非标识列。

CREATE  TABLE  Student          
	  ( Id_num INT IDENTIEY(1,1),
            Sno   CHAR(9) PRIMARY KEY,
            Sname  CHAR(20) UNIQUE,
            Ssex   CHAR(2) ,
            Sage   SMALLINT,
            Sdept  CHAR(20) is null
           );

7.删除表

语法:**drop table 表名 **

删除Student表:

drop table Student