名词解释:sql
三级模式:数据库
两级映像与数据独立性的关系:编程
概念模型三种联系的类型:安全
实体-联系(Entity-Relationship)模型通用表示方式:并发
关系模型三类完整性规则:dom
关系代数:是以关系为运算对象的一组高级运算的集合。关系代数是一种抽象的查询语句,是关系数据操纵语言的一种传统表达方式,即代数方式的数据查询过程。关系代数的运算对象是关系,运算结果也是关系。数据库设计
笛卡儿积函数
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}性能
选择运算测试
投影运算
关系模式是一个五元组,能够表示为 R(U,D,dom,F)
学生状况表(学号,姓名,性别,年龄,所在系)
。范式是符合某一种级别的关系模式的集合
1NF:任何关系模式都是第一范式。
2NF:不存在非主属性部分函数依赖于码
3NF:非主属性既不部分也不传递函数依赖与码
数据库系统设计分为 6 个阶段:
E-R 模型转换关系数据模型
实体的转换:
SQL Server 中数据文件的类型
逻辑数据库:
建立表格 / 修改表结构 / 删除表格
-- 建立表格 CREATE TABLE student ( cno char(4) PRIMARY KEY, cname nvarchar(20) NOT NULL, sex nvarchar(4), birthday date ) -- 修改表格只须要将 CREATE 改成 ALTER -- 删除表格 DROP TABLE [TABLE_NAME]
约束:约束是经过限制列中数据、行中数据和表之间数据来保证数据完整性的很是有效的方法。约束能够确保把 有效数据 输入到列中及维护表和表之间的特定关系
-- 在建立表的同时建立约束 CREATE TABLE student ( cno char(4) PRIMARY KEY, /*Primary Key*/ sex nvarchar(4) DEFAULT '男' CHECK(sex IN ('男','女')), /*Default+Check*/ birthday date DEAFAULT date(getdate()), /*Default*/ IDCardNUM char(18) UNIQUE, /*Unique 约束*/ class char(10) Foreign KEY Reference classes(class_num)/*foreing key*/ …… ) -- 在建立表以后添加约束 ALTER TALBE [表名] ADD CONSTRAINT [约束名] [约束类型] (列名) ALTER TALBE student ADD CONSTRAINT pk_st PRIMARY KEY (cno) ALTER TALBE student ADD CONSTRAINT cj_sex CHECK(sex in ('男', '女')) /*性别只能为男或女*/
-- 单表查询 SELECT * FROM 表名 -- 多表查询 SELECT rdID, rdName FROM Reader; -- DISTINCT 关键字 SELECT DISTINCT specialty FROM student; /*查询学生表中的专业名称,过滤重复行*/ -- AS 关键字 SELECT DISTINCT specialty AS 专业名称 FROM student;/*将查询结果中 specialty 取一个列别名*/
-- 比较运算符 =、>、<、>=、<=、!=、<>、!>、!< SELECT * FROM sc WHERE score >= 60 -- 逻辑表达式 AND、OR、NOT SELECT * FROM student WHERE specialty = '计算机' AND ssex = '男' -- 肯定范围的关键字 BETWEEN AND、NOT BETWEEN AND SELECT * FROM sc WHERE score BETWEEN 80 AND 90 -- 肯定集合的关键字 IN、NOT IN SELECT * FROM student WHERE specialty IN ('计算机','通讯') -- 字符匹配关键字 LIKE、NOT LIKE SELECT * FROM student WHERE sname LIKE '张%' /*查找姓张的学生*/ SELECT * FROM student WHERE sname LIKE '张_' /*查找姓张且姓字为两个字的学生*/ -- 空值判断关键字 IS NULL、IS NOT NULL SELECT * FROM sc WHERE score IS NULL -- 复合条件查询 SELECT * FROM student WHERE sex = '女' AND (specialty = '计算机' OR specialty = '通讯')
-- 简单分组 SELECT * FROM student GROUP BY ssex -- HAVING 关键字:选修了两门及以上课程的学生 SELECT * FROM student GROUP BY ssex HAVING COUNT(cno) >= 2 -- 聚合函数 count()、sum()、avg()、min()、max()
------------------------------------------------- a表 id name b表 id job parent_id 1 张三 1 23 1 2 李四 2 34 2 3 王武 3 34 4 a.id 同 parent_id 存在关系 -------------------------------------------------- -- 内链接 select a.*,b.* from a inner join b on a.id = b.parent_id 结果是: 1 张三 1 23 1 2 李四 2 34 2 -- 左外链接 select a.*,b.* from a left join b on a.id = b.parent_id 结果是: 1 张三 1 23 1 2 李四 2 34 2 3 王武 null -- 右外链接 select a.*,b.* from a right join b on a.id=b.parent_id 结果是: 1 张三 1 23 1 2 李四 2 34 2 null 3 34 4
-- 查询与连晓燕在同一个单位的读者; SELECT rdName FROM Reader WHERE rdDept = (SELECT rdDept FROM Reader WHERE rdName = '连小燕');
-- UNION(并集):查询选修了课程 C001 和 课程 C004 的学生的姓名 SELECT sname FROM sc,student WHERE cno = 'C001' AND sc.sno = student.sno UNION SELECT sname FROM sc,student WHERE cno = 'C004' AND sc.sno = student.sno -- EXCEPT(差集):查询没有选课的学生的学号 SELECT sno FROM student EXCEPT SELECT sno FROM sc -- INTERSECT(交集):查询即选修了课程 C001 又选修了课程 C004 的学生的姓名 SELECT sname FROM sc,student WHERE cno = 'C001' AND sc.sno = student.sno INTERSECT SELECT sname FROM sc,student WHERE cno = 'C004' AND sc.sno = student.sno
-- 默认升序 ASC SELECT * FROM SC ORDER BY sname ASC -- 降序排序 DESC(按成绩降序,成绩相同的话按学号升序排) SELECT sno,score FROM SC ORDER BY score DESC,sno ASC
视图并非以一组数据的形式存储在数据库中,数据库中只存储视图的定义,不存储视图对应的数据,这些数据仍存储在导出视图的基本表中,视图其实是一个查询结果。
-- 建立视图 CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition -- 查看视图 SELECT * FROM view_name -- 删除视图 DROP VIEW view_name
索引的类型
汇集索引:
非汇集索引:
CREATE INDEX index_name ON table_name(col_name)
DECLARE @var_name VARCHAR(20)
、DECLARE @MyCounter INT
SET @var_name = GETDATA()
、SELECT COUNT(sno)=@MyCounter from student
PRINT @var_name,@MyCounter
批出理语句使用
/* 多行注释 */ -- 单行注释 SELECT sno,sname FROM student GO -- 此处 GO 为批处理语句
流程控制语句
-- SET 语句 DECLARE @myvar char(20); SET @myvar = 'This is a test'; SELECT @myvar; GO -- BEGIN END 语句(用于将多个 SQL 语句合并为一个语句块) BEGIN { sql_statement|statement_block } END -- IF……ELSE 语句: -- 若是 C001 号课的平均成绩高于 80 分,则显示“平均成绩还不错”,不然显示“平均成绩通常” IF ( SELECT AVG(score) FROM sc WHERE cno = 'coo1') > 80 PRINT 'C001 号课的平均成绩还不错' ELSE PRINT 'C001 号课的平均成绩通常' -- CASE 语句:以搜索 CASE 格式查询全部学生的考试等级,包括学号、课程号和成绩级别 SELECT sno,cno, CASE WHEN score >= 90 then 'a' WHEN score >= 80 then 'b' WHEN score >= 70 then 'c' WHEN score >= 60 then 'd' WHEN score < 60 then 'e' END AS score_level FROM sc -- WHILE 语句:求 1 到 100 的累加和,当和超过 1000 时中止累加,显示累加和以及累加到的位置。 -- 结果:a=1035,i=45 DECLARE @i int,@a int SET @i = 1, @a = 0 WHILE @i <= 100 BEGIN SET @a = @a + @i IF @a >= 1000 BREAK SET @i = @i + 1 END SELECT @a AS 'a',@i AS 'i'
函数
-- 聚合函数 ADD(),AVG(),SUM()…… -- 日期函数 GETDATE():返回系统当前的日期和时间 DAY():返回日期表达式中的日 MOUTH():返回日期表达式中的月 YEAR():返回日期表达式中的年 -- 自定义函数:求选课表中某门课的平均成绩 CREATE FUNCTION average(@cn char(4)) RETURNS float AS BEGIN DECLARE @aver float SELECT @aver = (SELECT avg(score) FROM sc WHERE cno = @cn) RETURN @aver END
游标(定义、打开、读取、关闭、释放)
-- 利用游标将sc表中选课成绩小于50分的成绩提升30%,将大于等于50分的成绩提升50% -- 定义游标 DECLARE SC_Cursor CURSOR DYNAMIC FOR SELECT Grade FROM SC FOR UPDATE OF Grade -- 打开游标 OPEN SC_Cursor -- 读取游标 DECLARE @Grade INT FETCH NEXT FROM SC_Cursor INTO @Grade --假如检索到了数据,才处理 WHILE @@FETCH_STATUS = 0 BEGIN -- 填充数据 IF @Grade < 50 UPDATE SC SET Grade = @Grade * 1.3 WHERE CURRENT OF SC_Cursor ELSE UPDATE SC SET Grade = @Grade * 1.5 WHERE CURRENT OF SC_Cursor -- 填充下一条数据 FETCH NEXT FROM SC_Cursor INTO @Grade END -- 关闭游标 CLOSE SC_Cursor -- 释放游标 DEALLOCATE SC_Cursor GO
建立存储过程(修改存储过程只要将 CREATE 替换为 ALTER)
-- 不带参数的存储过程 CREATE PROCEDURE students_avg AS SELECT sno,avg(score) AS 'avgscore' FROM sc GROUP BY sno GO -- 带参数存储过程 CREATE PROCEDURE usp_rdName @rdID CHAR(9), @rdName VARCHAR(20) OUTPUT AS SELECT @rdName = rdName FROM Reader WHERE rdID = @rdID GO -- 存储过程当中可使用 raiserror 抛出异常
调用存储过程
-- 执行不带参数的存储过程 EXECUTE students_avg -- 执行带参数的存储过程 DECLARE @Result VARCHAR(20) EXEC usp_rdName 'rd2017001',@Result OUTPUT PRINT @Result
删除存储过程
DROP PROCEDURE students_avg
触发器
建立触发器、激发触发器、删除触发器(删除触发器所在的表,系统会自动删除与该表相关的触发器)。
-- 建立 DML 触发器: GO CREATE TRIGGER DML_Limited ON student FOR DELETE AS DECLARE @count varchar(50) SET @count = STR(@@ROWCOUNT)+'个学生被删除' SELECT @count RETURN -- 执行 DML 触发器(查询结果为:5个学生被删除) DELETE FROM student WHERE specialty = '计算机' -- 删除 DML 触发器 DROP TRIGGER DML_Limited -- 禁止在 student 表上的全部触发器 ALTER TABLE student DISABLE TRIGGER ALL -- 建立 DDL 触发器:禁止用户修改 BooksDB 数据库中的表; GO CREATE TRIGGER DDL_Limited ON DATABASE FOR DROP_TABLE,ALTER_TABLE AS PRINT '名为 DDL_Limited 的触发器禁止您修改 BooksDB 数据库中的表' ROLLBACK -- 执行 DDL 触发器 DROP TABLE Borrow -- 删除 DDL 触发器 DROP TRIGGER DDL_Limited -- 测试 AFTER 触发器,理解 INSERTED 表和 DELETED 表的做用; GO CREATE TRIGGER tri_InsDelOnReader ON Reader for INSERT, DELETE AS SELECT * FROM inserted SELECT * FROM deleted PRINT 'Reader 表上的 AFTER 触发器已执行!' GO -- 激发触发器执行 INSERT INTO Reader VALUES('rd2017008', 3, '孙星', '计算机科学学院', '66666666', 0); -- 激发触发器执行 DELETE FROM Reader WHERE rdID = 'rd2017008'
根据运行模式分类,事务分为 4 种类型:
若是多个用户同时访问一个数据库没有加以控制,就可能发生问题,这些问题包括:
锁的类型
INSERT INTO Reader VALUES('rd2017008', 3, '孙星', '计算机科学学院', '66666666', 0);
CREATE TABLE Account( cardID CHAR(4) NOT NULL PRIMARY KEY, Name CHAR(6), Balance INT CHECK(Balance > = 1) ) GO INSERT INTO Account VALUES('6666', '张三', 1000) INSERT INTO Account VALUES('8888', '李四', 1) --使用事务实现转帐:捕获到异常就回滚 BEGIN TRAN BEGIN TRY UPDATE account SET balance = balance + 1000 WHERE cardID = '8888' UPDATE account SET balance = balance - 1000 WHERE cardID = '6666' COMMIT END TRY BEGIN CATCH ROLLBACK END CATCH
-- 执行如下代码打开隐式事务: SET IMPLICIT_TRANSACTIONS ON -- 建立一个数据表,开始一个新的事务 CREATE TABLE T1 (i INT PRIMARY KEY) GO -- 查询表(查询成功) SELECT * FROM T1 -- 取消事务后再查询表中的数据(因为表不复存在,因此会获得一个错误信息。) ROLLBACK SELECT * FROM T1 -- 执行如下代码关闭隐式事务: SET IMPLICIT_TRANSACTIONS OFF;
GRANT|REVOKE|DENY ALL ON 安全对象 TO 用户
。安全对象 | ALL 对应的权限 |
---|---|
数据库 | CREATE DATABASE, CREATE PROCEDURE, CREATE VIEW, CREATE TABLE, CREATE RULE 等 |
标量函数 | EXECUTE, REFERENCES |
表值函数 | SELECT, DELETE, INSERT, UPDATE, REFERENCES |
存储过程 | EXECUTE, SYNONYM |
表 | SELECT, DELETE, INSERT, UPDATE, REFERENCES |
视图 | SELECT, DELETE, INSERT, UPDATE, REFERENCES |
-- 建立登录帐户、建立数据库帐户、授予权限、拒绝权限实例 CREATE LOGIN wtq WITH PASSWORD = 'wtq888',DEFAULT_DATABASE = BooksDB GO CREATE LOGIN test WITH PASSWORD = 'test888',DEFAULT_DATABASE = BooksDB GO CREATE USER wtq FROM LOGIN wtq GO CREATE USER test FROM LOGIN test GO GRANT SELECT,INSERT ON ReaderType TO wtq DENY DELETE,UPDATE ON ReaderType TO wtq DENY DELETE,INSERT,REFERENCES,SELECT,UPDATE ON ReaderType TO test
-- teaching 的完整备份(差别备份只须要将 WITH 后面的 Format 改成 Differential ) BACKUP DATABASE teaching TO DISK = 'F:\BACKUP\teaching.Bak' WITH FORMAT NAME = 'teaching 的完整备份' -- teaching 的完整数据库备份进行还原(差别还原使用 WITH RECOVERY) RESTORE DATABASE teaching TO DISK = 'F:\BACKUP\teaching.Bak' WITH REPLACE,NORECOVERY
// 引入 数据命名空间 和 SQL 命名空间 using System.Data using System.Data.SqlClient // 建立链接对象并实例化,例如链接一个名为 School 的 SQL Server 数据库 SqlConnection con = new SqlConnection(); con.ConnectionString = @"Data Source = .\SQLEXPRESS; AttachDbFilename = E:\data\ school_Data.MDF;Integrated Security = True;Connect Timeout = 30;User Instance = True"; // 打开数据库链接 con.Open(); // 读取数据 SqlCommand cmd = con.CreateCommand(); // 建立命令对象并实例化 cmd.CommandText = "SELECT * FROM student";// SqlCommand 的属性 CommandText 是一条 SQL 语句 SqlDataReader dr = cmd.ExecuteReader(); // 创建DataReader对象迅速获取查询结果