为小姐姐~~科普数据库~~
隔着屏幕~你感受到我的爱了喵~~
在数据库面前颤抖吧~

一建库建表
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
)
GO2创建物理表
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),长度固定是4DATETIME数据类型
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
END2带输出参数的存储过程
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