




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
nos^i/M
1MySQL入門
i.i數(shù)據(jù)庫概述
?MySQL是什么?
MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的RDBMS(Relational
DatabaseManagementSystem:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。
?什么是數(shù)據(jù)庫
數(shù)據(jù)庫就是存儲數(shù)據(jù)的倉庫,其本質(zhì)是一個文件系統(tǒng),數(shù)據(jù)按照特定的格式將數(shù)據(jù)存儲起來,用戶
可以通過SQL對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增加,修改,刪除及查詢操作。
?什么是關(guān)系型數(shù)據(jù)庫
數(shù)據(jù)庫中的記錄是有行有列的數(shù)據(jù)庫就是關(guān)系型數(shù)據(jù)庫,與之相反的就是NoSQL數(shù)據(jù)庫了。
?數(shù)據(jù)庫和表
數(shù)據(jù)庫管理系統(tǒng)(DBMS:mysql軟件)
數(shù)據(jù)庫管理系統(tǒng)(DataBaseManagementSystem,DBMS):指一種操作和管理數(shù)據(jù)庫的大型軟件,用
于建立、使用和維護數(shù)據(jù)庫,對數(shù)據(jù)庫進(jìn)行統(tǒng)一管理和控制,以保證數(shù)據(jù)庫的安全性和完整性。用
戶通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫中表內(nèi)的數(shù)據(jù)。(記錄)
?常見的數(shù)據(jù)庫管理系統(tǒng)
令MYSQL:開源免費的數(shù)據(jù)庫,小型的數(shù)據(jù)庫.已經(jīng)被Oracle收購了.MySQL5.5版本之后
都是由Oracle發(fā)布的版本。
令Oracle:收費的大型數(shù)據(jù)庫,Oracle公司的產(chǎn)品。Oracle收購SUN公司,收購MYSQL。
令DB2:IBM公司的數(shù)據(jù)庫產(chǎn)品,收費的。常應(yīng)用在銀行系統(tǒng)中.在中國的互聯(lián)網(wǎng)公司,
要求去I0E(IBM小型機、Oracle數(shù)據(jù)庫、EMC存儲設(shè)備)
令SQLServer:Microsoft公司收費的中型的數(shù)據(jù)庫。C#、.net等語言常使用。
令SyBase:已經(jīng)淡出歷史舞臺。提供了一個非常專業(yè)數(shù)據(jù)建模的工具PowerDesigner.
令SQLite:嵌入式的小型數(shù)據(jù)庫,應(yīng)用在手機端。
我們要學(xué)習(xí)的數(shù)據(jù)庫:MYSQL
?MySQL發(fā)展歷程
?MySQL的歷史可以追溯到1979年,一個名為MontyWidenius的程序員在為TcX的小公司打
工,并且用BASIC設(shè)計了一個報表工具,使其可以在4MHz主頻和16KB內(nèi)存的計算機上運行。
當(dāng)時,這只是一個很底層的且僅面向報表的存儲引擎,名叫Unireg。
?1990年,TcX公司的客戶中開始有人要求為他的API提供SQL支持。Monty直接借助于mSQL
的代碼,將它集成到自己的存儲引擎中。令人失望的是,效果并不太令人滿意,決心自己重
寫一個SQL支持。
?1996年,MySQL1.0發(fā)布,它只面向一小撥人,相當(dāng)于內(nèi)部發(fā)布。
?到了1996年10月,MySQL3.11.1發(fā)布(MySQL沒有2.x版本),最開始只提供Solaris下的
二進(jìn)制版本。一個月后,Linux版本出現(xiàn)了?在接下來的兩年里,MySQL被依次移植到各個平
臺。
?1999?2000年,MySQLAB公司在瑞典成立。Monty雇了幾個人與Sleepycat合作,開發(fā)出了
BerkeleyDB引擎,由于BDB支持事務(wù)處理,因此MySQL從此開始支持事務(wù)處理了。
?2000,MySQL不僅公布自己的源代碼,并采用GPL(GNUGeneralPublicLicense)許可協(xié)議,
正式進(jìn)入開源世界。同年4月,MySQL對舊的存儲引擎ISAM進(jìn)行了整理,將其命名為MylSAM,
?2001年,集成HeikkiTuuri的存儲引擎InnoDB,這個引擎不僅能持事務(wù)處理,并且支持行
級鎖。后來該引擎被證明是最為成功的MySQL事務(wù)存儲引擎。MySQL與InnoDB的正式結(jié)合版
本是4.0
?2003年12月,MySQL5.0版本發(fā)布,提供了視圖、存儲過程等功能。
?2008年1月,MySQLAB公司被Sun公司以10億美金收購,MySQL數(shù)據(jù)庫進(jìn)入Sun時代。在
Sun時代,Sun公司對其進(jìn)行了大量的推廣、優(yōu)化、Bug修復(fù)等工作。
?2008年11月,MySQL5.1發(fā)布,它提供了分區(qū)、事件管理,以及基于行的復(fù)制和基于磁盤的
NDB集群系統(tǒng),同時修復(fù)了大量的Bug。
?2009年4月,Oracle公司以74億美元收購Sun公司,自此MySQL數(shù)據(jù)庫進(jìn)入Oracle時代,
而其第三方的存儲引擎InnoDB早在2005年就被Oracle公司收購。
?2010年12月,MySQL5.5發(fā)布,其主要新特性包括半同步的復(fù)制及對SIGNAL/RESIGNAL的異
常處理功能的支持,最重要的是InnoDB存儲引擎終于變?yōu)楫?dāng)前MySQL的默認(rèn)存儲引擎。MySQL
5.5不是時隔兩年后的一次簡單的版本更新,而是加強了MySQL各個方面在企業(yè)級的特性。
Oracle公司同時也承諾MySQL5.5和未來版本仍是采用GPL授權(quán)的開源產(chǎn)品。
1.2MySQL安裝
?安裝
參考MySQL安裝圖解.doc
劭MySQL安裝圖解.doc
?配置MysQL服務(wù)
bin
M售理
這?本ifiKS(C:)?ProgramFiles(x86)?MySQL?MySQLServer5.5?bin
修改日期類型‘大小
名稱
8KB
34KB
3,381KB
3,656KB
3,766KB
3,644KB
3,684KB
3,997KB
use
8,657KB
:)3,395KB
3,358KB
3,471KB
3,930KB
4,022KB
3,925KB
7,995KB
3,988KB
3,920KB
CMySQLInstanceConfig.exe2010/8/2614:57遮位2,904KB
?啟動和關(guān)閉(必須以管理運行cmd命令窗口)
QS管理員:C:\Windows\System32\cmd.exe
C:\Windows\system32>netstartmysql
MySQL服務(wù)正在啟動
MySQL服務(wù)已經(jīng)啟動成功。
C:\Windows\system32>netstopmysql
MySQL服務(wù)定在停止..
MySQL服務(wù)已成功停止。
?登錄
格式1:cmd>mysql-u用戶名-p密碼
例如:mysql-uroot-proot
C:MJsei'S\LiKepei>nysql-uroot-proot
WelcometotheMySQLmonitor.Commandsendwith;or
Voui*MySQLconnectionidis2
Serueruersion:5.5.2?MySQLCommunitySeruer<GPL>
Copyright<c>2000,2011,Oracleand/oritsaffiliates.Allrightsreserved.
OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheii*respective
oviners.
Type'help;‘or'5'forhelp.Type*\c*tocleai*thecurrentinputstatement.
nysql>
格式2:cmd>mysql-user二用戶名一host二ip地址一password二密碼
1.3SQLyog安裝與使用
?安裝:
提供的SQLyog軟件為免安裝版,可直接使用
?使用:
輸入用戶名、密碼,點擊連接按鈕,進(jìn)行訪問MySQL數(shù)據(jù)庫進(jìn)行操作
SQLyogUltimate-|LKP/gjp-root9locdhost)
S?<£)WBgNQ)E5向一忌t表⑻具曰。IB0招工總曲■□皿
▼I’力安,。二二,*噓卬三
1,,
.rcot€<>calhSl^
.Query工QueryBolder字3Wh5if3
ttw、thn?e自動力儺:g】-?下一杯英,[d1.Sp>8卜》列比喇標(biāo)英,[dUErwr]。列出新詢標(biāo)笠.
Bi.r?bu?
,3gjp.iedger
s■gjp.sort
■&Vwwf
£4,StoredProcs
ffi1Functiont
-ATriggers
▲Event*
ij?mformation.schefna
國N?ny?ql
w.peWonn4nce.ichwa
ffiMtest
在Query窗口中,輸入SQL代碼,選中要執(zhí)行的SQL代碼,按F8鍵運行,或按執(zhí)行按鈕運行。
2SQL語句
2.1SQL語句介紹
?什么是SQL?
全稱StructuredQueryLanguage,簡稱SQL,中文叫結(jié)構(gòu)化查詢語言。
關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)。SQL92、SQL99
不只是mysql還有其他數(shù)據(jù)庫,在SQL92或者SQL99這些國際SQL標(biāo)準(zhǔn)基礎(chǔ)之上,它們還擴展
了自己的一些SQL語句,比如MySQL中的limit關(guān)鍵字
?SQL分類:
■數(shù)據(jù)定義語言:簡稱DDL(DataDefinitionLanguage),用來定義數(shù)據(jù)庫對象:數(shù)據(jù)庫,
表,列等。關(guān)鍵字:create,alter,drop等
■數(shù)據(jù)操作語言:簡稱DML(DataManipulationLanguage),用來對數(shù)據(jù)庫中表的記錄進(jìn)行
更新。關(guān)鍵字:insert,delete,update等
■數(shù)據(jù)控制語言:簡稱DCL(DataControlLanguage),用來定義數(shù)據(jù)庫的訪問權(quán)限和安全級
別,及創(chuàng)建用戶;關(guān)鍵字:grant等
■數(shù)據(jù)查詢語言:簡稱DQL(DataQueryLanguage),用來查詢數(shù)據(jù)庫中表的記錄。關(guān)鍵字:
select,from,where等
2.2SQL語句使用
2.2.1數(shù)據(jù)庫操作:database
?創(chuàng)建數(shù)據(jù)庫
語法:
*createdatabase數(shù)據(jù)庫名;
*createdatabase數(shù)據(jù)庫名characterset字符集;
iysql>createdatabaseday21_l;
!uei、yOK,1rov?affected<0.00sec>
iysql>createdatabaseday21_2charactersetgbk;
!ueryOK,1rovjaffected<0.01sec)
?查看數(shù)據(jù)庫
查看數(shù)據(jù)庫服務(wù)器中的所有的數(shù)據(jù)庫:showdatabases;
查看某個數(shù)據(jù)庫的定義的信息:showcreatedatabase數(shù)據(jù)庫名;
?刪除數(shù)據(jù)庫
dropdatabase數(shù)據(jù)庫名稱;
?其他的數(shù)據(jù)庫操作命令
切換數(shù)據(jù)庫:use數(shù)據(jù)庫名;
查看正在使用的數(shù)據(jù)庫:selectdatabase();
?例如:
#創(chuàng)建數(shù)據(jù)庫
createdatabaseday06;
#使用數(shù)據(jù)庫
useday06;
2.2.2表操作:table
2.2.2.1字段類型
?常用的類型有:
數(shù)字型:int
浮點型:double
字符型:varchar(可變長字符串)
日期類型:date(只有年月日,沒有時分秒)
datetime(年月日,時分秒)
boolean類型:不支持
分類類型名稱說明
整數(shù)類型tinylnt很小的整數(shù)
smallint小的整數(shù)
mediumint中等大小的整數(shù)
int(integer)普通大小的整數(shù)
小數(shù)類型float單精度浮點數(shù)
double雙精度浮點數(shù)
decimal(m,d)壓縮嚴(yán)格的定點數(shù)開發(fā)時用
日期類型yearYYYY190P2155
timeUH:MM:SS-838:59:59~838:59:59
dateYYYY-MM-DD1000-01-0P9999-12-3
datetime-開發(fā)用YYYY-MM-DDHH:MM:SS1000-01-0100:00:00"9999-12-31
23:59:59
timestampYYYY-MM-DDIIH:MM:SS1970“0廣0100:00:01
UTC?2038-01-1903:14:07UTC
文本、二進(jìn)制CHAR(M)M為0~255之間的整數(shù)
類型VARCHAR(M)M為0~65535之間的整數(shù)
TINYBLOB允許長度0~255字節(jié)
BLOB允許長度0~65535字節(jié)
MEDIUMBLOB允許長度0^167772150字節(jié)
LONGBLOB允許長度0^4294967295字節(jié)
TINYTEXT允許長度0~255字節(jié)
TEXT允許長度0~65535字節(jié)
MEDIUMTEXT允許長度0~167772150字節(jié)
LONGTEXT允許長度0^4294967295字節(jié)
VARBINARY(M)允許長度0~M個字節(jié)的變長字節(jié)字符串
BINARY(M)允許長度0~M個字節(jié)的定長字節(jié)字符串
?創(chuàng)建表
createtable表名(
字段名類型(長度)約束,
字段名類型(長度)約束
);
單表約束:
*主鍵約束:primarykey
*唯一約束:unique
*非空約束:notnull
*注意:主鍵約束=唯一約束+非空約束
?例如:
###創(chuàng)建分類表
CREATETABLEsort(
sidINTPRIMARYKEY,#分類ID
snameVARCHAR(IOO)#分類名稱
);
sname
?查看表
查看數(shù)據(jù)庫中的所有表:showtables;
查看表結(jié)構(gòu):desc表名;
?刪除表
droptable表名;
?修改表
altertable表名add列名類型(長度)約束;一修改表添加列.
altertable表名modify列名類型(長度)約束;一修改表修改列的類型長度及約束.
altertable表名change舊列名新列名類型(長度)約束;一修改表修改列名.
altertable表名drop列名;--修改表刪除列.
renametable表名to新表名;一修改表名
altertable表名characterset字符集;一修改表的字符集
2.2.3插入記錄:insert
?語法:
insertinto表(列名1,列名2,列名3..)values(值1,值2,值3..);一向表中插入某些列
insertinto表values(值1,值2,值3..);一向表中插入所有列
insertinto表(列名1,列名2,列名3..)valuesselect(列名1,列名2,列名3..)from表
insertinto表valuesselect*from表
?注意:
1.列名數(shù)與values后面的值的個數(shù)相等
2.列的順序與插入的值得順序一致
3.列名的類型與插入的值要一致.
4.插入值得時候不能超過最大長度.
5.值如果是字符串或者日期需要加引號''(一般是單引號)
?例如:
INSERTINTOsort(sid,sname)VALUESCsOOl','電器');
INSERTINTOsort(sid,sname)VALUESCs002','服飾');
INSERTINTOsortVALUESCs003','化妝品');
INSERTINTOsortVALUES('s004'書籍');
sidsname
□sOOl電器
□s002服飾
□s003化妝品
□s004書籍
*(NULL)(NULL)
2.2.4更新記錄:update
?語法:
update表名set字段名=值,字段名=值;
update表名set字段名=值,字段名=值where條件;
?注意:
1.列名的類型與修改的值要一致.
2.修改值得時候不能超過最大長度.
3.值如果是字符串或者日期需要加.
2.2.5刪除記錄:delete
?語法:
deletefrom表名[where條件];
?面試題:
刪除表中所有記錄使用deletefrom表名;還是用truncatetable表名;
刪除方式:delete-條-條刪除,不清空auto_increment記錄數(shù)。
truncate直接將表刪除,重新建表,auto_increment將置為零,從新開始。
2.3CMD中文亂碼
?修改my.ini文件,然后重啟mysql服務(wù)器
D:\java\MySQL\MySQLServer5.5\my.ini-Notepad2
文件任)編輯出視圖凹設(shè)置(S)幫助(2)
」」乂川立O「X小省|簫&|畫|.Y,叱II
55A[nysql]
56
57deFault-character-set=gbk
co
3SQL查詢
查詢語句,在開發(fā)中使用的次數(shù)最多,此處使用“products”商品表。
?主鍵類型,本案例采用int類型,實際案例采用是varchar類型
?時間類型,本案例采用date類型,實際案例采用datetime類型。
3.1準(zhǔn)備工作
創(chuàng)建商品表:
CREATETABLEproducts(
pidINTPRIMARYKEYAUTO_INCREMENT,#自增加AUTO_INCREMENT
pnameVARCHAR(20),#商品名稱
priceDOUBLE,#商品價格
pdateDATE,#日期
sidVARCIIAR(20)#分類ID
INSERTINTOproductsVALUES(NULL,'泰國大榴蓮’,98,NULL,'sOOl');
INSERTINTOproductsVALUES(NULL,'新疆大棗',38,NULL,"s002');
INSERTINTOproductsVALUES(NULL,'新疆切糕',68,NULL,'sOOf);
INSERTINTOproductsVALUES(NULL,'十三香',10,NULL,'s002');
INSERTINTOproductsVALUES(NULL,'老干媽',20,NULL,'s002');
3.2查詢語法
SELECT[DISTINCT]*[列名,列名]FROM表[WHERE條件].
3.3簡單查詢
?SQL語法關(guān)鍵字:
■SELECT
■FROM
?案例:
1.查詢所有的商品.select*fromproduct;
2.查詢商品名和商品價格.selectpname,pricefromproduct;
3.別名查詢,使用的as關(guān)鍵字,as可以省略的.
3.1表別名:select*fromproductasp;
3.2列別名:selectpnameaspnfromproduct;
4.去掉重復(fù)值.selectdistinctpricefromproduct;
5.查詢結(jié)果是表達(dá)式(運算簧詢):將所有商品的價格+10元進(jìn)行顯示.
selectpname,price+10fromproduct;
3.4條件查詢
?SQL語法關(guān)鍵字:
■WHERE
?案例:
1.查詢商品名稱為十三香的商品所有信息:
*select*fromproductwherepname='十三香';
2.查詢商品價格>60元的所有的商品信息:
*select*fromproductwhereprice>60;
where后的條件寫法:
*>,<,=,>=,<=,<>
*like使用占位符一和%_代表一個字符%代表任意個字符.
*select*fromproductwherepnamelike'%新%';
*in在某個范圍中獲得值(exists).
*select*fromproductwherepidin(2,5,8);
比較運算符><<=>==<>大于、小于、大于(小于)等于、不等于
BETWEEN...AND...顯示在某一區(qū)間的值(含頭含尾)
顯示在in列表中的值,例:i在100,200)
IN(set)
模糊查詢,Like語句中,%代表零個或多個任意字符,
LIKE,張」
代表一個字符,例first_namelike(_a%);
判斷是否為空
ISNULL
邏輯運算符and多個條件同時成立
or多個條件任一成立
not不成立,例:wherenot(salary>100);
3.5排序
?SQL語法關(guān)鍵字:
■ORDERBY
■ASC(升序)DESC(降序)
?案例:
1.查詢所有的商品,按價格進(jìn)行排序.(asc-升序,desc-降序)
*select*fromproductorderbyprice;
2.查詢名稱有新的商品的信息并且按價格降序排序.
*select*fromproductwherepname1ike'%新%'orderbypricedesc;
3.6聚合函數(shù)(組函數(shù))
?特點:只對單列進(jìn)行操作
?常用的聚合函數(shù):
■sum();求某一列的和
■avg():求某一列的平均值
■max():求某一列的最大值
■min():求某一列的最小值
■count():求某一列的元素個數(shù)
?案例:
1.獲得所有商品的價格的總和:selectsum(price)fromproduct;
2.獲得所有商品的平均價格:selectavg(price)fromproduct;
3.獲得所有商品的個數(shù):selectcount(*)fromproduct;
3.7分組
?SQL語法關(guān)鍵字:
■GROUPBY
■HAVING
?案例:
1.根據(jù)eno字段分組,分組后統(tǒng)計商品的個數(shù).
*selectcid,count(*)fromproductgroupbycid;
2.根據(jù)eno分組,分組統(tǒng)計每組商品的平均價格,并且平均價格>60;
*selectcid,avg(price)fromproductgroupbycidhavingavg(price)>60;
?注意事項:
1.select語句中的列(非聚合函數(shù)列),必須出現(xiàn)在groupby子句中
2.groupby子句中的列,不一定要出現(xiàn)在select語句中
3.聚合函數(shù)只能出現(xiàn)select語句中或者h(yuǎn)aving語句中,一定不能出現(xiàn)在where語句中。
3.8其他查詢語句
union集合的并集(不包含重復(fù)記錄)
unionall集合的并集(包含重復(fù)記錄)
4SQL查詢之語法順序和執(zhí)行順序(重要)
?MySQL查詢語法順序
1.SELECT
2.FROM
3.LEFTJOIN
4.ON
5.WHERE
6.GROUPBY
7.HAVING
8.ORDERBY
9.LIMIT
?執(zhí)行順序
示例SQL:
SELECT*FROMuserLEFTJOINorderONuser,id=order,uidWHEREorder,price>1000GROUP
BYuser,nameHAVINGcount(1)>5ORDERBYuser,nameLIMIT0,10
1.FROM(將最近的兩張表,進(jìn)行笛卡爾積)--VT1
2.0N(將VT1按照它的條件進(jìn)行過濾)--VT2
3.LEFTJOIN(保留左表的記錄)--VT3
4.WHERE(過濾VT3中的記錄)一VT4…VTn
5.GROUPBY(對VT4的記錄進(jìn)行分組)--VT5
6.HAVING(對VT5中的記錄進(jìn)行過濾)--VT6
7.SELECT(對VT6中的記錄,選取指定的列)一VT7
8.ORDERBY(對VT7的記錄進(jìn)行排序)一游標(biāo)
9.LIMIT(對排序之后的值進(jìn)行分頁)
?WHERE條件執(zhí)行順序(影響性能)
1.MYSQL:從左往右去執(zhí)行WHERE條件的。
2.Oracle:從右往左去執(zhí)行WHERE條件的。
?結(jié)論:寫WHERE條件的時候,優(yōu)先級高的部分要去編寫過濾力度最大的條件語句。
5多表之間的關(guān)系
如上圖所示,實際業(yè)務(wù)數(shù)據(jù)庫中的表之間都是有關(guān)系的,我們接下來主要要學(xué)習(xí)的就是如何分析表
關(guān)系及建立表關(guān)系。
1.分類表
createtablecategory(
cidvarchar(32)primarykey,
cnamevarchar(100)
);
2.商品表
createtableproduct(
pidvarchar(32)primarykey,
pnamevarchar(40),
pricedouble
);
3.訂單表
createtableorders(
oidvarchar(32)primarykey,
totalpricedouble
);
4.訂單項表
createtableorderitern(
oidvarchar(50),
pidvarchar(50)
);
5.1表與表之間的關(guān)系
表與表之間的關(guān)系,說的就是表與表之間數(shù)據(jù)的關(guān)系。
?一對一關(guān)系
■常見實例:一夫一妻
?一對多關(guān)系
■常見實例:會員和訂單
?多對多關(guān)系(需要中間表實現(xiàn))
■常見實例:商品和訂單
5.2外鍵
如何表示表與表之間的關(guān)系呢?就是使用外鍵來約束的。
要想理解外鍵,我們先去理解表的角色:主表和從表(需要建立關(guān)系才有J'主從表的角色區(qū)分)
任products送
a4區(qū)▼
pid
name
price
cidFK
現(xiàn)在我們有兩張表“分類表”和“商品表”。
目前從表的聲明上來說,沒有關(guān)系,但是我們有個需求:
商品應(yīng)該有所屬的分類,這個時候需要將分類表和商品表建立關(guān)系,如何建立?
按照以上需求分析:
主表是:商品表。主表中,應(yīng)該有一個字段去關(guān)聯(lián)從表,而這個關(guān)聯(lián)字段就是外鍵。
從表是:分類表。從表中,應(yīng)該有一個字段去關(guān)聯(lián)主表,而這個關(guān)聯(lián)字段就是主鍵。
?主鍵外鍵的理解
MS3^
Scategory|S3里products區(qū)
Z*cid主催Qpid
cnamename
price
cid研
?如何操作外鍵
■主表添加外里的格手______________________________________________________________
altertable表名add[constraint][約束名稱]foreignkey(主表外鍵字段)references
從表(從表主鍵)
■主表刪除外鍵的格式:
altertable表名dropforeignkey外鍵約束名稱
■使用外鍵目的:
■保證數(shù)據(jù)完整性(數(shù)據(jù)保存在多張表中的時候)
■在互聯(lián)網(wǎng)項目中,一般情況下,不建議建立外鍵關(guān)系。
5.3一對一關(guān)系(了解)
在實際工作中,一對一在開發(fā)中應(yīng)用不多,因為一對一完全可以創(chuàng)建成一張表
案例:一個丈夫只能有一個妻子
?建表語句:
?一對一關(guān)系創(chuàng)建方式1之外鍵唯一:
■添加外鍵列wid,指定該列的約束為唯一(不如儂一約燙就是一對多關(guān)系)
ALTERTABLEhusbandADDwidINTUNIQUE;
■添加外鍵約束
altertablehusbandaddforeignkey(wid)referenceswife(id);
?一對一關(guān)系創(chuàng)建方式2之主鍵做外鍵:(課后作業(yè))
■思路:使用主表的主鍵作為外鍵去關(guān)聯(lián)從表的主鍵
5.4一對多關(guān)系
案例:一個分類對應(yīng)多個商品
?注意事項:
-對多關(guān)系和一對一關(guān)系的創(chuàng)建很類似,唯一區(qū)別就是外鍵不唯一。
?一對多關(guān)系創(chuàng)建:
■添加外鍵列
■添加外鍵約束
?案例:
1.在商品表中添加一條記錄,該記錄的cid在分類表中不存在
2.在分類表中,刪除一條記錄,這條記錄在商品表中有外鍵關(guān)聯(lián)
5.5多對多關(guān)系
案例:同一個商品對應(yīng)多個訂單,一個訂單對應(yīng)多個商品
?注意事項:
■需要中間表去完成多對多關(guān)系的創(chuàng)建
■多對多關(guān)系其實就是兩個一對多關(guān)系的組合
?多對多關(guān)系創(chuàng)建:
■創(chuàng)建中間表,并在其中創(chuàng)建多對多關(guān)系中兩張表的外鍵列
■在中間表中添加外鍵約束
■在中間表中添加聯(lián)合主鍵約束
6多表關(guān)聯(lián)查詢
我們已經(jīng)學(xué)會了如何在一張表中讀取數(shù)據(jù),這是相對簡單的,但是在真正的應(yīng)用中經(jīng)常需要從多個
數(shù)據(jù)表中讀取數(shù)據(jù)。
本章節(jié)我們將向大家介紹如何使用MySQL的JOIN在兩個或多個表中查詢數(shù)據(jù)。
你可以在SELECT,UPDATE和DELETE語句中使用MySQL的JOIN來聯(lián)合多表查詢。
JOIN按照功能大致分為如下三類:
?CROSSJOIN(交叉連接)
?INNERJOIN(內(nèi)連接或等值連接)。
?OUTERJOIN(外連接)
?建表語句:
insertintocategory(cid,cname)values('cOOl','家電');
insertintocategory(cid,cname)values('c002','服飾');
insertintocategory(cid,cname)values('c003','化妝品');
insertintoproduct(pid,pname,price,cid)values('pOOl','聯(lián)想',5000,'cOOl');
insertintoproduct(pid,pname,price,cid)values('p002',‘海爾',3000,*cOOT);
insertintoproduct(pid,pname,price,cid)values('p003','雷神',5000,'cOOT);
insertintoproduct(pid,pname,price,cid)values('p004','阿迪',1000,'c002');
insertintoproduct(pid,pname,price,cid)values('p005'而寸克',1200,'c002,);
insertintoproduct(pid,pname,price,cid)values('p006','NB',800,'c002');
insertintoproduct(pid,pname,price,cid)values('p007','彪馬',600,'c002');
insertintoproduct(pid,pname,price,cid)values('p008',‘雪花秀',1500,'c003');
insertintoproduct(pid,pname,price,cid)values('p009','悅詩風(fēng)吟',1100,'c003');
6.1交叉連接
交叉連接的關(guān)鍵字:CROSSJOIN
交叉連接也叫笛卡爾積連接
笛片外積是指在數(shù)學(xué)中,兩個集合X和Y的笛卡爾積(Cartesianproduct),又稱直積,表示為X*Y,
第一個對象是X的成員而第二個對象是Y的所有可能有序?qū)Φ钠渲幸粋€成員。
交叉連接的表現(xiàn):行數(shù)相乘、列數(shù)相加
?隱式交叉連接
SELECT*FROMA,B
?顯式交叉連接
SELECT*FROMACROSSJOL\:B
案例:查詢商品表和分類表的笛卡爾積。
,多表查詢…準(zhǔn)備語句.sql
自動完成:[Tab]-下一個標(biāo)簽,[Ctrl+Space]一列出所有標(biāo)簽,[Ctd+Enter]<列出匹取標(biāo)簽
3SELECT*FROMcategory;
4SELECT*FROMproduct;交叉連接SQL語句
6一隱式交叉連接J,
71SELECT*FROMproduct,category;|
t2Profiler牛3信息曷4表致?lián)?信息
Y0叵限腑第一行:o
廠二一I(只讀)?曷再出畬看|一言言?
pnamepricecname
性總5000C001京電
5000c0':2強緯分類表記錄
聯(lián)想5000COG3化妝品
海爾3000CO01冢電
海爾3000c002弟的
海爾3000cOC3化妝品
蕾種5000cOCl豕電
雷神5000c002服飾
常神5000c003化妝品
阿迨1000C001★電一
阿
isC002魔飾
阿化妝品
i£克c003
耐
克C001京電
時
主c002展飾婀連酰錄總數(shù)
向
c003化妝品
□二
prp3京電
□06
服飾
□口06
□06化妝品
PO07京亳
□R07
原飾
select*fromproduct,categoryLIMIT0,1000
II
6.2內(nèi)連接
內(nèi)連接的關(guān)鍵字:INNERJOIN
內(nèi)連接也叫等值連接,內(nèi)聯(lián)接使用比較運算符根據(jù)每個表共有的列的值匹配兩個表中的行。
?隱式內(nèi)連接
SELECT*FROMA,BWHEREA.id=B.id
?顯式內(nèi)連接
SELECT*FROMAINNERJOINBONA.id=B.id
6.3外連接
外聯(lián)接可以是左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接。也就是說外連接又分為:左外連接、右外
連接、全外連接
外連接需要有主表或者保留表的概念。
在FROM子句中指定外聯(lián)接時,可以由下列幾組關(guān)鍵字中的一組指定:
?左外連接:LEFTJOIN或者LEFTOUTERJOIN
SELECT*FROMALEFTJOINBONA.id=B.id
案例:查詢分類信息,關(guān)聯(lián)查詢商品信息
?右外連接::RIGHTJOIN或者RIGHTOUTERJOIN
SELECT*FROMARIGHTJOINBONA.id=B.id
?全外連接(MySQL不支持):FULLJOIN或FULLOUTERJOIN
SELECT*FROMAFULLJOINBONA.id=B.id
外連接總結(jié):
?通過業(yè)務(wù)需求,分析主從表
?如果使用LEFTJOIN,則主表在它左邊
?如果使用RIGHTJOIN,則主表在它右邊
?查詢結(jié)果以主表為主,從表記錄匹配不到,則補null
6.4分頁查詢
MySQL的分頁關(guān)鍵字是:LIMIT
LIMIT關(guān)鍵字不是SQL92標(biāo)準(zhǔn)提出的關(guān)鍵字,它是MySQL獨有的語法。
通過Limit關(guān)鍵字,MySQL實現(xiàn)了物理分頁。
分頁分為邏輯分頁和物理分頁
邏輯分頁:將數(shù)據(jù)庫中的數(shù)據(jù)查詢到內(nèi)存之后再進(jìn)行分頁。
物理分頁:通過UMIT關(guān)鍵字,直接在數(shù)據(jù)庫中進(jìn)行分頁,最終返回的數(shù)據(jù),只是分頁后的數(shù)據(jù)。
?格式:
SELECT*FROMtableLIMIT[offset,]rows
offset:編譯量
rows:每頁多少行記錄。
?案例
1.分頁查詢商品表,每頁3條記錄,查第一頁
6.5子查詢
?定義
子查詢允許把一個查詢嵌套在另一個查詢當(dāng)中。
子查詢,又叫內(nèi)部查詢,相對于內(nèi)部查詢,包含內(nèi)部查詢的就稱為外部查詢
子查詢可以包含普通select可以包括的任何子句,比如:distinctAgroupby、orderby、
1imit>join和union等;
但是對應(yīng)的外部查詢必須是以下語句之一:select、insert、update>delete.
?位置
select中、from后、where中.
groupby和orderby中無實用意義。
?舉例
1.查詢“化妝品”分類下的商品信息
6.6查詢原理
第一、單表查詢:根據(jù)WHERE條件過濾表中的記錄,形成中間表(這個中間表對用戶是不可見的);
然后根據(jù)SELECT的選擇列選擇相應(yīng)的列進(jìn)行返回最終結(jié)果。
第二、兩表連接查詢:對兩表求積(笛卡爾積)并用ON條件和連接連接類型進(jìn)行過濾形成中間表;
然后根據(jù)WHERE條件過濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
第三、多表連接查詢:先對第一個和第二個表按照兩表連接做查詢,然后用查詢結(jié)果和第三個表做
連接查詢,以此類推,直到所有的表都連接上為止,最終形成一個中間的結(jié)果表,然后根據(jù)WHERE
條件過濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
理解SQL查詢的過程是進(jìn)行SQL優(yōu)化的理論依據(jù)。
7MySQL架構(gòu)
7.1邏輯架構(gòu)圖1
Connectors
NaiivoCAPI.JDBC.ODBC..NET.PHP.Pod.Python.Ruby.Cobol
?Connectors
指的是不同語言中與SQL的交互
?ManagementServeices&Utilities:
系統(tǒng)管理和控制工具
?ConnectionPool:連接池
*管理緩沖用戶連接,線程處理等需要緩存的需求。
*負(fù)責(zé)監(jiān)聽對MySQLServer的各種請求,接收連接請求,轉(zhuǎn)發(fā)所有連接請求到線程管理模塊。每
一個連接上MySQLServer的客戶端請求都會被分配(或創(chuàng)建)一個連接線程為其單獨服務(wù)。
*而連接線程的主要工作就是負(fù)責(zé)MySQLServer與客戶端的通信,接受客戶端的命令請求,傳遞
Server端的結(jié)果信息等。線程管理模塊則負(fù)責(zé)管理維護這些連接線程。包括線程的創(chuàng)建,線程的
cache等。
?SQLInterface:SQL接口
接受用戶的SQL命令,并且返回用戶需要查詢的結(jié)果。比如selectfrom就是調(diào)用SQLInterface
?Parser:解析器
*SQL命令傳遞到解析器的時候會被解析器驗證和解析。
主要功能:
a.將SQL語句進(jìn)行語義和語法的分析,分解成數(shù)據(jù)結(jié)構(gòu),然后按照不同的操作類型進(jìn)行分類,
然后做出針對性的轉(zhuǎn)發(fā)到后續(xù)步驟,以后
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 乘除法練習(xí)題1000道輕松打印隨身攜帶
- 小學(xué)生銀行卡知識
- 2025年住宅按揭保證合同指南
- 2025年中小企業(yè)員工合同標(biāo)準(zhǔn)版
- 2025年企業(yè)級數(shù)據(jù)管理系統(tǒng)開發(fā)合同
- 2025年合伙經(jīng)營策劃退出協(xié)議樣本
- 2025年咖啡廳加盟協(xié)議
- 2025年醫(yī)療機構(gòu)業(yè)務(wù)院長職責(zé)與聘用合同
- 2025年華夏地產(chǎn)市場調(diào)研與咨詢服務(wù)合同
- 2025年企業(yè)交通工具租賃合同樣式
- 攝影測量學(xué)實習(xí)指導(dǎo)書
- 大學(xué)生家長陪讀承諾書
- 安全生產(chǎn)事故調(diào)查與案例分析(第3版)課件 呂淑然 第5章 事故案例評析
- 2023版交安A、B、C證考試題庫含答案
- 樓梯 欄桿 欄板(一)22J403-1
- 勞動法培訓(xùn)課件
- 主題活動一《我調(diào)查》(教學(xué)實錄)-2023-2024學(xué)年二年級下冊綜合實踐活動內(nèi)蒙古版
- 2024-2025年粵教花城版七年級音樂上冊全冊教學(xué)設(shè)計
- PEP人教版小學(xué)英語六年級下冊單詞表(含音標(biāo))
- (正式版)JBT 106-2024 閥門的標(biāo)志和涂裝
- 頭頸部影像學(xué)表現(xiàn)(詳細(xì)、全面)
評論
0/150
提交評論