SQL結(jié)構(gòu)化查詢語言_第1頁
SQL結(jié)構(gòu)化查詢語言_第2頁
SQL結(jié)構(gòu)化查詢語言_第3頁
SQL結(jié)構(gòu)化查詢語言_第4頁
SQL結(jié)構(gòu)化查詢語言_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

SQL結(jié)構(gòu)化查詢語言

(StructuredQueryLanguage)數(shù)據(jù)庫簡介從20世界50年代中期開始,計算機的應(yīng)用由科學(xué)研究部門逐步發(fā)展到企業(yè)、行政部門。至60年代,數(shù)據(jù)處理成為計算機的主要應(yīng)用,數(shù)據(jù)庫技術(shù)作為數(shù)據(jù)管理技術(shù),是計算機軟件領(lǐng)域的一個重要分支,產(chǎn)生與60年代末。在數(shù)據(jù)處理中,通常計算是比較簡單的,而數(shù)據(jù)的管理比較復(fù)雜。數(shù)據(jù)管理是指數(shù)據(jù)的收集、整理、組織、存儲、維護(hù)、檢索、傳送等操作,這部分操作是數(shù)據(jù)處理業(yè)務(wù)的基本環(huán)節(jié)。數(shù)據(jù)管理技術(shù)的發(fā)展經(jīng)過了3個階段:人工管理階段文件系統(tǒng)階段數(shù)據(jù)庫階段數(shù)據(jù)庫簡介人工管理階段(20世紀(jì)50年代中期以前),這一階段的計算機主要用于科學(xué)計算,其數(shù)據(jù)管理有如下特點:數(shù)據(jù)不保存在機器中,數(shù)據(jù)是程序的一部分。程序和數(shù)據(jù)不具備獨立性。每個程序都包括存儲結(jié)構(gòu)、存取方法輸出方式等,當(dāng)存儲結(jié)構(gòu)改變時,程序必須要改變。數(shù)據(jù)是面向應(yīng)用的,一組數(shù)據(jù)對應(yīng)一個程序。文件系統(tǒng)階段(20世紀(jì)50年代后期至60年代中期),這一階段,計算機不僅用于科學(xué)計算,還用于信息的管理。文件系統(tǒng)的出現(xiàn)使此時的數(shù)據(jù)管理具有如下特點:數(shù)據(jù)以文件的形式長期保存在硬盤上。程序與數(shù)據(jù)之間具有“設(shè)備獨立性”,程序只需文件名即可操作文件數(shù)據(jù)不再屬于特定的程序,可以重復(fù)使用。數(shù)據(jù)庫簡介數(shù)據(jù)庫階段(20世紀(jì)60年代末開始),數(shù)據(jù)庫階段的管理方式具有如下特點:數(shù)據(jù)不再面向特定的某個或多個應(yīng)用,而是面向整個應(yīng)用系統(tǒng)的,數(shù)據(jù)冗余明顯減少,實現(xiàn)了數(shù)據(jù)共享。有較高的數(shù)據(jù)獨立性??煞譃槲锢頂?shù)據(jù)獨立性和邏輯數(shù)據(jù)獨立性。數(shù)據(jù)庫系統(tǒng)為用戶提供了方便的用戶接口系統(tǒng)提供了多方面的數(shù)據(jù)保護(hù)功能:數(shù)據(jù)庫的恢復(fù)、并發(fā)控制、數(shù)據(jù)完整性和數(shù)據(jù)安全性,以保證數(shù)據(jù)庫中的數(shù)據(jù)是安全、正確和可靠的。應(yīng)用程序1dbdbms應(yīng)用程序1應(yīng)用程序1....數(shù)據(jù)庫簡介在數(shù)據(jù)庫技術(shù)中,有3個名詞,應(yīng)加以區(qū)分?jǐn)?shù)據(jù)庫(Database,DB):統(tǒng)一管理的數(shù)據(jù)的集合,DB能為各種用戶共享,具有較小冗余度,數(shù)據(jù)關(guān)聯(lián)密切,具有較高的數(shù)據(jù)獨立性。數(shù)據(jù)庫管理系統(tǒng)(DatabaseManagementSystem.DBMS):位于用戶和OS之間的一層數(shù)據(jù)管理軟件,為用戶或應(yīng)用程序提供訪問DB的方法。數(shù)據(jù)庫系統(tǒng)(DatabaseSystem,DBS):采用了數(shù)據(jù)庫技術(shù)的計算機系統(tǒng)。實現(xiàn)有組織地、動態(tài)地存儲大量關(guān)聯(lián)數(shù)據(jù),方便多用戶訪問的計算機軟件、硬件和數(shù)據(jù)資源組成的系統(tǒng)。數(shù)據(jù)描述在數(shù)據(jù)處理中,數(shù)據(jù)描述將涉及不同的范疇。從事物的特點到計算機中的數(shù)據(jù)表示,經(jīng)歷了三個領(lǐng)域:現(xiàn)實世界信息世界,是現(xiàn)實世界在人們頭腦中的反映,人們把它用文字和符號記載下來。數(shù)據(jù)庫技術(shù)用的如下術(shù)語:實體:客觀存在的可以相互區(qū)別的事物.實體集:性質(zhì)相同的同類實體的集合。屬性:實體有很多特性,每個特性稱為屬性。實體標(biāo)識符:能惟一標(biāo)識每個實體的屬性或?qū)傩约R脵C器世界,信息世界的信息在機器中以數(shù)據(jù)形式存在。字段:標(biāo)記實體屬性的命名單位。是可命名的最小單位。記錄:字段的有序集合,通常用一條記錄描述一個實體。文件:同一類記錄的匯聚,是描述實體集的。鍵:能惟一標(biāo)識文件中每個記錄的字段或字段集。數(shù)據(jù)關(guān)聯(lián)現(xiàn)實世界中,事物是相互聯(lián)系的。這種聯(lián)系必然在信息世界中有所反映,也就是說,實體不是孤立存在的。兩個不同的實體集的實體間聯(lián)系有三種情況:一對一關(guān)聯(lián)一對多關(guān)聯(lián)多對多關(guān)聯(lián)數(shù)據(jù)庫簡介DBMS總是基于某種數(shù)據(jù)模型的,可以分為層次型、網(wǎng)狀型、關(guān)系型(RDBMS)和面向?qū)ο笮虳BMS關(guān)系型數(shù)據(jù)庫的主要特征是用二維表格結(jié)構(gòu)表達(dá)實體集,用外鍵表示實體間聯(lián)系。常用的數(shù)據(jù)庫產(chǎn)品OracleMySQLSQLServer,AccessDB2…數(shù)據(jù)庫三級模式結(jié)構(gòu)數(shù)據(jù)庫的作用就是把數(shù)據(jù)的具體組織留給DBMS去做,用戶只要抽象的處理數(shù)據(jù),而不必關(guān)系數(shù)據(jù)在計算機中的存儲和表示。對DB的一切操作,都是通過DBMS進(jìn)行的。DB內(nèi)模式概念模式外模式外模式用戶程序用戶程序終端命令DBMSOracle數(shù)據(jù)庫的安裝Windows下Oracle10g數(shù)據(jù)庫的安裝安裝路徑盡量不要含有中文

配置全局?jǐn)?shù)據(jù)庫名和設(shè)置密碼口令管理激活用戶帳號管理后臺http://system:1158/emSQL*PLUShttp://system:5560/isqlplus/userName:scott,password:tiger/自己改TOAD的安裝和使用計算機名connectoraclesqlplussqlplus/nologconnscott/tigerconnsys/chang_on_installconnsystem/mangersqlplusscott/tigersqlplusscott/tiger@link_characterSQL語言結(jié)構(gòu)化查詢語言(StructuredQueryLanguage),具有定義、查詢、更新和控制等多種功能,是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。SQL分類:數(shù)據(jù)操縱語言DML:SELECTINSERTUPDATEDELETE數(shù)據(jù)定義語言DDL:CREATEALTERDROPRENAMETRUNCATE數(shù)據(jù)控制語言DCL:GRANTREVOKETransaction事務(wù)--》原子性操作:commitrollbacksavepoint實驗用數(shù)據(jù)表查看所有表:selecttable_namefromuser_tables;查看表結(jié)構(gòu):describedept;(或者descdept;)emp表雇員表Empno:雇員工號Ename:雇員名字Job:工作。(秘書、銷售、經(jīng)理、分析員、保管)Mgr(manager):經(jīng)理的工號Hiredate:雇用日期Sal:工資Comm:津貼Deptno:所屬部門號dept表部門表Deptno:部門號Dname:部門名字Loc:地址salgrade表薪水等級Grade:等級losal:最低工資hisal:最高工資bonus表獎金Ename:雇員名字,job:工作,sal:工資comm:津貼添加注釋為表添加注釋commentontableempis‘雇員表';select*fromuser_tab_comments為列添加注釋commentoncolumnemp.Empnois'雇員工號';select*fromuser_col_commentsSELECTSelect-from-where句型SELECT[DISTINCT]{*,columnalias,..}FROMtableWhere條件表達(dá)式aliasColumnaliasColumn“alias”ColumnasaliasSELECT語言 檢索單個列selectcolfromtableName;檢索多個列selectcol1,col2,col3fromtableName;檢索所有列select*fromtableName;使用通配符的優(yōu)點:書寫方便、可以檢索未知列使用通配符的缺點:降低檢索的性能給檢索出的列起個別名selectjob"gongzuo"fromemp;selectjobas"gongzuo"fromemp;selectselect*fromemp;selectempnofromemp;selectempnoempnumberfromemp;selectempno“empnumber”fromemp;selectempnoasempnumberfromemp;selectdistinctempnofromemp;where條件比較=,?。?<>,<,>,<=,>=,any,some,allisnull,isnotnullbetweenxandyexsits(sub-query)in(list),notin(list)like_,%,escape‘\‘_\%escape‘\’whereselect*fromempwherecommisnull;select*fromempwherecommisnotnull;selectename,salfromempwheresalin(800,1250,1500,2000);selectename,salfromempwhereenamein(‘SMITH’,‘ALLEN’,‘KING’);selectename,salfromempwheresalbetween1000and2500;selectename,salfromempwheredeptno<>10;where邏輯復(fù)合條件not,and&&,or||計算次序問題的解決,最好用括號進(jìn)行分組處理SQL優(yōu)化問題:AND:把檢索結(jié)果較少的條件放到前面OR:把檢索結(jié)果較多的條件放到前面whereselectename,hiredatefromempwherehiredate>’20-2月-81’;selectename,salfromempwheredeptno=10andsal>1000;selectename,job,deptnofromempwheredeptno=10orjob=‘CLERK’;selectename,salfromempwheresalnotin(800,1500,2000);列出deptno為10或者30,并且工資>2000的所有人。like條件表達(dá)式中字符串匹配操作符是“l(fā)ike”%通配符表示任意字符出現(xiàn)任意次數(shù)_通配符表示任意字符出現(xiàn)一次Whereenamelike‘A%’技巧和注意事項:不能過度使用通配符。如果其他操作符能達(dá)到目的,就不要使用通配符。確實需要使用通配符時,除非絕對必要,否則不要把通配符用到搜索模式最開始處,因為這樣搜索起來是最慢的。selectenamefromempwhereenamelike‘%ALL%’;selectenamefromempwhereenamelike‘_A%’;selecttestYouquerythedatabasewiththiscommand:

SELECTename

FROMemp

WHEREenameLIKE‘_a%’;

Whichnamesaredisplayed?

A.namesstartingwith‘a(chǎn)’

B.namesstartingwith‘a(chǎn)’or‘A’

C.namescontaining‘a(chǎn)’asthesecondletter

D.namescontaining‘a(chǎn)’asanyletterexceptthefirstorderby按照單個列排序orderbycol降序和升序:orderbycoldesc(asc)按多個列排序orderbycol1desc(asc),col2desc(asc)orderbyselectename,salfromemporderbyename;selectename,salfromemporderbyempno;selectename,salfromemporderbyenameasc;selectename,salfromemporderbydeptnodesc;selectename,sal,deptnofromemporderbydeptnoasc,enamedesc;創(chuàng)建計算字段為什么需要計算字段?我們經(jīng)常需要直接從數(shù)據(jù)庫中檢索出轉(zhuǎn)換、計算或格式化過的數(shù)據(jù);而不是檢索出數(shù)據(jù),然后再在客戶機應(yīng)用程序中重新格式化。計算字段并不實際存在于數(shù)據(jù)庫表Sql允許select子句中出現(xiàn)+,-,*,/以及列名和常數(shù)的表達(dá)式拼接字段(||,+)首選||(mysql中||表示or,一般用concat())Strings=“”,s1=null;S+s1創(chuàng)建計算字段selectename||’isa’||jobfromemp;selectename,sal,sal*12fromemp;selectename,sal,sal*12+500fromemp;selectename,sal,sal*(12+500)fromemp通用函數(shù)nvlSql中允許列值為空,空值用保留字NULL表示。NULL不同與0或者空格,它就是代表了一個不確定的內(nèi)容。任何含有null值的數(shù)學(xué)表達(dá)式最后的結(jié)果都為空值selectename,sal,comm,(sal*12)+comm“income”fromemp;可以通過函數(shù)nvl將NULL轉(zhuǎn)換成為一個“actualvalue”selectename,comm,nvl(comm,0)fromemp

selectename,sal,comm,(sal*12)+nvl(comm,0)“income”fromempSQL函數(shù)函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。只是將取出的數(shù)據(jù)進(jìn)行處理,不會改變數(shù)據(jù)庫中的值。函數(shù)輸入arg1arg2argn函數(shù)執(zhí)行任務(wù)輸出結(jié)果兩種SQL函數(shù)Sql函數(shù)可以分為組函數(shù)和單行函數(shù)。組函數(shù)又被稱作聚合函數(shù),用于對多行數(shù)據(jù)進(jìn)行操作,并返回一個單一的結(jié)果,組函數(shù)僅可用于選擇列表或查詢的having子句單行函數(shù)對單個數(shù)值進(jìn)行操作,并返回一個值。函數(shù)單行函數(shù)組函數(shù)單行函數(shù)的分類轉(zhuǎn)換函數(shù)字符函數(shù)數(shù)字函數(shù)日期類型其他函數(shù)單行函數(shù)字符函數(shù)字符函數(shù)全以字符作為參數(shù),返回值分為兩類:一類返回字符值,一類返回數(shù)字值concat(string1,string2)連接兩個字符串initcap(string)string中每個單詞首字母大寫Lower(string)以小寫形式返回stringtrim()substr提取字符串的一部分substr(string,1,2)upper(string)以大寫形式返回stringinstr字符串出現(xiàn)的位置,instr(string,’A‘)length字符串長度字符函數(shù)selectename,salfromempwherelower(ename)like‘__a%’;selectename,salfromempwhereupper(ename)like‘__A%’;selectsubstr(‘Hello’,1,3)fromdual;selectname,substr(ename,2)fromemp;selectename,length(ename)fromemp;selectename,instr(ename,‘a(chǎn)')fromemp;selectename,lpad(ename,'6')fromemp;數(shù)字函數(shù)數(shù)字函數(shù)以NUMBER類型為參數(shù)返回NUMBER值round(number,n)selectround(23.652)fromdual;selectround(23.652,2)fromdual;selectround(23.652,-1)fromdual;trunc(number,n)selecttrunc(23.652)fromdual;selecttrunc(23.652,2)fromdual;selecttrunc(23.652,-1)fromdual;mod(x,y)求余數(shù)selectmod(13,5)fromdual;ceil()上取整

selectceil(19.2)fromdual;floor()下取整

selectfloor(19.2)fromdual;日期和時間函數(shù)Oracle以內(nèi)部數(shù)字格式存儲日期:世紀(jì),年,月,日,小時,分鐘,秒sysdate/current_date

以date類型返回當(dāng)前的日期Add_months(d,x)返回加上x月后的日期d的值LAST_DAY(d)返回的所在月份的最后一天Months_between(date1,date2)返回date1和date2之間月的數(shù)目日期和日期時間算術(shù)從日期中加或減一個數(shù)值,以得當(dāng)一個日期結(jié)果值selectsysdate+2fromdual;selectsysdate-2fromdual;兩個日期相減以便得到他們相差多少天selectename,round((sysdate-hiredate)/7)weeksfromempwheredeptno=10轉(zhuǎn)換函數(shù)標(biāo)量數(shù)據(jù)可以有類型的轉(zhuǎn)換,轉(zhuǎn)換分為兩種,隱式類型轉(zhuǎn)換和顯示類型轉(zhuǎn)換。隱式類型轉(zhuǎn)換可用于:字符和數(shù)字的相互轉(zhuǎn)換&字符和日期的相互轉(zhuǎn)換VARCHAR2orchar--numberVARCHAR2orchar--datenumber--varchar2date--varchar2盡管數(shù)據(jù)類型之間可以進(jìn)行隱式轉(zhuǎn)換,仍建議使用顯示轉(zhuǎn)換函數(shù),以保持良好的設(shè)計風(fēng)格。轉(zhuǎn)換函數(shù)to_charto_numberto_dateNUMBERCHARACTERTO_CHARTO_NUMBERDATETO_CHARTO_DATETO_CHAR函數(shù)操作日期TO_CHAR(date,'fmt')用于將日期或時間戳轉(zhuǎn)換成varchar2類型字符串,如果指定了格式字符串,則用它控制結(jié)果的結(jié)果。格式控制串由格式元素構(gòu)成。格式控制串必須用單引號括起來格式元素含義YYYY、YY代表四位、兩位數(shù)字的年份MM用數(shù)字表示的月份MON月份的縮寫、對中文月份來說就是全稱DD數(shù)字表示的日DY星期的縮寫,對中文的星期來說就是全稱HH24,HH1212小時或者24小時進(jìn)制下的時間MI分鐘數(shù)SS秒數(shù)TO_CHAR函數(shù)操作日期Selectto_char(sysdate,'dd-mon-yyhh24:mi:ss')"RigthNow"fromdual;selectename,hiredate,to_char(hiredate,'yyyy/mm/dd')fromempselectsysdate,to_char(sysdate,'yyyy-mon-ddhh12:mi:ss')fromdual;TO_CHAR函數(shù)操作數(shù)字to_char(num,format)用于將Number類型參數(shù)轉(zhuǎn)換為varchar2類型,如果指定了format,它會控制整個轉(zhuǎn)換??刂品x9代表一位數(shù)字,如果該位沒有數(shù)字則不進(jìn)行顯示,但對于小數(shù)點后面的部分仍會強制顯示0代表一位數(shù)字,如果該位沒有數(shù)字則強制顯示0$顯示美元符號L顯示本地貨幣符號.顯示小數(shù)點,顯示千分位符號TO_CHAR函數(shù)操作數(shù)字selectto_char(sal,‘$99,999.9999’)salaryfromempwhereename=‘ALLEN’;selectto_char(sal,‘$00,000.0000’)salaryfromempwhereename=‘ALLEN’;selectto_char(123456,'99,99,00')fromdual;to_number&to_dateto_date(String,format)將char或varchar2類型的string轉(zhuǎn)換為date類型Select

to_date('04,05,19,10,23,40','yy,mm,dd,hh12,mi,ss')fromdual;selectto_date('2004-09-19','yyyy-mm-dd')fromdual;to_number(String,format)將char或varchar2類型的string轉(zhuǎn)換為number類型selectto_number('$39343.783','$99990.000')fromdual;selectto_number('11.231','999.999')fromdual;單行函數(shù)嵌套單行函數(shù)可被嵌入到任何層嵌套函數(shù)從最深層到最低層求值F3(F2(F1(col,arg1),arg2),arg3)Step1=Result1Step2=Result2Step3=Result3單行函數(shù)嵌套顯示沒有上級管理的公司首腦selectename,nvl(to_char(mgr),’nomanager’)fromempwheremgrisnull;顯示員工雇傭期滿6個月后下一個星期五的日期Selectto_char(next_day(add_months(hiredate,6),’Friday’),’fmDay,Monthddth,YYYY’)“review”fromemporderbyhiredate;組函數(shù)組函數(shù)基于多行數(shù)據(jù)返回單個值EMP員工表中工資的最高值DEPTNOSAL------------------1024501050001013002080020110020300020300020297530160030285030125030950301500301250MAX(SAL)---------5000組函數(shù)avg()

返回某列的平均值min()返回某列的最小值max()返回某列的最大值sum()返回某列值的和count()返回某列的行數(shù)組函數(shù)僅在選擇列表和Having子句中有效組函數(shù)在數(shù)字類型數(shù)據(jù)使用AVGandSUM函數(shù)selectsum(sal),avg(sal),max(sal),min(sal)fromemp;MINandMAX適用于任何數(shù)據(jù)類型selectmin(hiredate),max(hiredate)fromemp;組函數(shù)除了count(*)外,都跳過空值而處理非空值selectcount(*)fromemp;selectcount(comm)fromemp;selectcount(distinctdeptno)fromemp;在分組函數(shù)中使用NVL函數(shù)

selectavg(comm)fromemp;NVL函數(shù)迫使分組函數(shù)包括空值selectavg(nvl(comm,0))fromemp;數(shù)據(jù)分組創(chuàng)建分組groupby子句Groupby子句可以包含任意數(shù)目的列。除組函數(shù)語句外,select語句中的每個列都必須在groupby子句中給出。如果分組列中具有null值,則null將作為一個分組返回。如果列中有多行null值,他們將分為一組。Groupby子句必須出現(xiàn)在where子句之后,orderby子句之前。過濾分組(having子句)Where過濾行,having過濾分組。Having支持所有where操作符。分組和排序一般在使用groupby子句時,應(yīng)該也給出orderby子句。數(shù)據(jù)分組SELECT column,group_functionFROM table[WHERE condition][GROUPBYgroup_by_expression][ORDERBYcolumn];使用GROUPBY子句將表分成小組結(jié)果集隱式按升序排列,如果需要改變排序方式可以使用Orderby子句數(shù)據(jù)分組出現(xiàn)在SELECT列表中的字段,如果出現(xiàn)的位置不是在組函數(shù)中,那么必須出現(xiàn)在GROUPBY子句中selectdeptno,avg(sal)fromempgroupbydeptnoGROUPBY列可以不在SELECT列表中selectavg(sal)fromempgroupbydeptno不能在WHERE子句中使用組函數(shù).不能在WHERE子句中限制組.使用Having對分組進(jìn)行限制selectavg(sal)fromempgroupbydeptnohavingavg(sal)>1000;Select子句順序子句說明是否必須使用select要返回的列或表達(dá)式是from從中檢索數(shù)據(jù)的表僅在從表選擇數(shù)據(jù)時使用where行級過濾否groupby分組說明僅在按組計算聚集時使用Having組級過濾否orderby輸出排序順序否Select子句順序Sql語句執(zhí)行過程:讀取from子句中的基本表、視圖的數(shù)據(jù),[執(zhí)行笛卡爾積操作]。選取滿足where子句中給出的條件表達(dá)式的元組按group子句中指定列的值分組,同時提取滿足Having子句中組條件表達(dá)式的那些組按select子句中給出的列名或列表達(dá)式求值輸出Orderby子句對輸出的目標(biāo)表進(jìn)行排序。例子selectmax(sal)fromempgroupbydeptno;selectmax(sal),deptno,job fromemp groupbydeptno,job;selectavg(sal)fromemp wheresal>1200 groupbydeptno havingavg(sal)>1500 orderbyavg(sal);多表查詢EMPLOYEES

DEPARTMENTS……sql:1992語法的連接語法規(guī)則:

SELECT table1.column,table2.column FROM table1,table2 WHERE table1.column1=table2.column2;在WHERE子句中寫入連接條件當(dāng)多個表中有重名列時,必須在列的名字前加上表名作為前綴連接的類型:等值連接–Equijoin非等值連接--Non-equijoin外連接--Outerjoin自連接--Selfjoin笛卡爾積selectcount(*)fromempselectcount(*)fromdeptselectemp.empno,dept.loc fromemp,dept檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)檢索出的列的數(shù)目將是第一個表中的列數(shù)加上第二個表中的列數(shù)應(yīng)該保證所有聯(lián)結(jié)都有where子句,不然數(shù)據(jù)庫返回比想要的數(shù)據(jù)多得多的數(shù)據(jù)

等值連接EMPLOYEES

DEPARTMENTSForeignkey外鍵Primarykey主鍵……等值連接使用AND操作符增加查詢條件EMPLOYEES

DEPARTMENTS

……等值連接selectemp.empno,emp.ename,dept.deptno,dept.loc fromemp,dept whereemp.deptno=dept.deptno andemp.deptno=10selectemp.empno,emp.ename,dept.deptno,dept.loc fromemp,dept whereemp.deptno=dept.deptno andename='JAMES'連接中使用表的別名使用表的別名簡化了查詢selecte.empno,e.ename,e.deptno,d.deptno,d.loc fromempe,deptd wheree.deptno=d.deptno多于兩個表的連接為了連接n個表,至少需要n-1個連接條件。EMPLOYEES

LOCATIONS

DEPARTMENTS

…多于兩個表的連接createtablemanager as select*fromemp;Manager,emp,deptselecte.empno,e.ename,m.ename,d.loc fromempe,managerm,deptd wheree.mgr=m.empno ande.deptno=d.deptno ande.job=‘ANALYST’非等值連接select* fromemp,salgrade wheresalbetweenlosalandhisal外連接empDEPt沒有雇員屬于40,50部門Dept.deptno=emp.deptno外連接為了在操作時能保持這些將被舍棄的元組,提出了外連接的概念,使用外連接可以看到不滿足連接條件的記錄外連接運算符是(+)有左外連接和右外連接左外連接顯示左邊表的全部行SELECT table.column,table.column FROM table1,table2 WHERE table1.column=table2.column(+);右外連接顯示右邊表的全部行SELECT table.column,table.column FROM table1,table2 WHERE table1.column(+)=table2.column;外連接selecte.ename,d.deptno,d.dname fromempe,deptd whered.deptno=e.deptno(+);selecte.ename,d.deptno,d.dname fromempe,deptd wheree.deptno(+)=d.deptno;自連接查找每個員工的上級主管selectworker.ename||’worksfor‘||manager.enamefromempworker,empmanagerwhereworker.mgr=manager.empnosql:1999語法的連接sql1992的語法規(guī)則暴露了這樣的缺點:語句過濾條件和表連接的條件都放到了where子句中。當(dāng)條件過多時,聯(lián)結(jié)條件多,過濾條件多時,就容易造成混淆。SQL1999修正了整個缺點,把聯(lián)結(jié)條件,過濾條件分開來,包括以下新的TABLEJOIN的句法結(jié)構(gòu):CROSS

JOINNATURALJOINUSING子句ON子句LEFTOUTERJOINRIGHTOUTERJOINFULLOUTERJOIN交叉連接CROSSJOIN產(chǎn)生了一個笛卡爾積,就象是在連接兩個表格時忘記加入一個WHERE子句一樣

selectemp.empno,emp.ename,emp.deptno,dept.loc

fromemp,dept;可以使用CROSSJOIN來達(dá)到相同的結(jié)果

selectemp.empno,emp.ename,emp.deptno,dept.loc

fromempcrossjoindept;自然連接NATURALJOIN子句基于兩個表中列名完全相同的列產(chǎn)生連接兩個表有相同名字的列數(shù)據(jù)類型相同從兩個表中選出連接列的值相等的所有行select*fromempnaturaljoindeptWheredeptno=10;自然連接的結(jié)果不保留重復(fù)的屬性using創(chuàng)建連接selecte.ename,e.ename,e.sal,deptno,d.loc fromempejoindeptdusing(deptno) wheredeptno=20using子句引用的列在sql任何地方不能使用表名或者別名做前綴,同樣適合natural子句使用on創(chuàng)建連接自然連接的條件是基于表中所有同名列的等值連接為了設(shè)置任意的連接條件或者指定連接的列,需要使用ON子句連接條件與其它的查詢條件分開書寫使用ON子句使查詢語句更容易理解selectename,dname fromempjoindeptonemp.deptno=dept.deptno whereemp.deptno=30;使用on創(chuàng)建連接三表連接檢索雇員名字、所在單位、薪水等級:這三個信息在三個表里面,所以只能用多表聯(lián)結(jié)

selectename,dname,grade fromemp joindeptonemp.deptno=dept.deptno joinsalgradeonemp.salbetweensalgrade.losalandsalgrade.hisal;左外連接在LEFTOUTERJOIN中,會返回所有左邊表中的行,即使在右邊的表中沒有可對應(yīng)的列值。selecte.ename,d.deptno,d.dname fromdeptd leftouterjoinempe one.deptno=d.deptnoselecte.ename,d.deptno,d.dname fromempe,deptd whered.deptno=e.deptno(+);右外連接RIGHTOUTERJOIN中會返回所有右邊表中的行,即使在左邊的表中沒有可對應(yīng)的列值。selecte.ename,d.deptno,d.dname fromempe rightouterjoindeptd one.deptno=d.deptnoselecte.ename,d.deptno,d.dname fromempe,deptd wheree.deptno(+)=d.deptno;子查詢SQL允許多層嵌套。子查詢,即嵌套在其他查詢中的查詢。SELECT select_list FROM table WHERE exproperator (SELECT select_list FROM table);理解子查詢的關(guān)鍵在于把子查詢當(dāng)作一張表來看待。外層的語句可以把內(nèi)嵌的子查詢返回的結(jié)果當(dāng)成一張表使用。子查詢要用括號括起來將子查詢放在比較運算符的右邊(增強可讀性)子查詢的種類按照子查詢返回的記錄數(shù),子查詢可以分為單行子查詢和多行子查詢單行子查詢主查詢子查詢

返回CLERK多行子查詢CLERKMANAGER主查詢子查詢

返回單行子查詢子查詢返回一行記錄使用單行記錄比較運算符Operator=>>= <<= <>MeaningEqualtoGreaterthanGreaterthanorequaltoLessthanLessthanorequaltoNotequalto單行子查詢我們要查詢有哪些人的薪水是在整個雇員的平均薪水之上的:首先求所有雇員的平均薪水

selectavg(sal+nvl(comm,0))fromemp

然后求:

selectename,empno,sal,sal+nvl(comm,0) fromemp wheresal+nvl(comm,0)>(selectavg(sal+nvl(comm,0))fromemp);此處嵌套的子查詢在外層查詢處理之前執(zhí)行多行子查詢子查詢返回多行行記錄使用集合比較運算符運算符

INsome

ALL含義等于列表中的任何值將值與子查詢返回的任意一個值進(jìn)行比較比較子查詢返回的每一個值在多行子查詢中使用in我們要查在雇員中有哪些人是經(jīng)理人,也就是說,有哪些人的empno號在mgr這個字段中出現(xiàn)過,這個時候,應(yīng)當(dāng)首先查詢mgr中有哪些號碼,然后再看看有哪些人的雇員號碼在此出現(xiàn):

selectempno,ename fromemp whereempnoin( selectdistinctmgrfromemp);在多行子查詢中使用someall找出部門編號為20的所有員工中收入最高的職員

select*fromemp wheresal>=all( selectsal fromemp wheredeptno=20) anddeptno=20在From子句中使用子查詢我們要求每個部門平均薪水的等級,可以這樣考慮,首先將每個部門的平均薪水求出來,然后把結(jié)果當(dāng)成一張表,再用這張結(jié)果表和salgrade表做連接,以此求得薪水等級。先求出每個部門平均薪水的表t。將t和salgrade進(jìn)行關(guān)聯(lián)查詢就可以了。

select*from salgrades,(selectdeptno,avg(sal)avg_sal fromempgroupbydeptno)t wheret.avg_salbetweens.losalands.hisal;SQL數(shù)據(jù)更新Sql的數(shù)據(jù)更新包括數(shù)據(jù)插入、刪除和修改3個操作.往表中插入數(shù)據(jù)的語句是insert語句,方式有兩種,一種是元組值的插入,一種是查詢結(jié)果的插入元組值的插入語法如下:INSERTINTO table[(column[,column...])]VALUES (value[,value...]);一次插入操作只插入一行Insert語句insertintoemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(1111,'gao','clerk',7902,sysdate,10000,3000,40)此處插入的元組中列的個數(shù)、順序與emp的結(jié)構(gòu)完全一致,因此表名之后的列名可以省略不寫insertintoemp values(2222,'gaohs','clerk',7902,sysdate,10000,3000,40)可以只插入部分列insertintoemp(empno,ename) values(3333,'xiaozhang')但要求省略的列必須滿足下面的條件:該列定義為允許Null值。在表定義中給出默認(rèn)值,這表示如果不給出值,將使用默認(rèn)值。如果不符合上面兩個條件,將會報錯。不能成功插入。Insert語句可以用insert語句把一個select語句的查詢結(jié)果插入到一個基本表中,語法如下:Insertintotablename(column,..)select*fromtablename2創(chuàng)建一個臨時表

createtabletemp as select*fromemp where1=2執(zhí)行插入

insertintossselect*fromemp;DELETE語句SQL的刪除操作是指從基本表中刪除元組,語法如下:

DELETE[FROM] table [WHERE condition];其語義是從基本表中刪除滿足條件表達(dá)式的元組Deletefromtable表示從表中刪除一切元組如果想從表中刪除所有的行,不要使用delete,可使用truncatetable

語句,完成相同的工作,但是速度更快。UPDATE語句Update語句用于修改基本表中元組的某些列,其語法如下:UPDATE tableSET column=value[,column=value]…[WHERE condition];其語義是:修改基本表中滿足條件表達(dá)式的那些元組的列值,需修改的列值在set子句中指出。事務(wù)處理事務(wù)(Transaction)是一個操作序列。這些操作要么都做,要么都不做,是一個不可分割的工作單位,是數(shù)據(jù)庫環(huán)境中的邏輯工作單位。事務(wù)是為了保證數(shù)據(jù)庫的完整性事務(wù)不能嵌套在oracle中,沒有事務(wù)開始的語句。一個Transaction起始于一條DML(Insert、Update和Delete)語句,結(jié)束于以下的幾種情況:用戶顯式執(zhí)行Commit語句提交操作或Rollback語句回退。當(dāng)執(zhí)行DDL(Create、Alter、Drop)語句事務(wù)自動提交。用戶正常斷開連接時,Transaction自動提交。系統(tǒng)崩潰或斷電時事務(wù)自動回退。Commit&RollbackCommit表示事務(wù)成功地結(jié)束,此時告訴系統(tǒng),數(shù)據(jù)庫要進(jìn)入一個新的正確狀態(tài),該事務(wù)對數(shù)據(jù)庫的所有更新都以交付實施。每個Commit語句都可以看成是一個事務(wù)成功的結(jié)束,同時也是另一個事務(wù)的開始。Rollback表示事務(wù)不成功的結(jié)束,此時告訴系統(tǒng),已發(fā)生錯誤,數(shù)據(jù)庫可能處在不正確的狀態(tài),該事務(wù)對數(shù)據(jù)庫的更新必須被撤銷,數(shù)據(jù)庫應(yīng)恢復(fù)該事務(wù)到初始狀態(tài)。每個Rollback語句同時也是另一個事務(wù)的開始。一旦執(zhí)行了commit語句,將目前對數(shù)據(jù)庫的操作提交給數(shù)據(jù)庫(實際寫入DB),以后就不能用rollback進(jìn)行撤銷。執(zhí)行一個DDL,dcl語句或從SQL*Plus正常退出,都會自動執(zhí)行commit命令。提交或回滾前數(shù)據(jù)的狀態(tài)以前的數(shù)據(jù)可恢復(fù)當(dāng)前的用戶可以看到DML操作的結(jié)果其他用戶不能看到DML操作的結(jié)果被操作的數(shù)據(jù)被鎖住,其他用戶不能修改這些數(shù)據(jù)提交后數(shù)據(jù)的狀態(tài)數(shù)據(jù)的修改被永久寫在數(shù)據(jù)庫中.數(shù)據(jù)以前的狀態(tài)永久性丟失.所有的用戶都能看到操作后的結(jié)果.記錄鎖被釋放,其他用戶可操作這些記錄.回滾后數(shù)據(jù)的狀態(tài)語句將放棄所有的數(shù)據(jù)修改修改的數(shù)據(jù)被回退.恢復(fù)數(shù)據(jù)以前的狀態(tài).行級鎖被釋放.數(shù)據(jù)庫的對象對象名稱 描述表 基本的數(shù)據(jù)存儲對象,以行和列的形式存在,列 也就是字段,行也就是記錄約束 執(zhí)行數(shù)據(jù)校驗,保證了數(shù)據(jù)完整性的視圖 一個或者多個表數(shù)據(jù)的邏輯顯示索引 用于提高查詢的性能Sequence數(shù)據(jù)庫對象的命名規(guī)則必須以字母開頭可包括數(shù)字和三個特殊字符(#_$)不要使用oracle的保留字同一用戶下的對象不能同名ORACLE常用數(shù)據(jù)類型數(shù)據(jù)類型含義Varchar2(n)變長字符串,存儲空間等與實際空間的數(shù)據(jù)大小,最大為4K,長度以字節(jié)為單位指定(注意中文字符)Char(n)定長字符串,存儲空間大小固定Long變長字符串,最大字節(jié)數(shù)達(dá)到2GBNumber(p,s)整數(shù)或小數(shù),p是精度(所有數(shù)字位的個數(shù),最大38),s是刻度范圍(小數(shù)點右邊的數(shù)字位個數(shù))Date年、月、日、時、分、秒Long變長字符串,最大字節(jié)數(shù)達(dá)到2GB表的創(chuàng)建標(biāo)準(zhǔn)的建表語法:

CREATETABLE[schema.]table (column

datatype[DEFAULTexpr],… );在創(chuàng)建新表時,指定的表名必須不存在,否則將出錯。使用默認(rèn)值:當(dāng)插入行時如果不給出值,dbms將自動采用默認(rèn)值。在用Create語句創(chuàng)建基本表時,最初只是一個空的框架,用戶可以使用insert命令把數(shù)據(jù)插入表中。表的創(chuàng)建設(shè)計要求:建立一張用來存儲學(xué)生信息的表,表中的字段包含了學(xué)生的學(xué)號、姓名、年齡、入學(xué)日期、年級、班級、email等信息,并且為grade指定了默認(rèn)值為1,如果在插入數(shù)據(jù)時不指定grade得值,就代表是一年級的學(xué)生createtablestu ( idnumber(6), namevarchar2(20)notnullunique, sexnumber(1)notnull, agenumber(3), sdatedate, gradenumber(2)default1, classnumber(4), emailvarchar2(50) );表的創(chuàng)建使用子查詢創(chuàng)建表的語法

CREATETABLEtable[column(,column...)] ASsubquery;新表的字段列表必須與子查詢中的字段列表匹配字段列表可以省略createtableemp2asselect*fromemp;表結(jié)構(gòu)的修改在基本表建立并使用一段時間后,可以根據(jù)實際需要對基本表的結(jié)構(gòu)進(jìn)行修改增加新的列用“altertable…add…”語句

altertableempaddaddressvarchar(20)

新增加的類不能定義為“notnull”,基本表在增加一列后,原有元組在新增加的列上的值都定義為空值。刪除原有的列用“altertable…drop…”語句,語法格式:altertable表名dropcolumn列名

altertableempdropcolumnaddress修改字段“altertable...modify...” altertableempmodify(jobvarchar(50))表結(jié)構(gòu)的修改在基本表不需要時,可以使用“droptable”語句撤消。在一個基本表撤消后,所有的數(shù)據(jù)都丟棄。所有相關(guān)的索引被刪除

droptableempcascadeconstraints可以使用RENAME語句改變表名(視圖),要求必須是表(視圖)的所有者RENAMEold_nameTOnew_name約束constraint當(dāng)我們創(chuàng)建表的時候,同時可以指定所插入數(shù)據(jù)的一些規(guī)則,比如說某個字段不能為空值,某個字段的值(比如年齡)不能小于零等等,這些規(guī)則稱為約束。約束是在表上強制執(zhí)行的數(shù)據(jù)校驗規(guī)則.Oracle支持下面五類完整性約束:NOTNULL 非空UNIQUEKey 唯一鍵PRIMARYKEY 主鍵FOREIGNKEY 外鍵CHECK 自定義檢查約束約束constraintOracle使用SYS_Cn格式命名約束,也可以由用戶命名創(chuàng)建約束的時機在建表的同時創(chuàng)建建表后創(chuàng)建約束從作用上分類,可以分成兩大類:表級約束:可以約束表中的任意一列或多列。可以定義出了NotNull以外的任何約束。列級約束:只能約束其所在的某一列。可以定義任何約束。

主鍵約束(PRIMARYKEY)主鍵約束是數(shù)據(jù)庫中最重要的一種約束。在關(guān)系中,主鍵值不可為空,也不允許出現(xiàn)重復(fù),即關(guān)系要滿足實體完整性規(guī)則。主鍵從功能上看相當(dāng)于非空且唯一一個表中只允許一個主鍵主鍵是表中能夠唯一確定一個行數(shù)據(jù)的字段主鍵字段可以是單字段或者是多字段的組合Oracle為主鍵創(chuàng)建對應(yīng)的唯一性索引主鍵約束主鍵可用下列兩種形式之一定義主鍵子句 在表的定義中加上如下子句primarykey(列)主鍵短語 在主屬性的定義之后加上primarykey字樣。上述形式Oracle會自動命名約束,可自己給約束起名createtablet3( idnumber(4), constraintt3_pkprimarykey(id) )非空約束(NOTNULL)確保字段值不允許為空只能在字段級定義

CREATETABLEemployees( employee_idNUMBER(6), nameVARCHAR2(25)NOTNULL, salaryNUMBER(8,2), hire_dateDATECONSTRAINTemp_hire_date_nnNOTNULL )唯一性約束(UNIQUE)唯一性約束條件確保所在的字段或者字段組合不出現(xiàn)重復(fù)值唯一性約束條件的字段允許出現(xiàn)空值Oracle將為唯一性約束條件創(chuàng)建對應(yīng)的唯一性索引

CREATETABLEemployees( idNUMBER(6), nameVARCHAR2(25)NOTNULLUNIQUE, emailVARCHAR2(25), salaryNUMBER(8,2), hire_dateDATENOTNULL, CONSTRAINTemp_email_ukUNIQUE(email) );CHECK約束Check約束用于對一個屬性的值加以限制在check中定義檢查的條件表達(dá)式,數(shù)據(jù)需要符合設(shè)置的條件createtableemp3( idnumber(4)primarykey, agenumber(2)check(age>0andage<100), salarynumber(7,2), sexchar(1), constraintsalary_checkcheck(salary>0))在這種約束下,插入記錄或修改記錄時,系統(tǒng)要測試新的記錄的值是否滿足條件關(guān)系模型的三類完整性規(guī)則為了維護(hù)數(shù)據(jù)庫中的數(shù)據(jù)與現(xiàn)實世界的一致性,關(guān)系數(shù)據(jù)庫的數(shù)據(jù)與更新操作必須遵循下列三類完整性規(guī)則:實體完整性規(guī)則 這條規(guī)則要求關(guān)系中在組成主鍵的屬性上不能有空值。參照完整性規(guī)則 這條規(guī)則要求“不引用不存在的實體”。例如:deptno是dept表的主鍵,而相應(yīng)的屬性也在表emp中出現(xiàn),此時deptno是表emp的外鍵。在emp表中,deptno的取值要么為空,要么等于dept中的某個主鍵值。用戶定義的完整性規(guī)則 用戶定義的完整性規(guī)則反應(yīng)了某一具體的應(yīng)用涉及的數(shù)據(jù)必須滿足的語義要求。外鍵約束(FOREIGNKEY)外鍵是表中的一個列,其值必須在另一表的主鍵中列出。作為主鍵的表稱為“主表”,作為外鍵的關(guān)系稱為“依賴表”外鍵參照的是主表的主鍵或者唯一鍵對于主表的刪除和修改主鍵值的操作,會對依賴關(guān)系產(chǎn)生影響,以刪除為例:當(dāng)要刪除主表的某個記錄(即刪除一個主鍵值,那么對依賴的影響可采取下列3種做法:RESTRICT方式:只有當(dāng)依賴表中沒有一個外鍵值與要刪除的主表中主鍵值相對應(yīng)時,才可執(zhí)行刪除操作。CASCADE方式:將依賴表中所有外鍵值與主表中要刪除的主鍵值相對應(yīng)的記錄一起刪除SETNULL方式:將依賴表中所有與主表中被刪除的主鍵值相對應(yīng)的外鍵值設(shè)為空值FOREIGNKEY(DEPTNO)REFERENCESDEPT(DEPTNO)[ONDELETE[CASCADE|SETNULL]]如省略on短語,缺省為第一中處理方式。約束的添加和撤銷可增加或刪除約束,但不能直接修改

altertabletablename

增加

addconstraintcon_nameunique(col)

刪除

dropconstraintcom_name[cascade]查詢constraintselectconstraint_name,constraint_type fromuser_constraints wheretable_name=‘a(chǎn)aa’

或者whereowner=‘SCOTT’大寫selectconstraint_name,column_namefromuser_cons_columns whertable_name=‘TABLENAME’VIEW定義:視圖是從若干基本表和(或)其他視圖構(gòu)造出來的表。在創(chuàng)建一個視圖時,只是存放的視圖的定義,也即是動態(tài)檢索數(shù)據(jù)的查詢語句,而并不存放視圖對應(yīng)的數(shù)據(jù),在用戶使用視圖時才去求相對應(yīng)的數(shù)據(jù)。所以視圖被稱作“虛表”視圖的作用:可以限制對數(shù)據(jù)的訪問,可以給用戶授予表的特定部分的訪問權(quán)限而不是整個表的訪問權(quán)限??梢允箯?fù)雜的查詢變的簡單。在編寫查詢后,可以方便地重用它而不必知道他的基本查詢細(xì)節(jié)。提供了對相同數(shù)據(jù)的不同顯示創(chuàng)建視圖在CREATEVIEW語句后加入子查詢.CREATE[ORREPLACE]VIEWview[(alias[,alias]...)]ASsubquery[WITHREADONLY];createorreplaceviewv$_emp_dept asselectemp.deptno,ename,dnamefromempjoindeptonemp.deptno=dept.deptnowithreadonly視圖在查詢時,不需要再寫完全的Select查詢語句,只需要簡單的寫上從視圖中查詢的語句就可以了select*fromv$_

溫馨提示

  • 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

提交評論