sql sever 学习实录

目录

1.创建数据库

2.创建、修改、删除表或模式

3、建立索引

4、插入数据

5、更新数据

6、查询表

7、视图

8、聚集函数

9、创建用户

       1、 创建登录用户

        2、创建用户

                3、创建角色

10、学习中遇到的错误

     ​编辑



1.创建数据库

create database <数据库名>
on (
name=<数据库名_data>,               --数据文件的逻辑名称,不能与日志逻辑同名
filename='路径\<数据库名>.mdf',      --mdf数据库的后缀,数据库文件存放地址
size=< >,                           --数据库初始大小
maxsize-< >,                         --数据库最大大小
filegrowth=< >                      --数据库每次增长大小
)
log on(
name=<数据库名_log>,                 --日志文件名称
filename='<路径>'\<数据库名>.ldf',   --ldf日志文件的后缀路径,日志文件存放地址
size=< >,                            --日志文件初始大小
maxsize=< >,                        --日志文件最大大小
filegrowth=< >,                      --每次增长大小
)

2.创建、修改、删除表或模式

--创建模式
create schema <模式名> authorization <用户名>    --用户名默认系统下的dbo

--删除模式
drop schema <模式名> [cascade|restrict]
--cascade(级联)删除模式同时把模式下的数据库对象全部删除
--restrict(限制)如果该模式下有数据库对象,则拒绝删除该模式

        用户名必须是已有的,可以在<数据库>- 安全性-用户下查找。

--创建表
create table <表名>                    --默认在用户dbo下创建表
(<列名> <数据类型> [完整性约束]          
    ……                                  
)

--创建一个新表并讲已有表中的数据添加
select <列名>
into <新表名>
from <已有表名>


--删除表
drop table <表名>

||
delete from <表名>            --删除符合条件的表中数据
[where <条件>]                


--修改表
alter table <表名>
    add <新列名> <数据类型> [完整性约束]                        --增加新列
   | add <表级完整性约束>                                       --增加表级完整性约束
   | drop column <列名> [cascade | restrict]                   --删除表中的列
   | drop constraint <完整性约束名> [restrict | cascade]        --删除表中的完整性约束
   | alter column <列名> <新数据类型>                           --改变表中列的数据类型

         完整性约束包括主键(primary key)、唯一值(unique)和对其他类型的约束,例如对数字类型的约束如{<Score> int (<Score> between 0 and 100)}和字符型的约束如{ <Sex> char (2) (Sex='男' or Sex='女') }。

        alter 只能修改列的数据类型,不能修改列的名称。

--在模式下创建表
create schema <模式名> authorization <用户名>                --在用户< >下创建模式< >并创建表
       create table <表名> (
            <列名> <数据类型> <完整性约束>
                ……
        )

3、建立索引

--创建索引
create [unique] | [cluster]                --默认是非聚簇(nonclustered),可定义unique(唯一)
index <索引名>                              --和cluster(聚簇)的索引    
on <表名> ( <列名> [次序]                   --聚簇是什么?
                ……
          )

--删除索引
drop index <索引名> on <表名>

4、插入数据

--插入数据
insert into <表名>( <列名> )                 
values (<数据>),                            --按照列名的顺序填写数据
        ……;

        若在一个表中插入信息,而这个表有两个及以上外键,则这两个外键都必须有数据插入,否则会报错。

5、更新数据

--更新数据
update <表名>
set <列名> = <修改的表达式> [,<列名> = <表达式>]
[where <修改符合的条件>]                                --若不加where条件,则整列数据都修改

--例如:
update S
set Sage=20                        --在S表下的Sage列修改信息即改为20
where Sno='20211228'               --符合Sno='20211228'的条件

6、查询表

--单表查询
select [all | distinct] <目标表达式>           --默认all,distinct为消除重复元组。目标表达式可以是列名,也可以是算式表达式
from <表名>  
[where <条件表达式>]                           --选择查询符合的条件
[group by <列名> [having <条件表达式>] ]       --按分类查询,且满足条件表达式
[order by <列名> [asc | desc] ];              --以<列名>的升序(asc)、降序(desc)查询

--group by语句
--例:
select Ssex,count(*)                         --从S表查询所有列
from S
group by Ssex;                               --以Ssex列里的数据分类,前面必须要有Ssex

--where <条件表达式>
--例;
select Sage 
from S
where Sage [not] between 17 and 30             --条件是Sage在17与30间
|
where Ssex [not] in ('男','女')                --条件是Ssex在男与女
|
where Sname [not] like '条件'                  --字符型在'条件'中的数据
--条件中可以使用通配符
--若需要查询的目标中有通配符,则可以用转换符 escape '符号'
--例:
where Cname like 'DB\_data' escape '\'         --即查询的目标为DB_data

        查询全部列用count(*)。

        通配符中:'%'表示任意长度,如a%b表示以a开头,b结尾任意长度的数据。'_'表示固定长度,如a_b表示以a开头,b结尾的三个字符长度的数据。

        having与where的区别:作用对象不同。where作用与基于表或视图,从中选择满足条件的元组。having作用于元组,从中选择满足条件的元组。

7、视图

--创建视图
create view <视图名>[<列名>]
as
<子查询>
[with check option]                --针对与视图所作的所有更新操作必须满足子查询中指定的限制条件


--删除视图
drop view <视图名> [cascade]       --cascade将该视图和它导出的所有视图一起删除


--查询视图、更新视图与表的方法相同

        建立视图时,除了需要创建整个表的列,否则需要在子查询中的select后写出相应的列,不能用 * 。 

8、函数

        count( [ distinct | all ] <列名> ) 为计数函数,输出列下元组的个数。

        sum( [ distinct | all ] <列名>)为求和函数,输出列下元素的相加的和,属性列必须是数值。

        avg( [ distinct | all ] <列名>)为求平均值函数,输出列下元素的平均值。

        max | min ( [ distinct | all ] <列名>) 为求最大(小)值函数,输出最大(小)值。

        datediff( day , <列名> , <列名> ) 求两个日期的时间差。day表示天数差。

        dateadd(month, <数字>,<列名>) 表示在<列名>下增加<数字>个manth 

        round(函数( ),2)表示保留两位小数。例:表示取price的平均值并保留两位小数。

        cast( (名) as (类型) )将一个属性的类型换成另一个类型 

--例:
select count(*) as '人数'                --在S表中查询所有列的下元组的总数
from S;
--例:
select Tno,round(avg(price),2) as avg_price from tb_book
group by Tno;
--cast
declare @x date
cast(@x as char(10))

--将原本类型是date的@x变量转换为char类型

        ' * '代表全部。即全部列。

        as 可以用在列名后,表示给查询结果重新命名列名。

9、创建用户

       1、 创建登录用户

create login <用户名>
{
    with “密码”='  '      --密码
    |[,default_database=database ]
    |[,default_language=language ]    
}
--eg
create login [qsy_4_11]        --[]可以用来表示命名的起始
with ”密码“='123456'        --创建成功可以在安全性->登录名查看
“密码”=password

--禁用登录用户
alter login <用户名> disable

--启用登录用户
alter login <用户名> enable


--自主存取控制   由grant与revoke
--可用权限:create [ schema | table | view | index | ]
--         alter table   
--         select insert update delete        

        2、创建用户,授权与取回

--创建用户
create user user_name
[
    {for | from}
    {
        login login_name
    }
    | without login
]
[ with default_schema=schema_name ]

--给用户授权
grant <权限> []
on <对象类型> <对象名> []         --
to <用户> []
[with grant option]            --不允许循环授予权限

--eg
grant update(Sno),select
on Student
to U1
[with grant option]


--回收权限
revoke <权限> []
[on <对象类型> <对象名> ]
from <用户> []

--eg
revoke insert
on SC
from U2 cascade          --sql中不能联级收回


--权限
--dba  全部权限
--resource  只能create table 、登录数据库、查询和操纵数据
--connect    登录数据库、查询和操纵数据


        3、创建角色,授予与取回权限

--角色创建
create role <角色名>


--给角色授权
grant <权限> []
on <对象类型> 对象名
to <角色> []


--将一个角色授予其他角色或用户
grant <角色> []
to <被授予角色>
[with admin option]


--角色权限收回
revoke <权限>
on <对象类型> <对象名>
from <角色> []

        角色是被命名的一组与数据库操作相关的权限。--是权限的集合 --可为一组具有相同权限的用户创建一个角色 --简化了授权过程。

12、存储过程

        

--创建存储过程:
create procedure 过程名 (
    @参数名 参数类型[,]
    [ ]                                --若是返回参数,则啊参数类型后加 output
)
as 过程体

--若过程体内有多条语句,则在as后使用begin [过程体] end


--修改存储过程
--重命名:
alter procedure 过程1 rename to 过程2;


--删除存储过程
drop procedure 过程名

        

--有返回参数时过程块里需要赋予返回值    
set @参数名=()

--eg、db_Library
create procedure PRO_returnB_sum(
    @B_sum int output,
    @Rno char(10)
)
as begin
    select B.*                                            --显示学号为@Rno的学生 
    from tb_borrow B,tb_reader R                          --的借阅信息
    where B.Rname=R.Rname and R.Rno=@Rno          
    
    set @B_sum=(select count(Bno)                      --给参数B_sum赋值                       
               from tb_borrow B,tb_reader R                   --计算该学生借了多少本书
               where B.Rname=R.Rname and R.Rno=@Rno
               )

OR   select @B_sum=count(Bno)
     from tb_borrow B,tb_reader R
     where B.Rname=R.Rname and R.Rno=@Rno
end

        给返回参数赋值有两种方法,一种是用set关键字,一种是在select内。 

--调用存储过程
declare 参数                    --声明变量
exec 过程名 实参

eg、过程 PRO_returnB_sum

exec  PRO_returnB_sum @B_sum output,'2021051228'            --学号为2021051228
select @B_sum                                         --显示借阅总数

11、游标 

--创建游标
declare cursor_name cursor for        --创建一个含Bname,Bno的游标
    select Bname,Bno
    from tb_book
open cursor_name                        --打开游标

12、学习中遇到的错误

        分组显示时,不能得知分组情况

     

         解决:在select 语句后添加所分组的列名。

        3、在使用grant为用户“User2”授权时出现“不能为实体级权限指定子实体(如列或安全性表达式)列表”的问题。解决:因为alter、insert不能对单独的列进行操作,alter只能对表进行操作,insert只能插入一组数据。故这两个操作不能单独对列进行。否则报错。

        4、在数据库下创建用户时,报错,内容为该登录已用另一个用户名开立账户。这是在另一个windows用户在某个数据库下创建用户。报错的原因是在创建登录用户时,已在已有的数据库下创建了与windows用户同名的用户,若要在这个数据库下创建用户,需将这个同名用户删去,再执行创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值