SqlServer数据库入门

784 阅读5分钟

为小姐姐~~科普数据库~~

隔着屏幕~你感受到我的爱了喵~~

在数据库面前颤抖吧~


一建库建表

1创建数据库

CREATE DATABASE stuDB
   ON  PRIMARY  --默认就属于PRIMARY主文件组,可省略
(
NAME='stuDB_data',  --主数据文件的逻辑名
FILENAME='D:\project\stuDB_data.mdf',  --主数据文件的物理名,master data file
SIZE=5mb,  --主数据文件初始大小
MAXSIZE=100mb,  --主数据文件增长的最大值
FILEGROWTH=15%   --主数据文件的增长率
)
--创建文件组,logic存在,但是ldf文件是物理存在的
filegroup mygroup
(
 name='School_data1',--逻辑名称.说明最多能够存储100mb数据,如果没有限制就可以将硬盘存储满
 size=3mb,--初始大小
 maxsize=100mb,--最大容量
 filegrowth=10%,--文件增长一次增长10%
 filename='F:\qiyi\School_data1.ndf'    
)
LOG ON
(
  NAME='stuDB_log',
  FILENAME='D:\project\stuDB_log.ldf',
  SIZE=2mb,
  FILEGROWTH=1MB
)
GO

2创建物理表

USE stuDB   --将当前数据库设置为stuDB
GO
CREATE  TABLE  stuInfo    /*-创建学员信息表-*/
(
stuName  VARCHAR(20)  NOT  NULL ,  --姓名,非空(必填)
stuNo   CHAR(6)  NOT  NULL,   --学号,非空(必填)
stuAge  INT  NOT  NULL,  --年龄,INT类型默认为4个字节
stuID  NUMERIC(18,0),     --身份证号   代表18位数字 小数位数为0
stuSeat   SMALLINT  IDENTITY (1,1),   --座位号,自动编号
stuAddress   TEXT   --住址,允许为空,即可选输入
)
GO

二主外键,约束

ALTER TABLE 表名 
     ADD CONSTRAINT 约束名  约束类型  具体的约束说明

约束名的取名规则推荐采用:约束类型_约束字段
主键(Primary Key)约束:如 PK_stuNo
唯一(Unique Key)约束:如 UQ_stuID
默认(Default Key)约束:如 DF_stuAddress
检查(Check Key)约束:如 CK_stuAge
外键(Foreign Key)约束:如 FK_stuNo

ALTER TABLE stuInfo         --主键约束
     ADD CONSTRAINT PK_stuNo PRIMARY KEY (stuNo)
ALTER TABLE stuInfo         --唯一约束
    ADD CONSTRAINT UQ_stuID UNIQUE (stuID)
ALTER TABLE stuInfo         --默认约束
    ADD CONSTRAINT DF_stuAddress
          DEFAULT ('地址不详') FOR stuAddress
ALTER TABLE stuInfo         --check 约束
    ADD CONSTRAINT CK_stuAge
        CHECK(stuAge BETWEEN 15 AND 40)
ALTER TABLE stuMarks        --外键约束(主表stuInfo和从表stuNo  关联字stuNo)
   ADD CONSTRAINT FK_stuNo         
       FOREIGN KEY(stuNo) REFERENCES stuInfo(stuNo)
GO

三基础数据类型

varchar,nvarchar:变化的。存储内容小于分配的空间,就回收分配空间。超出,就报错。 
nvarchar:每个字符占2个字节。长度是正常哒
declare @var1  varchar(10) ; set @var1 ='aa' ; print len(@var1);print datalength(@var1)
declare @var2  nvarchar(10) ; set @var2 ='aa' ; print len(@var2);print datalength(@var2)

varchar(4) 可以输入4个字线,也可以输入两个汉字,varchar(4) a1='a' ,a1长度是1
nvarchar(4) 可以输四个汉字,也可以输4个字母,但最多四个
char(4),长度固定是4

DATETIME数据类型
DATETIME=两个4字节的整数。
尽量使用独立于设置的表示方法:[yy]yymmdd[hh:mi:ss[.mmm]] 。因为每台pc时间设置不一样。
字符串转换datetime值CONVERT: CONVERT(DATETIME,'12/02/06',3)  ----目标数据类型,源头数据,style=3
insert into dbo.person(PER_FIRST_NAME, PER_Last_NAME, PER_BIRTH_DATE) --PER_BIRTH_DATE数据类型datetime
values('today','oct',CAST(convert(char(8),GETDATE(),112) as datetime)) 【Getdate()太长,我想要指定格式的datetime 数值】

四数据类型转换

两种方式Convert和Cast

--Convert(目标类型,源数据,[格式]) --日期有格式
print '我的成绩是:'+convert(char(3),100)
--cast(源数据  as  目标类型)  它没有格式
print '我的成绩是:'+cast(100 as char(3))

五子查询

子查询分2种: 独立子查询和相关子查询

1.独立子查询:子查询可以直接独立运行
查询比“王八”年龄大的学员信息
select * from Student where BornDate<(select BornDate from Student where StudentName=’王八’)

2.相关子查询:子查询使用了父查询中的结果
a select * from Student where ClassId in(select ClassId from grade where classname<>'八期班')

b EXISTS
select * from Student where EXISTS(select * from grade)--子查询的作用就相当于进行存在测试,返回true or false

六事务

三个关键语句:
开启事务:begin transaction
提交事务:commit transaction
回滚事务:rollback transaction
--事务一旦开启,就必须提交或者回滚
--事务如果有提交或者回滚,必须保证它已经开启

例子:

SET XACT_ABORT ON
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.test(IndexColumn,indate)
SELECT NEWID(),GETDATE()
UNION ALL
SELECT NEWID(),GETDATE()
PRINT 'transaction succsessfully'
COMMIT TRANSACTION
SET XACT_ABORT OFF

END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
SELECT * FROM dbo.test t

七视图

语法:

CREATE VIEW view_name AS
SELECT col1,col2,colN
FROM table_name
WHERE condition

注意:

视图体中不能有order by。只能创建 查询 语句。
视图 可以进行删除增加和修改操作。
不建议如此做,如果是多表关联出来的,那么多张的数据会报错,影响多个基表。

八触发器

——不常用

九存储过程

1 不带参数的存储过程

CREATE PROCEDURE [dbo].[SP_GetInfo]
AS
BEGIN
SELECT COL1,COL2,COL7 FROM TABLE_233
END

2带输出参数的存储过程

CREATE PROC SP_GetSal
@MaxSal INT OUTPUT,
@MinSal INT OUTPUT
AS
BEGIN
SELECT @MaxSal=MAX(empsal),
@MinSal=MIN(empsal)
FROM dbo.emp e
END

--执行存储过程
DECLARE @MaxSal INT
DECLARE @MinSal INT
EXEC dbo.SP_GetSal @MaxSal OUTPUT ,@MinSal OUTPUT
SELECT @MaxSal,@MinSal

十临时表和表变量 

面试经常会问临时表和表变量的区别?

从内部存储来看,二者在tempdb里面有明显差别,这里不做底层讲解

简单的说——

1临时表 

表达方式 #table
a有统计信息
b全局临时表:##T1(不能关闭创建的会话)

2表变量

表达式 @table 
a无统计信息
b表变量不能创建显示索引,只能创建Primarykey和unique约束
c一旦定义就无法改变。减少重新编译

十一游标

——不经常使用,不到万不得已 ,不用这个

——就是循环遍历,而且写起来,感觉有点麻烦

举个例子

declare @id int
declare @name varchar(50)
declare cursor1 cursor for         --定义游标cursor1
select * from table1               --使用游标的对象(跟据需要填入select文)
open cursor1                       --打开游标

fetch next from cursor1 into @id,@name  --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中

while @@fetch_status=0           --判断是否成功获取数据
begin
update table1 set name=name+'1'
where id=@id                           --进行相应处理(跟据需要填入SQL文)

fetch next from cursor1 into @id,@name  --将游标向下移1行
end

close cursor1                   --关闭游标
deallocate cursor1