版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京傳智播客教育數(shù)據(jù)庫(kù)開(kāi)發(fā)及ADO.Net講師:趙曉虎什么是數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)Database:數(shù)據(jù)的倉(cāng)庫(kù)倉(cāng)庫(kù)里有排貨架(表),貨物會(huì)分類(lèi)存放。比如牙膏、牙刷會(huì)放到一個(gè)排貨架上,面包會(huì)單獨(dú)放在一個(gè)排貨架上。倉(cāng)庫(kù)又分很多種糧倉(cāng)、武器倉(cāng)庫(kù)。倉(cāng)庫(kù)中還會(huì)有倉(cāng)庫(kù)管理員(DBA)對(duì)貨物進(jìn)行管理從倉(cāng)庫(kù)中拿貨物需要憑證,取貨和進(jìn)貨的人(程序員)我們?cè)趺创鎯?chǔ)數(shù)據(jù)學(xué)校的檔案室計(jì)算機(jī)文件,文件操作,開(kāi)發(fā)人員需要熟悉操作磁盤(pán)文件的函數(shù)、必須編寫(xiě)復(fù)雜的搜尋算法才能高效的把數(shù)據(jù)從文件中檢索出來(lái)、當(dāng)數(shù)據(jù)格式發(fā)生變化時(shí),需要編寫(xiě)復(fù)雜的文件格式升級(jí)程序、很難控制并發(fā)修改。數(shù)據(jù)庫(kù)(其實(shí)也是文件),DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))\RDBMS對(duì)于數(shù)據(jù)不僅僅是需要存儲(chǔ),更重要的是將數(shù)據(jù)進(jìn)行存儲(chǔ)以后怎么才能方便快捷的查詢、修改。數(shù)據(jù)庫(kù)特點(diǎn):海量存儲(chǔ)、查找速度快、并發(fā)性問(wèn)題控制、安全性、數(shù)據(jù)完整性(保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù)是正確的,真是的)。數(shù)據(jù)庫(kù)概述DBMS(DataBaseManagementSystem,數(shù)據(jù)庫(kù)管理系統(tǒng))和數(shù)據(jù)庫(kù)。平時(shí)談到“數(shù)據(jù)庫(kù)”可能有兩種含義:MSSQLServer、Oracle等某種DBMS;存放一堆數(shù)據(jù)表的一個(gè)分類(lèi)(Catalog)。不同品牌的DBMS有自己的不同的特點(diǎn):MYSQL(速度很快,適合對(duì)數(shù)據(jù)要求并不是十分嚴(yán)謹(jǐn)?shù)牡胤?,去掉了很多中小型企業(yè)中不常用的功能)、MSSQLServer(與.net結(jié)合很好,只能運(yùn)行在windows平臺(tái)下,大數(shù)據(jù)量、大交易量表現(xiàn)并不十分好)、DB2(大型)、Oracle(大型)、Access(文件)、SQLite(極其輕量級(jí)數(shù)據(jù)庫(kù))、Sybase等。對(duì)于開(kāi)發(fā)人員來(lái)講,大同小異SQL(語(yǔ)言)<>SQLServer<>MSSQLServer。最常見(jiàn)的錯(cuò)誤。除了Access、SQLServerCE、SQLite等文件型數(shù)據(jù)庫(kù)之外,大部分?jǐn)?shù)據(jù)庫(kù)都需要數(shù)據(jù)庫(kù)服務(wù)器才能運(yùn)行。學(xué)習(xí)、開(kāi)發(fā)時(shí)是連接本機(jī)的數(shù)據(jù)庫(kù),上線運(yùn)行時(shí)是數(shù)據(jù)庫(kù)運(yùn)行在單獨(dú)的服務(wù)器。數(shù)據(jù)庫(kù)中的概念數(shù)據(jù)庫(kù)DataBase,不同類(lèi)的數(shù)據(jù)應(yīng)該放到不同的數(shù)據(jù)庫(kù)中便于對(duì)各個(gè)數(shù)據(jù)類(lèi)別的進(jìn)行個(gè)性化管理避免命名沖突安全性更高Table(表):關(guān)系數(shù)據(jù)庫(kù)中的關(guān)系指的就是表。不同的貨物要放到各自的貨物架,將這種區(qū)域叫做“表”(Table)。不同的表根據(jù)放的數(shù)據(jù)不同進(jìn)行空間的優(yōu)化,找起來(lái)也方便。列(Column)、字段(Field)、行(Row)用表格格式化數(shù)據(jù):即便是引入了自動(dòng)識(shí)別設(shè)備也很容易識(shí)別。2003年5月入職,是產(chǎn)品開(kāi)發(fā)部的,姓名馬小虎王二小,技術(shù)支持部,入職是2005年7月姓名馬小虎部門(mén)開(kāi)發(fā)部入職時(shí)間2008.06.06姓名部門(mén)入職時(shí)間張三開(kāi)發(fā)2002主鍵(PrimaryKey)工號(hào)姓名部門(mén)入職時(shí)間001風(fēng)姐員工培訓(xùn)部2010年7月5日002瘦瘦公關(guān)部2010年8月2日003憨憨開(kāi)發(fā)部2009年3月5日主鍵就是數(shù)據(jù)行的唯一標(biāo)識(shí)。不會(huì)重復(fù)的列才能當(dāng)主鍵。一個(gè)表可以沒(méi)有主鍵,但是會(huì)非常難以處理,因此沒(méi)有特殊理由表都要設(shè)定主鍵主鍵有兩種選用策略:業(yè)務(wù)主鍵和邏輯主鍵。業(yè)務(wù)主鍵是使用有業(yè)務(wù)意義的字段做主鍵,比如身份證號(hào)、銀行賬號(hào)等;邏輯主鍵是使用沒(méi)有任何業(yè)務(wù)意義的字段做主鍵,完全給程序看的,業(yè)務(wù)人員不會(huì)看的數(shù)據(jù)。因?yàn)楹茈y保證業(yè)務(wù)主鍵不會(huì)重復(fù)(身份證號(hào)重復(fù))、不會(huì)變化(帳號(hào)升位),因此推薦用邏輯主鍵。表間關(guān)聯(lián)、外鍵(ForeignKey)商品名價(jià)格廠家編號(hào)大大香瓜子5.00001大大開(kāi)心果15.00001苦咖啡2002隨變3002冰工廠1002商品名價(jià)格生產(chǎn)廠家廠家地址廠家電話大大香瓜子5.00大大食品廠恰恰大街300號(hào)010-123456大大開(kāi)心果15.00大大食品廠恰恰大街300號(hào)010-123456苦咖啡2伊利食品廠內(nèi)蒙古伊利路1號(hào)400400400隨變3伊利食品廠內(nèi)蒙古伊利路1號(hào)400400400冰工廠1伊利食品廠內(nèi)蒙古伊利路1號(hào)400400400編號(hào)名稱(chēng)地址電話001大大食品廠恰恰大街300號(hào)010-123456002伊利食品廠內(nèi)蒙古伊利路1號(hào)400400400SQLServer的管理需要安裝SQLServer2005或者SQLServer2008,若要使用SQLServer管理工具進(jìn)行開(kāi)發(fā)還要安裝SQLServerManagementStudio,還可以使用VisualStudio進(jìn)行管理使用免費(fèi)的SQLServerExpress版本,Express版本的服務(wù)器名稱(chēng).\SQLEXPRESS,對(duì)于開(kāi)發(fā)人員來(lái)講和其他版本沒(méi)有區(qū)別。SQLServer的兩種驗(yàn)證方式:用戶名驗(yàn)證和Windows驗(yàn)證,開(kāi)發(fā)時(shí)用Windows驗(yàn)證就行。開(kāi)發(fā)人員關(guān)注點(diǎn)在開(kāi)發(fā)上,而不是配置、備份等之上,那是DBA做的事情。創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建表,設(shè)置主鍵數(shù)據(jù)庫(kù)的分離和附加MSSQLServer的每個(gè)數(shù)據(jù)庫(kù)包含:1個(gè)主數(shù)據(jù)文件(.mdf)必須。1個(gè)事務(wù)日志文件(.ldf)必須??梢园喝我舛鄠€(gè)次要數(shù)據(jù)文件(.ndf)多個(gè)事務(wù)日志文件文件組:可將多個(gè)數(shù)據(jù)文件邏輯的分到一組,方便日后管理維護(hù)(備份、將表建在指定的文件組上等等。)創(chuàng)建<部門(mén)表>:部門(mén)Id,部門(mén)名稱(chēng)<員工表>:?jiǎn)T工Id,身份證號(hào),姓名,性別,入職日期,年齡,地址,電話,所屬部門(mén)、Email分類(lèi)備注和說(shuō)明類(lèi)型說(shuō)明二進(jìn)制數(shù)據(jù)類(lèi)型存儲(chǔ)非子符和文本的數(shù)據(jù)Image可用來(lái)存儲(chǔ)圖像文本數(shù)據(jù)類(lèi)型字符數(shù)據(jù)包括任意字母、符號(hào)或數(shù)字字符的組合Char,8000固定長(zhǎng)度的非Unicode字符數(shù)據(jù)。固定長(zhǎng)度的字符串相對(duì)于可變長(zhǎng)度的字符串來(lái)說(shuō)效率要高一些,在數(shù)據(jù)長(zhǎng)度固定的情況下優(yōu)先選用固定長(zhǎng)度,省去了計(jì)算長(zhǎng)度的過(guò)程,提高效率Varchar,8000可變長(zhǎng)度非Unicode數(shù)據(jù)Nchar,4000固定長(zhǎng)度的Unicode數(shù)據(jù)Nvarchar,4000可變長(zhǎng)度Unicode數(shù)據(jù)Textvarchar(max)存儲(chǔ)長(zhǎng)文本信息(指針,2G)varchar(max),大字符串類(lèi)型可以保存非常多的字符,但是對(duì)于這種類(lèi)型的數(shù)據(jù)DBMS經(jīng)常將它們保存到單獨(dú)的空間中,這就導(dǎo)致了數(shù)據(jù)的保存和加載速度比較慢,因此除非必要,否則不要使用。Ntextnvarchar(max)Nvarchar(max)代替日期和時(shí)間日期和時(shí)間在單引號(hào)內(nèi)輸入Datetime日期和時(shí)間數(shù)字?jǐn)?shù)據(jù)該數(shù)據(jù)僅包含數(shù)字,包括正數(shù)、負(fù)數(shù)以及分?jǐn)?shù)intsmallint整數(shù)floatreal數(shù)字貨幣數(shù)據(jù)類(lèi)型用于十進(jìn)制貨幣值,money和smallmoney數(shù)據(jù)類(lèi)型精確到它們所代表的貨幣單位的萬(wàn)分之一。MoneyBit數(shù)據(jù)類(lèi)型表示是/否的數(shù)據(jù)Bit存儲(chǔ)布爾數(shù)據(jù)類(lèi)型練習(xí)創(chuàng)建一個(gè)School數(shù)據(jù)庫(kù)。創(chuàng)建一個(gè)班級(jí)表:TblClass:tClassId(班級(jí)編號(hào),自動(dòng)編號(hào),主鍵)、tClassName(班級(jí)名稱(chēng))、tClassDesc(班級(jí)簡(jiǎn)介)。創(chuàng)建一個(gè)學(xué)生信息表:TblStudent:tSId(學(xué)生編號(hào),自動(dòng)編號(hào),主鍵)、tSName(學(xué)生姓名)、tSGender(性別)、tSAddress(家庭地址)、tSPhone(電話)、tSAge(年齡)、tSBirthday(出生日期)、tSCardId(身份證號(hào))、tClassId(班級(jí)Id)分離數(shù)據(jù)庫(kù)在需要分離的數(shù)據(jù)庫(kù)上點(diǎn)右鍵-任務(wù)-分離附加數(shù)據(jù)庫(kù)(在其他計(jì)算機(jī)上,親自測(cè)試!)在數(shù)據(jù)庫(kù)節(jié)點(diǎn)上點(diǎn)右鍵-附加打開(kāi)數(shù)據(jù)之前,要打開(kāi)數(shù)據(jù)庫(kù)服務(wù)SQL語(yǔ)句入門(mén)(腳本、命令)SQL
全名是結(jié)構(gòu)化查詢語(yǔ)言(StructuredQueryLanguage),是關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的標(biāo)準(zhǔn)語(yǔ)言SQL語(yǔ)句是和DBMS“交談”專(zhuān)用的語(yǔ)句,不同DBMS都認(rèn)SQL語(yǔ)法。==========================================SQL語(yǔ)句中字符串用單引號(hào)、單等號(hào)。select*、SeLeCT*:SQL語(yǔ)句是大小寫(xiě)不敏感的,不敏感指的是SQL關(guān)鍵字,字符串值還是大小寫(xiě)敏感的//==============================================建庫(kù)、刪除數(shù)據(jù)庫(kù)、創(chuàng)建表、刪除表不僅可以手工完成,還可以執(zhí)行SQL語(yǔ)句完成,在自動(dòng)化部署、數(shù)據(jù)導(dǎo)入中用的很多簡(jiǎn)單的Insert語(yǔ)句。(*)SQL主要分DDL(數(shù)據(jù)定義語(yǔ)言,建表、建庫(kù)等語(yǔ)句。)、DML(數(shù)據(jù)操作語(yǔ)言)和DCL(數(shù)據(jù)庫(kù)控制語(yǔ)言)。CreateTable、DropTable、AlterTable等屬于DDL,Select、Insert、Update、Delete等屬于DML,GRANT授權(quán)、REVOKE取消授權(quán)屬于DCL使用sql語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)和表使用SQL語(yǔ)句創(chuàng)建School數(shù)據(jù)庫(kù)、TblClass表、TblStudent表。Go:將T-SQL語(yǔ)句分批發(fā)送到數(shù)據(jù)庫(kù)實(shí)例執(zhí)行。tSId tSName tSGender tSAddress tSPhone tSAge tSBirthday tSCardId tSClassId創(chuàng)建表練習(xí)創(chuàng)建數(shù)據(jù)庫(kù)TestSchool--tSId-- tSName-- tSGender-- tSAddress-- tSPhone-- tSAge-- tSBirthday-- tSCardId-- tSClassId--創(chuàng)建一個(gè)學(xué)生表TblStudent創(chuàng)建學(xué)生成績(jī)表TblScoretScoreId(成績(jī)id,主鍵,自動(dòng)編號(hào))、tSId(學(xué)生編號(hào))、tEnglish(英語(yǔ)成績(jī))、tMath(數(shù)學(xué)成績(jī))創(chuàng)建老師表TblTeachertTId、tTName、tTGender、tTAge、tTSalary、tTBirthday介紹生成腳本工具數(shù)據(jù)庫(kù)→右鍵→任務(wù)→生成腳本可選擇生成什么樣的腳本選擇生成的數(shù)據(jù)庫(kù)版本是否包含某些腳本等。是否生成帶數(shù)據(jù)的腳本(2005、2008都有該功能express沒(méi)有。)數(shù)據(jù)插入向表中插入一行(該行的每一列都有數(shù)據(jù))insertinto表(列名,列名)values(值1,值2)insert語(yǔ)句可以省略表名后的列名,但是不推薦。Insertinto表values(值1,值2)插入數(shù)據(jù)時(shí),只向某些列插入數(shù)據(jù):如果插入的行中有些字段的值不確定,那么Insert的時(shí)候不指定那些列即可。Insertinto表(列1)values(值1)自動(dòng)編號(hào)列不需要手動(dòng)插入。【SETIDENTITY_INSERT表名ON
】注意:主鍵不能有重復(fù)值。插入數(shù)據(jù)時(shí)的單引號(hào)問(wèn)題。Insertinto表(列)select列1,列2unionInsertinto表(列)select列1,列2from表Select列into新表名from舊表N前綴:N’字符串’,在服務(wù)器上執(zhí)行的代碼中(例如在存儲(chǔ)過(guò)程和觸發(fā)器中)顯示的Unicode字符串常量必須以大寫(xiě)字母N為前綴。即使所引用的列已定義為Unicode類(lèi)型,也應(yīng)如此。如果不使用N前綴,字符串將轉(zhuǎn)換為數(shù)據(jù)庫(kù)的默認(rèn)代碼頁(yè)。這可能導(dǎo)致不識(shí)別某些字符。在Northwind數(shù)據(jù)庫(kù)下測(cè)試print‘中文中文’數(shù)據(jù)更新(數(shù)據(jù)修改)更新一個(gè)列:updateStudentsetsSex=‘男’更新多個(gè)列:updateStudentsetsSex='女',sAge=18,sBirthday='1989-8-8'更新一部分?jǐn)?shù)據(jù):updateStudentsetsClassId=4wheresClassId=1,用where語(yǔ)句表示只更新Name是’tom’的行,注意SQL中等于判斷用單個(gè)=,而不是==。Where中還可以使用復(fù)雜的邏輯判斷updateStudentsetsAge=30wheresName='華佗'orsAge<25,or相當(dāng)于C#中的||(或者)所有學(xué)生的年齡加1updateStudentsetsAge=sAge+1updateStudentsetsClassId=6where(sAge>20andsAge<30)or(sAge=50)Where中可以使用的其他邏輯運(yùn)算符:(||)or、(&&)and、(!)not、<、>、>=、<=、<>(或!=)等數(shù)據(jù)刪除刪除表中全部數(shù)據(jù):DELETEFROMStudent。Delete只是刪除數(shù)據(jù),表還在,和DropTable不同。Delete也可以帶where子句來(lái)刪除一部分?jǐn)?shù)據(jù):DELETEFROMStudentWHEREsAge>20==========================truncatetablestudent的作用與deletefromstudent一樣,都是刪除student表中的全部數(shù)據(jù),區(qū)別在于:1.truncate語(yǔ)句非常高效。由于truncate操作采用按最小方式來(lái)記錄日志,所以效率非常高。對(duì)于數(shù)百萬(wàn)條數(shù)據(jù)使用truncate刪除只要幾秒鐘,而使用delete則可能耗費(fèi)幾小時(shí)。2.truncate語(yǔ)句會(huì)把表中的自動(dòng)編號(hào)重置為默認(rèn)值。3.truncate語(yǔ)句不觸發(fā)delete觸發(fā)器。練習(xí):插入幾條老師信息和成績(jī)、用SQL插入幾條員工信息(注意:bit類(lèi)型,在寫(xiě)代碼中用1或0來(lái)表示,不要用’false’,會(huì)進(jìn)行類(lèi)型轉(zhuǎn)換的。)練習(xí)1:給studentId是1的英語(yǔ)成績(jī)加10分練習(xí)2:考試題偏難,所有人的成績(jī)加5分練習(xí)3:所有女學(xué)生的年齡減1歲刪除工資大于2000的老師============將老師表清空========刪除所有老師刪除數(shù)據(jù)時(shí)候把自增長(zhǎng)列的值還原成種子約束-保證數(shù)據(jù)完整性先用設(shè)計(jì)器創(chuàng)建約束、再用代碼創(chuàng)建約束。數(shù)據(jù)庫(kù)約束是為了保證數(shù)據(jù)的完整性(正確性)而實(shí)現(xiàn)的一套機(jī)制見(jiàn)文件Employee.sql非空約束主鍵約束(PK)primarykeyconstraint唯一且不為空唯一約束(UQ)uniqueconstraint唯一,允許為空,但只能出現(xiàn)一次默認(rèn)約束(DF)defaultconstraint默認(rèn)值檢查約束(CK)checkconstraint范圍以及格式限制外鍵約束(FK)foreignkeyconstraint表關(guān)系增加外鍵約束時(shí),設(shè)置級(jí)聯(lián)更新、級(jí)聯(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è)置為主鍵測(cè)試外鍵約束:1:在學(xué)生表(主表)中刪除在成績(jī)表中被引用的學(xué)生記錄。2:成績(jī)表中添加一條新成績(jī),studentId在學(xué)生表中沒(méi)有。保存SQL腳本。再次打開(kāi)即可執(zhí)行。數(shù)據(jù)檢索執(zhí)行備注中的代碼創(chuàng)建測(cè)試數(shù)據(jù)表。簡(jiǎn)單的數(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個(gè)學(xué)生獲得年紀(jì)最大的10%的學(xué)生(percent)Distinct去除重復(fù)數(shù)據(jù)selectdistinctsNamefromstudentselectdistinctsName,sAgefromstudentDISTINCT是對(duì)查詢出的整個(gè)結(jié)果集進(jìn)行數(shù)據(jù)重復(fù)處理的,而不是針對(duì)某一個(gè)列。聚合函數(shù)SQL聚合函數(shù):MAX(最大值)、MIN(最小值)、AVG(平均值)、SUM(和)、COUNT(數(shù)量:記錄的條數(shù)。)聚合函數(shù)對(duì)null值不計(jì)算。如果一行的數(shù)據(jù)都是null,count(*)包含對(duì)空值行、重復(fù)行的統(tǒng)計(jì)。平均成績(jī)selectavg(english)fromscore男學(xué)生出生日期的最大值和最小值:selectmax(sBirthday),min(sBirthday)fromstudentwheresSex='男'聚合函數(shù)SQL聚合函數(shù):MAX(最大值)、MIN(最小值)、AVG(平均值)、SUM(和)、COUNT(數(shù)量:記錄的條數(shù)。)聚合函數(shù)對(duì)null值不計(jì)算。如果一行的數(shù)據(jù)都是null,count(*)包含對(duì)空值行、重復(fù)行的統(tǒng)計(jì)。平均成績(jī)selectavg(english)fromscore男學(xué)生出生日期的最大值和最小值:selectmax(sBirthday),min(sBirthday)fromstudentwheresSex='男'帶條件的查詢Select…from…where…查詢沒(méi)有及格的學(xué)生的學(xué)號(hào)查詢年齡在20-30歲之間的男學(xué)生Between…and…在之間查詢年齡在20-30歲之間的男學(xué)生查詢math成績(jī)?cè)?0-90分之間的所有學(xué)生建議:優(yōu)先使用between…and…,而不是“列>=值1and列<=值2”,between…and…已做過(guò)優(yōu)化處理,效率高。查詢班級(jí)id為1,2,3的所有學(xué)生selectsName,sAgefromstudentwheresClassId=1orsClassId=2orsClassId=3selectsName,sAgefromstudentwheresClassIdin(1,2,3)帶條件的查詢-模糊查詢(都是針對(duì)字符串操作的)查詢所有姓張的同學(xué)Select*fromstudentwhereleft(sName,1)=‘張‘看上去很美,如果改成查詢名字中帶亮的學(xué)生怎么做?換一種做法likeSelect*fromstudentwheresNamelike‘張%’會(huì)吧所有姓張的都查詢到,現(xiàn)在我想查詢姓張并且名字是一個(gè)字的學(xué)生?Select*fromstudentwheresNamelike‘%亮%’_、%、[]、^^只有MSSQLServer支持,其他DBMS用notlike。通配符%多字符匹配的通配符,它匹配任意次數(shù)(零或多個(gè))出現(xiàn)的任意字符通配符_單字符匹配,它匹配單個(gè)出現(xiàn)的字符[]只匹配一個(gè)字符并且這個(gè)字符必須是[]范圍內(nèi)的[0-9][a-z]not與like一起使用:notlike….要通配_、%、[、^這些字符怎么辦?[_]、[%]、[[]、^(不需要放到中括號(hào)里,因?yàn)閊只有放到中括號(hào)中才認(rèn)為是通配符)空值處理數(shù)據(jù)庫(kù)中,一個(gè)列如果沒(méi)有指定值,那么值就為null,數(shù)據(jù)庫(kù)中的null表示“不知道”,而不是表示沒(méi)有。因此selectnull+1結(jié)果是null,因?yàn)椤安恢馈奔?的結(jié)果還是“不知道”。select*fromscorewhereenglish=null;select*fromscorewhereenglish!=null;都沒(méi)有任何返回結(jié)果,因?yàn)閿?shù)據(jù)庫(kù)也“不知道”。SQL中使用isnull、isnotnull來(lái)進(jìn)行空值判斷:select*fromscorewhereenglishisnull;select*fromscorewhereenglishisnotnull;ISNULL(check_expression,replacement_value)數(shù)據(jù)排序ORDERBY子句位于SELECT語(yǔ)句的末尾,它允許指定按照一個(gè)列或者多個(gè)列進(jìn)行排序,還可以指定排序方式是升序(從小到大排列,ASC)還是降序(從大到小排列,DESC)。按照年齡升序排序所有學(xué)生信息的列表:SELECT*FROMStudentORDERBYsAgeASC按照英語(yǔ)成績(jī)從大到小排序,如果英語(yǔ)成績(jī)相同則按照數(shù)學(xué)成績(jī)從大到小排序:SELECT*FROMScoreORDERBYenglishDESC,mathDESCORDERBY子句要放到WHERE子句之后:SELECT*FROMScorewhereenglish>=60andmath>=60ORDERBYenglishDESC,mathDESCOrderby語(yǔ)句一般要放到所有語(yǔ)句的后面,就是先讓其他語(yǔ)句進(jìn)行篩選,全部篩選完成后,最后排序一下。表中數(shù)據(jù)是集合,集合是沒(méi)有順序的。Orderby返回的數(shù)據(jù)是有順序的,故此我們把orderby以后返回的數(shù)據(jù)集合叫“游標(biāo)”。數(shù)據(jù)分組在使用select查詢的時(shí)候,有時(shí)需要對(duì)數(shù)據(jù)進(jìn)行分組匯總(即:將現(xiàn)有的數(shù)據(jù)按照某列來(lái)匯總統(tǒng)計(jì)),這時(shí)就需要用到groupby語(yǔ)句。select
語(yǔ)句中可以使用group
by
子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個(gè)組的匯總信息。//分組一般都和聚合函數(shù)連用。1.請(qǐng)從學(xué)生表中查詢出每個(gè)班的班級(jí)Id和班級(jí)人數(shù):(見(jiàn)備注1)2.請(qǐng)從學(xué)生表中查詢出每個(gè)班的班級(jí)Id和班級(jí)中男同學(xué)的人數(shù):(見(jiàn)備注2)GROUPBY子句必須放到WHERE語(yǔ)句的之后,GroupBy與OrderBy都是對(duì)篩選后的數(shù)據(jù)進(jìn)行處理,而Where是用來(lái)篩選數(shù)據(jù)的。沒(méi)有出現(xiàn)在GROUPBY子句中的列是不能放到SELECT語(yǔ)句后的列名列表中的(聚合函數(shù)中除外)錯(cuò)誤:selectsClassId,count(sName),sAgefromstudentgroupbysClassId正確:selectsClassId,count(sName),avg(sAge)fromstudentgroupbysClassIdHaving語(yǔ)句(對(duì)組的篩選,哪些組顯示哪些組不顯示)對(duì)表中的數(shù)據(jù)分組后,會(huì)得到一個(gè)分組后的結(jié)果集,如何對(duì)該結(jié)果集在進(jìn)行篩選?→ having查詢班級(jí)人數(shù)超過(guò)三個(gè)人的班級(jí)。(見(jiàn)備注1)注意Having中不能使用未參與分組的列,Having不能替代where。作用不一樣,Having是對(duì)組進(jìn)行過(guò)濾。Having是GroupBy的條件對(duì)分組后的數(shù)據(jù)進(jìn)行篩選(與Where類(lèi)似,都是篩選,只不過(guò)having是用來(lái)篩選分組后的組的。)在Where中不能使用聚合函數(shù),必須使用Having,Having要位于GroupBy之后。Having的使用幾乎是與where一樣的,也可以用in。Havingcount(*)in(5,8,10)SQL語(yǔ)句的執(zhí)行順序5>…Select5-1>選擇列,5-2>distinct,5-3>top1>…From表2>…Where條件3>…Groupby列4>…Having篩選條件6>…Orderby列Groupby練習(xí)從orders表中查詢:1.熱銷(xiāo)售商品排名表,【即按照每種商品的總銷(xiāo)售數(shù)量排序】。2.請(qǐng)統(tǒng)計(jì)銷(xiāo)售總價(jià)超過(guò)3000元的商品名稱(chēng)和銷(xiāo)售總價(jià),并按銷(xiāo)售總價(jià)降序排序。3.統(tǒng)計(jì)各個(gè)客戶對(duì)"可口可樂(lè)"的喜愛(ài)度(既統(tǒng)計(jì)每個(gè)購(gòu)買(mǎi)人對(duì)“可口可樂(lè)”的購(gòu)買(mǎi)量)類(lèi)型轉(zhuǎn)換函數(shù)CAST(expressionASdata_type)CONVERT(data_type,expression,[style])Select‘您的班級(jí)編號(hào)’+1錯(cuò)誤這里+是數(shù)學(xué)運(yùn)算符SELECTFIdNumber,CAST(RIGHT(sNo,3)AS
INTEGER)as后三位的整數(shù)形式,CAST(RIGHT(sNo,3)AS
INTEGER)+1as后三位加1,CONVERT(INTEGER,RIGHT(sNo,3))/2as后三位除以2FROMstudent對(duì)編號(hào)排序,但編號(hào)是字符串類(lèi)型。1、2、11、3、21、36…對(duì)日期的轉(zhuǎn)換。轉(zhuǎn)換成各種國(guó)家格式的日期。select
convert(varchar(20),getdate(),104)Style的格式,查sql幫助。(輸入convert函數(shù)查詢)將日期轉(zhuǎn)換為指定格式的字符串。日期→字符串聯(lián)合結(jié)果集union(集合運(yùn)算符)集合運(yùn)算符是對(duì)兩個(gè)集合操作的,兩個(gè)集合必須具有相同的列數(shù),列具有相同的數(shù)據(jù)類(lèi)型(至少能隱式轉(zhuǎn)換的),最終輸出的集合的列名由第一個(gè)集合的列名來(lái)確定。(可以用來(lái)連接多個(gè)結(jié)果)聯(lián)合(union)與連接(join)不一樣簡(jiǎn)單的結(jié)果集聯(lián)合(老師、學(xué)生):selecttName,tSexfromteacherunionselectsName,sSexfromstudent基本的原則:每個(gè)結(jié)果集必須有相同的列數(shù);每個(gè)結(jié)果集的列必須類(lèi)型相容。selecttName,tSex,-1fromteacherunionselectsName,sSex,sClassIdfromstudent聯(lián)合:將多個(gè)結(jié)果集合并成一個(gè)結(jié)果集。union(去除重復(fù),相當(dāng)于默認(rèn)應(yīng)用了distinct)、unionall常見(jiàn)應(yīng)用:底部匯總。UnionallselecttName,tSexfromteacherunionselectsName,sSexfromstudentUNION合并兩個(gè)查詢結(jié)果集,并且將其中完全重復(fù)的數(shù)據(jù)行合并為一條selecttName,tSexfromteacherunionallselectsName,sSexfromstudentUnion因?yàn)橐M(jìn)行重復(fù)值掃描,所以效率低,因此如果不是確定要合并重復(fù)行,那么就用UNIONALL案例1要求在一個(gè)表格中查詢出學(xué)生的英語(yǔ)最高成績(jī)、最低成績(jī)、平均成績(jī)查詢結(jié)果為3行:select'english最高成績(jī)',max(english)fromscoreunionallselect'english最低成績(jī)',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同樣會(huì)去除重復(fù)數(shù)據(jù)。*一次插入多條數(shù)據(jù)--把現(xiàn)有表的數(shù)據(jù)插入到新表(表不能存在),為表建備份。--select*intonewStudentfromstudent(newStudent表在select查詢的同時(shí)自動(dòng)建立。)--把現(xiàn)有表的數(shù)據(jù)復(fù)制到一個(gè)已存在的表通過(guò)這種方式復(fù)制,只能復(fù)制表中的數(shù)據(jù),以及列的名字和數(shù)據(jù)類(lèi)型。對(duì)于約束,不會(huì)復(fù)制過(guò)來(lái)。Select*intonewTblfromoldTblwhere1<>1,這樣做可以只復(fù)制表結(jié)構(gòu),但效率并不高。建議:selecttop0*intonewTblfromoldTbl=========如果表已經(jīng)存在了===============--insertintobackupStudentselect*fromstudents(backupStudent表必須提前建好)字符串函數(shù)(*)LEN():計(jì)算字符串長(zhǎng)度(字符的個(gè)數(shù)。)datalength();//計(jì)算字符串所占用的字節(jié)數(shù),不屬于字符串函數(shù)。測(cè)試varchar變量與nvarchar變量存儲(chǔ)字符串a(chǎn)的區(qū)別。見(jiàn)備注1.LOWER()、UPPER():轉(zhuǎn)小寫(xiě)、大寫(xiě)LTRIM():字符串左側(cè)的空格去掉RTRIM():字符串右側(cè)的空格去掉LTRIM(RTRIM('bb'))LEFT()、RIGHT()截取取字符串SELECTLEFT('abcdefg',2)SUBSTRING(string,start_position,length),索引從1開(kāi)始。參數(shù)string為主字符串,start_position為子字符串在主字符串中的起始位置,length為子字符串的最大長(zhǎng)度。SELECTSUBSTRING('abcdef111',2,3)嘗試使用SQLServer的幫助。日期函數(shù)GETDATE():取得當(dāng)前日期時(shí)間DATEADD(datepart,number,date),計(jì)算增加以后的日期。參數(shù)date為待計(jì)算的日期;參數(shù)number為增量;參數(shù)datepart為計(jì)量單位,可選值見(jiàn)備注。DATEADD(DAY,3,date)為計(jì)算日期date的3天后的日期,而DATEADD(MONTH,-8,date)為計(jì)算日期date的8個(gè)月之前的日期。(入職一年以上的員工發(fā)1000$)DATEDIFF(datepart,startdate,enddate):計(jì)算兩個(gè)日期之間的差額。datepart為計(jì)量單位,可取值參考DateAdd。統(tǒng)計(jì)不同入學(xué)年數(shù)的學(xué)生個(gè)數(shù):selectDateDiff(year,sInDate,getdate()),count(*)fromstudentGroupbyDateDiff(year,sInDate,getdate())DATEPART(datepart,date):返回一個(gè)日期的特定部分Month()、year()、day()來(lái)代替。統(tǒng)計(jì)學(xué)生的生日年份個(gè)數(shù):selectDatePart(year,sBirthday),count(*)fromstudentgroupbyDatePart(year,sBirthday)1990年出生的人的個(gè)數(shù)?練習(xí)創(chuàng)建一張表,記錄電話呼叫員的工作流水,記錄呼叫員編號(hào)、對(duì)方號(hào)碼、通話開(kāi)始時(shí)間、通話結(jié)束時(shí)間。建表、插數(shù)據(jù)等最后都自己寫(xiě)SQL語(yǔ)句。要求:輸出所有數(shù)據(jù)中通話時(shí)間最長(zhǎng)的5條記錄。orderbydatediff輸出所有數(shù)據(jù)中撥打長(zhǎng)途號(hào)碼(對(duì)方號(hào)碼以0開(kāi)頭)的總時(shí)長(zhǎng)。like、sum輸出本月通話總時(shí)長(zhǎng)最多的前三個(gè)呼叫員的編號(hào)。輸出本月?lián)艽螂娫挻螖?shù)最多的前三個(gè)呼叫員的編號(hào).groupby,count(*)按照月份分組。ADO.NET為什么要學(xué)ADO.NET之前我們所學(xué)只能在查詢分析器里查看數(shù)據(jù),操作數(shù)據(jù),我們不能讓普通用戶去學(xué)sql,所以我們搭建一個(gè)界面(WebWinform)讓用戶方便的操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)什么是ADO.NETADO.NET就是一組類(lèi)庫(kù),這組類(lèi)庫(kù)可以讓我們通過(guò)程序的方式訪問(wèn)數(shù)據(jù)庫(kù),就像System.IO下的類(lèi)用類(lèi)操作文件一樣,System.Data.這組類(lèi)是用來(lái)操作數(shù)據(jù)庫(kù)(不光是MSSqlServer),它提供了統(tǒng)一的編程接口讓操作其它數(shù)據(jù)庫(kù)(Access、Oracle等)的方式和操作MSSqlServer一致ADO.NET組成數(shù)據(jù)提供程序(常用類(lèi))Connection,用來(lái)連接數(shù)據(jù)庫(kù)Command,用來(lái)執(zhí)行SQL語(yǔ)句DataReader只讀、只進(jìn)的結(jié)果集,一條一條讀取數(shù)據(jù)(StreamReader、XmlReader微軟的類(lèi)庫(kù)中這些Reader的使用方式都差不多)DataAdapter,一個(gè)封裝了上面3個(gè)對(duì)象的對(duì)象。數(shù)據(jù)集(DataSet),臨時(shí)數(shù)據(jù)庫(kù)。斷開(kāi)式數(shù)據(jù)操作ADO.NET中的其他常見(jiàn)類(lèi)ConnectionStringBuilder//自動(dòng)生成連接字符串Parameter//帶參數(shù)的SQL語(yǔ)句Transaction//在ADO.NET中使用事務(wù)與DataSet相關(guān)的類(lèi):DataView//視圖類(lèi),DataTable中的數(shù)據(jù)以不同的視角查看DataRowView//DataView中的行。DataTable//DataSet中的數(shù)據(jù)表DataRow//DataTable中的行DataColumn//DataTable中的列DataRealation//DataTable與DataTable的關(guān)系Constraint//DataTable中建立的約束A訪問(wèn)數(shù)據(jù)庫(kù)的方式。11.連接數(shù)據(jù)用Connection2.執(zhí)行SQL語(yǔ)句Command3.執(zhí)行完畢之后將結(jié)果一條一條返回。DataReader2使用DataAdapter+DataSet,這種方法本質(zhì)還是通過(guò)C
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版物流信息化系統(tǒng)開(kāi)發(fā)及運(yùn)維服務(wù)合同3篇
- 2025托福保分培訓(xùn)合同書(shū)
- 二零二五年度鈑金產(chǎn)品定制設(shè)計(jì)與加工合同3篇
- 2025-2030年中國(guó)黃連素市場(chǎng)運(yùn)行狀況及投資發(fā)展前景預(yù)測(cè)報(bào)告
- 2025-2030年中國(guó)高純銅市場(chǎng)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)非調(diào)質(zhì)鋼市場(chǎng)供需現(xiàn)狀及投資發(fā)展規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)集線器行業(yè)市場(chǎng)競(jìng)爭(zhēng)格局及投資發(fā)展戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)鉑金首飾市場(chǎng)需求狀況及發(fā)展策略分析報(bào)告
- 2025-2030年中國(guó)采鹽市場(chǎng)發(fā)展?fàn)顩r及投資前景規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)過(guò)硫酸鹽市場(chǎng)發(fā)展趨勢(shì)及投資建議研究報(bào)告
- 2024年紀(jì)檢監(jiān)察綜合業(yè)務(wù)知識(shí)題庫(kù)含答案(研優(yōu)卷)
- 科室醫(yī)療質(zhì)量與安全管理小組工作制度
- 中華民族共同體概論課件第五講大一統(tǒng)與中華民族共同體初步形成(秦漢時(shí)期)
- 初二生地會(huì)考試卷及答案-文檔
- 私營(yíng)企業(yè)廉潔培訓(xùn)課件
- 施工單位值班人員安全交底和要求
- 中國(guó)保險(xiǎn)用戶需求趨勢(shì)洞察報(bào)告
- 數(shù)字化轉(zhuǎn)型指南 星展銀行如何成為“全球最佳銀行”
- 中餐烹飪技法大全
- 靈芝孢子油減毒作用課件
- 現(xiàn)場(chǎng)工藝紀(jì)律檢查表
評(píng)論
0/150
提交評(píng)論