关系数据库 第一瓣
数据库说会也会,一用起来好像又不大确定,干脆总结下。
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