一些SQL Server基本操作(一)


初學,第一次碰……其實是因為作業要寫實驗報告,所以順便寫寫文章,也算留一個存檔。

#實驗要求具體就不描述了

實驗要求

1,創建Student數據庫,包括Students,Courses,SC表,表結構如下…

  #1. 先手動用SQL Server 2014 Management Studio添加新表,新列

  #2. 遇到第一個報錯:

    不允許保存更改。您所做的更改要求刪除並重新創建以下表。您對無法重新創建的標進行了更改或者啟用了“阻止保存要求重新創建表的更改”選項

   解決:http://www.jb51.net/article/30416.htm

   工具-〉選項-〉左側有個 設計器-〉表設計器和數據庫設計器 -> 阻止保存要求重新創建表的更改(右側) 把鈎去掉即可。

  #2. 手打了Students表和Courses表

  #3. 嫌SC表內容太多,一個個手打太麻煩,然后直接復制了4行下去,作了個大死!開始報錯:

    SQL 已更新或刪除的行值要么不能使該行成為唯一行(sqlserver中有多行所有的列重復的數據,無法更新或刪除問題)

   參考:http://www.cnblogs.com/jhxk/articles/1614963.html

   試了好久,並沒有成功【主要因為自己一開始不知道怎么搞】,然后干脆刪了表(反正我就寫了那么幾行,刪了就刪了)重新建一個新的,

   然后開始批量生產,就是很普通的插入語句,大致如下:

 1 USE [Student]
 2 GO
 3 
 4 INSERT INTO [dbo].[SC]
 5            ([SNO]
 6            ,[CNO]
 7            ,[GRADE])
 8      VALUES
 9            ('0409011','EE-006',87);
10 GO

 

   媽媽再也不用擔心我不能復制粘貼了。差不多第一個題勉強這么解決。

2.1.查詢身高大於1.80m的男生的學號和姓名;

 

   #1. 直接SELECT語句

1 USE [Student]
2 GO
3 
4 SELECT [SNO]
5             ,[SNAME]
6     FROM [dbo].[Students]
7     WHERE HEIGHT>1.80 AND SEX='';
8 GO

    截圖如上

2.2.查詢計算機系秋季所開課程的課程號和學分數

  #1. 由於計算機系課程默認以SC開頭,所以查找字段中包含某字符串的結果

   參考:http://blog.itpub.net/22392018/viewspace-772268/

 

1 USE [Student]
2 GO
3 
4 SELECT [CNO]
5       ,[CREDIT]
6 FROM [dbo].[Courses]
7 WHERE PATINDEX('%CS%',CNO)>0 AND SEMESTER=''
8 GO

 

    截圖如上

2.3查詢選修計算機系秋季所開課程的男生的姓名、課程號、學分數、成績

  #1. 有關計算機秋的查詢如上題,本次是三表聯查

   參考:http://zhidao.baidu.com/question/465019816.html

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Courses].[CNO]
 5       ,[dbo].[Courses].[CREDIT]
 6       ,[dbo].[Students].[SNAME]
 7       ,[dbo].[SC].[GRADE]
 8   FROM [dbo].[SC]
 9   LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
10   LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
11 
12   WHERE PATINDEX('%CS%',[dbo].[SC].[CNO])>0 AND SEMESTER='' AND [dbo].[Students].[SEX]=''
13 
14 GO

    截圖如上

2.4查詢至少選修一門電機系課程的女生的姓名(假設電機系課程的課程號以EE開頭)

  #1. 並沒有用到新的知識,直接貼代碼

 

USE [Student]
GO

SELECT [dbo].[Students].[SNAME]
  FROM [dbo].[Students]
  LEFT JOIN[dbo].[SC]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]

  WHERE PATINDEX('%CS%',[dbo].[SC].[CNO])>0 AND [dbo].[Students].[SEX]=''

GO

 

   讓人憂傷的是,查詢出來的是所有的記錄,一直想知道怎么讓它一個名字只出來一條,然而並沒有找到辦法。【此處未完日后待續】

   #第二天發現謎之答案之后得到解決——DISTINCT

 1 USE [Student]
 2 GO
 3 
 4 SELECT DISTINCT [dbo].[Students].[SNAME]
 5   FROM [dbo].[Students]
 6   LEFT JOIN[dbo].[SC]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
 7 
 8   WHERE PATINDEX('%CS%',[dbo].[SC].[CNO])>0 AND [dbo].[Students].[SEX]=''
 9 
10 GO

2.5查詢每位學生已選修課程的門數和總平均成績

  #1. 查詢每位學生的已修課程COUNT(),總平均成績AVG()

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Students].[SNO]
 5         ,AVG([dbo].[SC].[GRADE]) 平均成績
 6         ,COUNT([dbo].[SC].[CNO]) 課程門數
 7     FROM [dbo].[SC]
 8   LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
 9   LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
10   GROUP BY [dbo].[Students].[SNO]

2.6查詢每門課程選課的學生人數,最高成績,最低成績和平均成績

  #1. 新知識為最大項MAX()和最小項MIN()

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Courses].[CNO]
 5         ,COUNT([dbo].[SC].[SNO]) 選課人數
 6         ,AVG([dbo].[SC].[GRADE]) 平均成績
 7         ,MAX([dbo].[SC].[GRADE]) 最高成績
 8         ,MIN([dbo].[SC].[GRADE]) 最低成績
 9     FROM [dbo].[Courses],[dbo].[SC]
10     WHERE [dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
11     GROUP BY [dbo].[Courses].[CNO]

2.7查詢所有課程的成績都在80分以上的學生的姓名、學號、且按學號升序排列

  #1. 想法是查詢最低成績在80分以上,則所有成績都在80分以上,想當然的使用 GROUP BY MIN([dbo].[SC].[GRADE])>=80 報錯,提示使用HAVING

   參考:http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html

    GROUP BY 和 HAVING 講的很多

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Students].[SNO]
 5         ,[dbo].[Students].[SNAME]
 6     FROM [dbo].[Students]
 7     LEFT JOIN [dbo].[SC] ON [dbo].[SC].[SNO]=[dbo].[Students].[SNO]
 8     GROUP BY [dbo].[Students].[SNO],[dbo].[Students].[SNAME]
 9     HAVING MIN([dbo].[SC].[GRADE])>=80
10     ORDER BY [dbo].[Students].[SNO]

  結果只有一個人(其實一個人都沒有,后來改了數據orz)

2.8查詢缺成績的學生的姓名,缺成績的課程號及其學分數

  #1.新知識IS NULL 為空

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Students].[SNAME]
 5         ,[dbo].[Courses].[CNO]
 6         ,[dbo].[Courses].[CREDIT]
 7     FROM [dbo].[SC]
 8     LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
 9     LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
10     WHERE [dbo].[SC].[GRADE] IS NULL

  搜不到,然后任性的加了一個試驗品hhhh

2.9查詢有一門以上(含一門)三個學分以上課程的成績低於70分的學生的姓名;

  #1. 世界上最狗血的事情就是,當我想好好寫數據庫作業的時候,一百度發現了全套答案

  發張圖表達一下這操蛋的心情,我不抄我不抄,我就看一眼

  鏈接:http://3y.uu456.com/bp_1jk0h81auc7zlrk1b2th_1.html

  看了一下前面題的答案,還是不錯的,至少解決了之前未完待續的問題棒棒噠!不過我前題做法比答案復雜不止一點點呢……

    WHERE STUDENTS.SNO=SC.SNO 就能代替我所有的 LEFT JOIN (話說我之前是哪里百度出LEFT JOIN的寫法)

  參考了答案之后擼出這道題,然后發現其實這個題很簡單orz

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Students].[SNAME]
 5 
 6     FROM [dbo].[SC],[dbo].[Courses],[dbo].[Students]
 7     WHERE [dbo].[SC].[SNO]=[dbo].[Students].[SNO] 
 8             AND [dbo].[SC].[CNO]=[dbo].[Courses].[CNO] 
 9             AND [dbo].[Courses].[CREDIT]>=3 
10             AND [dbo].[SC].[GRADE]<70
11 /*上面是答案的方法,下面是按我之前風格寫的,
12   別在於另外兩個表聯法不同*/
13 USE [Student]
14 GO
15
16 SELECT [dbo].[Students].[SNAME]
17   FROM [dbo].[SC]
18   LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
19   LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
20   WHERE [dbo].[Courses].[CREDIT]>=3 AND [dbo].[SC].[GRADE]<70

 

 

 

2.10查詢1984年~1986年出生的學生的姓名,總平均成績及已修學分數

  #1. 挺簡單的BETWEEN AND

 

 1 USE [Student]
 2 GO
 3 
 4 SELECT [dbo].[Students].[SNAME]
 5         ,COUNT([dbo].[Courses].[CREDIT]) 已修學分
 6         ,AVG([dbo].[SC].[GRADE]) 平均成績
 7     FROM [dbo].[SC]
 8     LEFT JOIN[dbo].[Courses]ON[dbo].[SC].[CNO]=[dbo].[Courses].[CNO]
 9     LEFT JOIN[dbo].[Students]ON[dbo].[SC].[SNO]=[dbo].[Students].[SNO]
10     WHERE [dbo].[Students].[BDATE] BETWEEN '1984-01-01' AND '1986-12-31'
11     GROUP BY [dbo].[Students].[SNAME]

 

2.11在STUDENT和SC關系中,刪去SNO以’01’開關的所有記錄。

  #這個不知道什么意思呢。。。看了一眼答案發現題目的開關應該是開頭orz。。。= =還以為是什么很高級的東西的說

  而且答案還錯了

 

 1 USE [Student]
 2 GO
 3 
 4 DELETE FROM [dbo].[SC]
 5       WHERE [dbo].[SC].[SNO] LIKE '%01%'
 6 GO
 7 
 8 DELETE FROM [dbo].[Students]
 9       WHERE [dbo].[Students].[SNO] LIKE '%01%'
10 GO

 

 

2.12在STUDENTS關系中增加以下記錄:

  #直接INSERT跟第1題一樣

 

 1 USE [Student]
 2 GO
 3 
 4 INSERT INTO [dbo].[Students]
 5            ([SNO]
 6            ,[SNAME]
 7            ,[SEX]
 8            ,[BDATE]
 9            ,[HEIGHT]
10            ,[DEPARTMENT])
11      VALUES
12            ('0409101','何平','','1987-03-02',1.62,''),
13            ('0408130','向陽','','1986-12-11',1.75,'');
14 GO

 

2.13將課程CS-221的學分數增為3,講課時數增為60

 

  #UPDATE語句

 

 1 USE [Student]
 2 GO
 3 
 4 UPDATE [dbo].[Courses]
 5    SET [CREDIT] = 3
 6       ,[LHOUR] = 60
 7  WHERE [dbo].[Courses].[CNO]='CS-211'
 8 
 9 
10 
11 GO

 

/**************************************我是萌萌噠的分割線**************************************/

  第一次寫日志,並不是什么特別有意義的東西QAQ

  但是,畢竟第一次就當鼓勵自己了,應該除了我之外沒人看吧,我就當日記寫了orz

  好好加油,無論現在多么凄慘,一年之后一定能遇見不一樣的自己!

 

 

 

 

 

 


免責聲明!

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



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