█ 数据类型
对字符型的选择是一个重要的知识点:
对 char(n),nchar(n),varchar(n),nvarchar(n) 进行辨析 :
❶ 不带n的是ASCII编码(英文、字符、数字占1个字节,汉字占2个字节),
带n的是unicode编码(所有字符都占2个字节;即牺牲了存储空间而优化了兼容性);
❷ 不带var的是固定长度的,不足n补空格,超出则截断
带var的是可变长度的(自适应的),存储大小为实际长度,超出则截断
如何进行选择?
❶ 数据含有汉字,使用带n的unicode编码(考虑到兼容性);数据是字母、符号、数字的组合,使用不带n的ASCII编码(考虑到存储空间)
❷ 数据长度不定,使用带var的(可变当然要带var,原则上优先不可变);长度固定,使用不带var的(效率较高,且var需要多出一位类存储长度信息)
列个表 :
数据类型 | 数据标识 |
---|---|
整型 | int, bigint, smallint, tinyint, bit |
精确数值型 | decimal, numeric |
浮点型 | float, real |
ASCII字符型 | char, varchar, text |
unicode字符型 | nchar, nvarchar, ntext |
图像型 | image |
二进制型 | binary, varbinary |
日期时间型 | date, time, datetime |
特殊数据类型 | … |
█ 约束(constraint)
☑ 主键 右键→设置主键
☑ 非空 勾选"允许NULL值"
☑ 唯一 右键→索引/键→添加→常规(类型、列)→"唯一键"
☑ 默认 下方属性→直接添加默认值
☑ 检查 右键→CHECK约束→表达式
☑ 外键 右键→关系→常规(表和列范式)→设置主键表、外键表及其需要对应的列
█ 脚本命令的建表及约束
相关约束的脚本命令表达 :
☑ 主键 primary key
☑ 非空 not null
☑ 唯一 unique
☑ 默认 default()
☑ 检查 check()
☑ 外键 foreign key(列名) references 表名(列名)
demo :
use dbtest
go
create table ClassInfo -- ClassInfo表
(
cId int primary key identity(1,1), -- 主键,identity表示自动生成唯一标识,且(种子,步长)
cName nvarchar(10) not null -- 非空约束
)
create table StudentInfo -- StudentInfo表
(
sId int primary key identity(1,1), -- 主键自动 not null ,其余自动允许null
sName nvarchar(10) not null,
sPhone char(11)
sGender bit default(1), -- 默认约束
sGrade tinyint check(sGrade>=1 and sGrade<=4), -- 检查约束
sEmail varchar(20) not null unique, -- 唯一约束
cId int not null , -- 外键约束之前先建立关系
foreign key(cId) references ClassInfo(cId) -- 外键约束(注意格式)
)
█ 操作表的属性(列)
界面修改不必多言;直接看脚本命令 :
alter table StudentInfo
alter column Sname nvarchar(12) -- 修改(注意:原本not nll的Sname现在允许NULL了)
alter table StudentInfo
add sTeacher nvarchar(10) -- 添加属性(列)
alter table StudentInfo
drop column sPhone -- 删除(注意:当该列存在约束时,无法drop掉,需要先删除约束条件)
█ 操作表的约束
create table Score
(
Sno int,
Cno int,
score decimal(4,1),
constraint pk_cs primary key(Sno,Cno) -- 创建时设置约束,其实这句写在上面也一样,就是给约束命名而不使用默认名而已
)
alter table Score
add constraint uk_ss unique(Sno) -- 修改时添加约束
alter table Score
drop constraint pk_cs -- 修改时删除约束
█ 操作表的数据
▉ 简单查询(select)
select * from 表名
▉ 插入(insert [into]…values…)
-- 假设表UserInfo的列为:UserId, UserName, UserPwd
-- 其中UserId的唯一标识作用自动实现
insert into UserInfo(UserName, UserPwd)
values('Loli', '123456') -- 最完整写法
insert UserInfo
values('DMX', '112358') -- 为所有的列,按照默认顺序(对应)赋值
insert UserInfo(UserName)
values('cocoa') -- 为某些列赋值,而不是所有列(未被赋值的列不能有非空约束)
insert UserInfo -- 批量插入数据(值得注意的是,数据库只受到了一次影响)
values('stranger1', '321aaa123'),('stranger2', '987654321')
▉ 修改(更新)(update…set…)
-- ↑ 接上表
update UserInfo
set UserPwd='5c4cafcf959b534f' -- 为所有行的指定列进行修改
update UserInfo
set UserPwd = '123456' where UserName = 'DMX' -- 为指定行进行修改列(where筛选条件)
▉ 删除(delete [from]…)
-- ↑ 接上表
delete UserInfo
where UserId>4 -- 唯一标示未重置
清空(truncate table…)
truncate table 表名 -- 唯一标识重置;注意被清空的表不能被设置为外键
█ 知识点拾遗
① 设为主键后,可以由SQL Server自动帮我们维护这个唯一标识的值:
设置为int型→下方列属性→表设计器→表示规范→"是表示" 置 “是”
② 外键约束极其重要。依据是关系的数量模式(1对1?1对多?多对多?)和 谁起决定作用
★☆★ demo : 学生(编号,姓名,班级编号),班级(编号,名称)
思路 :班级与学生是一对多的关系,因此在学生关系(多)中进行外键约束;
学生关系中对班级编号的填写,依赖于班级关系中所拥有的编号取值,即后者起决定作用,因而班级关系为主键表,学生关系为外键表
③ 精确数值型decimal和numeric,唯一的区别在于decimal不能用于带有identity关键字的列
例如 decimal(4,1)表示共4位,其中小数1位;小数位数严格且优先的原则下,进行截断
> _ <