數據庫SQL語句練習45道&& 習題歸納

建表語句: 

CREATE TABLE STUDENT
(SNO VARCHAR(3) NOT NULL, 
SNAME VARCHAR(4) NOT NULL,
SSEX VARCHAR(2) NOT NULL, 
SBIRTHDAY DATETIME,
CLASS VARCHAR(5))
go--分批次處理
CREATE TABLE COURSE
(CNO VARCHAR(5) NOT NULL, 
CNAME VARCHAR(10) NOT NULL, 
TNO VARCHAR(10) NOT NULL)
go
CREATE TABLE SCORE 
(SNO VARCHAR(3) NOT NULL, 
CNO VARCHAR(5) NOT NULL, 
DEGREE NUMERIC(10, 1) NOT NULL) 
go
CREATE TABLE TEACHER 
(TNO VARCHAR(3) NOT NULL, 
TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL, 
TBIRTHDAY DATETIME NOT NULL, PROF VARCHAR(6), 
DEPART VARCHAR(10) NOT NULL)

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾華' 
,'男' ,1977-09-01,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' 
,'男' ,1975-10-02,95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王麗' 
,'女' ,1976-01-23,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李軍' 
,'男' ,1976-02-20,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' 
,'女' ,1975-02-10,95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陸君' 
,'男' ,1974-06-03,95031);
GO
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'計算機導論',825)
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系統' ,804);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'數據電路' ,856);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等數學' ,100);
GO
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
GO
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 
VALUES (804,'李誠','男','1958-12-02','副教授','計算機系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 
VALUES (856,'張旭','男','1969-03-12','講師','電子工程系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)
VALUES (825,'王萍','女','1972-05-05','助教','計算機系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 
VALUES (831,'劉冰','女','1977-08-14','助教','電子工程系');

create table grade
(low smallint, 
upp smallint, 
rank char(1));
insert into grade values(90,100,'A')
insert into grade values(80,89,'B')
insert into grade values(70,79,'C')
insert into grade values(60,69,'D')
insert into grade values(0,59,'E')

建表結果如圖所示:

Student表                                                                                   

                        

Teacher表

Course表

Score表

         

Grade表

題目及其答案:

select* from student
select* from teacher
select* from course
select* from score

--1 查詢Student表中的所有記錄的Sname、Ssex和Class列。
select sname,ssex,class 
from student

--2、 查詢教師所有的單位即不重複的Depart列。
select distinct depart 
from teacher

--3、 查詢Student表的所有記錄。
select* from student

--4、 查詢Score表中成績在60到80之間的所有記錄。
select* from score
where DEGREE between 60 and 80
 
--5、 查詢Score表中成績爲85,86或88的記錄。
select* from score
where DEGREE in(85,86,88)

--6、 查詢Student表中“95031”班或性別爲“女”的同學記錄。
select* from student 
where class='95031' or ssex='女'--union(並集)

--7、 以Class降序查詢Student表的所有記錄。
select* from student 
order by class desc

--8、 以Cno升序、Degree降序查詢Score表的所有記錄。
select* from score
order by Cno asc,DEGREE desc --按兩個序列排序直接並列即可 

--9、 查詢“95031”班的學生人數。
select COUNT(*) from student
where class='95031'

--10、查詢Score表中的最高分的學生學號和課程號。
select sno,cno from score
where DEGREE=(select max(degree) from score)

--11、查詢‘3-105’號課程的平均分。
select AVG(DEGREE) from score
where cno='3-105'

--12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。
select AVG(degree) from score
where cno like '3%'
group by cno--今日份分組
having COUNT(sno)>=5

--13、查詢最低分大於70,最高分小於90的Sno列。
select  sno from score
group by sno
having min(DEGREE)>70 and max(DEGREE)<90--聚集函數條件只能用having

--14、查詢所有學生的Sname、Cno和Degree列。
select sname,cno,DEGREE
from student,score
where student.sno=score.sno

--15、查詢所有學生的Sno、Cname和Degree列。
select sno,cname,DEGREE
from course,score
where course.cno=score.cno

--16、查詢所有學生的Sname、Cname和Degree列。
select sname,cname,DEGREE
from student,score,course
where student.sno=score.sno and course.cno=score.cno

--17、查詢“95033”班所選課程的平均分。
select AVG(degree)
from student,score
where score.sno=student.sno and class='95033'

--18 查詢所有同學的Sno、Cno和rank列
select sno,cno,degree,rank 
from grade,score
where degree between low and upp--兩個表之間不一定只有連接關係~

--19、查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄--高於該同學的所有成績
select* from score
where cno='3-105' 
and DEGREE>all(select degree from score where sno='109')

--20、查詢score中選學一門以上課程的同學中分數爲非最高分成績的記錄。
select* from score 
where degree<(select max(degree) from score)
and sno in(select sno from score group by sno having count(sno)>1)--主碼範圍約束

--21、查詢成績高於學號爲“109”、課程號爲“3-105”的成績的所有記錄。
select* from score
where degree>all(select degree from score where cno='3-105' and sno='109')

--22、查詢和學號爲108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。
select sno,sname,sbirthday from STUDENT
where year(sbirthday)=(select year(sbirthday) from student where sno='108')

--23、查詢“張旭“教師任課的學生成績。
select degree from score,course,teacher--表格龐大時效率低
where course.cno=score.cno and course.tno=teacher.tno and tname='張旭'

select degree from score
where cno=(select cno from course 
where tno=(select tno from teacher 
where tname='張旭'))

--24、查詢選修某課程的同學人數多於5人的教師姓名。
select tname from teacher,course,score
where teacher.tno=course.tno and score.cno=course.cno 
group by tname--連接表後直接篩選select後的屬性
having COUNT(*)>5

--25、查詢95033班和95031班全體學生的記錄。
select* from student
where class in(95033,95031)

--26、查詢存在有85分以上成績的課程Cno.
select cno from score group by cno
having max(degree)>85

--27、查詢出“計算機系“教師所教課程的成績表。
select teacher.tno,degree --屬性包含tno和degree
from score,course,teacher
where score.cno=course.cno and teacher.tno=course.tno and DEPART='計算機系'

--28、查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。--並集 或 並集減交集
select tname,prof from teacher --該解法存在歧義
where prof in(select prof from teacher
group by prof
having COUNT(*)=1)

select tname,prof from teacher 
where depart='計算機系' and prof not in(select prof from teacher where depart='電子工程系') 
union
select tname,prof from teacher 
where depart='電子工程系' and prof not in(select prof from teacher where depart='計算機系')

--29、查詢選修編號爲“3-105“課程且成績至少高於選修編號爲“3-245”的同學的Cno、Sno和Degree,並按Degree從高到低次序排序。
select cno,sno,degree from score 
where cno='3-105'and degree>any(select degree from score where score.cno='3-245') 
order by degree desc  

--30、查詢選修編號爲“3-105”且成績高於選修編號爲“3-245”課程的同學的Cno、Sno和Degree.
select cno,sno,degree from score
where cno='3-105'and degree>all(select degree from score where score.cno='3-245')

--31、查詢所有教師和同學的name、sex和birthday.
select sname,ssex,sbirthday from student
union
select tname,tsex,tbirthday from teacher

--32、查詢所有“女”教師和“女”同學的name、sex和birthday.
select sname,ssex,sbirthday from student where ssex='女'
union
select tname,tsex,tbirthday from teacher where tsex='女'

--33、查詢成績比該課程平均成績低的同學的成績表。--P106 3.57
select* from score a 
where degree<(select avg(degree) from score b where a.cno=b.cno)--同一課程

--34、查詢所有任課教師的Tname和Depart. 
select tname,depart from teacher,course
where teacher.tno=course.tno --任課

select tname,depart from teacher 
where exists(select* from course where course.tno=teacher.tno)

--35、查詢所有未講課的教師的Tname和Depart
select tname,depart from teacher 
where tno not in(select tno from course)

--36、查詢至少有2名男生的班號。
select class from student 
where ssex='男'
group by class
having COUNT(ssex)>=2 

--37、查詢Student表中不姓“王”的同學記錄。
select * from student 
where sname not like '王%'

--38、查詢Student表中每個學生的姓名和年齡。
select sname,2019-year(sbirthday) from student 

--39、查詢Student表中最大和最小的Sbirthday日期值。
select max(sbirthday)from student
union 
select min(sbirthday)from student

--40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。
select* from student 
order by class desc,2019-year(sbirthday)desc

--41、查詢“男”教師及其所上的課程。
select tname,cname from teacher,course
where tsex='男' and teacher.tno=course.tno

--42、查詢最高分同學的Sno、Cno和Degree列。
select sno,cno,degree from score 
where degree=(select max(degree) from score)

--43、查詢和“李軍”同性別的所有同學的Sname.
select sname from student 
where ssex=(select ssex from student where sname='李軍')

--44、查詢和“李軍”同性別並同班的同學Sname.
select sname from student 
where ssex=(select ssex from student where sname='李軍')
and class=(select class from student where sname='李軍')

--45、查詢所有選修“計算機導論”課程的“男”同學的成績表 --“大一統”減少嵌套 
select degree from score,student,course 
where student.sno=score.sno and course.cno=score.cno 
and cname='計算機導論' and ssex='男'


查詢思路

  • 查什麼
  • 從哪裏查
  • 連接否?
  • 條件

 

習題歸納tips:

1.日期區間可直接between

2.查詢屬性多於聚集函數用到的屬性      select 屬性1,屬性2……連接  某屬性 in 某範圍

3.插入信息

4.更新信息(含聚集函數)

5.刪除信息

6.建立視圖

 

區分group by和 where

注意:group by 字句可以和where條件語句結合在一起使用。且where在前,group by 在後,

  • 先對select xx from xx的記錄集合用where進行篩選
  • 然後再使用group by 對篩選後的結果進行分組 
  • 使用having字句對分組後的結果進行篩選

注意:having和where的用法區別:

  • where肯定在group by 之前,having只能用在其之後——先分組後篩選
  • where  是對記錄的限定,having 是對分組後結果的限定
  • where後的條件表達式裏不允許使用聚合函數,而having可以。

tip:當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序是:

  1. 執行where xx對全表數據做篩選,返回第1個結果集。
  2. 針對第1個結果集使用group by分組,返回第2個結果集。
  3. 針對第2個結果集中的每1組數據執行select xx,有幾組就執行幾次,返回第3個結果集。
  4. 針對第3個結集執行having xx進行篩選,返回第4個結果集。
  5. 針對第4個結果集排序

 

數據庫數據處理、安全性、完整性、觸發器練習

https://max.book118.com/html/2017/0330/97988849.shtm

刪除時登錄名時正在使用

exec sp_who 'WY_PC'

kill 52
kill 54
kill 55

sp_droplogin 'WY_PC'

如何爲SQL server 創建登錄賬戶
https://jingyan.baidu.com/article/f71d6037b2233e1ab641d19e.html?qq-pf-to=pcqq.c2c

 

快捷鍵

Ctrl+kc/ku


 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章