数据库学完了,但是脑子里还是没有一个系统的数据库操作 概念。借着考试复习的这个机会,总结一下数据库的常用操作。内容参考上课的课件进行了整理,整篇文章会很长。
CREATE DATABASE DB ON PRIMARY ( NAME = DB_data, FILENAME = 'F:\DB_data1.mdf', SIZE = 10MB, MAXSIZE = UNLIMTED ), ( NAME = DB_data2, FILENAME = 'F:\DB_data2.ndf', SIZE = 11MB, MAXSIZE = 20MB, FILEGROWTH = 2MB ) LOG ON ( NAME = DB_log1, FILENAME = 'F:\DB_log1.ldf', SIZE = 1MB, MAXSIZE = 30MB, FILEGROWTH = 10% )
语法:
alter database 数据库名称
add file 数据文件
[to file group 文件组名称]
add log file 日志文件
操作:
ALTER DATABASE DB ADD FILE ( NAME = , FILENAME = , SIZE = , FILEGROWTH = )
ALTER DATABASE DB ADD LOG FILE ( NAME = , FILENAME = , SIZE = , FILEGROWTH = , MAXSIZE = )
语法:
ALTER DATABASE 数据库名
MODIFY FILE 文件属性
操作:将数据库db1中的数据文件data2的初始大小改为10MB,最大容量为20MB,增长幅度为10%
alter database db1 modify file ( name = data2, size = 10, maxsize = 20, filegrowth = 10% )
ALTER DATABASE DB MODIFY FILE ( NAME = , SIZE = , )
语法:
alter database 数据库名称
remove file 数据文件或日志文件的逻辑文件名
操作:删除数据库db1中的数据文件data4和日志文件log2
alter database db1 remove data4 alter database db1 remove log2
语法:
alter database 数据库名
add filegroup 文件组名
操作:在数据库db1中增加一个g2文件组
alter database db1 add filegroup g2
语法:
alter database 数据库名
modify filegroup 文件组名
name=新文件组名
操作:将数据库db1中的文件组g2更名为g3
alter database db1 modify filegroup g2 name=g3
语法:
alter database 数据库名称
remove filegroup 文件组名
操作:删除数据库db1的文件组g3
alter database db1 remove filegroup g3
语法:
alter database 数据库名
modify name = 新数据库名
操作:将数据库db1的名字修改为gl
alter database db1 modify name = gl
DROP DATABASE DB1,DB2,DB3
CREATE SCHEMA T2 AUTHORIZATION User1 CREATE TABLE Test(C1 INT PRIMATY KEY, C2 CHAR(4) ) GRANT SELECT TO User2 DENY DELETE TO User3;
ALTER SCHEMA T1 TRANSFER T2.Test
DROP SCHEMA T2
类型:
主键(PRIMARY KEY)约束
惟一(UNIQUE)约束
外键(FOREIGN KEY)约束
检查(CHECK)约束
说明:非空和默认值也可看成是约束。
创建表约束的方法:新建表时,在单列后创建约束或者在所有列之后,再创建约束;如果表已存在,只能通过修改表,添加约束。
语法:
操作:
CREATE TABLE Student ( SNO CHAR(7) PRIMATY KEY, SNAME NCHAR(5) NOT NULL, SID CHAR(18) UNIQUE, SEX NCHAR(1) DEFAULT 'MAN', SAGE TINYINT CHECK (SAGE >= 15 AND SAGE <= 40) SDEPT NVARCHAR(20) ) CREATE TABLE Course ( cno CHAR(6) PRIMARY KEY, cname NVARCHAR(20) NOT NULL, credit NUMRIC(3,1) CHECK (credit > 0), senester TINYINT ) CREATE TABLE SC ( sno CHAR(7) NOT NULL, cno CHAR(9) NOT NULL, grade TINYINT, PRIMARY KEY (sno, cno) FOREIGN KEY (sno) REFERENCES Student (SNO) FOREIGN KEY (cno) REFERENCES Course (cno) )
主键约束的作用:
1.不允许输入重复的值
2.不能取空值 (当主键是由多个属性组成时:某一属性上的数据可以重复,但其组合必须是惟一的;每个属性的值都不能为空。)
3.一个表上只能有一个主键。
create table student ( sno char (6), sname char (8), ssex bit , sphone char(11) constraint pk_student primary key (sno) )
alter table student add constraint pk_student primary key (sno)
操作:在student表中,创建“sphone”字段惟一性约束,并且将约束命名为uq_sphone
alter table student add constraint uq_sphone unique (sphone)
create table sc ( sno char ( 6 ) not null references student ( sno ), cno char ( 3 ), grade tinyint primary key (sno,cno), foreign key ( cno ) references course ( cno ) )
操作1:在student表中,设置名为ck_student的检查约束,该约束限制“性别”为man或woman
alter table student add constraint ck_student check (sex=man or sex=woman)
alter table sc add constraint ck_sc check (grade>=0 and grade<=100)
操作1:新建表时添加
create table student ( name char(6) not null, age int(10) null, sex char(5) default 'man' )操作2:修改已有的表
alter table student add constraint df_student default 'man' for sex
create table student (sno char (6) not null , sname char (8) not null , ssex bit , 电话 char(11) ) alter table xsqk add constraint pk_xsqk_xh primary key (学号), constraint df_xsqk_xb default 1 for 性别, constraint ck_xsqk_xb check (性别=1 or 性别=0 ), constraint uq_xsqk_dh unique (电话)
create table student ( sno char (6) primary key (学号) check (学号 like '[0-9] [0-9] [0-9] [0-9] [0-9] [0-9]'), sname char (8) not null , ssex bit default 1 check (ssex=0 or ssex=1) , sphone char(11) unique (sphone) )
alter table student drop constraint pk_xsqk_xh alter table student drop constraint uq_xsqk_dh alter table student drop constraint ck_xsqk _xb alter table student drop constraint ck_xsqk _xh alter table student drop constraint df_xsqk_xb
alter table student add address char(10) constraint df_xsqk_jg default ‘shanghai’ , email varchar(30), number int identity go
alter table sc alter column grade numeric(4,1)
alter table sc alter column grade int
1.不能修改text、image、ntext、gimestamp类型的列;
2.不能修改类型是varchar、nvarchar、varbinary的列的数据类型,但可增加其长度。
3.不能修改是主键、外键列的类型,但可增加其长度;
4.不能修改包含索引、有默认值、检查约束和惟一性约束列的类型,但可增加其长度。
5.不能修改用列表达式定义或被引用在列表达式中的列。
6.不能修改复制列。
语法:
update 表名
set {列名 = 表达式 | null | default } [ , … n ] )
[ where 逻辑表达式 ]
操作:将sc表中的课程号为101的成绩不及格的学生的成绩都加上10分
update sc set grade = grade + 10 where ( cno = '101' and grade < 60)
--先删除表中的约束 Alter table student drop constraint df_xsqk_jg --再删除表中的列 Alter table student drop column address,email,number
delete from student where name = 'zhangsan'
exec sp_rename ‘student’,'rename_student'
Drop table sc go Drop table student ,course
INSERT INTO Student(SNO,SNAME,SAGE,SDEPT) VALUES ('132','ZHANGSAN',23,'ASD') INSERT INTO Student VALUES ('1234','ZHANGSAN','143','MAN',22,'YI',)
insert into nopass select * from sc where grade<60
select name,age from student
select * from student
SELECT name,year(getdate()) - year(Birthdate) AS age FROM Student
SELECT DISTINCT Sno FROM SC
查询条件 | 谓词 |
---|---|
比较运算符 | 比较运算符 =, >, >=, <, <=, <>(或!=) |
确定范围 | BETWEEN AND, NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多重条件 | AND, OR |
操作:查询不及格的学生姓名
SELECT DISTINCT Sno FROM SC WHERE Grade < 60
SELECT Sno, Cno, Grade FROM SC WHERE Grade BETWEEN 80 AND 90等价与下面这句话
SELECT Sno, Cno, Grade FROM SC WHERE Grade >=80 AND Grade <=90
SELECT Sno, Cno, Grade FROM SC WHERE Grade NOT BETWEEN 80 AND 90等价与下面这句话
SELECT Sno, Cno, Grade FROM SC WHERE Grade < 80 AND Grade > 90
select name, sex from sudent where dept in ('信息管理系','通信工程','计算机系')
select name, sex from sudent where dept = '信息管理系' or dept = '通信工程系' or dept = '计算机系'
SELECT Sname, Sex FROM Student WHERE Dept NOT IN ( '信息管理系', '通信工程系', '计算机系')等价于
SELECT Sname, Sex FROM Student WHERE Dept!= '信息管理系' AND Dept!= '通信工程系' AND Dept!= '计算机系'
select * from student where name like '张%'
select * from student where name like '[张刘李]%'
select * from student where name like '_[大小]%'
select name from student where name not like '张%'
select * from student where number like '%[^123]__'
where t1 like '%30!%%' escape '!'
SELECT Sno, Cno FROM SC WHERE Grade IS NULL
SELECT Sno, Cno, Grade FROM SC WHERE Cno IN( 'C002', 'C003') AND Grade BETWEEN 80 AND 90
SELECT Sno, Cno, Grade FROM SC WHERE (Cno = 'C001' OR Cno = 'C002') AND Grade BETWEEN 80 AND 90
SELECT * FROM Student ORDER BY Dept ASC, Birthdate DESC
SELECT COUNT(DISTINCT Sno) FROM SC
SELECT SUM(Grade) FROM SC WHERE Sno = '0811101'
SELECT Cname FROM Course WHERE Credit = MAX(Credit)应该改为:
declare @credit int select @credit=max(credit) from course select cname from course where credit=@credit
SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno
SELECT Sno as 学号, COUNT(*) as 选课门数, AVG(Grade) as 平均成绩 FROM SC GROUP BY Sno
SELECT Dept, Count(*) 女生人数 FROM Student WHERE Sex = '女' GROUP BY Dept
SELECT Dept, Sex, Count(*) 人数, FROM Student GROUP BY Dept, Sex ORDER BY Dept
SELECT Sno, Count(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) > 3
SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) >= 4
多表连接查询分类三种:
1.内连接(INNER JOIN):
分为三种:等值连接、自连接、不等连接
2.外连接(OUTER JOIN):
分为三种:左外连接、右外连接、全外连接
3.交叉连接(CROSS JOIN) :
没有WHERE子句,它返回连接表中所有数据
行的笛卡尔积
语法:ANSI方式的连接格式
FROM 表1 [INNER] JOIN 表2 ON <连接条件>
连接条件语法格式:[<表名1.>][<列名1>]<比较运算符>[<表名2.>][<列名2>]
内连接执行过程:
首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,
找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。
表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2, …
重复这个过程,直到表1中的全部元组都处理完毕为止。
操作1:查询学生的选课情况。学生信息在student表中,选课信息在sc表中。两张表都存放着学生的学学号sno。
SELECT * FROM Student INNER JOIN SC ON Student.Sno=SC.Sno操作2:去除重复列。如果不指定查询结果的列名(如操作1)则直接将两个表拼接在一起,学号列会重复。为了避免重复,需要制定列名。
SELECT Student.Sno, Sname, Sex, Sage, Dept, Cno, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno操作3:指定列别名 ,参照前面说过的格式:<源表名> [ AS ] <表别名>
SELECT Sname, Cno, Grade FROM Student S JOIN SC ON S.Sno = SC.Sno WHERE Dept = '计算机系'注意:当为表指定了别名时,在查询语句中的其他地方,所有用到表名的地方都要使用别名,而不能再使用原表名。
SELECT Sname, Grade FROM Student s JOIN SC ON s.Sno = SC. Sno JOIN Course c ON c.Cno = SC.Cno WHERE Dept = '信息管理系' AND Cname = '计算机文化学'
有分组和行选择条件的多表连接查询。统计计算机系学生每门课程的选课人数、平均成绩、最高成绩和最低成绩。
SELECT Cno, COUNT(*) AS Total, AVG(Grade) as AvgGrade, MAX(Grade) as MaxGrade, MIN(Grade) as MinGrade FROM Student S JOIN SC ON S.Sno = SC.Sno WHERE Dept = '计算机系' GROUP BY Cno
语法:
create [ unique ] [ clustered | nonclustered ] index 索引名
on { 表名 | 视图名 } ( 列名 [ asc | desc ] [ , ...n ] )
create unique index ix_kcm on kc ( 课程名 desc) with drop_existing --删除已存在的索引,创建新的索引
create view v1 (学生学号,男生姓名, 生日) as select 学号, 姓名, 出生日期 from xsqk where 专业名=‘计算机网络’ and 性别=1 go使用视图
select * from v1
alter view v1 (学生学号,男生姓名,生日,专业,系) as select 学号,姓名,出生日期,专业名,所在系 from xsqk where 专业名=‘计算机网络’ and 性别=1 )
5.5.1 使用视图插入数据
注意:
1.可通过视图向基表中插入数据,但插入的数据实际上存放在基表中,而不是存放在视图中。
2.如果视图引用了多个表,使用insert语句插入的列必须属于同一个表。
3.若创建视图时定义了“with check option”选项,则使用视图向基表中插入数据时,必须保证插入后的数据满足定义视图的限制条件。
操作1:向“V1”视图中添加两条记录。
insert into v1 values(‘020106’,‘张三’,‘1981-04-22’,‘计算机网络’,‘计算机’) insert into v1 values(‘020107’,‘张四’,‘1981-07-08’,‘信息安全’,‘计算机’)
注意:
1.要删除的数据必须包含在视图的结果集中。
2.如果视图引用了多个表时,无法用delete命令删除数据。
语法:
delete from 视图名 [ where 条件]
操作:删除“V1”视图中学号为‘020108’的记录。
delete from V1 where sno = ‘020108’
CREATE PROCEDURE p_StudentGrade1 AS SELECT Sname, Cname, Grade FROM Student s INNER JOIN SC ON s.Sno = SC.Sno INNER JOIN Course c ON c.Cno = sc.Cno WHERE Dept = '计算机系'执行:
EXEC p_StudentGrade1
create procedure p_xsqk @xh char(6)
as select 姓名,课程号,成绩 from xsqk , xs_kc
where xsqk.学号=xs_kc.学号 and xsqk.学号= @xh
go
执行:
exec p_xsqk ‘020102‘ --(1)按位置传递参数
exec p_xsqk @xh=‘020103‘ --(2)通过参数名传递参数
注意:因输入参数没有默认值,所以不能用“exec p_xsqk”
create procedure p_kh @teacher char(8) , @kch char(3) output as select @kch = 课程号 from kc where 授课教师= @teacher go执行:
declare @teacher varchar(8), @kch char(3) set @teacher='赵怡' exec p_kh @teacher, @kch output print @teacher + ‘教师所受课程的课程号为:’ + @kch
create procedure p_find @findname char(8) as if exists (select * from xsqk where 姓名=@findname) return 1 else return 0执行:
declare @result int exec @result=p_find ‘陈伟‘ if @result =1 print ‘有这个人!‘ else print ‘ 没有这个人!
触发器就是是一种表或视图执行insert、 delete、update操作时,被系统自动执行的特殊的存储过程。
语法:
create trigger 触发器名
on 表名| 视图名
for | after | instead of [ insert , update, delete ]
as SQL语句
注意:1个表上可有多个触发器。 每个触发器只能作用在一个表上。这是一个一对多的关系
操作:在xscj库的xs_kc表上创建1个名为tr_insert_cj的触发器,当向xs_kc表进行插入操作时激发该触发器,并给出提示信息“有新成绩插入到xs_kc表中!”
create trigger tr_insert_cj on xs_kc after insert as print ‘有新成绩信息插入到xs_kc表! ’ go执行下面这条语句后会触发insert触发器
insert into xs_kc values( '020105', '101', 87, null )
操作:在student表上创建名为tr_update_xsqk2的触发器,当对该表的“姓名”列修改时激发该触发器,使用户不能修改“姓名”列。
create trigger tr_update_xsqk2 on student after update as if update(姓名) begin rollback transaction -- 撤消修改操作 raiserror(‘不能修改学生姓名!’ , 16 ,1) end go执行下面这条语句后会触发update触发器
update student set 姓名=‘小花’ where 姓名=‘杨颖’
操作:在xscj库的xsqk表上创建1个名为tr_delete_xsqk的触发器,当要删除指定学号的行时,激发该触发器,撤消删除操作,并给出提示信息“不能删除xsqk表中的信息
create trigger tr_delete_xsqk on xsqk after delete as rollback transaction print ‘不能删除xsqk表中的信息!’ go
delete xsqk where 学号= '020101'
语法:
alter trigger 触发器名
语法:
drop trigger 触发器名[,…n]
on {database | all server}
《数据库原理及应用》 课件
不得不说,课件上有很多错误。起的名字还是拼音简写,⊙﹏⊙b汗!。改了一部分,还有部分没改。个人觉得课堂上学道的东西不会太多,还是自己多动手比较好。像我这样把课件给整理一遍,估计整个计算机系再也找不出来第二个这样的奇葩了~O(∩_∩)O哈哈~