关系数据库 第一瓣

  数据库说会也会,一用起来好像又不大确定,干脆总结下。

1.关系模型的完整性约束

  数据完整性是指数据库中的数据是有意义和正确的,它包括实体完整性、参考完整性、用户定义的完整性

  实体完整性保证关系中的每个元组都是可以识别的和唯一的。这就要求关系数据库中所有表必须有主码,不允许出现无主码或者主码值相同的记录。关系模型中的每一行记录对应客观存在一个实例或事实。

  现实世界中的实体之间往往存在某种联系,而在关系模型中,实体以及实体之间的联系都是用关系来表示的。参照完整性一般是指多个实体或表之间的关联关系。例如一个表中某列的取值受另一个表某列的取值范围约束。

  用户定义的完整性,它反映了某一具体应用所涉及的数据必须满足的应用语义的要求。用户定义的完整性实际上是指明关系中属性的取值范围,防止属性的值与应用语义矛盾。

 

2. SQL数据类型

  每种数据库所支持的数据类型并不完全相同,并且与标准的SQL也有差异,这里列出标准SQL类型与SQL SERVER 类型。

  ---------------------------SQL-92或SQL-99数据类型----------------------

  (1)准确型

    计算机中能精确存储的数据,比如整数、定点小数等

    Integer    4字节  可表示-21亿多到21亿多的整数

    Smallint   2字节  可表示-32768到32767的整数

    Bit                     存储1或0

    Decimal(p,q)     定点小数。p为小数点左边加右边一共可存储的十进制最大位      数。q为右边可存储的小数最大位数。p>=q>=1

  (2)近似型

    用于表示浮点型数据的近似数据类型。

    float        8字节  

  (3)字符串型

    目前字符的编码方式有两种,普通编码方式和统一字符编码。普通编码方式不同国家或地区编码长度不一样,如英文为1个字节,中文为2个字节;统一编码方式均采用双字节编码。

    character(n)  固定长度的字符串类型,n为最大长度,取值1~8000

    character varying(n)可变长度的字符串类型

    national character(n)定长的unicode字符串类型,n取值1~4000

    national character(n)varying 变长的unicode字符串类型

    binary(n)  定长的二进制字符数据,n取值1~8000

    binary varying(n) 变长的二进制字符数据

  (4)日期时间型

    SQL-92或SQL-99是将日期和时间类型数据分开存储的,日期是Date类型,时间是Time类型。

 

 ---------------------------SQL SERVER数据类型----------------------

  (1)准确型 

    计算机中能精确存储的数据,比如整数、定点小数等

    Bigint      8字节  可表示-922亿亿多到922亿亿多的整数 

    Int          4字节  可表示-21亿多到21亿多的整数 

    Smallint   2字节  可表示-32768到32767的整数

    Tinyint         存储0~255之间的整数 

    Bit                     存储1或0 

    Numeric(p,q)或Decimal(p,q)     定点小数。p为小数点左边加右边一共可存储的十进制最大位数。q为右边可存储的小数最大位数。p>=q>=1

  (2)近似型

    用于表示浮点型数据的近似数据类型。 

    float        8字节  

    real         4字节 

     精度参考 float与double http://www.cnblogs.com/BradMiller/archive/2010/11/25/1887945.html

    

1. 范围
   float:
  1bit(符号位) 8bits(指数位) 23bits(尾数位)
  double:
  1bit(符号位) 11bits(指数位) 52bits(尾数位)
 2.  精度
   float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
  double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

  (3)字符串型 

    char(n)  固定长度的字符串类型,n为最大长度,取值1~8000 

    varchar(n)可变长度的字符串类型

    text    可存储231 -1(2G多)个字符的大文本 

    national character(n)定长的unicode字符串类型,n取值1~4000 

    national character(n)varying 变长的unicode字符串类型

    ntext    可存储230-1(1G多)个字符的统一编码文本

     binary(n) 定长的二进制字符数据,n取值1~8000 

    varbinary(n) 变长的二进制字符数据

    image    大容量变长的二进制字符数据,可存储多种格式的文件如word,excel,bmp,gif,JPEG等的数据,最多可存231-1个字节,约为2GB 

  (4)日期时间型

    Datetime       8字节    1753.1.1 ~ 9999.12.31之间的时间,精确到3.3ms

      Smalltime  4字节    1900.1.1 ~ 2079.6.6之间的时间,精确到分钟。

     输入日期格式之一数字加分隔符 例如: 2001-10-25 3:28:57 PM

  (5)货币型

    实际上都是拥有四位小数的decimal类型

    money               8字节   -263 ~ 263-1之间

    smallmoney   4字节   -214748.3648 ~ 214748.3647

 

3.  数据库定义、删除、修改

   几点注意

  •   默认情况下,SQL语言不区分大小写;
  •   SQL中的字符常量用单引号括起来;   
  •       --为SQL的单行注释符,/*  */为多行注释符;
  •   数据库中的空值为特殊的标量常量,代表未定义的或者有意义但是目前还处于未知状态的值;
  •       计算函数不能出现在WHERE字句中

   (1)定义表

    Create table 表名 (

      列名  数据类型 [列级完整性约束]

      {, 列名  数据类型 [列级完整性约束]  …}

      [,表级完整性约束]

    )

    列级完整性约束:

    NOT NULL、DEFAULT、UNIQUE、CHECK(约束表达式)、PRIMARY KEY,

    [FOREIGN KEY (列名)] REFERENCES 外表名 (外表列名)

    例如:    

CREATE TABLE t_anaresult(
      Sno char(7) PRIMARY KEY,
      Sname char(10) NOT NULL,
      Ssex char(2) CHECK(Ssex = '' OR Ssex = ''),
      Sage tinyint CHECK(Sage>15 AND Sage<45),
      Sdept char(20) DEFAULT '计算机系'
    ) 

 

CREATE TABLE t_sc(
      Sno char(7) NOT NULL,
      Cno char(10) NOT NULL,
      Grade tinyint,
      CHECK (Grade>=0 and Grade<=100),
      PRIMARY KEY (Sno),
      FOREIGN KEY (Sno) REFERENCES t_anaresult (Sno)
     )

 

 

    (2)删除表

    drop table 表名 {[, 表名]…}

    例如 drop table t_sc , t_anaresult

 

    (3)修改表

    ALTER TABLE 表名

    [ALTER COLUMN 列名 新数据类型]

    | [ADD [COLUMN] 列名 数据类型 [约束]]

    | [DROP COLUMN 列名]

 

    | [ADD PRIMARY KEY (列名,…)]

    | [ADD FOREIGN KEY (列名) REFERENCES 表名 (列名)]

 (4)查询功能

    基本结构可描述为:

    SELECT 目标列名序列

      FROM 数据源

       [WHERE 检索条件]

       [GROUP BY 分组依据列]

       [HAVING 组提取条件] 

       [ORDER BY 排序依据列]

    例如

      选择若干列

SELECT Sno FROM t_anaresult;  --选择特定列
SELECT * FROM t_anaresult;    --选择所有
SELECT Sno AS 学号 FROM t_anaresult; --为列取别名

 

      选择若干元组    

SELECT DISTINCT Sdept FROM t_anaresult; --去掉重复行

 

 

      WHERE字句常用的查询条件

    比较                                           = 、<、>、<=、>=、!=

    确定范围                                     BETWEEN AND(包括边界值),NOT BETWEEN AND

    字符匹配             LIKE , NOT LIKE

    空值               IS NULL, NOT NULL

    多重查询             AND, OR

    例如

 

SELECT Sno FROM t_anaresult WHERE Sdept = '计算机系'
SELECT Sno FROM t_anaresult WHERE Sage BETWEEN 18 AND 20;
SELECT Sno FROM t_anaresult WHERE Sdept IN ('计算机系','数学系');

 

   字符匹配(_ :匹配任意一个字符 %:匹配0个或者多个字符 []:匹配[]中的任意一个字符 [^]不匹配[]中的任意一个)         

SELECT Sno FROM t_anaresult WHERE Sdept like '%计算机%'
SELECT Sno FROM t_anaresult WHERE Sdept IS NULL
SELECT Sno FROM t_anaresult WHERE Sdept IS NOT NULL

 

 

 

      对结果进行排序

      ORDER BY 列名 ASC|DESC

 

SELECT Sno FROM t_anaresult ORDER BY Sage DESC; 

 

      使用计算函数进行汇总

      COUNT(*),COUNT(列名),SUM(列名),AVG(列名),MAX(列名),MIN(列名)

      除COUNT(*)外,其他函数计算过程中均忽略NULL值      

SELECT COUNT(*) FROM t_anaresult;
SELECT COUNT(DISTINCT Sedpt) FROM t_anaresult;
SELECT MIN(Sno),MAX(Sno) FROM t_anaresult;
SELECT MIN(Sno)||'@'||MAX(Sno) FROM t_anaresult; --将两字段连接在一起输出

 

        对结果进行分组计算

      GROUP BY 分组依据列 [HAVING 组提取列]

      使用了分组字句,则查询列表的每个列要么是分组依据列,要么是计算函数。      

SELECT Sdept , COUNT(Sdept) AS 该系人数 FROM t_anaresult GROUP BY  Sdept

 

      HAVING用于对分组后的记录进行再过滤,它用于组而不是单个记录      

SELECT Sdept , COUNT(Sdept) AS 该系人数 FROM t_anaresult GROUP BY  Sdept HAVING COUNT(*) >1

 

posted @ 2013-10-07 15:53  programmertata  阅读(245)  评论(0编辑  收藏  举报