数据库SQL Server基本操作

一、创建表

创建表Student:

create table Student1
(
Sno char(9) primary key,
Sname char(9) ,
Ssex char(2),
Sdept char(8),
Sage smallint);

创建表Course:

create table Course1
(
Cno char(4)primary key,
Cname char(10),
Cpno char(4),
Ccredit smallint,
foreign key Cpno references Course1(Cno)
);

创建表SC:

create table SC1(
Cno char(2),
Sno char(10),
Grade int,
primary key(Sno,Cno),
foreign key(Sno)references Student1(Sno),
foreign key(Cno)references Course1(Cno)
);

二、修改表基本表:

alter table 表名

1.增加列:

add 新列名 数据类型 完整性约束;
例如:

alter table Student add ID char(20);

2.删除列(属性):

drop column 属性名(列);
例如:

alter table Student drop column ID;

3.修改数据类型:

alter column 列名 数据类型;
例如:

alter table  Student alter column Sage char(8);

三、删除基本表:

drop table 表名 [restrict|cascade];
resrrict:删除表有限制条件(不能有视图,不能有触发器)
cascade:删除表没有限制条件(删除表时,相关视图将一起删除)

例如:

drop table Teacher cascade;//有问题

四、建立索引:

create [unique][cluster]index<索引名>
on <表名>(<表名>[<次序>[,<列名>[<次序>]]…);
unique:表明此索引只对应唯一的数据记录
cluster:表示要建立的是聚族索引

例如:

create cluster index StuSname on Student(Sname);
/*将会在Student表的Sname列上建立聚族索引,且Student表中的记录将按照Sname值的升序存放*/

例如:建立唯一索引

create unique index StuSno on Student(Sno);
create unique index CouCno on Course(Cno);
create unique index SCno on SC(Sno asc,Cno desc);

注:asc升序,desc降序,默认升序

五、删除索引:

drop index 索引名;
例如:

drop index StuSname;


六、数据查询:

**select [all|distinct] 目标列,目标列表达式,……
from 表名或视图
where 条件
group by 列名1 having 条件表达式
order by 列名2 [asc|desc]; //升|降,默认升
**

**
补充:
lower(列名):变小写
upper(列名):变大写
**


(I)

A、单表查询:
1.查询全体学生的学号,姓名

select Sno,Sname
from Student ;

B、查询全部列:
1.查询全体学生的详细记录

select *
from Student;

C、查询经计算的值:
1.查询全体学生的姓名及出生年份

select Sname,2014-Sage
from Student;

2.查询全体学生的姓名,出生年份,和所在系,要用小写字母表示系名

select Sname,'Birth',2014-Sage,lower(Sdept)
from Student;

D、取别名:
在查询列名后加上别名

例如:

select Sname Name,'Year-Birth',2014-Sage Birthday,upper(Sdept)Department
from Student;

E、去掉结果中的重复项加distinct
例如:

select distinct Sno
from SC;


(II)

**查询满足条件的元组
比较:=,<,>,<=,>=,!=,<>,!>,!<,NOT+上述比较符
确定范围:between and,not between and
确定集合:in,not in
字符匹配:like,not like
注:查询字符本身包括%,_时,加反斜杠
空值:is null,not is null
注:is不能用=代替
多重条件:and,or,not
**

1.查询计算系的学生

select Sname
from Student 
where Sdept='CS';

2.查询成绩在90分以上的学生学号,姓名

select  distinct Student.Sno,Sname
from Student,SC
where Grade>90;

3.查询年龄不再20到30之间的学生

select Sno,Sage
from Student 
where Sage not between 20 and 30;
//或者:where Sage<20 or Sage>30;

4.查询计算机系,数学系,信息系学生的学号,姓名

select Sno,Sname
from Student 
where Sdept in('CS','IS','MA');
//或者:where Sdept='CS'or Sdept='IS'or Sdept='MA';

5.找出姓李,并且成绩大于90学生的学号,姓名,性别,成绩

Select Student.Sno,Sname,Ssex,Grade
From Student,SC
where Sname LIKE '李%'and Grade >90;

6.查询姓李名字为三个字的学生信息

select *
from Student
where Sname like '李____';

7.查询第二个字不为‘芳’的学生

select *
from Student 
where Sname not like '__芳%' ;

8.查询有成绩学生的学号

select distinct SC.Sno
from Student ,SC
where Grade is not null;

(III)

order by 列名 [asc|desc];

1.查询选修了课程号为3的学生的学号,成绩安降序排列

select Sno
from SC
where Cno='3'
order by Grade desc;

(IV)聚集函数

count([distinct|all] * ) 统计元组个数

count([distinct|all] 列名 ) 统计一列值的个数

sum([distinct|all] 列名) 计算一列值的总和

avg([distinct|all] 列名) 计算一列值的平均值

**max([distinct|all] 列名) 求一列值的最大值 **

**min([sistinct|all] 列名) 求一列值的最小值
**

1.查询学生总人数

select count(Sno)
from Student;

2.计算1号课程的平均成绩

select avg(Grade)
from SC
where Cno='1';

3.查询200215012选修课程的总学分

select sum(Ccredit)
from SC,Course
where SC.Cno=Course.Cno and Sno='200215012';

(V)group by

**查询结果按某一列或多列的值分组,值相等的为一组
目的:为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每个分组,即每个函数都有一个函数值。
**

1.求各个课程号及相对应的选课人数

select Cno,count(Sno)
from SC
group by Cno;

2.查询选修了1门课以上的学生学号

select Sno
from SC
group by Sno
having count (*)>1;

(VI)连接查询:

等值与非等值连接

1.查询每个学生及其选修课程情况

select Student.*,SC.*
from Student,SC
where Student.Sno=SC.Sno;

自身连接

1.查询每一门的间接先修课。

select first.Cno,second.Cpno
from Course first,Course second
where first.Cpno=second.Cno;

外连接

1.查询每个学生及其选修课程情况

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student left outer join SC on(Student.Sno=Sc.Sno); 

/*from Student left outer join SC using (Sno);*/有问题

复合连接

1.查询选修了2号课程且成绩在90分以上的所有学生

select Student.Sno,Sname,Grade
from SC,Student
where SC.Sno=Student.Sno and Cno='2' and Grade>90;

2.查询每个学生的学号,姓名,选修课程名及成绩

select Student.Sno,Sname,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno ;

嵌套查询

select Sname ,Sno,Sdept
from Student
where Sno in(select Sno
           from Student 
            where Sdept='女');

查询与刘晨同一系的学生

select *
from Student
where Sdept in(select Sdept
from Student
where Sname='刘晨');

集合查询

  1. 查询数学系和信息系的学生的信息
select * 
from student
where sdept=’MA’
 union
select * 
from student 
where sdept='IS';
  1. 查询选修了1号课程或2号课程的学生的学号
select sno from sc where cno='1' 
Union 
select sno from sc where cno='2';

3.查询同时选修了“英语”和“数学”这两门课的同学的学号,姓名及成绩。

select SC.Sno,Sname,Grade
from Student,SC,Course 
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and  Cname in('数学','英语')and SC.Sno in(
select Sno
from SC,Course 
where SC.Cno=Course.Cno and Cname='数学' 
intersect
select Sno
from SC,Course 
where  SC.Cno=Course.Cno and Cname='英语') ;

4.查询计算机系学生年龄不大于23的学生的差集

select*
from student
where sdept='cs'
except
select *
from student
where sage<23;


查询测试:

1、查询不姓刘也不姓王的同学学号、姓名、出生年份。

select Sno,Sname,2014-Sage Birthday
from Student
where Sname not like '王%'and Sname not like '刘%';

2、查询“信息”系同学中最大年龄,最小年龄的同学的信息。

方法一
select *
from Student
where Sdept='IS'and( Sage =(select max(Sage)
from Student 
where Sdept ='IS'
)or Sage in(select min(Sage)
from Student 
where Sdept='IS'));
方法二
select *
from Student
where Sdept='IS'and Sage in(
select max(Sage)
from Student 
where Sdept ='IS'
union
select min(Sage)
from Student
where Sdept='IS'
);

3、查询选修了没有先行课程的同学的课程号及成绩。

select Sno,SC.Cno,Grade
from Course,SC
where SC.Cno=Course.Cno and Cpno is null;

4、查询和王敏同一个系的同学的总人数。

select count(Sno)
from Student
where Sdept in(
select Sdept
from Student
where Sname ='王敏');

5、查询成绩在85分以上的同学信息,按男女分组显示,系别以大写字母显示。

select Student.Sno,Sname,Sage,Ssex,upper(Sdept)
from Student,SC
where Student.Sno=SC.Sno and Grade>85
order by Ssex;

6、查询“数据库”这门课程的总成绩及平均分。

select sum(Grade),avg(Grade)
from SC,Course
where SC.Cno=Course.Cno and Cname='数据库';

7、查询数学系和信息系同学的信息,按照系别降序,年龄升序排列。

select *
from Student
where Sdept in('IS','MA')
order by Sage asc,Sdept desc;

8、查询姓张的两个字同学的选课的学号,课程号,课程名及成绩。

select SC.Sno,SC.Cno,Cname,Ccredit
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Sname like '张__';

9、查询有选课记录的同学的人数。

select count( distinct Sno ) 
from SC;

10、查询选修课程信息中女同学的选修课程号及相应选课人数。

select SC.Cno,count(SC.Cno)
from SC
where Cno in(select SC.Cno
        from Student,SC
        where Student.Sno=SC.Sno and Ssex='女')
group by SC.Cno;

11、查询选修“1”号课程且成绩在80分以上的同学的选课信息。

select*
from SC
where Cno='1' and Grade>80;

12、查询选修了“信息系统”和“数学”两门课的同学的学号,姓名及成绩。

select SC.Sno,Sname,Grade
from SC,Course,Student
where SC.Sno=Student.Sno and SC.Cno=Course.Cno and Cname in('数学','信息系统')and SC.Sno in(
select Sno
from SC,Course
where SC.Cno=Course.Cno and Cname ='数学'and Sno in(
select Sno
from SC,Course
where SC.Cno=Course.Cno and Cname='信息系统'));

1、查询选修了“信息系统”课程的人数。

select count(Sno)
from Course,SC
where  Course.Cno=SC.Cno and Cname='信息系统';

2、查询姓刘的同学的选课信息及出生年份。

select Sname,SC.*,2014-Sage  Birth
from Student,SC
where  Student.Sno=SC.Sno and Sname like'刘%';

3、查询选修了“1”号课程的同学的总成绩及平均分。

select sum(Grade) sum,avg(Grade) avg
from SC,Course
where SC.Cno=Course.Cno and SC.Cno='1'; 

4、查询信息系和计算机系同学的学号,姓名和年龄,并按系别升序,年龄降序排列。

select Sno,Sname,Sage,Sdept
from Student
where Sdept in('IS','CS')
order by Sage desc,Sdept asc;

5、查询选修了“数学”且在90分以上的同学的学号,姓名,成绩。

select SC.Sno,Sname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='数学' and Grade>90;

6、统计和李勇同一个系的学生人数。

select Count(Sno)
from Student
where  Sdept=(select Sdept
from Student
where Sname like '李勇');

7、查询“男同学中最大年龄,最小年龄的同学的信息。

方法一
select*
from Student
where Sage in(
select max(Sage)
from Student
where   Ssex like '男')or
Sage in(
select min(Sage)
from Student
where   Ssex like '男');
方法二
select*
from Student
where Sage in(
select max(Sage)
from Student
where   Ssex like '男'
union
select min(Sage)
from Student
where   Ssex like '男');

8、查询姓王的两个字的同学的选课的课程名称及学分。

select Cname,Ccredit
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Sname like '王__';

9、查询数据库课程成绩在85分以上的同学的人数。

select count(Sno)
from SC,Course
where  SC.Cno=Course.Cno and Cname like '数据库'and Grade>85;

10、查询不及格的同学的学生信息,按男女进行分组显示,系别以大写字母显示。

select Student.Sno,Sname,Sage,Ssex,upper(Sdept)
from Student,SC
where Student.Sno=SC.Sno and Grade<60
order by Ssex;

11、查询没有先行课的课程号及课程名。

select Cno,Cname
from Course
where Cpno is null;

12、查询选修了“数据库”或“信息系统”两门课程的同学的学号、姓名及成绩。

select SC.Sno,Sname,Grade,Cname
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname in('数据库','信息系统');

1、查询“信息”系同学中最大年龄和平均年龄。

select sum(Sage),avg(Sage)
from Student
where Sdept='IS';

2、查询不是信息系也不是数学系的同学学号、姓名、出生年份。

select Sno,Sname,2014-Sage Birthday
from Student
where Sdept!='IS' and Sdept!='MA';

3、查询选修了没有先行课程的同学的课程号及成绩。

select SC.Cno,Grade
from Course,SC
where  SC.Cno=Course.Cno and Cpno is null;

4、查询和王敏同性别的的同学的学号、姓名。

select Sno,Sname
from Student
where Ssex in (
select Ssex
from Student
where Sname ='王敏');

5、查询不及格的同学信息,按男女分组显示,系别以小写字母显示。

select Student.Sno,Sname,Sage,Ssex,lower(Sdept)
from Student,SC
where Student.Sno=SC.Sno and Grade<60
order by Ssex;

6、查询选修了“数据库”这门课程的总人数。

select count(Sno)
from SC,Course
where SC.Cno=Course.Cno and Cname='数据库';

7、查询计算机系和数学系同学的信息,按照系别降序,年龄升序排列。

select *
from Student
where Sdept in ('CS','MA')
order by Sdept desc,Sage asc;

8、查询姓张和姓王的同学的选课的学号,课程号,课程名及成绩。

select SC.Sno,SC.Cno,Cname,Grade
from Student,SC,Course
where STudent.Sno=SC.Sno and SC.Cno=Course.Cno and (Sname like'王%' or Sname like '张%');

9、查询各个课程号及相应的选课人数。

select Cno ,count(Cno)
from SC
group by Cno; 

10、查询选修了3门课程的同学的学生学号。

select Sno
from SC
group by Sno
having count(Cno)=3; 

11、查询选修“1”号课程且成绩在80分以上的同学的学号、姓名、课程名及成绩。

select SC.Sno,Sname,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and SC.Cno='1' and Grade>80;

12、查询同时选修了“英语”和“数学”这两门课的同学的学号,姓名及成绩。

方法一
select SC.Sno,Sname,Grade
from Student,SC,Course 
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and  Cname in('数学','英语')and SC.Sno in(
select Sno
from SC,Course 
where SC.Cno=Course.Cno and Cname='数学' 
intersect
select Sno
from SC,Course 
where  SC.Cno=Course.Cno and Cname='英语') ;
方法二
select SC.Sno,Sname,Grade
from Student,SC,Course 
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname in('数学','英语')and SC.Sno in(
select Sno
from SC,Course 
where SC.Cno=Course.Cno and Cname='数学'and Sno in( 
select Sno
from SC,Course 
where  SC.Cno=Course.Cno and Cname='英语')) ;

插入

1.插入一条学生纪录

insert 
into student(sno,sname,ssex,sdept,sage)
values ('201212019','程东','男','IS',18);

insert
 into Student(sno,sname,ssex,sage,sdept)  
values('95005', '刘云',   '女',18, 'CS ');

2,插入一条选课记录

insert 
into SC
values ('6','201212016',56);
或者
insert 
into SC
values ('9','201212013',null);

3.对每一个系,求学生的平均年龄,并把结果存入数据库

create table Dept_age
(Sdept char(15),
 ave_age smallint);
insert 
into Dept_age(sdept,avg_age)
select Sdept,avg(Sage)
from student
group by  Sdept;

修改

1.将学号201212016的年龄改为25

update Student
set Sage=25
where Sno='201212016';

2.将所有的学生年龄加1

update student
set sage=sage+1;

3.将张三成绩置0

update SC
set grade=0
where'张三'=(select Sname 
from Student
where Student.Sno=SC.sno);

4.输出数据库成绩前三名信息

方法一:
select top 3 SC.Sno,Sname,sdept,Grade
from sc,course,student
where Student.sno=SC.sno and course.cno=sc.cno and cname='数据库'  
order by grade desc;
方法二:
create view 数据库成绩
as
select SC.Sno,Sname,sdept,Grade
from sc,course,student
where Student.sno=SC.sno and course.cno=sc.cno and cname='数据库';
select top 3*
from 数据库成绩
order by grade desc;

删除

1.删除学号是201212018的同学信息

delete 
from Student
where Sno='201212018';

2.删除程东同学的选修信息

delete 
from SC
where '程东'=(select Sname
from student
where SC.sno=student.sno);

视图

创建视图

1.创建一个反映学生出生年份的视图:

create view BT_S(sno, sname, 出生年份) 
as 
select sno, sname, 2014- sage 
from student;

2.将所有女生的记录定义为一个视图:

create view F_student 
as
 select *
 from student 
where ssex='女';

3.建立数学系学生视图

create view MA_student 
as
 select *
 from student 
where Sdept='ma';

4.建立信息系学生视图,要求进行修改和插入操作时仍需保证该视图只有信息系学生

create view IS_student 
as
 select sno,sname,sage
 from student 
where Sdept='is'
with check option;

删除视图

1.删除视图SC-s

drop view SC_s;

drop view SC_s cascade;//删除了视图和它导出的所有视图

查询视图

1.查找出信息系视图中年龄小于20的所有学生

select *
from IS_student
where Sage<20;

更新视图与更新表的操作一样

完整性约束命令子句建表

1.创建学生表要求,姓名唯一,年龄在18-25,性别只能是男,女,学号是主码

create table Stu(
Sname char(9) unique,
Sno char(10),
Sage smallint constraint c1 check (Sage between 18 and 45),
Ssex char(2) constraint c2 check (Ssex in('男','女')),
Sdept char(20), 
constraint Stukey primary key(Sno));

修改完整性约束

alter table Stu2 add constraint check ( Sname not like '刘%'and Ssex='女');
alter table Stu2 add constraint t9 check (Sno between 900and 999);

4.删除原来的完整性约束,增加新的

alter table student drop constraint C1;
alter table student add constraint C1 check(Sno between 900 and 999);

更新视图测试:

1、将计算机系和数学系姓刘的同学年龄加1岁。

update Student
set sage=sage+1
where Sdept in('MA','CS');

2、将同学们选修的“数据库”课程的成绩设为85分。

update SC
set Grade=85
where '数据库'=(
select Cname
from Course
where Course.cno=SC.Cno );

3、在数据表的全属性中将新同学记录(200215178,张鹏,女,18岁);

(200215179,刘明,男, 19岁)插入到学生表中。
insert
into Student(Sno,Sname,Ssex,Sage)
values ('200215179','刘明','男' ,'19');

4、求选修了数据库同学的平均成绩,并将结果存入数据库中。

create table  DB
( Sno char(13),
   Avgs smallint);
insert 
into DB
select cname,avg(Grade)
from sc,course
where sc.cno=course.cno and cname='数据库'
group by cname;

5、删除“7”号课程的课程信息。

delete
from sc
where cno='7'; 

6、将选修课各科的课程号、课程名及平均成绩的定义一个视图。

create view SC_Course
as
select SC.Cno,Cname,avg(grade) 平均成绩
from sc,course
where sc.cno=course.cno
group by sc.cno,cname;

7、向信息系学生视图IS_S中插入一条新的学生记录(200215199,赵庚,20岁)。

create view IS_S
as
select *
from student
where Sdept='Is';

insert
into  IS_S(sno,sname,sage)
values('200215199','赵庚','20');

insert
into  IS_S(sno,sname,sage,sdept)
values('200215199','赵庚','20','is');

8、查询计算机系及信息系选修1号课程视图中成绩在80-95之间的学生的学号,姓名,课程名及成绩。

create view SC_s(sno,sname,cno,cname,sdept,grade)
as
select sc.sno,sname,sc.cno,cname,sdept,grade
from sc,student,course
where student.sno=sc.sno and sc.cno=course.cno and sc.cno='1'and sdept in ('cs','is');


select sno,sname,cname,grade
from SC_s
where grade between 80 and 95;

9、删除信息系同学视图IS_S中学号为200215199的学生记录。

delete 
from IS_S
where sno='200215199';

10、将信息系学生视图IS_S中学号为200215125的同学姓名改为杨悦。

update IS_S
set sname='杨悦'
where sno='201212019';

11、用命令创建一个职工表,其中有职工号,姓名,性别,年龄,
其中职工号为四位整数,姓名不允许取空值,性别只能取男或女。

create table Workers
( Wno char(10)constraint W1 check (Wno between 1000 and 9999),
Wname char(20)constraint W2 not null,
Wsex char(3) constraint W3 check (Wsex in('男','女')),
Wage int);

12、用命令创建一个仓库管理表,其中有职工号,仓库号,库存量,其中库存量在0到1000之间。

create table  Chouse
( Wno char(10),
  Cno char(10),
  Cquanlity float constraint C1 check (Cquanlity between 0 and 1000));

授权与回收

1.将查询student表的权限授予用户U1

grant select
on  student
to U1;
考试时写
grant select
on  table student
to U1;

2.把student,course表的全部权限授予U2和U1

grant all privileges
on  student,course
to U1,U2;

3.把对表SC的查询权限授予所有用户

grant select
on SC
to public;

4.把查询student和修改学生学号的权限授予用户2

grant update(sno),select
on student
to U2;

5.把对表SC的插入权限授予用户2,并允许将此权限在授予其他用户

grant insert
on SC
to U2
with grant option;

回收权限

6.把用户2修改学生学号的权限回收

revoke update(sno)
on student
from u2;

7.回收所有用户对表的查询

revoke select
on SC
from public;

8.把用户u2对SC的插入权限回收

revoke insert
on SC
from U2 cascade;

创建角色

1.创建一个角色R1;

create role R1;

2.用grant对角色R1授予student的select,update,insert权限

grant select,update,insert
on student
to R1;

3.将角色授予U1

grant R1
to U1;

4.回收u1的三个权限

revoke R1
from U1;

你可能感兴趣的:(数据库SQL Server基本操作)