SQL語句簡單整理


SQL語句簡單整理

參考https://blog.csdn.net/weixin_43947974/article/details/84855856

1.數據庫操作:

    1)創建數據庫: create database database_name;

​ 創建並設置字符編碼 create database database_name character setutf8;

    2)刪除數據庫: drop datebase database_name;

    3)查看數據庫字符集編碼: show variables like 'character_set_database'

​ 如果使用可視化工具要切換到所查數據庫,或者使用: use database_name; 命令使用所查數據庫``

    4)修改數據庫字符編碼: alter database_name character set utf8;

2.數據表的操作:

    1)創建表: create table table_name(field1 int primary key,field2 varchar(20) not null ...)

    2)刪除表: drop table table_name

    3)插入表: insert into table_name(field1,field2) values(value1,value2)

    4)查詢表: select * from table_name where 查詢條件

    5)添加列: alter table table_name add col_name varchar(20) not null

    6)刪除列: alter table table_name drop column col_name

    7)修改列: alter table table_name modify column col_name varchar(50)

    8)更新列: update table_name set col1=value1... where 條件...

3.約束:

    1)種類:primary key(主鍵約束)、default(默認約束)、not null(非空約束)、unique(唯一約束)、foreign key(外鍵約束)、check(檢查約束)

    2)添加約束: alter table table_name add constraint 約束名 約束類型

      比如: alter table student add constraint fk_1 foreign key(class_id) references class(class_id);

    3)刪除約束: alter table table_name drop 約束類型 約束名稱 注意:刪除主鍵時,應先刪除引用了它的外鍵

      比如: alter table student drop foreign key fk_1

4.數據庫查詢

  1.簡單的查詢:

    1)無條件查詢:select * from table_name;

​ select col1,col2,... from table_name;

    2)條件查詢:select * from table_name where 條件;

    3)排序查詢:select col1,col2,...from table_name where 條件 .. order by 列名 desc/asc

​ desc:從大到小排序。

​ asc:從小到大排序,默認是asc

       比如: select s_id,s_name,s_score from student where s_score>=60 order by s_id desc

    4)模糊查詢:查詢關鍵字 like 主要使用 % 、_、[ ]三個字符

     % 表示匹配0個或多個字符(通配符)
         _匹配一個字符
         [ ]匹配其中中的一個(類似正則表達式)

      例: select * from student where s_name like '張%' 譯:查詢學生中姓張的,兩個字,三個字的都可以查出來,如:張三、張麻子

      例: select * from student where s_name like '張_' 譯:查詢學生中姓張的,且只有兩個字的,如:張三、張四

      例: select * from student where s_name like '[張李王]三' 譯:查詢學生中姓名為:張三、李三、王三 的信息

    5)分組查詢:select * from table_name group by 列名 關鍵字

group by ,將統計的列中相同數據進行分組

      比如: select s_score,count(*) '人數' from student group by s_score 譯:查詢學生中每個分數有多少人,對統計出來人數的列暫時命名為‘人數’,就是對相同的成績進行了分組

      分組查詢常用函數:

        (1)max:求最大值

例: select s_name,max(math_score) from student group by s_name 查詢數學成績最高的學生姓名

        (2)min:求最小值

例: select s_name,min(math_score) from student group by s_name 查詢數學成績最低的學生姓名

        (3)avg:求平均值

例: select class_id,avg(math_score) from student group by class_id 查詢每個班的平均數學成績

        (4)sum:求總數和

例: select sum(s_id) from student group by s_id 查詢表中一共有多少學生,若不分組,將會將所有學生id相加獲取最后總和

        (5)count:求總行數

例: select count(s_id) from student 查詢表中一共有多少行學生

    6)having用法:篩選成組后的各種數據,它可以篩選真實表中沒有的數據作為查詢條件

       比如: select s_name,sum(s_score) from student group by s_name having sum(s_score)>600 查詢總成績大於600分的學生,但我們表沒有總分這個記錄

          只有每科的成績,這時就可以用having了,where就不能來篩選總成績大於600的學生了。

          having和where的區別:

            having:having對查詢結果中的列發揮作用,篩選數據

            wherer:where針對表中的列發揮作用,查詢數據

    7)limit用法:limit 主要是用於分頁,limit n,m 表示從n+1開始取m條數據

        比如: select * from student limit 2,5 表示取所有信息的第3條后面的5條記錄:3、4、5、6、7

    8)簡單的多表查詢: select table1.,table2. from table1,table2 where 條件

  2.子查詢和連接查詢

    1)where子查詢:把內層查詢結果當作外層查詢的比較條件

    比如:查詢成績及格的學生,后面括號里可以放子查詢,也可以放已知的數據。

select s_name,s_score 
from student 
where s_score 
in (select s_score from student wheres_score>=60) 

    2)from子查詢:把子查詢的結果作為一個表,進行再次查詢

    比如:查詢成績及格學生的姓名和班級,這里將子查詢作為一個新表(stu) 再進行查詢 ,這里有班級表(class)和學生表(student)

select s_name,class_name 
from class,(select s_name,class_id from student where s_score>=60) as stu 
where class.class_id = stu.class_id 

    3)exists子查詢:把子查詢結果拿到內層,看內層的查詢是否成立

    比如:查詢班級中的學生姓名,

    select class_id,s_name

from student where exists(select * from class where class.class_id=student.class_id)

    4)連接查詢

      連接查詢我們把表的數據給出來,方便對照查看

      left join 左連接:以左表為准,去右表找數據,如果沒有匹配的數據,則以null補空位

           語法: select col1,col2,col3 from ta left join tb on 條件

​ on后面放連接的一些條件,跟where后面跟條件一樣

           例: SELECT class.*,s_id,s_name FROM class LEFT JOIN student ONclass.class_id=student.class_id

           結果:img 查詢班級里的學生,沒有學生的就用 null 補位了

     right join 右連接:以右表為准,去左表找數據,如果沒有匹配的數據,則以null補空位 和左連接相反

           語法: select col1,col2,col3 from ta right join tb on 條件

     inner join 內連接:查詢的結果是所連接2個表的交集,

          語法: select ta1.,ta2. from ta1 inner join ta2 on 條件

           例: SELECT class.*,s_id,s_name FROM student INNER JOIN class 我們這里不跟條件,查詢的就是兩個表的所有交集

             img

           例: SELECT class.*,s_id,s_name FROM student INNER JOIN class ON class.class_id=student.class_id 有條件后,都滿足條件的才會查詢出來

             img

常用數據類型

創建數據庫

--創建students數據庫
create database student;

--創建student表結構
CREATE TABLE Student (
  Sno     CHAR(7)   PRIMARY KEY,
  Sname   NCHAR(5)   NOT NULL,
  Ssex    NCHAR(1) check (ssex='男' or ssex='女'), 
  Sage    TINYINT,
  Sdept   NVARCHAR(20) 
  )
--創建course表結構
CREATE TABLE Course (
  Cno       CHAR(6),
  Cname     NVARCHAR(20)  NOT NULL,
  Credit    TINYINT default 1,
  Semester TINYINT,
  PRIMARY KEY(Cno)
);
--創建sc表結構
CREATE TABLE SC (
  Sno    CHAR(7)  NOT NULL,
  Cno    CHAR(6)  NOT NULL,
  Grade  TINYINT,
  PRIMARY KEY (Sno, Cno),
  FOREIGN KEY (Sno)  REFERENCES  Student (Sno),
  FOREIGN KEY (Cno)  REFERENCES  Course (Cno)  
)  ;

--往student表中插入數據
insert into student values('0811101','李勇','男',21,'計算機系')
insert into student values('0811102','劉晨','男',20,'計算機系')
insert into student values('0811103','王敏','女',20,'計算機系')
insert into student values('0811104','張小紅','女',19,'計算機系')
insert into student values('0821101','張立','男',20,'信息管理系')
insert into student values('0821102','吳賓','女',19,'信息管理系')
insert into student values('0821103','張海','男',20,'信息管理系')
insert into student values('0831101','錢小平','女',21,'通信工程系')
insert into student values('0831102','王大力','男',20,'通信工程系')
insert into student values('0831103','張姍姍','女',19,'通信工程系')
--往course表中插入數據
insert into course values('C001','高等數學',4,1)
insert into course values('C002','大學英語',3,1)
insert into course values('C003','大學英語',3,2)
insert into course values('C004','計算機文化學',2,2)
insert into course values('C005','JAVA',2,3)
insert into course values('C006','數據庫基礎',4,5)
insert into course values('C007','數據結構',4,4) 
insert into course values('C008','計算機網絡',4,4)

--往sc表中插入數據
insert into sc values('0811101','C001',96)
insert into sc values('0811101','C002',80)
insert into sc values('0811101','C003',84)
insert into sc values('0811101','C005',62)
insert into sc values('0811102','C001',92)
insert into sc values('0811102','C002',90)
insert into sc values('0811102','C004',84)
insert into sc values('0821102','C001',76)
insert into sc values('0821102','C004',85)
insert into sc values('0821102','C005',73)
insert into sc values('0821102','C007',NULL)
insert into sc values('0821103','C001',50)
insert into sc values('0821103','C004',80)
insert into sc values('0831101','C001',50)
insert into sc values('0831101','C004',80)
insert into sc values('0831102','C007',NULL)
insert into sc values('0831103','C004',78)
insert into sc values('0831103','C005',65)
insert into sc values('0831103','C007',NULL)

select * from Student
select * from Course
select * from SC

第一章

--① 在Teacher表中添加一個職稱列:列名為:Title,類型為nchar(4)。
alter table Teacher add Title nchar(4)

--② 為Teacher表中的Title列增加取值范圍約束,取值范圍為:{教授,副教授,講師}。
alter table Teacher add check(Title='教授' and Title='副教授' and Title='講師')

--③ 將Course表中Credit列的類型改為:tinyint。
alter table Course drop constraint  CK__Course__Credit__0BC6C43E --刪除約束

alter table Course
alter Column Credit tinyint

--④ 刪除Student表中的Sid和Sdate列。
alter table Student drop constraint UQ__Student__CA1E5D79023D5A04 --刪除約束

alter table Student drop constraint DF__Student__Sdate__07020F21 --刪除約束

alter table Student
drop Column Sid,Sdate

--⑤ 為Teacher表添加主鍵約束,其主鍵為:Tno。
alter table Teacher add   primary key(Tno)

--⑥ 在Teacher表中添加一個移動電話列:列名為:Tel,類型為普通編碼定長字符串,長度為11。
alter table Teacher add  Tel nchar(11)

--⑦ 在Teacher表中添加一個住址列:列名為Adrs,類型為Unicode編碼變長字符串,最大長度為25。
alter table Teacher
add  Adrs nvarchar(25)

--⑧ 為TC表選擇適合的屬性,添加Tno,cno為主鍵約束。
alter table TC
add  constraint fk_Tno1 primary key(Tno)

alter table TC
add  constraint fk_Cno1 primary key(Cno)

--⑨ 為TC表中的Tno添加引用Teacher表的外鍵,名為fk_tno,Cno添加引用Course表的外鍵,名為fk_cno。
alter table TC
add  constraint fk_tno foreign key(Tno) references Teacher(Tno)

alter table TC
add  constraint fk_Cno foreign key(Cno) references Course(Cno)

--⑩ 在student中插入一行數據(學號:'0811101',姓名:'李勇',性別:'男',年齡:21,所在系:'計算機系'),course表中插入一行數據(課程號:'C001',課程名:'高等數學',開課學期:4,學分:1)、sc表中插入一行數據(學號:'0811101',課程號:'C001',成績:96)
insert  into Student(Sno,Sname,Ssex,Sage,Sdept)values('0811101','李勇','男',21,'計算機系')

insert into Course(Cno,Cname,Credit,Semester)values('C001','高等數學',4,1)

insert into SC(Sno,Cno,Grade)values('0811101','C001',96)

insert into Student values('211606','林先生','男',26,'計算機系')

第二章

--1.	查詢SC表中的全部數據。
select * from sc

--2.	查詢所有學生的所在系名(不重復顯示)。
select distinct sdept from student

--3.	查詢計算機系學生的姓名和年齡,並按年齡升序顯示結果。
select sname,sage from student
where sdept = '計算機系' order by Sage asc

--4.	查詢計算機系年齡在18~20歲的男生姓名和年齡。
select sname ,sage from student
where sdept='計算機系' and sage between 18 and 20 and ssex='男'

--5.	查詢C001課程的最高分。
select max(grade) 最高分 from sc
where cno='C001'

--6.	查詢計算機系學生的最大年齡和最小年齡,並分別取別名,顯示為年長和年幼。
select max(sage) 年長,min(sage) 年幼 from student
where sdept='計算機系'

--7.	統計每個系的學生人數。
select sdept,count(*) 學生人數 from student
group by sdept

--8.	統計每門課程的選課人數和最高成績。
select count(*) 選課人數,max(grade) 最高成績 from sc
group by cno

--9.	統計每個學生的選課門數和考試總成績,並按選課門數降序顯示結果。
select sno,count(*) 選課門數,sum(Grade) 考試總成績 from sc
group by sno
order by count(cno) desc

--10.	列出總成績超過200的學生的學號和總成績。
select sno,sum(Grade) 考試總成績 from sc
group by sno
having sum(Grade)>200

--11.	查詢所有姓名第二個字是“小”或“大”的學生姓名
select sname from student where Sname like '_小%' or Sname like '_大%'

--12.	查詢學號尾數不是1、5的的學生姓名和學號。
select sname,sno from student
where Sno not like '%1' and Sno not like '%5'

--13.	查詢計算機系和信息管理系學生中年齡在18-20的學生的學號、姓名、所在的系
select Sno,Sname,sdept
from student
where Sdept = '計算機系' or Sdept = '信息管理系' and Sage between 18 and 20  

--14.	統計每個學生的選課門數和平均成績,列出平均成績大於70分學生的學號,選課門數、平均成績、結果按平均成績從高到低排列
select sno,COUNT(*) as 選課門數,avg(grade) as 平均成績 
from sc group by sno
having avg(grade)>70 
order by avg(grade) desc

--15.	查詢計算機系和信息管理系每個系的學生人數
select Sdept,COUNT(sno) as 學生人數
from student group by Sdept having Sdept='計算機系' or Sdept='信息管理系'

--16.	查詢選了C002課程的學生姓名和所在系。
select sname,sdept from sc join student on sc.Sno=student.sno
where cno='c002'
--17.	查詢考試成績80分以上的學生姓名、課程號和成績,並按成績降序排列結果。
select sname,cno,grade from sc join student on sc.Sno=student.sno
where grade>80
order by grade desc

--18.	查詢"計算機系"選了"JAVA"課程的學生信息,列出學生姓名、課程名和成績
select sname,Cname,grade
from student 
join sc on sc.sno=student .sno
join course on course.cno=sc.cno
where sdept='計算機系' and cname = 'JAVA'

--19.	查詢與“計算機文化學”在同一學期開設的課程的課程名和開課學期。
select c1.Cname 課程名,c1.Semester 開課學期
from Course c1 join Course c2 
on c1.Semester=c2.Semester
where c2.Cname='計算機文化學'

--20.	查詢成績在70~80分的學生的學號、課程名和成績,並按成績降序顯示結果。
select sno 學號,Cname 課程名,grade 成績
from Course join sc
on Course.Cno = sc.Cno
where grade between 70 and 80
order by grade desc

--21.	 查詢哪些課程沒有學生選修,列出課程號和課程名。
select c.Cno,Cname from SC s right outer 
join Course c on s.Cno=c.Cno where sno is null

--22.	查詢計算機系哪些學生沒有選課,列出學生姓名。
select sname from SC s right outer
join student on student.sno=s.sno 
where s.sno is null and sdept ='計算機系'

--23.	 查詢每個學生的選課情況,包括未選課的學生,列出學生的學號、姓名、選的課程號。
select student.sno,sname,cno from SC s right outer
join student on student.sno=s.sno 


第三章

--1.查詢選課門數最多的前2位學生,列出學號和選課門數。
select top 2  sno,count(cno) 選課門數
from sc
group by sno
order by count(cno) desc

--2.查詢計算機系年齡最大的三個學生的姓名和年齡(包含並列的結果)。
select top 3  sname  姓名,sage  年齡
from student
group by Sname,sage,sdept
having sdept = '計算機系'
order by count(sage) desc

--3.查詢選了java課程的學生的學號、姓名、所在系、課程名和成績,並對所在系進行如下處理:
--當所在系為“計算機系”時,在查詢結構中顯示“CS”;
--當所在系為“信息管理系”時,在查詢結構中顯示“IM”;
--當所在系為“通信工程系”時,在查詢結構中顯示“COM”;
select student.sno,sname,sdept,cname,grade,
case
when sdept='計算機系' then 'CS'
when sdept='信息管理系' then 'IM'
when sdept='通信工程系' then 'COM'
end as 所在系
from sc
join student on student.sno = sc.sno
join course on sc.cno = course.cno
where cname='JAVA'

--4.查詢計算機系學生姓名、年齡和年齡情況,其中年齡情況為:如果年齡小於20,則顯示“偏小”;如果年齡在20-22,則顯示“合適”;如果年齡大於22,則顯示“偏大”。
select sname 姓名,sage  年齡,
case
when sage<20 then '偏小'
when sage>=20 and sage<=22 then '合適'
when sage>22 then '偏大'
end as 年齡情況
from student where sdept='計算機系'

--5.查詢每位學生成績,並將成績換算成積點:
--其中不及格成績和成績為空的科目績點為0,
--其他成績十位上的數即為積點
--(60分的積點是6;78分的積點是7;89分的積點是8),
--同時對每位同學的積點進行統計,
--列出學號,
--總績點並按總積點的降序排列
select sname,
case
when Grade<60 and Grade is null then 0
when Grade>=60 and Grade <70 then 6
when Grade>=70 and Grade <80 then 7
when Grade>=80 and Grade <90 then 8
when Grade>=90 and Grade <=100 then 9
end as 科目績點 into JiDian
from sc
join student on student.sno = sc.sno
join course on sc.cno = course.cno

select sname 姓名,SUM(科目績點)
from JiDian
group by sname
order by SUM(科目績點) desc
--6.查詢計算機系選了java課程的學生姓名、所在系和考試成績,並將結果保存到新表 
select sname,sdept,grade 
into NewGrid
from sc
join student on student.sno = sc.sno
join course on sc.cno = course.cno
where Sdept = '計算機系' and Cname = 'JAVA'
--7.統計每個系的女生人數,並將所在系和人數結果保存到新表Girls中(此表為全局臨時表);
--通過Girls表查詢計算機系的女生人數,列出系名和人數。
select Sdept as sdept,COUNT(sno) as num
into ##Girls
from student where Ssex='女' 
group by sdept

select sdept,num
from ##Girls
where sdept = '計算機系'

--用子查詢實現以下題目(10-15題)
--8.查詢選了“C001”課程的學生姓名和所在系。
select sname 姓名,sdept 所在系
from student
where sno in
(	select sno
​	from Course join SC on Course.Cno = SC.cno
​	where course.Cno='C001'
)

--9.查詢計算機系成績80分以上的學生的學號和姓名。
select Sno 學號,Sname 姓名
from student
where sdept = '計算機系' and sno in
(	select sno
​	from sc
​	where grade>=80
)

--10.查詢計算機系考試成績最高的學生的姓名。
select Sname 姓名
from student join SC on student.Sno = SC.sno
where sdept = '計算機系' and grade=
(	select top 1 grade
​	from sc
)

--11.查詢年齡最大的男生的姓名、所在系和年齡。
select Sname 姓名,Sdept 所在系,sage 年齡
from student
where ssex = '男' and sage in
(	select top 1 sage
​	from student
)

--12.查詢C001課程的考試成績高於該課程平均成績的學生的學號和成績。
select student.Sno 學號,grade 成績
from student join sc on student.sno = sc.sno
where cno ='C001' and grade >
(	select AVG(grade)
​	from sc
​	where cno ='C001'
​	group by cno
)

--13.查詢計算機系學生考試成績高於計算機系學生平均成績的學生的姓名、考試的課程名和考試成績。
select student.Sno 學號,cname 課程名,grade 成績
from sc 
join student on student.sno = sc.sno
join course on course.cno = sc.cno
where Sdept='計算機系' and grade >
(	select AVG(grade)
​	from sc 
​	join student on student.sno = sc.sno
​	where Sdept='計算機系'
)

--采用exists查詢完成以下題目(14-16題)
--14.查詢選了java課程的學生的姓名,學號和所在的系(采用exists查詢)
select Sname 姓名,student.Sno 學號,Sdept 系別 from student
where exists
(	select * from sc 
​	where exists
​	(	
​		select *
​		from course
​		where cno =sc.cno and Cname ='JAVA'
​	) and Sno = student.sno
)

--15.查詢選修了“C002”號課程的學生姓名
select Sname 姓名 from student
where exists
(	select * from sc 
​	where exists
​	(	
​		select *
​		from course
​		where cno =sc.cno and cno ='C002'
​	) and Sno = student.sno
)

--16.查詢選了JAVA課程的學生姓名和所在系
select Sname 姓名,Sdept 系別 from student
where exists
(	select * from sc 
​	where exists
​	(	
​		select *
​		from course
​		where cno =sc.cno and Cname='JAVA'
​	) and Sno = student.sno
)

--17.每位同學將各自的信息插入到student表中,包括學號、姓名、性別、年齡和所在的系
insert into student values(1606367,'林恩','男',21,'計算機系')

--18.創建一張表,表名為每位同學各自的學號(如s211506999)
--表結構包括(姓名、選的課程名和考試成績);
--將計算機系每個學生的姓名、選的課程名和考試成績插入到此表中。
create table s211606367
(
​	sname varchar(20),
​	cname varchar(40),
​	grade tinyint
)
insert into s211606367
select sname,cname,grade
from sc 
join student on student.sno = sc.sno
join course on course.cno = sc.cno
where Sdept ='計算機系'

--19.將所有選修C001課程的學生的成績加10分。
update SC set grade = grade+10 
where sno in
(	select sno
​	from Course join sc on sc.Cno = Course.cno
​	where sc.cno='C001'
)

--20.將計算機系所有學生的“計算機文化學”的考試成績加10分。
update SC set grade = grade+10 
where sno in
(	select sc.sno
​	from sc join Course on sc.Cno = Course.cno
​	join student on sc.sno = student.sno
​	where cname='計算機文化學' and Sdept = '計算機系'
)

--21.修改“java”課程的考試成績,如果是通信工程系的學生,則增加10分;如果是信息管理系的學生則增加5分,其他系的學生不加分。
update SC set grade = grade+
case sdept
when '通信工程系' then 10
when '信息管理系' then 5
else 0
end
from student join SC on student.Sno =SC.Sno
join course on course.cno=sc.cno
where cname='JAVA'

--22.刪除成績成績為空的學生的選課記錄。
delete from SC
where Grade is null

--23.刪除信息管理系“高等數學”考試成績不及格學生的“高等數學”選課記錄。
delete from SC
where Sno in
(	select distinct sc.sno
​	from student join SC on student.Sno =SC.Sno
​	join course on course.cno=sc.cno
​	where Sdept='信息管理系' and Cname='高等數學' and Grade<60
)

--24.刪除“java”考試成績最低的學生的java修課記錄。
delete from SC
where grade in
(	select MIN(grade)
​	from student join SC on student.Sno =SC.Sno
​	join course on course.cno=sc.cno
​	where Cname='JAVA'
)

--25.刪除沒人選的課程的基本信息。
delete from course
where cno in
(	select Course.cno
​	from sc right outer join course on course.cno=sc.cno
​	where sc.Cno is null
)

第四章

--1、索引:寫出實現下列操作的SQL語句,並執行所寫代碼。
--(1)在Student表上為Sname列建立一個聚集索引,索引名為:IdxSname。(提示:若執行創建索引的代碼,請先刪除該表的主鍵約束,及sc表的外鍵約束)
alter table Sc drop constraint FK__SC__Sno__0AD2A005 --先刪除外鍵約束
alter table Student drop constraint PK__Student__CA1FE4647F60ED59 --再刪除本表約束
create clustered index IdxSname on Student(Sname)

--(2)在Course表上為Cname列建立一個唯一的非聚集索引,索引名為:IdxCN。(注:寫出sql語句,如果執行報錯,請說明報錯原因就可以)
create unique nonclustered index IdxCN on Course(Cname)

--(3)在SC表上為Sno和Cno建立一個組合的聚集索引,索引名為:IdxSnoCno。
alter table sc drop constraint PK__SC__E600025308EA5793
create clustered index IdxSnoCno on sc(sno,cno)

--(4)刪除Sname列上建立的IdxSname索引。
drop index Student.IdxSname

--2、視圖:寫出創建滿足下述要求的視圖的SQL語句,並執行所寫代碼。
--(1)查詢學生的學號、姓名、所在系、課程號、課程名、課程學分,視圖名為V_STU_SC_CO。
create view V_STU_SC_CO(sno,sname,sdept,cno,cname,credit)
as
select student.sno,sname,sdept,course.cno,cname,credit
from SC join Student on student.Sno = SC.Sno
join Course on SC.Cno = Course.cno

--(2)查詢學生的學號、姓名、選修的課程名和考試成績,視圖名為V_SNO_GRADE。
create view V_SNO_GRADE(sno,sname,cname,grade)
as
select student.sno,sname,cname,grade
from SC join Student on student.Sno = SC.Sno
join Course on SC.Cno = Course.Cno

--(3)統計每個學生的選課門數,要求列出學生學號和選課門數,視圖名為V_COUNT。
create view V_COUNT(sno,cnamecount)
as
select sno,COUNT(cno)
from SC 
group by sno

--(4)統計每個學生的修課總學分,要求列出學生學號和總學分(說明:考試成績大於等於60才可獲得此門課程的學分),視圖名為V_COUNT_CREIT。
create view V_COUNT_CREIT(sno,countcredit)
as
select sno,SUM(credit)
from sc
join Course on SC.Cno = Course.cno
where Grade>=60
group by sno

--3、利用第2題建立的視圖,完成如下查詢。
--(1)查詢考試成績大於等於90分的學生的姓名、課程名和成績。
select sno,cname,grade
from V_SNO_GRADE
where Grade>=90

--(2)查詢選課門數超過3門的學生的學號和選課門數。
select sno 學號,COUNT(cno) 選課門數
from V_STU_SC_CO
group by sno
having COUNT(cno)>3

--(3)查詢計算機系選課門數超過3門的學生的姓名和選課門數(提示:物理表和視圖連接)。
select sname 姓名,cnamecount 選課門數
from V_COUNT
join student on V_COUNT.sno = student.sno
where student.Sdept = '計算機系' and cnamecount>3

(4)定義的視圖,使其查詢每個學生的學號、總學分以及總的選課門數。
alter view V_COUNT_CREIT(sno,countcredit,countcno)
as
select sno 學號,SUM(credit) 總學分,COUNT(sc.cno) 總選課門數
from sc
join Course on SC.Cno = Course.cno
where Grade>=60
group by sno

--5、創建滿足如下要求的觸發器。
--(1)限制學生的考試成績必須在0-100之間,,觸發器名稱為tri_grade(使用后觸發型)。
create trigger tri_grade
on sc after insert
as
if(select grade from sc
where grade in (select grade from inserted))<0
or (select grade from sc
where grade in (select grade from inserted))>100
rollback

--(2)限制不能刪除成績不及格的考試記錄,觸發器的名稱為tri_less60(使用后觸發型)。
create trigger tri_less60
on sc after delete
as
if exists(select * from deleted
where grade<60)
rollback

--(3)限制每個學生每學期選的課程不能超過5門,觸發器名稱tri_count(使用前觸發型)。
create trigger tri_count
on sc instead of insert
as
if (select count(*) from sc 
where sno in (select sno from inserted))<5
insert into sc select * from inserted

--6、創建滿足如下要求的存儲過程。
--(1)查詢每個學生的修課總學分,要求列出學生學號及總學分,存儲過程名為p1。
create procedure p1
as
select sno 學號,sum(credit) 總學分
from SC join course on sc.cno = course.cno
group by sno

--(2)查詢學生的學號、姓名、選修的課程號、課程名、課程學分,
--將學生所在的系作為輸入參數,默認為”信息管理系“,執行此存儲過程,
--查詢“計算機系”情況,存儲過程名為p2。
create procedure p2
@sdept char(20) = '信息管理系'
as
select student.sno 學號,sname,sc.cno,cname,credit
from SC join course on sc.cno = course.cno
join student on sc.sno=student.sno
where sdept=@sdept

exec p2'計算機系'

--(3)創建存儲過程,查詢指定系的男生人數,
--其中系為輸入參數,人數為輸出參數,存儲過程名為p3,
--執行存儲過程,查詢計算機系的男生人數。
create procedure p3 
@sdept char(20),
@number char(7) output
as
select @number=count(sno) 
from student
where sdept=@sdept and ssex='男'

declare @number int
exec p3'計算機系',@number output
print @number

--(4)創建存儲過程用於修改指定課程的開課學期。
--輸入參數為:課程號和修改后的開課學期,
--存儲過程名陪p4,執行該存儲過程,修改c001的課程為第4學期開課。
create procedure p4 
@cno char(6),@Semester tinyint
as
update course set Semester = @Semester
where cno = @cno

exec p4'c001',4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM