初學,第一次碰……其實是因為作業要寫實驗報告,所以順便寫寫文章,也算留一個存檔。
#實驗要求具體就不描述了
實驗要求:
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
好好加油,無論現在多么凄慘,一年之后一定能遇見不一樣的自己!
