版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.第1章 數(shù)據(jù)庫簡介 1. 數(shù)據(jù)庫的概念 數(shù)據(jù)庫(database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫,每個數(shù)據(jù)庫都有一個或多個不同的api用于創(chuàng)建,訪問,管理,搜索和復(fù)制所保存的數(shù)據(jù)。我們也可以將數(shù)據(jù)存儲在文件中,但是在文件中讀寫數(shù)據(jù)速度相對較慢。所以,現(xiàn)在我們使用關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(rdbms)來存儲和管理的大數(shù)據(jù)量。所謂的關(guān)系型數(shù)據(jù)庫,是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。 rdbms即關(guān)系數(shù)據(jù)庫管理系統(tǒng)(relational database management system)的特點: 1.數(shù)據(jù)以表格的形式出現(xiàn) 2.每行為各種記
2、錄名稱 3.每列為記錄名稱所對應(yīng)的數(shù)據(jù)域 4.許多的行和列組成一張表單 5.若干的表單組成databaserdbms 術(shù)語在我們開始學(xué)習(xí)my sql 數(shù)據(jù)庫前,讓我們先了解下rdbms的一些術(shù)語: 數(shù)據(jù)庫: 數(shù)據(jù)庫是一些關(guān)聯(lián)表的集合。. 數(shù)據(jù)表: 表是數(shù)據(jù)的矩陣。在一個數(shù)據(jù)庫中的表看起來像一個簡單的電子表格。 列: 一列(數(shù)據(jù)元素) 包含了相同的數(shù)據(jù), 例如郵政編碼的數(shù)據(jù)。 行:一行(=元組,或記錄)是一組相關(guān)的數(shù)據(jù),例如一條用戶訂閱的數(shù)據(jù)。 冗余:存儲兩倍數(shù)據(jù),冗余可以使系統(tǒng)速度更快。 主鍵:主鍵是唯一的。一個數(shù)據(jù)表中只能包含一個主鍵。你可以使用主鍵來查詢數(shù)據(jù)。 外鍵:外鍵用于關(guān)聯(lián)兩個表。
3、復(fù)合鍵:復(fù)合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復(fù)合索引。精品. 索引:使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu)。類似于書籍的目錄。 參照完整性: 參照的完整性要求關(guān)系中不允許引用不存在的實體。與實體完整性是關(guān)系模型必須滿足的完整性約束條件,目的是保證數(shù)據(jù)的一致性。my sql數(shù)據(jù)庫my sql是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典my sql ab公司開發(fā),目前屬于oracle公司。my sql是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。 my sql是開源
4、的,所以你不需要支付額外的費用。 my sql支持大型的數(shù)據(jù)庫??梢蕴幚頁碛猩锨f條記錄的大型數(shù)據(jù)庫。 my sql使用標(biāo)準(zhǔn)的sql數(shù)據(jù)語言形式。 my sql可以允許于多個系統(tǒng)上,并且支持多種語言。這些編程語言包括c、c+、python、java、perl、php、eiffel、ruby和tcl等。 my sql對php有很好的支持,php是目前最流行的web開發(fā)語言。 my sql支持大型數(shù)據(jù)庫,支持5000萬條記錄的數(shù)據(jù)倉庫,32位系統(tǒng)表文件最大可支持4gb,64位系統(tǒng)支持最大的表文件為8tb。 my sql是可以定制的,采用了gpl協(xié)議,你可以修改源碼來開發(fā)自己的my sql系統(tǒng)。精品
5、.第2章 my sql數(shù)據(jù)庫的安裝與配置1. 所需my sql安裝包mysql-5.0.41_setup. exe2. 安裝方法步驟圖解1運行安裝程序下一步 2. 選擇“custom”自定義安裝,下一步 3. 這里可以將不需要的安裝刪除,可以更改安裝目錄,下一步精品. 4. 單擊“install”按鈕,開始安裝 5. 安裝中,耐心等一會兒 6.這里是詢問你是否要注冊一個my sql.com的賬號,或是使用已有的賬號登陸my sql.com,一般不需要了,點選“skip sign-up”,按“next”略過此步驟。精品. 7.安裝完成出現(xiàn)如下界面 現(xiàn)在軟件安裝完成了,出現(xiàn)上面的界面,這里有一個很
6、好的功能, my sql配置向?qū)В挥孟蛞郧耙粯?,自己手動亂七八糟的配置my.ini了,將 “configure the my sql server now”前面的勾打上,點“finish”結(jié)束軟件的安裝并啟動 my sql配置向?qū)А?8. 進入配置過程 9. 選擇配置方式 選擇配置方式,“detailed configuration(手動精確配置)”、“standard configuration(標(biāo)準(zhǔn)配置)”,我們選擇“detailed configuration”,方便熟悉配置過程。精品. 10.選擇服務(wù)器類型,“developer machine(開發(fā)測試類,my sql占用很少資源)
7、”、“server machine(服務(wù)器類型,my sql占用較多資源)”、“dedicated my sql server machine(專門的數(shù)據(jù)庫服務(wù)器,my sql占用所有可用資源)”,大家根據(jù)自己的類型選擇了,一般選“server machine”,不會太少,也不會占滿。 11. 選擇my sql數(shù)據(jù)庫的大致用途,“multi functional database(通用多功能型,好)”、“tran sac tional database only(服務(wù)器類型,專注于事務(wù)處理,一般)”、“non - tran sac tional database only(非事務(wù)處理型,較簡單
8、,主要做一些監(jiān)控、記數(shù)用,對myl sam數(shù)據(jù)類型的支持僅限于non - tran sac tional),隨自己的用途而選擇了,我這里選擇“tran sac tional database only”,按“next”繼續(xù)。精品. 12. 對innodb table space進行配置,就是為innodb 數(shù)據(jù)庫文件選擇一個存儲空間,如果修改了,要記住位置,重裝的時候要選擇一樣的地方,否則可能會造成數(shù)據(jù)庫損壞,當(dāng)然,對數(shù)據(jù)庫做個備份就沒問題了,這里不詳述。我這里沒有修改,使用用默認位置,直接按“next”繼續(xù) 13. 選擇您的網(wǎng)站的一般my sql訪問量,同時連接的數(shù)目,“decision s
9、upport(dss)/olap(20個左右)”、“online transaction processing(oltp)(500個左右)”、“manual setting(手動設(shè)置,自己輸一個數(shù))”,我這里選“online transaction processing(oltp)”,自己的服務(wù)器,應(yīng)該夠用了,按“next”繼續(xù) 精品.14. 是否啟用tcp/ip連接,設(shè)定端口,如果不啟用,就只能在自己的機器上訪問my sql數(shù)據(jù)庫了,我這里啟用,把前面的勾打上,port number:3306,在這個頁面上,您還可以選擇“啟用標(biāo)準(zhǔn)模式”(enable strict mode),這樣my sq
10、l就不會允許細小的語法錯誤。如果您還是個新手,我建議您取消標(biāo)準(zhǔn)模式以減少麻煩。但熟悉my sql以后,盡量使用標(biāo)準(zhǔn)模式,因為它可以降低有害數(shù)據(jù)進入數(shù)據(jù)庫的可能性。按“next”繼續(xù) 15. 這個比較重要,就是對my sql默認數(shù)據(jù)庫語言編碼進行設(shè)置,第一個是西文編碼,第二個是多字節(jié)的通用utf8編碼,都不是我們通用的編碼,這里選擇第三個,然后在character set那里選擇或填入“gbk”,當(dāng)然也可以用“gb2312”,區(qū)別就是gbk的字庫容量大,包括了gb2312的所有漢字,并且加上了繁體字、和其它亂七八糟的字使用my sql的時候,在執(zhí)行數(shù)據(jù)操作命令之前運行一次“set names g
11、bk;”(運行一次就行了,gbk可以替換為其它值,視這里的設(shè)置而定),就可以正常的使用漢字(或其它文字)了,否則不能正常顯示漢字。按 “next”繼續(xù)。 16. 選擇是否將my sql安裝為windows服務(wù),還可以指定service name(服務(wù)標(biāo)識名稱),是否將my sql的bin目錄加入到windows path(加入后,就可以直接使用bin下的文件,而不用指出目錄名,比如連接,“my sql.exe -uuser name -ppass word;”就可以了,不用指出my sql.exe的完整地址,很方便),我這里全部打上了勾,service name不變。按“next”精品. 17
12、 這一步詢問是否要修改默認root用戶(超級管理)的密碼(默認為空),“new root password”如果要修改,就在此填入新密碼(如果是重裝,并且之前已經(jīng)設(shè)置了密碼,在這里更改密碼可能會出錯,請留空,并將“modify security settings”前面的勾去掉,安裝配置完成后另行修改密碼),“confirm(再輸一遍)”內(nèi)再填一次,防止輸錯?!癳nable root access from remote machines(是否允許root用戶在其它的機器上登陸,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“create an anonymous account(新建一
13、個匿名用戶,匿名用戶可以連接數(shù)據(jù)庫,不能操作數(shù)據(jù),包括查詢)”,一般就不用勾了,設(shè)置完畢,按“next”繼續(xù)。 18.確認設(shè)置無誤,如果有誤,按“back”返回檢查。按“execute”使設(shè)置生效。精品. 19. 設(shè)置完畢,按“finish”結(jié)束my sql的安裝與配置這里有一個比較常見的錯誤,就是不能“start service”,一般出現(xiàn)在以前有安裝my sql的服務(wù)器上,解決的辦法,先保證以前安裝的my sql服務(wù)器徹底卸載掉了;不行的話,檢查是否按上面一步所說,之前的密碼是否有修改,照上面的操作;如果依然不行,將my sql安裝目錄下的data文件夾備份,然后刪除,在安裝完成后,將安裝
14、生成的 data文件夾刪除,備份的data文件夾移回來,再重啟my sql服務(wù)就可以了,這種情況下,可能需要將數(shù)據(jù)庫檢查一下,然后修復(fù)一次,防止數(shù)據(jù)出錯。安裝路徑不要帶有中文!也不能有空格括號之類的,否則就會遇到下圖顯示的錯誤 到此我們的my sql安裝配置完成,我們需要測試my sql是否真的安裝配置成功。在我們的cmd 命令行下輸入 net start my sql看是否能啟動服務(wù);精品.使用工具navi cat lite for my sql看是否能夠鏈接到my sql數(shù)據(jù)庫 精品.第3章 數(shù)據(jù)庫和表的操作1. sql語句分類 dql(data query language,數(shù)據(jù)查詢語言
15、) 查詢數(shù)據(jù)庫中的數(shù)據(jù) select dml(data manipulation language,數(shù)據(jù)操作語言) 插入、刪除和修改數(shù)據(jù)庫中的數(shù)據(jù); insert、 update 、delete等; dcl( data control language,數(shù)據(jù)控制語言) 用來控制存取許可、存取權(quán)限等; grant、revoke 等; ddl( data definition language,數(shù)據(jù)定義語言) 用來建立數(shù)據(jù)庫、數(shù)據(jù)庫對象和定義其列 create 、drop 等事務(wù)控制語言(tran sac tional control language, tcl) commit、rollback2
16、. sql語句書寫規(guī)則 書寫sql語句應(yīng)遵循以下規(guī)則: sql語句不區(qū)分大小寫 字符值和日期值區(qū)分大小寫 sql語句可以寫成一行或多行 關(guān)鍵字不能簡寫或分割于多行 子句通常置于單獨行這樣更具可讀性并便于編輯精品. tab和縮進的使用可以提高程序的可讀性 關(guān)鍵字最好大寫,其他詞諸如表名、列名使用小寫3. sql 中的注釋: sql標(biāo)準(zhǔn): 多行注釋: /* */。 單行注釋: - my sql: “#”4. 數(shù)據(jù)庫對象的命名規(guī)則 必須以字母開頭 可包括數(shù)字和三個特殊字符(# _ $) 不要使用my sql的保留字( 保留字與關(guān)鍵字my sql 數(shù)據(jù)庫系統(tǒng)的 用戶只能使用,不能用它來定義 表的名稱與
17、字段名)同一schema下的對象不能同名5. 列類型 my sql支持多種列類型: 數(shù)值類型、 日期/時間類型、 字符串(字符)類型my sql中的數(shù)值數(shù)據(jù)類型:數(shù)值數(shù)據(jù)類型-整數(shù)精品. 數(shù)值數(shù)據(jù)類型-浮點數(shù)精品. 日期/時間類型 字符串類型精品.數(shù)據(jù)庫的操作查看數(shù)據(jù)庫: show databases;創(chuàng)建數(shù)據(jù)庫: create database if not exists 數(shù)據(jù)庫名; 刪除數(shù)據(jù)庫: drop database 數(shù)據(jù)庫名; 使用數(shù)據(jù)庫 use 數(shù)據(jù)庫名表的操作顯示當(dāng)前數(shù)據(jù)庫中已有的數(shù)據(jù)表的信息:show tables;精品.查看數(shù)據(jù)表中各列的信息:describe|desc 表
18、名 列名;查看表的詳細結(jié)構(gòu):show create table 表名g;備注:如果不加”g”參數(shù),顯示的結(jié)果可能非?;靵y;加上該參數(shù)可以使結(jié)果更加直觀,易于查看。創(chuàng)建表:create table 表名(列名 列類型,列名 列類型);刪除表:drop table 表名修改表結(jié)構(gòu):增加列alter table 表名 add 列名 列類型;修改列類型alter table 表名 modify 列名 列類型;列改名alter table 表名 change 舊列名 新列名 列類型;精品.刪除列alter table 表名 drop 列名; 更改表名alter table 表名 rename 新表名;r
19、ename table 表名 to 新表名;支持一次重命名多個表。rename table old_table1 to tmp_table,new_table to old_table,tmp_table to new_table;表的約束:約束約束用于確保數(shù)據(jù)庫數(shù)據(jù)滿足特定的商業(yè)規(guī)則。約束是表級的強制規(guī)定,約束可分為列級、表級約束兩種:列級約束是字段定義的一部分,只能應(yīng)用在一個列上表級約束是獨立于列的定義定義約束的關(guān)鍵字constraint。大部分數(shù)據(jù)庫都支持以下五種約束:精品.not null(非空)如果在列上定義了not null,那么當(dāng)插入數(shù)據(jù)時,必須為列提供數(shù)據(jù)。 not null約
20、束只能定義在列級;unique(唯一):當(dāng)定義了唯一約束后,該列值不能是重復(fù)的,但是可以為null。被定義的唯一性約束,會自動建立一個唯一性的索引;unique約束既可以定義在列級,也可以定義在表級;注意:如果字段定義為unique約束時,允許包含多個null值。primary key(主鍵)用于唯一的標(biāo)識表行的數(shù)據(jù),當(dāng)定義主鍵約束后,該列不但不能重復(fù)而且不能為null。需要說明的是:一張表最多只能有一個主鍵,但是可以有多個unique約束。my sql中會自動產(chǎn)生主鍵索引;主鍵約束既可以定義在列級,也可以定義在表級;foreign key(外鍵)用于定義主表和從表之間的關(guān)系。外鍵約束要定義在
21、從表上,主表則必須具有主鍵約束或是unique約束,當(dāng)定義外鍵約束后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或是為null。一個表中可以定義多個外鍵約束;my sql中會自動產(chǎn)生外鍵鍵索引;外鍵約束既可以定義在列級,也可以定義在表級;check(檢查)檢查性約束,檢查輸入的每一個數(shù)據(jù),只有符合條件的數(shù)據(jù)才允許插入到 表中。check表達式的結(jié)果必須是一個布爾值check約束既可以定義在列級也可以定義在表級。所有的存儲引擎均對check子句進行分析,但是忽略check子句。精品.添加約束 可增加或刪除約束,但不能直接修改;可使約束啟用和禁用只要是可以使用表級約束語法來定義的約束,都可以通過add
22、constraint來增加該約束。語法:alter table tableadd constraint constraint_name type (column);非空約束必須使用modify子句增加alter table table modify column type not null;添加約束示例給學(xué)生表添加約束:1. 將sid設(shè)為主鍵alter table stu add constraint pk_sid primary key(sid);2. 為sname添加唯一約束alter table stu add constraint uq_sname unique(sname);3. 性
23、別默認為男alter table stu modify sex char(2) default 男; 注意:默認值不是約束,要加默認值可以在建表時添加或修改表結(jié)構(gòu)。4. 性別為非空alter table stu modify sex char(2) not null; 5. 給classid添加外鍵alter table stu add constraint fk_classid foreign key (classid) references classes(classid);精品.刪除定義的約束刪除定義的約束刪除約束示例:刪除主鍵約束 alter table stu drop primar
24、y key;注意:如果主鍵列有自增長列,必須先刪除自增長,再刪除主鍵:alter table stu change tno tno int(11);刪除not null約束alter table stu modify sex char(2) ;刪除唯一約束 alter table stu drop index uq_tname;刪除外鍵約束alter table stu drop foreign key fk_stu_sc;精品.表級約束和列級約束列級定義:是在定義列的同時定義約束如在classes表定義主鍵約束:create table classes(classid number(2) c
25、onstraint pk_cid primary key, -給約束取名字cname varchar2(12);表級定義:是指在定義了所有列后,再定義約束。注意:not null約束只能在列級上定義。以建立stu表時定義主鍵約束和外鍵約束為例:creat table stu(sid number(4), sname varchar2(20), classid number(2),constraint pk_sid primary key(sid),constraint uq_sname unique(sname);自動增長和默認值精品.作業(yè):創(chuàng)建數(shù)據(jù)庫:school在其中創(chuàng)建表:stu, co
26、urse, sc添加相應(yīng)的約束信息。精品. 精品.第4章 數(shù)據(jù)更新操作1課程學(xué)習(xí)目標(biāo): 數(shù)據(jù)的增加 數(shù)據(jù)的修改數(shù)據(jù)的刪除2. 插入數(shù)據(jù)insert insert語句用于完成各種向數(shù)據(jù)表中插入數(shù)據(jù)的功能,可以對列賦值一次插入一條記錄,也可以根據(jù)select查詢子句獲得的結(jié)果記錄集批量插入指定數(shù)據(jù)表。語法格式:1.所有字段都插入:insert into 表名 values(value1,value2,value3.);2.插入部分字段: insert into 表名 (column1,column2,column3,.)values (value1,value2,value3,.); 注意:1 插
27、入空值可以用null,默認值用default。 2 可以使用last_insert_id()函數(shù)獲取上一條insert命令生成的auto_increment值。 這是一個面向連接的函數(shù),只對本次會話有效。、插入數(shù)據(jù)時的注意事項: 注意事項1:每次插入一行數(shù)據(jù),不可能只插入半行或者幾列數(shù)據(jù),因此,插入的數(shù)據(jù)是否有效將按照整行的完整性的要求來檢驗;精品. 注意事項2: 每個數(shù)據(jù)值的數(shù)據(jù)類型、精度和小數(shù)位數(shù)必須與相應(yīng)的列匹配; 注意事項3:如果在設(shè)計表的時候就指定了某列不允許為空,則必須插入數(shù)據(jù); 注意事項4: 插入的數(shù)據(jù)項,要求符合檢查約束的要求注意事項5: 具有缺省值的列,可以使用default
28、(缺?。╆P(guān)鍵字來代替插入的數(shù)值; 允許為空值的列,可以使用null關(guān)鍵字來插入空值。修改數(shù)據(jù)update update語句用于修改表中一列或多列的值,使用where子句限制修改的行。語法格式: update 表名 set column1=value1,column2=value2,. where 條件;刪除數(shù)據(jù)deletedelete語句向用戶提供了刪除數(shù)據(jù)的功能,同update語句一樣限定表中哪些行將被刪除。語法格式: delete from 表名 where 條件; truncate table 表名 ;二者關(guān)系:精品.truncate table 在功能上與不帶 where 子句的 de
29、lete 語句相同,二者均刪除表中的全部行。但 truncate table速度快,但不可以回滾;delete 速度慢,但可以回滾。精品. 第五章 數(shù)據(jù)庫查詢查詢基本語法(單表查詢):select from where order by asc或desc查詢?nèi)康男泻土衧elect * from stu;查詢部分的列:select sid, sname, sex, age from stu;查詢滿足條件的行的部分列:select sid, sname ,sex from stu where age=20;sql操作符算術(shù)運算符:+ - * / % 如:select sal*12 from em
30、p;關(guān)系運算符: = = = !=或 between, in, like, is null, 注意:字符類型不區(qū)分大小寫,binary類型區(qū)分大小寫;如果字符串的后面有空白符,則會自動忽略。邏輯運算符:and or not, &, |, !基本查詢精品.怎樣消除重復(fù)行:select distinct deptno , job from emp;使用別名:格式:列名 別名 或 列名 as 別名如:select empno, sal*12 “年工資” from emp; 或 select empno, sal*12 as “年工資” from emp;注意:1.如果別名中使用特殊字符,或者是強制大
31、小寫敏感,或有空格時,都可以通過為別名添加加雙引號實現(xiàn)。2. where子句中不能使用別名。null值:空值是指不可用、未分配的值空值不等于零或空格任意類型都可以支持空值包括空值的任何算術(shù)表達式都等于空字符串和null進行連接運算,得到也是null.如何查詢null值:使用is nullselect * from emp where comm is null;select * from emp where comm is not null;通配符使用通配符進行模糊查詢:精品.如:查詢名字以s開頭的員工: select * from emp where ename like s%;基本查詢使用邏
32、輯操作指定多個查詢條件select empno,ename,job,sal from emp where ename =smith or ename=ford;在where條件中使用in:如:查詢smith, fort, king的員工號、工作,薪水select empno,ename,job,sal from emp where ename in(smith,ford,king);在where條件中使用between and :select empno,ename,job,sal from emp where sal between 1000 and 2000;注意:數(shù)據(jù)庫執(zhí)行sql語句時是
33、從右到左的順序,所以盡可能把最優(yōu)化條件寫右邊?;静樵兣判蚓?使用order by子句進行排序:排序的類型為兩種升序asc 、降序desc。數(shù)字、日期、字符串可以進行排序。null認為是排序中的最大值。 排序方式:按單個列排序select * from emp order by sal desc;按多列排序select * from emp order by sal desc, empno ;按別名排序select ename,sal*12 “年薪” from emp order by “年薪” asc;一次插入多條語句select into語句語句形式為:create table tabl
34、e2 select vale1, value2 from table1;要求:目標(biāo)表table2不存在,因為在插入時會自動創(chuàng)建表table2,并將table1中指定字段數(shù)據(jù)復(fù)制到table2中。insert into select from 語句形式為:insert into table2(column1,column2) select col1,col2 精品.from table1;要求:目標(biāo)表table2已創(chuàng)建好,且從table1表查詢出來的列類型應(yīng)與table2中列的類型一致。 nsert into select value union select value語句形式為:insert
35、 into table2(column1,column2) select value1_1,value1_2 union select value2_1,value2_1 union ;作用:將多行值一次性插入到表中。要求:目標(biāo)表table2已創(chuàng)建好。常用的聚合函數(shù):分組查詢: group by精品.select 列名(條件), max(結(jié)果列名) as 要求查詢的結(jié)果顯示列名from 表名group by 列名(條件)分組查詢多列分組:select 列名1(條件),列名2(條件) , avg(結(jié)果列名) as 要求查詢的結(jié)果顯示列名from 表名group by 列名1(條件),列名2(條件
36、)分組查詢having:having的使用 having通常是在group by的后面select 列名1(條件),列名2(條件), avg(結(jié)果列名) as 平均成績from 表名group by 列名1(條件),列名2(條件)having avg(結(jié)果列名)10條件分組查詢:where子句從數(shù)據(jù)源中去掉不符合其搜索條件的數(shù)據(jù)group by子句搜集數(shù)據(jù)行到各個組中,統(tǒng)計函數(shù)為各個組計算統(tǒng)計值having子句去掉不符合其組搜索條件的各組數(shù)據(jù)行order by 排序使用順序 先 where 接著1 group by 接著2 having 最后 order by with rollup如果gro
37、up by子句里只有一個數(shù)據(jù)列,加上with rollup關(guān)鍵字的效果是將在查詢結(jié)果的最后一行將自動添加一條總數(shù)統(tǒng)計記錄。如果按多列分組,將會進行階段性總和(相當(dāng)于“小計”),最后再為全體記錄統(tǒng)計一個最終的總和(相當(dāng)于“總計”)。例:精品. select sno, count(*),avg(score) from sc group by sno with rollup;統(tǒng)計函數(shù)的使用:select 字段名,group_concat(distinct 要連接的字段 order by asc/desc 排序字段 separator 分隔符) 多表聯(lián)接查詢內(nèi)聯(lián):inner join外聯(lián):左外聯(lián)接 (
38、left join)右外聯(lián)接 (right join)完整外聯(lián)接(full join) -my sql 5.0暫不支持交叉聯(lián)接(cross join)內(nèi)聯(lián)查詢:nner join叫做等值連接(2個表聯(lián)接)sql語法:精品.select * from 表名1 inner join 表名2 on 表名1.與表名2相同的字段= 表名2.與表名1相同的字段多表聯(lián)接:select * from (表1 inner join 表2 on 表1.字段號=表2.字段號) inner join 表3 on 表1.字段號=表3.字段號select * from (表1 inner join 表2 on 表1.字段
39、號=表2.字段號) inner join 表3 on 表1.字段號=表3.字段號) inner join 表4 on member.字段號=表4.字段號select * from (表1 inner join 表2 on 表1.字段號=表2.字段號) inner join 表3 on 表1.字段號=表3.字段號) inner join 表4 on member.字段號=表4.字段號) inner join 表5 on member.字段號=表5.字段號左外聯(lián)接: 顯示左表t1中的所有行,并把右表t2中符合條件加到左表t1中;右表t2中不符合條件,就不用加入結(jié)果表中,并且null表示。sql語法
40、:select * from t1 left outer join t2 on t1.userid=t2.userid右聯(lián)(right outer join)。顯示右表t2中的所有行,并把左表t1中符合條件加到右表t2中;左表t1中不符合條件,就不用加入結(jié)果表中,并且null表示sql語句:select * from t1 right outer join t2 on t1.userid=t2.userid第四:全聯(lián)(full outer join)。顯示左表t1、右表t2兩邊中的所有行,即把左聯(lián)結(jié)果表+右聯(lián)結(jié)果表組合在一起,然后過濾掉重復(fù)的。sql語句:select * from t1 fu
41、ll outer join t2 on t1.userid=t2.userid精品.更新關(guān)聯(lián)數(shù)據(jù)表里的數(shù)據(jù)記錄1. 修改關(guān)聯(lián)數(shù)據(jù)表里 的數(shù)據(jù)記錄使用updata命令在一條sql語句中對多個表中 的數(shù)據(jù)記錄做出修改語法: update product p inner join productprice pp on ductid = ductid set pp.price = pp.price * 0.8, p.dateupdate = curdate() where p.datecreated any (select s2 from table2)在子查詢中,返回的是 ta
42、ble2 的所有 s2 列結(jié)果(5,12,20),然后將 table1 中的 s1 的值與之進行比較,只要大于 s2 的任何值即表示為 true,符合查詢條件。 in 是 = any 的別名,二者相同,但 not in 的別名卻不是 any 而是 some。精品.特殊情況 如果 table2 為空表,則 any 后的結(jié)果為 false; 如果子查詢返回如 (null,null,null) 列為空的結(jié)果,則 any 后的結(jié)果為 unknown 。all操作符:all 關(guān)鍵字必須接在一個比較操作符的后面,表示與子查詢返回的所有值比較為 true ,則返回 true例子:select s1 from
43、 table1 where s1 all (select s2 from table2)該查詢不會返回任何結(jié)果,因為 s1 中沒有比 s2 所有值都大的值。 當(dāng)然在該例子查詢中,返回了 s2 的所有值,您可以在該子查詢中添加任何條件以限制返回的查詢結(jié)果而無需全部返回。 not in 是 all 的別名,二者相同。 特殊情況 如果 table2 為空表,則 all 后的結(jié)果為 true; 如果子查詢返回如 (0,null,1) 這種盡管 s1 比返回結(jié)果都大,但有空行的結(jié)果,則 all 后的結(jié)果為 unknown 。行子查詢:例子:精品.from 子查詢:from 子查詢是指 from 的子句作
44、為子查詢語句,主查詢再到子查詢結(jié)果中獲取需要的數(shù)據(jù)語法:select . from (subquery) as name .子查詢會生成一個臨時表,由于 from 子句中的每個表必須有一個名稱,因此 as name 是必須的。from 子查詢也稱為衍生數(shù)據(jù)表子查詢。精品.標(biāo)量子查詢標(biāo)量子查詢是指子查詢返回的是單一值的標(biāo)量,如一個數(shù)字或一個字符串,也是子查詢中最簡單的返回形式一個標(biāo)量子查詢的例子如下: select * from article where uid = (select uid from user where status=1 order by uid desc limit 1)在
45、該例子中,子查詢語句: select uid from user where status = 1 order by uid desc limit 1返回的是單一的數(shù)字(如 2),實際的查詢語句為: select * from article where uid = 2使用子查詢進行比較可以使用 = = = 這些操作符對子查詢的標(biāo)量結(jié)果進行比較,通常子查詢的位置在比較式的右側(cè): select * from t1 where column1 = (select max(column2) from t2)提示 對于采用這些操作符之一進行的比較,子查詢必須返回一個標(biāo)量。唯一的例外是 可以和行子查詢同
46、時使用。 子查詢與表連接在很多情況下,子查詢的效果與 join 表連接很類似,但一些特殊情況下,是必須用子查詢而不能用表連接的,如: select * from t1 where column1 = (select max(column2) from t2)select * from article as t where 2 = (select count(*) from article where article.uid = t.uid)精品.exists 和 not exists 子查詢exists 和 not exists 子查詢語法如下:select . from table wher
47、e exists (subquery)該語法可以理解為:將主查詢的數(shù)據(jù),放到子查詢中做條件驗證,根據(jù)驗證結(jié)果(true 或 false)來決定主查詢的數(shù)據(jù)結(jié)果是否得以保留。例子:精品.從語句執(zhí)行結(jié)果可以看出,article 表中第 4 條記錄沒有被保留,原因就是該條記錄的數(shù)據(jù)在子查詢中返回的結(jié)果是 false 。 當(dāng)上面的 sql 使用 not exists 時,查詢的結(jié)果就是 article 表中 uid 不存在于 user 表中的數(shù)據(jù)記錄。 提示 exists (subquery) 只返回 true 或 false,因此子查詢中的 select * 也可以是 select 1 或其他,官方
48、說法是實際執(zhí)行時會忽略 select 清單,因此沒有區(qū)別。 exists 子查詢的實際執(zhí)行過程可能經(jīng)過了優(yōu)化而不是我們理解上的逐條對比,如果擔(dān)憂效率問題,可進行實際檢驗以確定是否有效率問題。 exists 子查詢往往也可以用條件表達式、其他子查詢或者 join 來替代,何種最優(yōu)需要具體問題具體分析。關(guān)聯(lián)子查詢:關(guān)聯(lián)子查詢是指一個包含對表的引用的子查詢,該表也顯示在外部查詢中。通俗一點來講,就是子查詢引用到了主查詢的數(shù)據(jù)數(shù)據(jù)。 以一個實際的例子來理解關(guān)聯(lián)子查詢: 精品.將該例 sql 與如下語句比較更能看出關(guān)聯(lián)子查詢與普通子查詢的區(qū)別: select * from article where u
49、id in(select uid from user)在本實例中,雖然兩個 sql 執(zhí)行后的返回結(jié)果都一樣,但它們的實現(xiàn)過程是完全不一樣的。后者(普通子查詢)實際被執(zhí)行為: select * from article where uid in(1,2,3)但在關(guān)聯(lián)子查詢中,是無法單獨執(zhí)行子查詢語句的。其實際流程大致為: 1. 先做外部主查詢;2. 將主查詢的值傳入子查詢并執(zhí)行;3. 子查詢再將查詢結(jié)果返回主查詢,主查詢根據(jù)返回結(jié)果完成最終的查詢。這個執(zhí)行流程類似于 exists 子查詢,實際上某些情況下 mysql 就是將關(guān)聯(lián)子查詢重寫為 exists 子查詢來執(zhí)行的。 關(guān)聯(lián)子查詢效率精品.很明顯,一般情況下關(guān)聯(lián)子查詢的效率是比較低下的,實際上本例中的關(guān)聯(lián)子查詢例子也僅是為了演示關(guān)聯(lián)子查詢的原理及用法。如果可以的話,關(guān)聯(lián)子查詢盡量使用 join 或其他查詢來代替。如本例中,使用 inner join 來替換的 sql 為: select article.* from article inner join user on article.uid = user.uid注意:此處只是為了演示用 inner join 替換關(guān)聯(lián)子查詢的樣例,并非表名這種處
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銷售電極夾具合同模板
- 欄桿銷售合同模板
- 工控產(chǎn)品購銷合同模板
- 系統(tǒng)升級合同模板
- 沈陽市二手車買賣合同模板
- 安裝集體供暖合同模板
- 匾額木板出售合同模板
- 工程裝修合同模板
- 農(nóng)業(yè)開發(fā)項目合同模板
- 車位管理服務(wù)合同模板
- 2022年第七屆“學(xué)憲法講憲法”(初中組)活動知識競賽題庫及答案(5套題)
- 2023年大學(xué)試題(大學(xué)選修課)-零缺陷管理考試參考題庫(含答案)
- 2023年度小學(xué)生漢語言文化大賽培訓(xùn)試題,菁選3篇
- 《荷葉·母親》仿寫作文9篇(一)
- 中級主管護師考試歷年真題及答案
- 漫畫說病人手術(shù)流程
- 金礦開采項目可行性研究報告
- 塑膠模具管理流程
- 高一【物理(人教版)】重力與彈力(第一課時)-課件
- 中國近現(xiàn)代史綱要(首都師范大學(xué))超星爾雅學(xué)習(xí)通章節(jié)測試答案
- 寶寶不挑食課件PPT
評論
0/150
提交評論