sql經典習題


           <div class="article-source-link2222">
                版權聲明:本文為博主轉載文章, 轉載自:<a href="https://blog.csdn.net/ghuiL/article/details/40981627">https://blog.csdn.net/ghuiL/article/details/40981627</a>
            </div>
        </span>
                </div>
                                                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
                                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
            <div class="htmledit_views" id="content_views">

這里主要介紹幾道題目用以更加深入的了解SQL語句。在工作面試時乃至在考研時,很多時候都會考到SQL語句。如果這篇文章中的所有的題目都搞明白了,那么應付工作面試筆試或者考研筆試將會更加的游刃有余。


題目01

現有關系數據庫如下:
學生(學號,姓名,性別,專業,獎學金)
課程(課程號,名稱,學分)
學習(學號,課程號,分數)
用SQL語言實現下列題目:
1. 檢索不學課程號為“C135”課程的學生信息,包括學號,姓名和專業。

     
     
    
   
  
  
          
  1. select 學號, 姓名, 專業
  2. from 學生
  3. where 學號 NOT IN (
  4. select 學號
  5. from 學習
  6. where 課程號= "C135");
 2. 檢索至少學過課程號為“C135”和“C219”的學生信息,包括學號、姓名和專業。 
        

     
     
    
   
  
  
          
  1. select 學號, 姓名, 專業
  2. from 學生
  3. where 學號 IN (
  4. select 學號
  5. from 學習 x, 學習 y
  6. where x.學號=y.學號 AND x.課程號= 'C135' AND y.課程號= 'C219');
 3. 從學生表中刪除成績出現過0分的所有學生信息。 
        

     
     
    
   
  
  
          
  1. delete from 學生
  2. where 學號 IN (
  3. select 學號
  4. from 學習
  5. where 分數= 0);
 4. 定義“英語”專業學生所學課程的信息視圖AAA,包括學號、姓名、課程號和分數。 
        

     
     
    
   
  
  
          
  1. create view AAA(學號, 姓名, 課程號, 分數)
  2. AS
  3. select 學號, 姓名, 課程號, 分數
  4. from 學生, 學習
  5. where 學生.學號=學習.學號 AND 專業= "英語";

題目02

學校有多名學生,財務處每年要收一次學費。為財務處收學費工作設計一個數據庫,包括兩個關系:
學生(學號,姓名,專業,入學日期)
收費(學年,學號,學費,書費,總金額)
假設規定屬性的類型:學費、書費、總金額為數值型數據;學號、姓名、學年、專業為字符型數據;入學日期為日期型數據。列的寬度自定義。
試用SQL語句定義上述表的結構。(定義應包括主鍵子句和外鍵子句)。

     
     
    
   
  
  
          
  1. create table 學生(
  2. 學號 char( 8) primary key,
  3. 姓名 char( 25),
  4. 專業 char( 50),
  5. 入學日期 date
  6. );
  7. create table 收費(
  8. 學年 char( 10),
  9. 學號 char( 8),
  10. 學費 numeric( 4),
  11. 書費 numeric( 5, 2),
  12. 總金額 numeric( 7, 2),
  13. primary key(學號, 學年),
  14. foreign key(學號) references 學生(學號)
  15. );
 
        

題目03

設某公司數據庫中有關系模式如下:職工(職工號,職工名,性別,年齡)工作(職工號,公司號,工資)公司(公司號,公司名,地址)。1. 寫出查詢每個公司女職工的平均工資的SQL語句。(提示:求平均值用函數AVG())

     
     
    
   
  
  
          
  1. select 公司號, 公司名, AVG(工資)
  2. from 職工, 工作, 公司
  3. where 公司.公司號=工作.公司號 AND 職工.職工號=工作.職工號 AND 性別= '女'
  4. group by 公司號;
 2. 試用SQL語句寫出下列操作:超過50歲職工的工資增加200元。 
        

     
     
    
   
  
  
          
  1. update 工作
  2. set 工資=工資+ 200
  3. where 職工號 IN (
  4. select 職工號
  5. from 職工
  6. where 年齡>= 50);
 3. 把對職工表的插入權限授給用戶A,並許諾他再將此權限授予其他用戶。 
        
grant insert ON 職工 TO A WITH GRANT OPTION;
    
    
   
  
 
 
         

題目04

圖書出版管理數據庫中有兩個基本表:
圖書 (書號,書名,作者編號,出版社,出版日期)
作者 (作者編號,作者名,年齡,地址)
試用SQL語句寫出下列查詢:
檢索年齡低於作者平均年齡的所有作者的作者名、書名和出版社。

     
     
    
   
  
  
          
  1. select 作者名, 書名, 出版社
  2. from 圖書, 作者
  3. where 圖書.作者編號=作者.作者編號 AND 年齡 <= (
  4. select AVG(年齡)
  5. from 作者);
 
        

題目05

現有關系數據庫如下:學生(學號,姓名,性別,專業,獎學金)課程(課程號,名稱,學分)學習(學號,課程號,分數)用SQL語言實現下列題目。 

1. 檢索沒有獲得獎學金、同時至少有一門課程成績在95分以上的學生信息,包括學號、姓名和專業。


     
     
    
   
  
  
          
  1. select 學號, 姓名, 專業
  2. from 學生
  3. where 獎學金<= 0 AND 學號 IN (
  4. select 學號
  5. from 學習
  6. where 分數>= 95);
 
         
         2. 檢索沒有任何一門課程成績在80分以下的所有學生的信息,包括學號、姓名和專業。 
        

     
     
    
   
  
  
          
  1. select 學號, 姓名, 專業
  2. from 學生
  3. where 學號 NOT IN (
  4. select 學號
  5. from 學習
  6. where 分數< 80);
 3. 對成績得過滿分(100分)的學生,如果沒有獲得獎學金的,將其獎學金設為1000元。 
        

     
     
    
   
  
  
          
  1. update 學生
  2. set 獎學金= 1000
  3. where 獎學金<= 0 AND 學號 IN (
  4. select 學號
  5. from 學習
  6. where 分數= 100);
 4. 定義學生成績得過滿分(100分)的課程視圖 AAA,包括課程號、名稱和學分。 
        

     
     
    
   
  
  
          
  1. create view AAA(課程號, 名稱, 學分)
  2. AS
  3. select 課程號, 名稱, 學分
  4. from 課程
  5. where 課程號 IN (
  6. select 課程號
  7. from 學習
  8. where 分數= 100);
 
        

題目06

設有學生-課程關系數據庫,其數據庫關系模式為:學生Student(學號Sno,姓名Sname,所在系Sdept,年齡Sage,性別Ssex)課程Course(課程號Cno,課程名稱Cname,先修課號Cpno,學分Ccredit)學生選課SC(學號Sno,課程號Cno,成績Grade)試用SQL語言分別寫出下列查詢:1. 查詢選修了3號或6號課程的學生的學號。

     
     
    
   
  
  
          
  1. select Sno
  2. from SC
  3. where Cno= '3' OR Cno= '6';
2. 查詢至少選修了一門其直接先行課為8號課程的學生學號與姓名。

     
     
    
   
  
  
          
  1. select Sno, Sname
  2. from SC, Course, Student
  3. where Course.Cno=SC.Cno AND Student.Sno=SC.Sno AND Cpno= '8';
3. 查詢選修了全部課程的學生學號、姓名和年齡。

     
     
    
   
  
  
          
  1. -- 查詢沒有一門課程是該學生沒有選的
  2. select Sno, Sname, Sage
  3. from Student
  4. where NOT EXISTS (
  5. select *
  6. from Course
  7. where NOT EXISTS (
  8. select *
  9. from SC
  10. where Student.Sno=SC.Sno AND Course.Cno=SC.Cno));
 4. 查詢沒有選修2號課程的學生學號與姓名。 
        

     
     
    
   
  
  
          
  1. select Sno, Sname
  2. from Student
  3. where Sno NOT IN (
  4. select Sno
  5. from SC
  6. where Cno= '2');
 5. 查詢選修了3門以上課程並且成績均及格的學生學號與其平均成績。 
        

     
     
    
   
  
  
          
  1. -- 本題未經驗證,未必正確
  2. select Sno, AVG(Grade)
  3. from SC x
  4. group by Sno
  5. having COUNT(Cno)> 3
  6. where NOT EXISTS (
  7. select *
  8. from SC y
  9. x.Cno=y.Cno AND Grade< 60);
 6. 將計算機科學系(CS)全體學生的所有成績置為零。 
        

     
     
    
   
  
  
          
  1. update SC
  2. set Grade= 0
  3. where Sno IN (
  4. select Sno
  5. from Student
  6. where Sdept= 'CS');
 
        

題目07

設有學生-課程關系數據庫,其數據庫關系模式為:學生S(學號S#,姓名SN,所在系SD,年齡SA)課程C(課程號C#,課程名稱CN,先修課號PC#)學生選課SC(學號S#,課程號C#,成績G)試用SQL語言分別寫出下列查詢:1. 求學生'95001'(為學號)所選的成績為60以上的課程號。

     
     
    
   
  
  
          
  1. select C#
  2. from SC
  3. where S#= '95001' AND G>= 60;
2. 求選讀了“數據庫概論”,並成績為80或90的學生學號和姓名。

     
     
    
   
  
  
          
  1. select S#,SN
  2. from S,SC,C
  3. where C.C#=SC.C# AND SC.S#=S.S# AND C.CN= '數據庫概論' AND (G= 90 OR G= 80);
3. 求選修了全部課程的學生學號、姓名及其所在系名。

     
     
    
   
  
  
          
  1. -- 沒有一門課程是該學生沒有選修的
  2. select S#, SN, SD
  3. from S
  4. where NOT EXISTS (
  5. select *
  6. from C
  7. where NOT EXISTS (
  8. select *
  9. from SC
  10. where SC.C#= C.C# AND SC.S#=S.S#
  11. ));
 4. 找出沒有學生選修的課程號及課程名稱。 
        

     
     
    
   
  
  
          
  1. select C #, CN
  2. from C
  3. where C.C # NOT IN (
  4. select SC.C #
  5. from SC);
5. 列出選課數超過3門的學生學號、其所修課程數及平均成績。

     
     
    
   
  
  
          
  1. select S#, count(C#), AVG(G)
  2. from SC
  3. group by S#
  4. having count(C#)> 3;
6. 刪除“數據結構”課程及所有對它的選課情況。

     
     
    
   
  
  
          
  1. -- 首先刪除SC中的數據
  2. delete from SC
  3. where SC.C# IN (
  4. select C.C#
  5. from C
  6. where CN= '數據結構');
  7. -- 其次刪除C的數據
  8. delete from C
  9. where Cname= '數據結構';

題目08

下表為數據表Register的相關信息,請寫出創建該表的語句(PK代表主鍵)。字段名數據類型長度允許空。
Id(PK) int8
Username varchar20
Password varchar20

     
     
    
   
  
  
          
  1. create table Register(
  2. id int( 8) primary key,
  3. username varchar( 20),
  4. password varchar( 20)
  5. );

題目09

根據下表完成任務:(PK代表主鍵)

stuId(PK)  sName classId professional
IIIT001 zhangsan IIIT20501 software
IIIT002 lisi IIIT20501 software
IIIT003 wangwu IIIT20501 software
IIIT004 zhaoliu IIIT20501 software
表StudentInfo
1. 請找出stuId為IIIT003的學生信息。

     
     
    
   
  
  
          
  1. select *
  2. from StudentInfo
  3. where stuId= "IIIT003";
2. 在字段stuId上創建索引。
create unique index stuIndex ON StudentInfo(stuId);
    
    
   
  
 
 
         
3. 創建視圖查詢學生的stuId和sName。

     
     
    
   
  
  
          
  1. create view StuView
  2. AS
  3. select stuId, sName
  4. from StudentInfo;
4. 創建存儲過程,通過輸入stuId對應的學生id號碼,輸出sName(學生姓名)。

     
     
    
   
  
  
          
  1. -- 創建存儲過程
  2. CREATE PROCEDURE pro_inid_out_sName
  3. @stuIdvarchar( 10),sNamevachar( 10) OUTPUT
  4. As
  5. Begin
  6. Select @sName=sName
  7. from StudentInfo
  8. where stuId=@stuId
  9. end
  10. -- 調用存儲過程
  11. declare @sNamevarchar( 10)
  12. execute pro_inid_out_sName ‘IIIT001’,@sName output


全文完。轉載請注明出處。如有不對之處請在留言板中指正。

參考文獻

王珊. 數據庫系統概論,高等教育出版社.



免責聲明!

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



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