数据库创建对象

数据库DATABASE

数据库文件组有主文件组和次文件组,数据文件和日志文件

ON PRIMARY主文件组
FILENAME ‘文件名’

LOG ON

文件分逻辑名称(NAME)和物理名称(FILENAME即存储地址)。最大尺寸默认不需要定义

--表示我会出现问题的内容
CREATE DATABASE school
ON
PRIMARY                                             --主文件
(	NAME='schmgt1',
	FILENAME='D:\SQLprogram',
	SIZE=10MB,
	MAXSIZE=40MB,
	FILEGROWTH=2MB
),													--忘记两个之间的符号是,
(	NAME='schmgt2',
	FILENAME='D:\SQLprogram',
	SIZE=10MB,
	MAXSIZE=40MB,
	FILEGROWTH=2MB
),
FILEGROUP sch1										--不使用=
(	NAME='schmgt3',
	FILENAME='D:\SQLprogram',
	SIZE=10MB,
	--MAXSIZE=默认,									--默认最大尺寸
	FILEGROWTH=2MB
),	
(	NAME='schmgt4',
	FILENAME='D:\SQLprogram',
	SIZE=10MB,
	FILEGROWTH=1MB
),
FILEGROUP sch2									
(	NAME='schmgt5',
	FILENAME='D:\SQLprogram',
	SIZE=10MB,
	MAXSIZE=20MB,							
	FILEGROWTH=10%
)
LOG ON                                               --LOG ON
(	NAME='schmgtlog',
	FILENAME='D:\SQLprogram',
	SIZE=20MB,							
	FILEGROWTH=10%
)

表TABLE

表的列需要数据类型,列的约束

列的约束有六种,下面都列了(可能不合理,主要看格式)
主键可以是多个候选码,要写的最后,括号写列名

CREATE TABLE student
(	学号 char(6)  not null PRIMARY KEY,                    --主键;非空也是一个约束
	姓名 char(8) UNIQUE,                                   --唯一约束
	性别 char(2),
	出生时间 datetime,
	专业 char(12) FOREIGN KEY REFERENCES course(专业),     --外键,加参考列
	总学分 int CHECK(0<=总学分 and 总学分<=100),           --CHECK约束
	备注 varchar(500) DEFAULT 0                            --默认值 0
)

视图VIEW

CREATE VIEW CE_SUM
	AS (SELECT)                                      --VIEW是AS
-------------------------------------------------------------
--不重要,记格式
		SELECT score.学号 num,SUM(成绩) score_sum
			FROM score,student
			WHERE score.学号=student.学号
				AND 专业='计算机'
			GROUP BY score.学号

游标CURSOR

游标分声明-打开-读取-关闭和删除四步

只有CREATE有CURSOR

DECLARE xs_cur2 CURSOR                --声明
    DYNAMIC
    FOR
        SELECT 学号,姓名,总学分
            FROM xsb
            WHERE 专业= '计算机'
        FOR UPDATE OF 总学分
OPEN xs_cur2                          --打开
FETCH NEXT FROM xs_cur2               --读取数据
FETCH NEXT FROM xs_cur2               --下一条数据
FETCH RELATIVE 2 FROM xs_cur2         --两条后
FETCH PRIOR FROM xs_cur2              --前一条
FETCH RELATIVE -3 FROM xs_cur2
SELECT '执行情况' = @@FETCH_STATUS
FETCH FIRST FROM xs_cur2              --数据的第一条
CLOSE xs_cur2                         --关闭
DEALLOCATE xs_cur2                    --删除

索引INDEX

--创建唯一,聚集索引
CREATE UNIQUE CLUSTERED INDEX kc_id 
ON kcb (课程号)
/*在视图上创建索引*/
CREATE VIEW dbo.vxs1 WITH SCHEMABINDING
AS 
SELECT 学号, 姓名
FROM dbo.xsb
GO

CREATE UNIQUE CLUSTERED INDEX inx1 
ON dbo.vxs1(学号)
GO

T-SQL语句 用户定义系列——自定义函数FUNCTION

标量函数

CREATE FUNCTION average(@num char(20)) RETURNS int
    AS
    BEGIN
        DECLARE @aver int
        SELECT @aver=
        ( 
            SELECT avg(成绩) 
                FROM cjb
                WHERE 课程号=@num
                GROUP BY 课程号
        )
        RETURN @aver
    END

--使用在创建表的列中也可以直接写函数average('101')至少输入变量可以直接放在括号里面,不用声明变量

DECLARE @course1 char(20) /*定义局部变量*/
DECLARE @aver1 int
SELECT @course1 = '101' /*给局部变量赋值*/
SELECT @aver1=dbo.average(@course1) /*调用用户函数,并将返回值赋
给局部变量*/
SELECT @aver1 AS '101课程的平均成绩' /*显示局部变量的值*/

嵌入表值函数

--(1)创建视图。
USE pxscj
GO
CREATE VIEW xsv
    AS
    SELECT dbo.xsb.学号, dbo.xsb.姓名, dbo.kcb.课程名, dbo.cjb.成绩
        FROM dbo.kcb 
            INNER JOIN dbo.cjb ON dbo.kcb.课程号 = dbo.cjb.课程号
            INNER JOIN dbo.xsb ON dbo.cjb.学号 = dbo.xsb.学号

--(2)定义内嵌函数。
CREATE FUNCTION student_score(@id char(6)) RETURNS table
    AS RETURN
    (
        SELECT *
            FROM pxscj.dbo.xsv
            WHERE dbo. xsv.学号= @id
    )
--(3)调用内嵌函数,查询学号为191301的学生的各科成绩及学分。
SELECT *
    FROM pxscj.[dbo].student_score('191301')

多语句表值函数

CREATE FUNCTION MAM_FUN (@课程号 char(3))
RETURNS @score TABLE(最高分 int,平均分 int,最低分 int)
	AS                                                      --多语句表值函数RETURNS部分
	BEGIN
		INSERT @score                                            --INSERT的设定
				SELECT MAX(成绩),AVG(成绩),MIN(成绩)
					FROM score
					WHERE 课程号=@课程号
		RETURN
	END 
SELECT * FROM MAM_FUN(101)                                        --调用

存储过程PROCEDURE

简单存储过程

USE pxscj
GO
CREATE PROCEDURE cjb_info
    AS
        SELECT *
            FROM cjb
            WHERE 学号= '191301'

EXECUTE  cjb_info

使用带参数的存储结构

USE pxscj
GO
CREATE PROCEDURE xkc_info1 @name char (8), @cname char(16) 
    AS 
        SELECT a.学号, 姓名, 课程名, 成绩, t.学分
            FROM xsb  a  INNER JOIN  cjb  b
                ON a.学号 = b.学号 INNER  JOIN  kcb  t
                ON b.课程号= t.课程号 
                WHERE a.姓名=@name and t.课程名=@cname
GO

EXECUTE xkc_info1 '王林', '计算机基础'

使用带OUTPUT参数的存储过程

CREATE PROCEDURE dbo.xsb_insert
    AS
        INSERT INTO xsb 
            VALUES('091201', '陶伟', 1, '1990-03-05', '软件工程',50, NULL);
--存在存储过程的嵌套
CREATE PROCEDURE xsb_iud  @X bit, @STR CHAR(8) OUTPUT
    AS
    BEGIN 
        EXEC xsb_insert
        IF @X=0
        BEGIN
            UPDATE xsb SET 姓名='刘英', 性别=0 WHERE 学号='091201'
            SET @STR='修改成功'
        END
        ELSE
            IF @X=1
            BEGIN
                DELETE FROM xsb WHERE 学号='091201'
                SET @STR='删除成功'
            END
    END
接下来执行存储过程xsb_iud来查看结果:
DECLARE @str char(8)
EXEC dbo. xsb_iud  0, @str OUTPUT
SELECT @str;

使用带有通配符的存储过程

CREATE PROCEDURE xkc_info2  @name varchar(30) = '李%'
    AS
        SELECT a.学号,a.姓名,c.课程名,b.成绩
            FROM  xsb a  INNER JOIN  cjb  b
                ON a.学号 =b.学号 INNER JOIN kcb c
                ON c.课程号= b.课程号 
            WHERE 姓名 LIKE @name
GO 
--执行存储过程:
EXECUTE xkc_info2      	/*参数使用默认值,显示所有李姓学生信息*/
--或者:
EXECUTE xkc_info2  '王%'   	/*传递给@name 的实参为'王%',显示所有王姓学生信息*/

使用OUTPUT游标参数的存储过程

CREATE PROCEDURE xsb_cursor @xsb_cursor  cursor VARYING OUTPUT
    AS
        SET @xsb_cursor = CURSOR  FORWARD_ONLY STATIC FOR
            SELECT *		
                FROM xsb
        OPEN @xsb_cursor

DECLARE @MyCursor  cursor
EXEC xsb_cursor @xsb_cursor = @MyCursor OUTPUT	/*执行存储过程*/
FETCH NEXT FROM @MyCursor
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        FETCH NEXT FROM @MyCursor
    END
CLOSE @MyCursor
DEALLOCATE @MyCursor

 练习B的例题

使用了输出,变量

CREATE PROCEDURE CPA @sn1 char(6),@sn2 char(6),@x bit OUTPUT         --存储过程的格式完全不记得
	AS 
		BEGIN--DECLARE @x bit                                        --begin-end是要出现的
		SELECT @x= 
			CASE						                             --case格式,变量不在case后,最后要end
				WHEN (SELECT AVG(成绩)FROM score WHERE 学号=@sn1)
					>(SELECT AVG(成绩)FROM score WHERE 学号=@sn2) THEN 1
				ELSE 0
				END
			FROM score
		END
DECLARE @x bit
EXEC CPA 081109,081110,@x OUTPUT
SELECT @x

触发器TRIGGER

分DML和DDL

分FOR/AFTER和INSTEAD OF

CREATE TRIGGER score_insert 
ON score FOR INSERT
AS 
	DECLARE @学号 char(6)
	SELECT @学号=student.学号 FROM inserted ,student WHERE inserted.学号=student.学号
	IF @学号 IS NOT NULL 
		print('插入数据成功')
	ELSE begin
		print('该学号不存在于student表中,不能插入记录,插入将终止!')
		ROLLBACK TRANSACTION
		end

创建登录名

create login 登录名
    from windows|with password='123'   --登录名分Windows和SQL-Server
    with default_database=pxscj

创建用户名

create user tao
    for 登录名
    with default_schema=dbo

固定用户名角色,删除用户名角色 

EXEC sp_addsrvrolemember ' SQL_tao', 'sysadmin'
EXEC sp_dropsrvrolemember 'SQL_tao', 'sysadmin'

添加固定用户名角色成员

EXEC sp_addrolemember 'db_owner', 'User_SQL_tao'
EXEC sp_droprolemember 'db_owner', 'User_SQL_tao'

创建角色

create role role1
    authorization dbo
drop role role1

授予用户或角色权限

grant create table --权限
    to tao  --用户或角色

grant select
    on pxscj
    to tao


deny 权限
    to 用户、角色

revoke 权限
    from 用户、角色

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值