create database mydb
on
(
--数据文件,第一个数据文件为主文件,后缀.mdf
name = my_datatbase_data,--逻辑名
filename = 'D:\数据库练习\my_database_data.mdf',--文件名
size = 10MB,--数据库初始大小
maxsize = 100MB,--最大大小
filegrowth = 10% -- 文件的增长容量
)
log on
(
--日志文件,后缀.ldf
name = my_database_log,
filename = 'D:\数据库练习\my_database_log.ldf',
size = 5MB,
maxsize = 50MB,
filegrowth = 5MB
)
略
drop database mydb
--创建一个密码为123,登录名为vistor,基于mydb数据库的登陆
create login visitor
with
password = '123',
default_database = mydb;
--从登录名为vistor的数据库中创建数据库用户dbuser
create user dbuser
from login visitor;
--赋予他建表的权限(语句权限无需指定表)
grant create table to dbuser;
--赋予在t0上插入和查询的权限(需要指定表,一条语句只能指定一个表)
grant insert,select on t0 to dbuser;
--从dbuser上收回建表的权限
revoke create table from dbuser;
--创建角色
create role student;
--删除角色
drop role student;
--删除数据库用户
drop user dbuser;
--删除登陆帐好
drop login visitor;
常用数据类型:
数据类型 | 数据范围 | 用途 |
---|---|---|
bit | [0,1] | 表示逻辑 |
int | [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31} - 1] [−231,231−1] | 表示32位整数 |
bigint | [ − 2 63 , 2 63 − 1 ] [-2^{63},2^{63} - 1] [−263,263−1] | 表示64位整数 |
float | 略 | 表示浮点数 |
money | 略 | 表示货币 |
char(n) | 1<=n<=8000 | 表示定长小字符串 |
varchar(n) | 按实际空间分配,最大8000 | 表示变长小字符串 |
varchar(max) | 非常大 | 表示文本类型,例如一本小说就可以用这个存储 |
date | 略 | 表示日期 |
binary、varbinary、varbinary(max) | 略,和char类似 | 表示二进制,例如音频视频之类的不易被处理的文件。 |
--创建一个由学号,姓名,性别构成的表
create table emp(
empid varchar(20),
empname varchar(20),
empgender char(10)
);
-- 插入三条数据
insert into emp
values('001','张三','男');
insert into emp(empid)
values('004');
insert into emp(empname,empgender)
values('尹志平','男');
-- 修改表中行
--有where指定,就指改变指定的,没有就全部改变
update emp
set empgender = '女'
where empname = '张三';
update emp
set empgender = '男'
--修改表中列,增加一列
alter emp
add empscore int;
--删除,和update原理一样
delete from emp
where empname = '尹志平';
--删表
drop table emp;
begin transaction --开始显式事务
commit transaction --结束事务
create table figure(
fno int primary key identity(1,1),
fname varchar(20) not null,
fnickname varchar(20) unique,
depno varchar(20) foreign key references dep(depno)
);
create table dep(
depno varchar(20) primary key,
depname varchar(20)
);
figure表
fno(主键,初始为1,且自增1) | fname (非空) | fnickname(唯一) | depno(外键) |
---|---|---|---|
1 | 尹志平 | 龙骑士 | 1 |
2 | 小龙女 | 姑姑 | 2 |
3 | 杨过 | 过儿 | 2 |
dep表
depno | depname |
---|---|
1 | 全真教 |
2 | 古墓派 |
sum(),max(),avg(),min(),count()-- 求和,求最大值.平均值,最小值,计数
select * from emp; --全部查询
select * from emp where empname = '尹志平' -- 指定查询
select * from emp order by empscore desc/asc --根据分数降序/升序查找
select depno,max(empscore) from emp group by depno --查询每个部门的最大分数(按部门编号分组)
连接查询:两个表直接进行连接的查询(只说内连接),比如我想知道我想通过figure表的depno知道depname,那么一个表肯定不行,我们可以通过连接查询完成。
子查询:将查询结果作为上一个查询的条件,比如说我想知道班上的最高分的信息,我们先查到最高分,然后将最高分作为条件去找这个人。
--连接查询
select depname
from figure
join dep on figure.depno = dep.depno;
--子查询
select *
from emp
where empscore = (select max(empscore) from emp)
--
索引的实质给数据库一个搜索的方向(将数据有顺序的存放在B树中)。
视图的实质是把查询打包成一个函数,需要时直接调用。
视图属于三级模式中的外模式
索引分为唯一索引(唯一约束自带),聚集索引(主键自带,且只能有一个),非聚集索引。
--在表emp上对empname列创建索引
create index index_01 on emp(empname);
--创建视图view_01 将查询全部emp的元素的查询指令打包
create view view_01
as select * from emp;
sql作为一种数据库专有的编程语言也有自己的程序设计方式,但是sql语言一般较为繁琐,只能实行简单的逻辑,一般繁琐的逻辑实现还是交给后台(java,c++,go等)来完成。
declare @i int ,@res int
select @i = 1,@res = 1
while(@i <= 10)
begin
select @res = @res * @i
select @i = @i + 1
end
select @res;
略
存储过程和函数只在定义和使用上有细小的差别
--创建
create proc sp_add @a int ,@b int,@res int output
as
begin
select @res = @a + @b
end
--调用
declare @a int,@b int,@res int
select @a = 3,@b = 4
exec sp_add @a,@b,@res output
select @res;
--创建
create function func_add(@a int,@b int)
returns int
as
begin
declare @res int
select @res = @a + @b
return @res
end
--调用
declare @res int,@a int,@b int
select @a = 3,@b = 4
select @res = dbo.func_add(@a,@b)
select @res
触发器:顾名思义,通过触发某个事件来执行的,比如设定只能在8:00-17:00修改数据库,那么当5:00修改数据的时候就会触发触发器然后阻止这次的行动。
DML触发器:在对表内数据进行操作时触发(类似对象权限)
DDL触发器:(类似语句权限)
太难了,略。。。。