SQL-Server-2008數據庫—創建、建表、查詢語句_第1頁
SQL-Server-2008數據庫—創建、建表、查詢語句_第2頁
SQL-Server-2008數據庫—創建、建表、查詢語句_第3頁
SQL-Server-2008數據庫—創建、建表、查詢語句_第4頁
SQL-Server-2008數據庫—創建、建表、查詢語句_第5頁
已閱讀5頁,還剩16頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、SQL Server 2008數據庫創建、建表、查詢語句一、創建數據庫 1、利用對象資源管理器創建用戶數據庫:(1)選擇“開始”“程序”Microsoft SQL Server 2008SQL Server Management Studio命令,打開SQL Server Management Studio。(2)使用“Windows身份驗證”連接到SQL Server 2008數據庫實例。(3)展開SQL Server 實例,右擊“數據庫”,然后人彈出的快捷菜單中選擇“新建數據庫存”命令,打開“新建數據庫”對話框。(4)在“新建數據庫”對話框中,可以定義數據庫的名稱、數據庫的所有者、是否使用

2、全文索引、數據文件和日志文件的邏輯名稱和路徑、文件組、初始大小和增長方式等。輸入數據庫名稱student。2、利用T-SQL語句創建用戶數據庫:在SQL Server Management Studio中,單擊標準工具欄的“新建查詢”按鈕,啟動SQL編輯器窗口,在光標處輸入T-SQL語句,單擊“執行”按鈕。SQL編輯器就提交用戶輸入的T-SQL語句,然后發送到服務器執行,并返回執行結果。創建數據庫student的T-SQL語句如下:Create data base studentOn primary(name=student_data,filename='E:SQL Server200

3、8 SQLFULL_CHSstudent_data.mdf',size=3,maxsize=unlimited,filegrowth=1)Log on(name=student_log,filename='E:SQL Server2008 SQLFULL_CHSstudent_log.ldf',size=1,maxsize=20,filegrowth=10%)二、創建數據表1、利用表設計器創建數據表:(1)啟動SQL Server Management Studio,連接到SQL Server 2008數據庫實例。(2)展開SQL Server實例,選擇“數據庫”stu

4、dent“表”,單擊鼠標右鍵,然后從彈出的快捷菜單中選擇“新建表”命令,打開“表設計器”。(3)在“表設計器”中,可以定義各列的名稱、數據類型、長度、是否允許為空等屬性。(4)當完成新建表的各個列的屬性設置后,單擊工具欄上的“保存”按鈕,彈出“選擇名稱”對話框,輸入新建表名stu_info,SQL Server數據庫引擎會依據用戶的設置完成新表的創建。2、利用T-SQL語句創建數據表:Create table stu_info(stu_id char(10)not null,name nvarchar(20)not null,birthday date null,sex nchar(2)nul

5、l,address nvarchar(20)null,mark int null,major nvarchar(20)null,sdept nvarchar(20)null);3、樣本數據庫student表數據:學生信息表(stu_info):課程信息表(course_info):學生成績表(stu_grade):三、完整性與約束數據庫中的數據是現實世界的反映,數據庫的設計必須能夠滿足現實情況的實現,即滿足現實商業規則的要求,這也是數據完整性的要求。在數據庫的管理系統中,約束是保證數據庫中數據完整性的重要方法。1、 完整性:數據完整性是數據庫設計方面一個非常重要的問題,數據完整性代表數據的正確

6、性、一致性和可靠性。實施數據完整性的目的在于確保數據的質量。在SQL Server中,根據數據完整性措施所作用的數據庫對象和范圍不同,可以將數據完整性分類為實體完整性、域完整性和參照完整性。實體完整性把數據表中的每行看作一個實體,它要求所有的行都具有唯一的標識;域完整性要求數據表中指定列的數據具有正確的數據類型、格式和有效的數據范圍;參照完整性維持被參照表和參照表之間的數據一致性。2、 約束:約束是數據庫中的數據完整性實現的具體方法。在SQL Server中,包括5種約束類型:primary key約束、foreign key約束、unique約束、check約束和default約束。四、數據

7、查詢1、查詢語句:查詢就是根據客戶端的要求,數據庫服務器搜尋出用戶所需要的信息資料,并按用戶規定的格式進行整理后返回給客戶端。查詢語句select在SQL Server中是使用頻率最高的語句,可以說select語句是SQL語言的靈魂。select語句的語法結構:select select_listinto new_tableFrom table_sourcewhere search_conditiongroup by group_by_expressionhaving search_conditionOrder by order_expressionasc|desc參數說明如下:Select子

8、句:指定由查詢結果返回的列。Into子句:將查詢結果存儲到新表或視圖中。From子句:用于指定數據源,即使用的列所在的表或視圖。如果對象不止一個,那么它們之間必用逗號分開。Where子句:指定用于限制返回的行的搜索條件。如果select語句沒有where子句,dbms假設目標表中的所有行都滿足搜索條件。Group by子句:指定用來放置輸出行的組,并且如果select子句select_list中包含聚合函數,則計算每組的匯總值。Having子句:指定組或聚合函數的搜索條件。Having通常與groupby子句一起使用。Order by子句:指定結果集的排序方式。ASC關鍵字表示升序排列結果,D

9、ESC關鍵字表示降序排列結果。如果沒有指定任何一個關鍵字,那么ASC就是默認的關鍵字。如果沒有orderby子句,DBMS將根據輸入表中的數據的存放位置來顯示數據。 在這一系列的子句中,select子句和from子句是必需的,其他的子句根據需要都是可選的。2、簡單查詢:21、查詢列:(1)查詢指定列:數據表中有很多列,通常情況下并不需要查看全部的列,因為不同的用戶所關注的內容不同。在指定列的查詢中,列的顯示順序由select子句指定,與數據在表中的存儲順序無關;同時,在查詢多列時,用“,”將各字段隔開。例7-1、查詢所有同學學號、姓名和成績信息。Select stu_id,name,markf

10、rom stu_info查詢結果如下:(2)查詢所有列:使用“*”通配符,查詢結果將列出表中所有列的值,而不必指明各列的列名,這在用戶不清楚表中各列的列名時非常有用。服務器會按用戶創建表格時聲明列的順序來顯示所有的列。例7-2、查詢所有同學的所有信息。select*from stu_info查詢結果如下:(3)使用運算列:YEAR為系統函數,獲取指定日期的年份;GEDDATE()為系統函數,獲取當前日期和時間。例7-3、查詢所有同學的年齡信息。Select stu_id,name,YEAR(getdate()-YEAR(birthday)from stu_info查詢結果如下:(4)改變列標題

11、顯示:通常在查詢結果顯示的列標題就是創建表時所使用的列名,但是,這在實際使用中往往會帶來一些不便,因此,可以利用 列標題=列名 或 as 列標題 來根據需要修改列標題的顯示。例7-4、查詢所有同學的年齡信息。Select name as'姓名',YEAR(getdate()-YEAR(birthday)as'年齡'from stu_info1.函數year(getdate() 表示當前的年份2.函數year(birthday) 表示出生的年份3.year(getdate()-year(birthday)=22就是“當前的年份”-“出生的年份”=22(單位是年)計

12、算出來的結果是當前年齡查詢結果如下:(5)除去結果的重復信息:使用 distinct 關鍵字能夠從返回的結果數據集合中刪除重復的行,使返回的結果更簡潔。例7-5、查詢所有的院系信息。Select distinct sdeptfrom stu_info查詢結果如下:(6)返回查詢的部分數據:在SQL Server 2008中,提供了 top 關鍵字讓用戶指定返回一定數量的數據。Top n 表示返回最前面的n 行,n 表示返回的行數;top n percent 表示返回前面的n%行。例7-6、查詢前5位同學的學號、姓名和成績信息。Select top 5 stu_id,name,markfrom

13、stu_info查詢結果如下:例7-7、查詢60%同學的學號、姓名和成績信息。Select top 60 percent stu_id,name,markfrom stu_info查詢結果如下:22、選擇行:Where 子句用于指定查詢條件,使得select 語句的結果表中只包含那些滿足查詢條件的記錄。在使用時,where 子句必須緊跟在 from 子句后面。Where 子句中的條件表達式包括算術表達式和邏輯表達式兩種,SQL Server對Where 子句中的查詢條件的數目沒有限制。(1)使用比較表達式:例7-8、查詢所有的男同學學號、姓名、生日和性別信息。Select stu_id,nam

14、e,birthday,sexfrom stu_infowhere sex='男'查詢結果如下:例7-9、查詢所有的總分大于550分的同學學號、姓名、生日和性別信息。Select stu_id,name,birthday,sexfrom stu_infowhere mark>550查詢結果如下:(2)使用邏輯比較表達式:例7-10、查詢所有總分大于550的男同學信息。Select stu_id,name,birthday,sexfrom stu_infowhere mark>550 and sex='男'查詢結果如下:例7-11、查詢所有總分大于550

15、分或男同學信息。Select stu_id,name,birthday,sexFrom stu_infoWhere mark>550 or sex='男'查詢結果如下:為了增強程序可讀性,一般采用括號()來實現需要的執行順序,而不考慮其默認的優先級順序。例7-12、查詢所有信息學院和會計學院并且總分大于550分的同學信息。select*from stu_info where (sdept='信息學院'or sdept='會計學院')and mark>550查詢結果如下:(3)空值(null)的判斷:如果在創建數據表時沒有指定 not

16、null 約束,那么數據表中某些列的值就可以為null。所謂null就是空,在數據庫中,其長度為0。例7-13、查詢所有籍貫為空的同學信息。select*from stu_infowhere address is null查詢結果如下:(4)限定數據范圍:使用between限制查詢數據范圍時同時包括了邊界值,效果完全可以用含有“>=”和“<=”的邏輯表達式來代替;而使用not between進行查詢時沒有包括邊界值,效果完全可以用含有“>”和“<”的邏輯表達式來代替。例7-14、查詢總分在530560之間的同學信息。select*from stu_infowhere m

17、ark between 530 and 560查詢結果如下:(5)限制檢索數據的范圍:對于列值不在一個連續的取值區間,而是一些離散的值,利用between關鍵字就無能為力了,可以利用SQL Server提供的另一個關鍵字 IN。在大多數情況下,OR 運算符與IN 運算符可以實現相同的功能。例7-15、查詢所有在信息學院或會計學院就讀的同學信息。select*from stu_infowhere sdept in('信息學院','會計學院')查詢結果如下:(6)模糊查詢:在實際的應用中,用戶不會總是能夠精確的給出查詢條件。因此,經常需要根據一些并不確切的線索來搜索

18、信息。SQL Server提供了like子句來進行這類模糊搜索。Like子句在大多數情況下會與通配符配合使用。所有通配符只有在like子句中才有意義,否則通配符會被當作普遍字符處理。各通配符也可以組合使用,實現復雜的模糊查詢。(通配符 “%” 表示任意字符的匹配;通配符“_ ”只能匹配任何單個字符;通配符“”用于指定范圍(如a-z)或集合(如abcdef)中的任何單個字符;通配符“”用于匹配沒有在方括號中列出的字符。)在使用like進行模糊查詢時,當“%”、“_”和“”符號單獨出現時,都會被作為通配符進行處理。但是有時可能需要搜索的字符串包含量一個或多個特殊通配符,例如,數據表中可能存儲含百分

19、號(%)的折扣值。若要搜索作為字符而不是通配符的百分號,必須提供escape關鍵字和轉義符,例如,“like %B% escape B ”就是使用了escape關鍵字定義了轉義字符B,將字符串“%B%”中的第二個百分號(%)作為實際值,而不是通配符。例7-16、查詢所有姓“張”的同學信息。select*from stu_infowhere name like '張%'查詢結果如下:例7-17、查詢所有姓“張”,而且姓名是兩個字的同學信息。select*from stu_infowhere name like '張_'查詢結果如下:例7-18、查詢所有姓“張”或姓

20、“王”的同學信息。select*from stu_infowhere name like '張王%'查詢結果如下:例7-19、查詢所有不姓“張”也不姓“王”的同學信息。select*from stu_infowhere name like '張王%'查詢結果如下:23、排序查詢結果:在SQL語句中,order by 子句用于排序。Order by子句總是在where子句(如果有的話)后面說明的,可以包含一個或多個列,每個列之間以逗號分隔??梢赃x擇使用asc|desc關鍵字指定按照升序|降序排序。如果沒有特別說明,值是以升序列進行排序的,即默認情況下使用的是asc

21、關鍵字。例7-20、查詢所有同學課程編號701的課程成績,并按由大到小的順序輸出。select*from stu_gradewhere course_id='701'orderby grade desc查詢結果如下:使用order by子句也可以根據兩列或多列的結果進行排序,并用逗號分隔開不同的排序關鍵字。其實際排序結果是根據order by子句后面列名的順序確定優先級的。即查詢結果首先以第一列的順序進行排序,而只有當第一列出現相同的信息時,這些相同的信息再按第二列的順序進行排序,依此類推。例7-21、查詢所有同學課程編號701的課程成績,并按由大到小的順序輸出,如果成績相同,

22、則按學號由小到大排序。select*from stu_gradewhere course_id='701'orderby grade desc,stu_id查詢結果如下: Order by子句除了可以根據列名進行排序外,還支持根據列的相對位置(即序號)進行排序。例7-22、查詢所有同學課程編號701的課程成績,并按由大到小的順序輸出,如果成績相同,則按學號由小到大排列。Select stu_id,course_id,gradeFrom stu_gradeWhere course_id='701'orderby 3 desc,1查詢結果如下:24、分組與匯總:(1

23、)聚合函數:聚合函數是TSQL所提供的系統函數,可以返回一列,幾列或全部列的匯總數據,用于計數或統計。這類函數(除count外)僅用于數值型列,并且在列上使用聚合函數時,不考慮null值。例7-23、統計學生信息表中學生人數。Select COUNT(*) as '學生人數'From stu_info查詢結果如下:例7-24、統計學生成績表中學號為2007070102同學的最高分、最低分、平均分和總分。Select MAX(grade),MIN(grade),AVG(grade),SUM(grade)From stu_gradeWhere stu_id='2007070

24、102'查詢結果如下:(2)分組匯總:使用聚合函數只返回單個匯總,而在實際應用中,更多的是需要進行分組匯總數據。使用group by子句可以進行分組匯總,為結果集中的每一行產生一個匯總值。Group by子句與聚合函數有密切關系,在某種意義上說,如果沒有聚合函數,group by子句也沒有多大用處了。Group by關鍵字后面跟著的列名稱為分組列,分組列中的每個得復值將被匯總為一行。如果包含where子句,則只對滿足where條件的行進行分組匯總。例7-25、統計學生成績表中每個同學的最高分、最低分、平均分和總分。Select stu_id,MAX(grade),MIN(grade),

25、AVG(grade),SUM(grade)From stu_gradeGroup by stu_id查詢結果如下:例7-26、統計學生成績表中每個同學的最高分、最低分、平均分和總分,80分以下的成績不參與統計。Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)From stu_gradeWhere grade>=80Group by stu_id查詢結果如下:(3)分組篩選:如果使用group by子句分組,則還可用having子句對分組后的結果進行過濾篩選。Having子句通常與group by子句一起使用,用于指定組或合

26、計的搜索條件,其作用與where子句相似,二者的區別如下:作用對象不同:where 子句作用于表和視圖中的行,而having子句作用于形成的組。Where子句限制查找的行,having子句限制查找的組。執行順序不同。若查詢句中同時有where子句和having子句,執行時,先去掉不滿足where條件的行,然后分組,分組后再去掉不滿足having條件的組。Where子句中不能直接使用聚合函數,但having子句的條件中可以包含聚合函數。例7-27、統計學生成績表中每個同學的最高分、最低分、平均分和總分,并輸出平均分大于87分的信息。Select stu_id,MAX(grade),MIN(gra

27、de),AVG(grade),SUM(grade)From stu_gradeGroup by stu_idHaving AVG(grade)>87查詢結果如下:(4)明細匯總:使用group by子句對查詢數據進行分組匯總,為每一組產生一個匯總結果,每個組只返回一行,無法看到詳細信息。使用compute和compute by子句既能夠看到統計經營部的結果又能夠瀏覽詳細數據。例7-28、使用compute子句對所有學生的人數進行明細匯總。select*from stu_infocompute count(stu_id)查詢結果如下:在使用compute 和compute by時,需要注意

28、以下幾點:Computeby子句不能與select into子句一起使用。Compute 子句中的列必須在select子句的字段列表中出現。Compute by表示按指定的列進行明細匯總,使用by關鍵字時必須同時使用order by子句,并且compute by中出現的列必須具有與order by后出現的列相同的順序,且不能跳過其中的列。例7-29、使用compute by子句按照院系對所有學生的人數進行明細匯總。select*from stu_infoorder by sdeptcompute count(stu_id)by sdept查詢結果如下:3、 連接查詢:前面介紹的查詢都是針對單一

29、的表,而在數據通庫管理系統中,考慮到數據的冗余度低、數據一致性等問題,通常對數據表的設計要滿足范式的要求,因此也會造成一個實體的所有信息保存在多個表中。當檢索數據時,往往在一個表中不能夠得到想要的信息,通過連接操作,可以查詢出存放在多個表中同一實體的不同信息,給用戶帶來很大的靈活性。多表連接實際上就是實現如何使用一個表中的數據來選擇另一個表中的行。而連接條件則主要通過以下方法定義兩個表在查詢中的關聯方式:指定每個表中要用于連接的列。典型的連接條件在一個表中的指定外鍵,在另一個表中指定與其關聯的鍵。指定比較各列的值時要使用的比較運算符(=、< >等)。表的連接的實現可以通過兩種方法:

30、利用select語句的where子句;在from子句中使用join(inner join,cross join ,outer join,left outer join,full outer join等)關鍵字。例7-30、查詢所有選修課程編號701的同學學號、姓名和成績。Select stu_info.stu_id,name,markFrom stu_info,stu_gradeWhere stu_info.stu_id=stu_grade.stu_id and course_id='701'查詢結果如下:例7-31、查詢所有選修課程的同學選修課程的成績。Select stu_

31、info.stu_id,name,course_name,gradeFrom stu_info,stu_grade,course_infoWhere stu_info.stu_id=stu_grade.stu_id andcourse_info.course_id=stu_grade.course_id查詢結果如下:有時表名比較煩瑣,使用起來很麻煩,為了程序的簡潔明了,在SQL中,也可以通過AS關鍵字為表定義別名。例7-32、查詢所有同學所有課程的成績。Select A.stu_id,name,course_name,markFrom stu_info as A,stu_grade as B,

32、course_info as CWhere A.stu_id=B.stu_id and B.course_id=C.course_id查詢結果如下:在select 語句的from子句中,通過指定不同類型的join關鍵字可以實現不同的表的連接方式,而在on關鍵字后指定連接條件。例7-33、查詢所有選修課程的同學學號、姓名和成績。Select stu_info.stu_id,name,markFrom stu_info inner join stu_gradeOn stu_info.stu_id=stu_grade.stu_id查詢結果如下:例7-34、從stu_info表中查詢入學分數比學號為2

33、007070101同學高的所有同學信息。Select R1.stu_id,R1.name,R1.markFrom stu_info as R1 inner join stu_info as R2On R2.stu_id='2007070101' and R1.mark>R2.mark查詢結果如下:例7-35、查詢所有同學的選修課程信息。Select stu_info.stu_id,name,markFrom stu_info left outer join stu_gradeOn stu_info.stu_id=stu_grade.stu_id查詢結果如下:例7-36、查

34、詢所有同學的選修課程信息。Select stu_info.stu_id,name,markFrom stu_grade right outer join stu_infoOn stu_info.stu_id=stu_grade.stu_id查詢結果如下:4、 嵌套查詢:所謂嵌套查詢指的是在一個select 查詢語句中包含另一個(或多個)select查詢語句。其中,外層的select查詢語句叫外部查詢,內層的select 查詢語句叫子查詢。嵌套查詢的執行過程:首先執行子查詢語句,得到的子查詢結果集傳遞給外層主查詢語句,作為外層主查詢的查詢項或查詢條件使用。子查詢也可以再嵌套子查詢。4、1單列單值

35、嵌套查詢:例7-37、查詢選修“計算機基礎”的學生成績信息。select*from stu_gradewhere course_id=(select course_idFrom course_infoWhere course_name='計算機基礎')查詢結果如下:例7-38、查詢比“2007070101”同學年齡大的同學信息。select*from stu_infowhere birthday<(select birthdayFrom stu_infoWhere stu_id='2007070101')查詢結果如下4、2單列多值嵌套查詢:例7-39、查詢

36、所有會計學院的同學成績信息。select*from stu_gradewhere stu_id in(select stu_idFrom stu_infoWhere sdept='會計學院')查詢結果如下例7-40、查詢其他系中比會計學院某一學生分數少的學生學號和姓名。Select stu_id,nameFrom stu_infoWhere mark<any(select markFrom stu_infoWhere sdept='會計學院')And sdept<>'會計學院'查詢結果如下例7-41、查詢選修“計算機基礎”的學生

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論