1创建数据库

1.1SQL server Management Studio图形界面:

资源管理器-新建数据库
(建议首先在目标存储位置建立文件夹)

1.2T-sql脚本:

新建查询【红线圈】

create database testdb
on primary(                  --数据库文件 .mdf
name='testdb',               --文件名称
filename='E:\testdb.mdf',    --文件存储路径,如果其中有文件夹一定要事先创建好文件夹才可以
size=10,                     --文件初始大小
maxsize=100mb,               --文件最大
filegrowth=2                 --增量   记得每一个赋值后面都有逗号,但是最后一个不可以有
)
log on(                      --日志文件 .ldf
name='testdb_log',
filename='E:\testdb_log.ldf',
size=10,
maxsize=100mb, 
filegrowth=2 
)

ctrl+f5 或者√(分析)【蓝线圈】

如没有报错继续

执行(f5)【黑线圈】

sql server新建本地数据库 sql server 2019怎么新建数据库_数据类型


刷新一下,便可以看到新建的数据库,完美!

sql server新建本地数据库 sql server 2019怎么新建数据库_sql server新建本地数据库_02

2新建表

2.1SSMS图形界面

数据库-表-新建表 即打开了表设计器

2.2 T-SQL

命令内,用,隔开小命令
命令外,用GO隔开两个命令

一些常见的约束:
NOT NULL --非空
DEFAULT’默认’ --默认值
DEFAULT数字
IDENTITY(种子,增量) --标识列
numeric(18,0) --18位数字,小数位数为0,一般身份证号码啥的
PRIMERY KEY或者最后用 PRIMARY KEY(某列名) --主键
UNIQUE–唯一性约束
CHECK(约束条件) --check约束

唯一性约束和主键约束
区别:唯一性可以为空,主键不可以为空
相同:都不允许重复

3位的char要求每个字符在0-9之间
no char(3) check(no like ‘[0-9][0-9][0-9]’)

设置identity的时候以及表设计器操作也是一样,一定这个字段是int
身份证学号什么的要设置char
1有可能出现0的开头,数字没法表示
2一般不用于计算,所以一般不用数字而用字符

设置性别gender

1可以Bit default 0,这样还是0,1自己去判断男女,什么都不填默认false

2可以char(2) default’男‘,除非是初始什么都不填才可以default值显示

3可以 char(2) check (gender in (‘男’,’女‘)),这样就非要填一个什么

4可以 char(2) default ‘男’ check (gender in (‘男’,’女‘))

5可以 char(2) check(gender=‘男’ or gender=‘女’),其实和3是一样的

sql server新建本地数据库 sql server 2019怎么新建数据库_sql server新建本地数据库_03

USE booktest
GO
CREATE TABLE Student(
Sno CHAR(7) PRIMARY KEY,
Sname varchar(10) NOT NULL,
Sex bit DEFAULT 0,
Ssex CHAR(2) DEFAULT '男', --不填默认男
Gender CHAR(2) CHECK (Gender IN ('男','女')),  --没有default并且没要求not null 所以不填会默认 Null
Sgender CHAR(2) DEFAULT '男' CHECK (Sgender IN ('男','女')), --不填默认男
Sage int CHECK(Sage BETWEEN 0 AND 100),
Sdept varchar(10) NOT null
)
GO

sql server新建本地数据库 sql server 2019怎么新建数据库_sql server新建本地数据库_04

一些小栗子
USE Guanke2019
GO
 CREATE  TABLE stuInfo2(
 stuName VARCHAR(4) NOT NULL,
 stuNo VARCHAR(10) NOT NULL,
 Credit SMALLINT CHECK(Credit BETWEEN 1 AND 10),
 stuSeat INT IDENTITY(1,1),
 stuId NUMERIC(18,0),
 stuAddress TEXT DEFAULT'具体不详'
 PRIMARY KEY(stuNo),
 PRIMARY KEY(stuNo,Cno)  --联合主键
 )
CREATE TABLE stuInfo7(
 stuNo VARCHAR(10) PRIMARY KEY CHECK(LEN(stuNo)=3),
 stuName VARCHAR(10) UNIQUE,
 score INT NOT NULL
 )

2.3注意

默认对表的结构不允许修改,因此

【工具】-【选项】-取消勾选【阻止保存要求重新创建表的更改】

sql server新建本地数据库 sql server 2019怎么新建数据库_数据_05

2.4出错合集

(1)提交数据出错

新创建好的表,编辑前200行数据,添加编辑数据时出错,一行数据提交不了,报错:未更新任何行,错误源:Net SqlClient Data Provider

sql server新建本地数据库 sql server 2019怎么新建数据库_数据库_06


然后查看表设计器

stuNo varchar(3)

stuName varchar(2)

结合各种帖子,大概意思就是数据的长度超过了规定设置的长度

猫猫摇头,又是一个坑🕳

这就不得不讲到varchar(X)和nvarcharc(X)的区别了

在教材上写:

  • varchar(可变长度的非Unicode数据)
  • nvarchar(可变长度的Unicode数据)

然后翻译过来就是:

  • varchar记录一个英文或英文标点,对应一个字符长度
    记录一个中文或中文标点,对应两个字符长度
  • nvarchar记录一个英文/中文/字符,对应一个字符长度
  • n是指national的意思

总之:

  • 英语环境用varchar,国内中文环境用nvarchar
  • varchar比较节省空间
  • 若是多语言的应用坏境,则需要采用unicode即用nvarchar

所以出错原因是
varchar(2)输入‘狗子’这两个中文字符,占位4个字符长度,不合适
所以

  • 首先,

如果用varchar的话,最好varchar(10)空间放多一点,如果不够实际占位是可以自动缩小的,超过了就难办了

  • 其次,

控制输入字符的长度len(列名),也是控制占位的字符长度的

(2)默认值没有显示

stuAddress设置了默认值,但是在新添数据的时候没有显示

sql server新建本地数据库 sql server 2019怎么新建数据库_sqlserver_07


sql server新建本地数据库 sql server 2019怎么新建数据库_sql server新建本地数据库_08


根据上面的出错思路

大概又是我varchar设置小了,原始设置为varchar(10)

现在修改为varchar(50)然后它可以了!显示了!

明明这个默认地址这么长,还放个10,真是心大!!

sql server新建本地数据库 sql server 2019怎么新建数据库_数据类型_09

3常见的数据类型

分类

数据类型

说明1

说明2

说明3

二进制

image

存储图像

-

binary

固定长度的二进制

-

vbinary

可变长度的二进制

分类

数据类型

说明1

说明2

说明3

文本数据类型

char

字符数据包括任意数字、字母和数字的组合,在单引号内输入

固定长度的非unicode字符

长度最多为8KB

-

varchar

-

可变长度的非unicode字符

-

nchar

-

固定长度的unicode字符

-

nvarchar

-

可变长度的unicode字符

-

text

-

存储长文本信息

长度最多为2GB

-

ntext

-

存储可变长度的长文本

(1)char与varchar,nchar与nvarchar的区别
两个字符型字段分别定义为char(10)和varchar(10),当给它们存入“abc”这个数据时,char(10)字段占用十个字节的存储空间,会在abc之前补充7个空格,而varchar(10)只占用3个字节存储空间,这就是char和varchar的区别。可以看出varchar比较适合存储长度变化很大的数据,但是char的存取速度会比较快,因为是固定长度。
(2)nchar和char,nvarchar和varchar,ntext和text的区别
主要区别在于是否使用Unicode进行编码。一般情况下在仅仅处理中文及英文,不涉及特殊符号时不需要使用Unicode,Unicode编码中由于每个字符都占用两个字节,而在非Unicode编码中,英文及英文符号占一个字节,中文及中文符号占两个字节,也就是说nchar(5)与char(10)都可以写入5个中文或中文符号,前者写入5个英文或者英文符号,后者写入10个英文或英文符号。
(3)char类和text的区别
char和varchar以及nchar和nvarchar字段的数据是保存在表中,而text字段可以保存大容量的文本,数据是保存在另外的空间里,当然在表面上看来并没有什么区别。

分类

数据类型

说明1

说明2

说明3

日期和时间数据类型

time

仅存储时间,精度为 100 纳秒

hh:mm:ss[.nnnnnnn]

时间和日期在单引号内输入

-

date

仅存储日期,从 0001 年 1 月 1 日 到 9999 年 12 月 31 日

YYYY-MM-DD

-

smallltimedate

日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束,精确到1分钟

YYYY-MM-DDhh:mm:ss

-

timedate

日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束,精确到3/100秒,即3.33 毫秒

YYYY-MM-DDhh:mm:ss[.nnn]

-

timedate2

从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒

YYYY-MM-DDhh:mm:ss[.nnnnnnn]

-

timedateoffset

与 datetime2 相同,外加时区偏移

YYYY-MM-DDhh:mm:ss[+/-]hh:mm

-

timestamp

时间戳

分类

数据类型

说明1

说明2

说明3

数值数据类型

bigint

整数

可存储8字节整数(-9223372036854775808~9223372036854775807)

仅包含数字,正数负数和分数

-

int

-

可存储4字节整数(-2147483648~2147483647)

-

smallint

-

可存储2字节整数(-32768~32767)

-

tinyint

-

可存储1字节整数(0 到255)

-

float[(n)]

数字

从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据

参数 n 指示该字段保存 4 字节还是 8 字节,N< =24-4字节,N> 24-8字节,默认n=53

-

real

-

从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据

-

numeric(p,s)

固定精度和比例的数字

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值,默认是 18。s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值,默认是 0。

-

decimal(p,s)

-

分类

数据类型

说明1

说明2

说明3

货币数据类型

money

介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据

十进制货币

-

smallmoney

介于 -214,748.3648 和 214,748.3647 之间的货币数据

布尔数据类型

bit

存储0或1

表示是/否的数据

4表的完整性约束

4.1实体完整性

4.2域完整性

4.3引用完整性

5查看已注册的服务器

快捷键:ctr+alt+G

或者

sql server新建本地数据库 sql server 2019怎么新建数据库_sqlserver_10


铛铛!

sql server新建本地数据库 sql server 2019怎么新建数据库_数据_11

--日期
SELECT CONVERT(date,GETDATE())            --日期:2016-05-03
--用于定义一个与采用 24 小时制并带有秒小数部分的一日内时间相组合的日期
SELECT CONVERT(datetime,GETDATE())        --2016-05-03 15:02:38.763
--定义结合了 24 小时制时间的日期。
SELECT CONVERT(datetime2,GETDATE())        --2016-05-03 15:02:38.7630000
--用于定义一个与采用 24 小时制并可识别时区的一日内时间相组合的日期。
SELECT CONVERT(datetimeoffset,GETDATE())--2016-05-03 15:02:38.7630000 +00:00
--此时间为 24 小时制,秒始终为零 (:00),并且不带秒小数部分。
SELECT CONVERT(smalldatetime,GETDATE())    --2016-05-03 15:03:00
--定义一天中的某个时间。此时间不能感知时区且基于 24 小时制。
SELECT CONVERT(time,GETDATE())            --15:02:38.7630000
--时间戳
SELECT CONVERT(timestamp,GETDATE())        --0x0000A5FB00F7EB4D