數(shù)據(jù)庫開發(fā)及ADO_第1頁
數(shù)據(jù)庫開發(fā)及ADO_第2頁
數(shù)據(jù)庫開發(fā)及ADO_第3頁
數(shù)據(jù)庫開發(fā)及ADO_第4頁
數(shù)據(jù)庫開發(fā)及ADO_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

北京傳智播客教育數(shù)據(jù)庫開發(fā)及ADO.Net講師:趙曉虎什么是數(shù)據(jù)庫數(shù)據(jù)庫Database:數(shù)據(jù)的倉庫倉庫里有排貨架(表),貨物會分類存放。比如牙膏、牙刷會放到一個排貨架上,面包會單獨放在一個排貨架上。倉庫又分很多種糧倉、武器倉庫。倉庫中還會有倉庫管理員(DBA)對貨物進(jìn)行管理從倉庫中拿貨物需要憑證,取貨和進(jìn)貨的人(程序員)我們怎么存儲數(shù)據(jù)學(xué)校的檔案室計算機(jī)文件,文件操作,開發(fā)人員需要熟悉操作磁盤文件的函數(shù)、必須編寫復(fù)雜的搜尋算法才能高效的把數(shù)據(jù)從文件中檢索出來、當(dāng)數(shù)據(jù)格式發(fā)生變化時,需要編寫復(fù)雜的文件格式升級程序、很難控制并發(fā)修改。數(shù)據(jù)庫(其實也是文件),DBMS(數(shù)據(jù)庫管理系統(tǒng))\RDBMS對于數(shù)據(jù)不僅僅是需要存儲,更重要的是將數(shù)據(jù)進(jìn)行存儲以后怎么才能方便快捷的查詢、修改。數(shù)據(jù)庫特點:海量存儲、查找速度快、并發(fā)性問題控制、安全性、數(shù)據(jù)完整性(保存在數(shù)據(jù)庫中的數(shù)據(jù)是正確的,真是的)。數(shù)據(jù)庫概述DBMS(DataBaseManagementSystem,數(shù)據(jù)庫管理系統(tǒng))和數(shù)據(jù)庫。平時談到“數(shù)據(jù)庫”可能有兩種含義:MSSQLServer、Oracle等某種DBMS;存放一堆數(shù)據(jù)表的一個分類(Catalog)。不同品牌的DBMS有自己的不同的特點:MYSQL(速度很快,適合對數(shù)據(jù)要求并不是十分嚴(yán)謹(jǐn)?shù)牡胤?,去掉了很多中小型企業(yè)中不常用的功能)、MSSQLServer(與.net結(jié)合很好,只能運行在windows平臺下,大數(shù)據(jù)量、大交易量表現(xiàn)并不十分好)、DB2(大型)、Oracle(大型)、Access(文件)、SQLite(極其輕量級數(shù)據(jù)庫)、Sybase等。對于開發(fā)人員來講,大同小異SQL(語言)<>SQLServer<>MSSQLServer。最常見的錯誤。除了Access、SQLServerCE、SQLite等文件型數(shù)據(jù)庫之外,大部分?jǐn)?shù)據(jù)庫都需要數(shù)據(jù)庫服務(wù)器才能運行。學(xué)習(xí)、開發(fā)時是連接本機(jī)的數(shù)據(jù)庫,上線運行時是數(shù)據(jù)庫運行在單獨的服務(wù)器。數(shù)據(jù)庫中的概念數(shù)據(jù)庫DataBase,不同類的數(shù)據(jù)應(yīng)該放到不同的數(shù)據(jù)庫中便于對各個數(shù)據(jù)類別的進(jìn)行個性化管理避免命名沖突安全性更高Table(表):關(guān)系數(shù)據(jù)庫中的關(guān)系指的就是表。不同的貨物要放到各自的貨物架,將這種區(qū)域叫做“表”(Table)。不同的表根據(jù)放的數(shù)據(jù)不同進(jìn)行空間的優(yōu)化,找起來也方便。列(Column)、字段(Field)、行(Row)用表格格式化數(shù)據(jù):即便是引入了自動識別設(shè)備也很容易識別。2003年5月入職,是產(chǎn)品開發(fā)部的,姓名馬小虎王二小,技術(shù)支持部,入職是2005年7月姓名馬小虎部門開發(fā)部入職時間2008.06.06姓名部門入職時間張三開發(fā)2002主鍵(PrimaryKey)工號姓名部門入職時間001風(fēng)姐員工培訓(xùn)部2010年7月5日002瘦瘦公關(guān)部2010年8月2日003憨憨開發(fā)部2009年3月5日主鍵就是數(shù)據(jù)行的唯一標(biāo)識。不會重復(fù)的列才能當(dāng)主鍵。一個表可以沒有主鍵,但是會非常難以處理,因此沒有特殊理由表都要設(shè)定主鍵主鍵有兩種選用策略:業(yè)務(wù)主鍵和邏輯主鍵。業(yè)務(wù)主鍵是使用有業(yè)務(wù)意義的字段做主鍵,比如身份證號、銀行賬號等;邏輯主鍵是使用沒有任何業(yè)務(wù)意義的字段做主鍵,完全給程序看的,業(yè)務(wù)人員不會看的數(shù)據(jù)。因為很難保證業(yè)務(wù)主鍵不會重復(fù)(身份證號重復(fù))、不會變化(帳號升位),因此推薦用邏輯主鍵。表間關(guān)聯(lián)、外鍵(ForeignKey)商品名價格廠家編號大大香瓜子5.00001大大開心果15.00001苦咖啡2002隨變3002冰工廠1002商品名價格生產(chǎn)廠家廠家地址廠家電話大大香瓜子5.00大大食品廠恰恰大街300號010-123456大大開心果15.00大大食品廠恰恰大街300號010-123456苦咖啡2伊利食品廠內(nèi)蒙古伊利路1號400400400隨變3伊利食品廠內(nèi)蒙古伊利路1號400400400冰工廠1伊利食品廠內(nèi)蒙古伊利路1號400400400編號名稱地址電話001大大食品廠恰恰大街300號010-123456002伊利食品廠內(nèi)蒙古伊利路1號400400400SQLServer的管理需要安裝SQLServer2005或者SQLServer2008,若要使用SQLServer管理工具進(jìn)行開發(fā)還要安裝SQLServerManagementStudio,還可以使用VisualStudio進(jìn)行管理使用免費的SQLServerExpress版本,Express版本的服務(wù)器名稱.\SQLEXPRESS,對于開發(fā)人員來講和其他版本沒有區(qū)別。SQLServer的兩種驗證方式:用戶名驗證和Windows驗證,開發(fā)時用Windows驗證就行。開發(fā)人員關(guān)注點在開發(fā)上,而不是配置、備份等之上,那是DBA做的事情。創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,設(shè)置主鍵數(shù)據(jù)庫的分離和附加MSSQLServer的每個數(shù)據(jù)庫包含:1個主數(shù)據(jù)文件(.mdf)必須。1個事務(wù)日志文件(.ldf)必須??梢园喝我舛鄠€次要數(shù)據(jù)文件(.ndf)多個事務(wù)日志文件文件組:可將多個數(shù)據(jù)文件邏輯的分到一組,方便日后管理維護(hù)(備份、將表建在指定的文件組上等等。)創(chuàng)建<部門表>:部門Id,部門名稱<員工表>:員工Id,身份證號,姓名,性別,入職日期,年齡,地址,電話,所屬部門、Email分類備注和說明類型說明二進(jìn)制數(shù)據(jù)類型存儲非子符和文本的數(shù)據(jù)Image可用來存儲圖像文本數(shù)據(jù)類型字符數(shù)據(jù)包括任意字母、符號或數(shù)字字符的組合Char,8000固定長度的非Unicode字符數(shù)據(jù)。固定長度的字符串相對于可變長度的字符串來說效率要高一些,在數(shù)據(jù)長度固定的情況下優(yōu)先選用固定長度,省去了計算長度的過程,提高效率Varchar,8000可變長度非Unicode數(shù)據(jù)Nchar,4000固定長度的Unicode數(shù)據(jù)Nvarchar,4000可變長度Unicode數(shù)據(jù)Textvarchar(max)存儲長文本信息(指針,2G)varchar(max),大字符串類型可以保存非常多的字符,但是對于這種類型的數(shù)據(jù)DBMS經(jīng)常將它們保存到單獨的空間中,這就導(dǎo)致了數(shù)據(jù)的保存和加載速度比較慢,因此除非必要,否則不要使用。Ntextnvarchar(max)Nvarchar(max)代替日期和時間日期和時間在單引號內(nèi)輸入Datetime日期和時間數(shù)字?jǐn)?shù)據(jù)該數(shù)據(jù)僅包含數(shù)字,包括正數(shù)、負(fù)數(shù)以及分?jǐn)?shù)intsmallint整數(shù)floatreal數(shù)字貨幣數(shù)據(jù)類型用于十進(jìn)制貨幣值,money和smallmoney數(shù)據(jù)類型精確到它們所代表的貨幣單位的萬分之一。MoneyBit數(shù)據(jù)類型表示是/否的數(shù)據(jù)Bit存儲布爾數(shù)據(jù)類型練習(xí)創(chuàng)建一個School數(shù)據(jù)庫。創(chuàng)建一個班級表:TblClass:tClassId(班級編號,自動編號,主鍵)、tClassName(班級名稱)、tClassDesc(班級簡介)。創(chuàng)建一個學(xué)生信息表:TblStudent:tSId(學(xué)生編號,自動編號,主鍵)、tSName(學(xué)生姓名)、tSGender(性別)、tSAddress(家庭地址)、tSPhone(電話)、tSAge(年齡)、tSBirthday(出生日期)、tSCardId(身份證號)、tClassId(班級Id)分離數(shù)據(jù)庫在需要分離的數(shù)據(jù)庫上點右鍵-任務(wù)-分離附加數(shù)據(jù)庫(在其他計算機(jī)上,親自測試!)在數(shù)據(jù)庫節(jié)點上點右鍵-附加打開數(shù)據(jù)之前,要打開數(shù)據(jù)庫服務(wù)SQL語句入門(腳本、命令)SQL

全名是結(jié)構(gòu)化查詢語言(StructuredQueryLanguage),是關(guān)系數(shù)據(jù)庫管理系統(tǒng)的標(biāo)準(zhǔn)語言SQL語句是和DBMS“交談”專用的語句,不同DBMS都認(rèn)SQL語法。==========================================SQL語句中字符串用單引號、單等號。select*、SeLeCT*:SQL語句是大小寫不敏感的,不敏感指的是SQL關(guān)鍵字,字符串值還是大小寫敏感的//==============================================建庫、刪除數(shù)據(jù)庫、創(chuàng)建表、刪除表不僅可以手工完成,還可以執(zhí)行SQL語句完成,在自動化部署、數(shù)據(jù)導(dǎo)入中用的很多簡單的Insert語句。(*)SQL主要分DDL(數(shù)據(jù)定義語言,建表、建庫等語句。)、DML(數(shù)據(jù)操作語言)和DCL(數(shù)據(jù)庫控制語言)。CreateTable、DropTable、AlterTable等屬于DDL,Select、Insert、Update、Delete等屬于DML,GRANT授權(quán)、REVOKE取消授權(quán)屬于DCL使用sql語句創(chuàng)建數(shù)據(jù)庫和表使用SQL語句創(chuàng)建School數(shù)據(jù)庫、TblClass表、TblStudent表。Go:將T-SQL語句分批發(fā)送到數(shù)據(jù)庫實例執(zhí)行。tSId tSName tSGender tSAddress tSPhone tSAge tSBirthday tSCardId tSClassId創(chuàng)建表練習(xí)創(chuàng)建數(shù)據(jù)庫TestSchool--tSId-- tSName-- tSGender-- tSAddress-- tSPhone-- tSAge-- tSBirthday-- tSCardId-- tSClassId--創(chuàng)建一個學(xué)生表TblStudent創(chuàng)建學(xué)生成績表TblScoretScoreId(成績id,主鍵,自動編號)、tSId(學(xué)生編號)、tEnglish(英語成績)、tMath(數(shù)學(xué)成績)創(chuàng)建老師表TblTeachertTId、tTName、tTGender、tTAge、tTSalary、tTBirthday介紹生成腳本工具數(shù)據(jù)庫→右鍵→任務(wù)→生成腳本可選擇生成什么樣的腳本選擇生成的數(shù)據(jù)庫版本是否包含某些腳本等。是否生成帶數(shù)據(jù)的腳本(2005、2008都有該功能express沒有。)數(shù)據(jù)插入向表中插入一行(該行的每一列都有數(shù)據(jù))insertinto表(列名,列名)values(值1,值2)insert語句可以省略表名后的列名,但是不推薦。Insertinto表values(值1,值2)插入數(shù)據(jù)時,只向某些列插入數(shù)據(jù):如果插入的行中有些字段的值不確定,那么Insert的時候不指定那些列即可。Insertinto表(列1)values(值1)自動編號列不需要手動插入?!維ETIDENTITY_INSERT表名ON

】注意:主鍵不能有重復(fù)值。插入數(shù)據(jù)時的單引號問題。Insertinto表(列)select列1,列2unionInsertinto表(列)select列1,列2from表Select列into新表名from舊表N前綴:N’字符串’,在服務(wù)器上執(zhí)行的代碼中(例如在存儲過程和觸發(fā)器中)顯示的Unicode字符串常量必須以大寫字母N為前綴。即使所引用的列已定義為Unicode類型,也應(yīng)如此。如果不使用N前綴,字符串將轉(zhuǎn)換為數(shù)據(jù)庫的默認(rèn)代碼頁。這可能導(dǎo)致不識別某些字符。在Northwind數(shù)據(jù)庫下測試print‘中文中文’數(shù)據(jù)更新(數(shù)據(jù)修改)更新一個列:updateStudentsetsSex=‘男’更新多個列:updateStudentsetsSex='女',sAge=18,sBirthday='1989-8-8'更新一部分?jǐn)?shù)據(jù):updateStudentsetsClassId=4wheresClassId=1,用where語句表示只更新Name是’tom’的行,注意SQL中等于判斷用單個=,而不是==。Where中還可以使用復(fù)雜的邏輯判斷updateStudentsetsAge=30wheresName='華佗'orsAge<25,or相當(dāng)于C#中的||(或者)所有學(xué)生的年齡加1updateStudentsetsAge=sAge+1updateStudentsetsClassId=6where(sAge>20andsAge<30)or(sAge=50)Where中可以使用的其他邏輯運算符:(||)or、(&&)and、(!)not、<、>、>=、<=、<>(或!=)等數(shù)據(jù)刪除刪除表中全部數(shù)據(jù):DELETEFROMStudent。Delete只是刪除數(shù)據(jù),表還在,和DropTable不同。Delete也可以帶where子句來刪除一部分?jǐn)?shù)據(jù):DELETEFROMStudentWHEREsAge>20==========================truncatetablestudent的作用與deletefromstudent一樣,都是刪除student表中的全部數(shù)據(jù),區(qū)別在于:1.truncate語句非常高效。由于truncate操作采用按最小方式來記錄日志,所以效率非常高。對于數(shù)百萬條數(shù)據(jù)使用truncate刪除只要幾秒鐘,而使用delete則可能耗費幾小時。2.truncate語句會把表中的自動編號重置為默認(rèn)值。3.truncate語句不觸發(fā)delete觸發(fā)器。練習(xí):插入幾條老師信息和成績、用SQL插入幾條員工信息(注意:bit類型,在寫代碼中用1或0來表示,不要用’false’,會進(jìn)行類型轉(zhuǎn)換的。)練習(xí)1:給studentId是1的英語成績加10分練習(xí)2:考試題偏難,所有人的成績加5分練習(xí)3:所有女學(xué)生的年齡減1歲刪除工資大于2000的老師============將老師表清空========刪除所有老師刪除數(shù)據(jù)時候把自增長列的值還原成種子約束-保證數(shù)據(jù)完整性先用設(shè)計器創(chuàng)建約束、再用代碼創(chuàng)建約束。數(shù)據(jù)庫約束是為了保證數(shù)據(jù)的完整性(正確性)而實現(xiàn)的一套機(jī)制見文件Employee.sql非空約束主鍵約束(PK)primarykeyconstraint唯一且不為空唯一約束(UQ)uniqueconstraint唯一,允許為空,但只能出現(xiàn)一次默認(rèn)約束(DF)defaultconstraint默認(rèn)值檢查約束(CK)checkconstraint范圍以及格式限制外鍵約束(FK)foreignkeyconstraint表關(guān)系增加外鍵約束時,設(shè)置級聯(lián)更新、級聯(lián)刪除:[ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}][ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}]約束練習(xí)Teacher表中tSex控制只能是男女,默認(rèn)男tAge在30-40之間默認(rèn)30Score表中studentId是外鍵先要把Student表中的sId設(shè)置為主鍵測試外鍵約束:1:在學(xué)生表(主表)中刪除在成績表中被引用的學(xué)生記錄。2:成績表中添加一條新成績,studentId在學(xué)生表中沒有。保存SQL腳本。再次打開即可執(zhí)行。數(shù)據(jù)檢索執(zhí)行備注中的代碼創(chuàng)建測試數(shù)據(jù)表。簡單的數(shù)據(jù)檢索:SELECT*FROMStudent只檢索需要的列:SELECTsNameFROMStudent、SELECTsName,sAgeFROMStudent列別名:SELECTsNameAS姓名,sAgeAS年齡,sBirthdayAS出生日期FROMStudent使用where檢索符合條件的數(shù)據(jù):SELECTsNameFROMStudentWHEREsSex=‘女’。還可以檢索不與任何表關(guān)聯(lián)的數(shù)據(jù):select1+1;selectselectgetdate();Top、DistinctTop獲取前幾條數(shù)據(jù),top一般都與orderby連用獲得年紀(jì)最小的5個學(xué)生獲得年紀(jì)最大的10%的學(xué)生(percent)Distinct去除重復(fù)數(shù)據(jù)selectdistinctsNamefromstudentselectdistinctsName,sAgefromstudentDISTINCT是對查詢出的整個結(jié)果集進(jìn)行數(shù)據(jù)重復(fù)處理的,而不是針對某一個列。聚合函數(shù)SQL聚合函數(shù):MAX(最大值)、MIN(最小值)、AVG(平均值)、SUM(和)、COUNT(數(shù)量:記錄的條數(shù)。)聚合函數(shù)對null值不計算。如果一行的數(shù)據(jù)都是null,count(*)包含對空值行、重復(fù)行的統(tǒng)計。平均成績selectavg(english)fromscore男學(xué)生出生日期的最大值和最小值:selectmax(sBirthday),min(sBirthday)fromstudentwheresSex='男'聚合函數(shù)SQL聚合函數(shù):MAX(最大值)、MIN(最小值)、AVG(平均值)、SUM(和)、COUNT(數(shù)量:記錄的條數(shù)。)聚合函數(shù)對null值不計算。如果一行的數(shù)據(jù)都是null,count(*)包含對空值行、重復(fù)行的統(tǒng)計。平均成績selectavg(english)fromscore男學(xué)生出生日期的最大值和最小值:selectmax(sBirthday),min(sBirthday)fromstudentwheresSex='男'帶條件的查詢Select…from…where…查詢沒有及格的學(xué)生的學(xué)號查詢年齡在20-30歲之間的男學(xué)生Between…and…在之間查詢年齡在20-30歲之間的男學(xué)生查詢math成績在80-90分之間的所有學(xué)生建議:優(yōu)先使用between…and…,而不是“列>=值1and列<=值2”,between…and…已做過優(yōu)化處理,效率高。查詢班級id為1,2,3的所有學(xué)生selectsName,sAgefromstudentwheresClassId=1orsClassId=2orsClassId=3selectsName,sAgefromstudentwheresClassIdin(1,2,3)帶條件的查詢-模糊查詢(都是針對字符串操作的)查詢所有姓張的同學(xué)Select*fromstudentwhereleft(sName,1)=‘張‘看上去很美,如果改成查詢名字中帶亮的學(xué)生怎么做?換一種做法likeSelect*fromstudentwheresNamelike‘張%’會吧所有姓張的都查詢到,現(xiàn)在我想查詢姓張并且名字是一個字的學(xué)生?Select*fromstudentwheresNamelike‘%亮%’_、%、[]、^^只有MSSQLServer支持,其他DBMS用notlike。通配符%多字符匹配的通配符,它匹配任意次數(shù)(零或多個)出現(xiàn)的任意字符通配符_單字符匹配,它匹配單個出現(xiàn)的字符[]只匹配一個字符并且這個字符必須是[]范圍內(nèi)的[0-9][a-z]not與like一起使用:notlike….要通配_、%、[、^這些字符怎么辦?[_]、[%]、[[]、^(不需要放到中括號里,因為^只有放到中括號中才認(rèn)為是通配符)空值處理數(shù)據(jù)庫中,一個列如果沒有指定值,那么值就為null,數(shù)據(jù)庫中的null表示“不知道”,而不是表示沒有。因此selectnull+1結(jié)果是null,因為“不知道”加1的結(jié)果還是“不知道”。select*fromscorewhereenglish=null;select*fromscorewhereenglish!=null;都沒有任何返回結(jié)果,因為數(shù)據(jù)庫也“不知道”。SQL中使用isnull、isnotnull來進(jìn)行空值判斷:select*fromscorewhereenglishisnull;select*fromscorewhereenglishisnotnull;ISNULL(check_expression,replacement_value)數(shù)據(jù)排序ORDERBY子句位于SELECT語句的末尾,它允許指定按照一個列或者多個列進(jìn)行排序,還可以指定排序方式是升序(從小到大排列,ASC)還是降序(從大到小排列,DESC)。按照年齡升序排序所有學(xué)生信息的列表:SELECT*FROMStudentORDERBYsAgeASC按照英語成績從大到小排序,如果英語成績相同則按照數(shù)學(xué)成績從大到小排序:SELECT*FROMScoreORDERBYenglishDESC,mathDESCORDERBY子句要放到WHERE子句之后:SELECT*FROMScorewhereenglish>=60andmath>=60ORDERBYenglishDESC,mathDESCOrderby語句一般要放到所有語句的后面,就是先讓其他語句進(jìn)行篩選,全部篩選完成后,最后排序一下。表中數(shù)據(jù)是集合,集合是沒有順序的。Orderby返回的數(shù)據(jù)是有順序的,故此我們把orderby以后返回的數(shù)據(jù)集合叫“游標(biāo)”。數(shù)據(jù)分組在使用select查詢的時候,有時需要對數(shù)據(jù)進(jìn)行分組匯總(即:將現(xiàn)有的數(shù)據(jù)按照某列來匯總統(tǒng)計),這時就需要用到groupby語句。select

語句中可以使用group

by

子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個組的匯總信息。//分組一般都和聚合函數(shù)連用。1.請從學(xué)生表中查詢出每個班的班級Id和班級人數(shù):(見備注1)2.請從學(xué)生表中查詢出每個班的班級Id和班級中男同學(xué)的人數(shù):(見備注2)GROUPBY子句必須放到WHERE語句的之后,GroupBy與OrderBy都是對篩選后的數(shù)據(jù)進(jìn)行處理,而Where是用來篩選數(shù)據(jù)的。沒有出現(xiàn)在GROUPBY子句中的列是不能放到SELECT語句后的列名列表中的(聚合函數(shù)中除外)錯誤:selectsClassId,count(sName),sAgefromstudentgroupbysClassId正確:selectsClassId,count(sName),avg(sAge)fromstudentgroupbysClassIdHaving語句(對組的篩選,哪些組顯示哪些組不顯示)對表中的數(shù)據(jù)分組后,會得到一個分組后的結(jié)果集,如何對該結(jié)果集在進(jìn)行篩選?→ having查詢班級人數(shù)超過三個人的班級。(見備注1)注意Having中不能使用未參與分組的列,Having不能替代where。作用不一樣,Having是對組進(jìn)行過濾。Having是GroupBy的條件對分組后的數(shù)據(jù)進(jìn)行篩選(與Where類似,都是篩選,只不過having是用來篩選分組后的組的。)在Where中不能使用聚合函數(shù),必須使用Having,Having要位于GroupBy之后。Having的使用幾乎是與where一樣的,也可以用in。Havingcount(*)in(5,8,10)SQL語句的執(zhí)行順序5>…Select5-1>選擇列,5-2>distinct,5-3>top1>…From表2>…Where條件3>…Groupby列4>…Having篩選條件6>…Orderby列Groupby練習(xí)從orders表中查詢:1.熱銷售商品排名表,【即按照每種商品的總銷售數(shù)量排序】。2.請統(tǒng)計銷售總價超過3000元的商品名稱和銷售總價,并按銷售總價降序排序。3.統(tǒng)計各個客戶對"可口可樂"的喜愛度(既統(tǒng)計每個購買人對“可口可樂”的購買量)類型轉(zhuǎn)換函數(shù)CAST(expressionASdata_type)CONVERT(data_type,expression,[style])Select‘您的班級編號’+1錯誤這里+是數(shù)學(xué)運算符SELECTFIdNumber,CAST(RIGHT(sNo,3)AS

INTEGER)as后三位的整數(shù)形式,CAST(RIGHT(sNo,3)AS

INTEGER)+1as后三位加1,CONVERT(INTEGER,RIGHT(sNo,3))/2as后三位除以2FROMstudent對編號排序,但編號是字符串類型。1、2、11、3、21、36…對日期的轉(zhuǎn)換。轉(zhuǎn)換成各種國家格式的日期。select

convert(varchar(20),getdate(),104)Style的格式,查sql幫助。(輸入convert函數(shù)查詢)將日期轉(zhuǎn)換為指定格式的字符串。日期→字符串聯(lián)合結(jié)果集union(集合運算符)集合運算符是對兩個集合操作的,兩個集合必須具有相同的列數(shù),列具有相同的數(shù)據(jù)類型(至少能隱式轉(zhuǎn)換的),最終輸出的集合的列名由第一個集合的列名來確定。(可以用來連接多個結(jié)果)聯(lián)合(union)與連接(join)不一樣簡單的結(jié)果集聯(lián)合(老師、學(xué)生):selecttName,tSexfromteacherunionselectsName,sSexfromstudent基本的原則:每個結(jié)果集必須有相同的列數(shù);每個結(jié)果集的列必須類型相容。selecttName,tSex,-1fromteacherunionselectsName,sSex,sClassIdfromstudent聯(lián)合:將多個結(jié)果集合并成一個結(jié)果集。union(去除重復(fù),相當(dāng)于默認(rèn)應(yīng)用了distinct)、unionall常見應(yīng)用:底部匯總。UnionallselecttName,tSexfromteacherunionselectsName,sSexfromstudentUNION合并兩個查詢結(jié)果集,并且將其中完全重復(fù)的數(shù)據(jù)行合并為一條selecttName,tSexfromteacherunionallselectsName,sSexfromstudentUnion因為要進(jìn)行重復(fù)值掃描,所以效率低,因此如果不是確定要合并重復(fù)行,那么就用UNIONALL案例1要求在一個表格中查詢出學(xué)生的英語最高成績、最低成績、平均成績查詢結(jié)果為3行:select'english最高成績',max(english)fromscoreunionallselect'english最低成績',min(english)fromscoreunionallselect'english平均',avg(english)fromscore查詢結(jié)果為1行:Selectmax(english),min(english),avg(english)fromscore;案例2查詢每位老師的信息,包括姓名、工資,并且在最后一行加上平均工資和最高工資底部匯總:selecttName,tSalaryfromteacherunionallselect'平均工資',avg(tSalary)fromteacherunionallselect'最高工資',max(tSalary)fromteacher一次插入多條數(shù)據(jù)insertintoScore(studentId,english,math)select1,80,100unionselect1,80,100unionselect3,50,59unionallselect4,66,89unionselect5,59,100此處如果用unionall同樣會去除重復(fù)數(shù)據(jù)。*一次插入多條數(shù)據(jù)--把現(xiàn)有表的數(shù)據(jù)插入到新表(表不能存在),為表建備份。--select*intonewStudentfromstudent(newStudent表在select查詢的同時自動建立。)--把現(xiàn)有表的數(shù)據(jù)復(fù)制到一個已存在的表通過這種方式復(fù)制,只能復(fù)制表中的數(shù)據(jù),以及列的名字和數(shù)據(jù)類型。對于約束,不會復(fù)制過來。Select*intonewTblfromoldTblwhere1<>1,這樣做可以只復(fù)制表結(jié)構(gòu),但效率并不高。建議:selecttop0*intonewTblfromoldTbl=========如果表已經(jīng)存在了===============--insertintobackupStudentselect*fromstudents(backupStudent表必須提前建好)字符串函數(shù)(*)LEN():計算字符串長度(字符的個數(shù)。)datalength();//計算字符串所占用的字節(jié)數(shù),不屬于字符串函數(shù)。測試varchar變量與nvarchar變量存儲字符串a(chǎn)的區(qū)別。見備注1.LOWER()、UPPER():轉(zhuǎn)小寫、大寫LTRIM():字符串左側(cè)的空格去掉RTRIM():字符串右側(cè)的空格去掉LTRIM(RTRIM('bb'))LEFT()、RIGHT()截取取字符串SELECTLEFT('abcdefg',2)SUBSTRING(string,start_position,length),索引從1開始。參數(shù)string為主字符串,start_position為子字符串在主字符串中的起始位置,length為子字符串的最大長度。SELECTSUBSTRING('abcdef111',2,3)嘗試使用SQLServer的幫助。日期函數(shù)GETDATE():取得當(dāng)前日期時間DATEADD(datepart,number,date),計算增加以后的日期。參數(shù)date為待計算的日期;參數(shù)number為增量;參數(shù)datepart為計量單位,可選值見備注。DATEADD(DAY,3,date)為計算日期date的3天后的日期,而DATEADD(MONTH,-8,date)為計算日期date的8個月之前的日期。(入職一年以上的員工發(fā)1000$)DATEDIFF(datepart,startdate,enddate):計算兩個日期之間的差額。datepart為計量單位,可取值參考DateAdd。統(tǒng)計不同入學(xué)年數(shù)的學(xué)生個數(shù):selectDateDiff(year,sInDate,getdate()),count(*)fromstudentGroupbyDateDiff(year,sInDate,getdate())DATEPART(datepart,date):返回一個日期的特定部分Month()、year()、day()來代替。統(tǒng)計學(xué)生的生日年份個數(shù):selectDatePart(year,sBirthday),count(*)fromstudentgroupbyDatePart(year,sBirthday)1990年出生的人的個數(shù)?練習(xí)創(chuàng)建一張表,記錄電話呼叫員的工作流水,記錄呼叫員編號、對方號碼、通話開始時間、通話結(jié)束時間。建表、插數(shù)據(jù)等最后都自己寫SQL語句。要求:輸出所有數(shù)據(jù)中通話時間最長的5條記錄。orderbydatediff輸出所有數(shù)據(jù)中撥打長途號碼(對方號碼以0開頭)的總時長。like、sum輸出本月通話總時長最多的前三個呼叫員的編號。輸出本月?lián)艽螂娫挻螖?shù)最多的前三個呼叫員的編號.groupby,count(*)按照月份分組。ADO.NET為什么要學(xué)ADO.NET之前我們所學(xué)只能在查詢分析器里查看數(shù)據(jù),操作數(shù)據(jù),我們不能讓普通用戶去學(xué)sql,所以我們搭建一個界面(WebWinform)讓用戶方便的操作數(shù)據(jù)庫中的數(shù)據(jù)什么是ADO.NETADO.NET就是一組類庫,這組類庫可以讓我們通過程序的方式訪問數(shù)據(jù)庫,就像System.IO下的類用類操作文件一樣,System.Data.這組類是用來操作數(shù)據(jù)庫(不光是MSSqlServer),它提供了統(tǒng)一的編程接口讓操作其它數(shù)據(jù)庫(Access、Oracle等)的方式和操作MSSqlServer一致ADO.NET組成數(shù)據(jù)提供程序(常用類)Connection,用來連接數(shù)據(jù)庫Command,用來執(zhí)行SQL語句DataReader只讀、只進(jìn)的結(jié)果集,一條一條讀取數(shù)據(jù)(StreamReader、XmlReader微軟的類庫中這些Reader的使用方式都差不多)DataAdapter,一個封裝了上面3個對象的對象。數(shù)據(jù)集(DataSet),臨時數(shù)據(jù)庫。斷開式數(shù)據(jù)操作ADO.NET中的其他常見類ConnectionStringBuilder//自動生成連接字符串Parameter//帶參數(shù)的SQL語句Transaction//在ADO.NET中使用事務(wù)與DataSet相關(guān)的類:DataView//視圖類,DataTable中的數(shù)據(jù)以不同的視角查看DataRowView//DataView中的行。DataTable//DataSet中的數(shù)據(jù)表DataRow//DataTable中的行DataColumn//DataTable中的列DataRealation//DataTable與DataTable的關(guān)系Constraint//DataTable中建立的約束A訪問數(shù)據(jù)庫的方式。11.連接數(shù)據(jù)用Connection2.執(zhí)行SQL語句Command3.執(zhí)行完畢之后將結(jié)果一條一條返回。DataReader2使用DataAdapter+DataSet,這種方法本質(zhì)還是通過C

溫馨提示

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

評論

0/150

提交評論