




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Oracle Java EE實(shí)訓(xùn)教材系列數(shù)據(jù)庫的設(shè)計(jì)與開發(fā)第一章 MySQL介紹目 標(biāo)解釋MySQL產(chǎn)品的起源和狀態(tài)列出現(xiàn)有的MySQL產(chǎn)品及專業(yè)服務(wù)安裝MySQL及“world”數(shù)據(jù)庫描述MySQL客戶端-服務(wù)器模型MySQL概述MySQL最初是由“MySQL AB”公司開發(fā)的一套關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。MySQL不僅是最流行的開源數(shù)據(jù)庫,而且是業(yè)界增長最快的數(shù)據(jù)庫,每天有超過7萬次的下載量,其應(yīng)用范圍從大型企業(yè)到專有的嵌入應(yīng)用系統(tǒng)。MySQL AB是由兩個瑞典人和一個芬蘭人:David Axmark、Allan Larsson和Michael “Monty” Widenius在
2、瑞典創(chuàng)辦的。在2008年初,Sun Microsystems收購了MySQL AB公司。在2009年,Oracle收購了Sun公司,使MySQL并入Oracle的數(shù)據(jù)庫產(chǎn)品線。MySQL數(shù)據(jù)庫產(chǎn)品MySQL數(shù)據(jù)庫是公認(rèn)的簡單易用、高性能及高可靠性的產(chǎn)品。MySQL企業(yè)服務(wù)器MySQL社區(qū)服務(wù)器MySQL嵌入數(shù)據(jù)庫MySQL集群MySQL圖形用戶界面(GUI)工具M(jìn)ySQL GUI工具為MySQL數(shù)據(jù)庫提供了一組豐富的圖形用戶界面。MySQL移植工具包MySQL AdministratorMySQL Query BrowserMySQL驅(qū)動程序MySQL數(shù)據(jù)庫驅(qū)動程序(也稱作連接器),為多種編程
3、語言提供數(shù)據(jù)庫客戶端的連接。MySQL包括以下連接器:MySQL C APIMySQL連接器/ODBCMySQL連接器/JMySQL連接器/NetMySQL連接器/PHP嵌入式MySQL解決方案MySQL還提供了庫文件,用來將MySQL數(shù)據(jù)庫服務(wù)器嵌入到程序中。libmysqldMySQL MXJ安裝MySQL推薦到MySQL網(wǎng)站的下載網(wǎng)頁: downloads/下載MySQL數(shù)據(jù)庫服務(wù)器。這里有多種支持的平臺,并且每個版本都有不同的安裝說明。在Windows中安裝MySQL服務(wù)器安裝“world”數(shù)據(jù)庫MySQL提供了三個數(shù)據(jù)庫示例,以用于測試數(shù)據(jù)庫特征及培訓(xùn)。下載地址為:。需要使用MySQ
4、L命令行客戶端來裝載world數(shù)據(jù)庫。1.創(chuàng)建“world”數(shù)據(jù)庫mysql CREATE DATABASE world;2.選擇“world”數(shù)據(jù)庫mysql USE world;3.構(gòu)建“world”數(shù)據(jù)庫的表mysql SOURCE C:/world.sqlMySQL客戶端-服務(wù)器模型在網(wǎng)絡(luò)環(huán)境中,MySQL采用客戶端/服務(wù)器架構(gòu)進(jìn)行工作。MySQL的安裝包括以下主要部件: MySQL服務(wù)器客戶端程序MySQL非客戶端工具M(jìn)ySQL客戶端-服務(wù)器模型第二章 MySQL客戶端目 標(biāo)在MySQL客戶/服務(wù)器體系結(jié)構(gòu)中調(diào)用客戶端程序使用mysql客戶端程序調(diào)用客戶端程序MySQL客戶端程序可以
5、從命令行調(diào)用。當(dāng)客戶端程序被調(diào)用時,可以通過在程序名后指定選項(xiàng)來控制它的行為。選項(xiàng)也可以在選項(xiàng)文件中定義。shell mysql helpshell mysql -version通用命令選項(xiàng)語法MySQL程序選項(xiàng)具有以下兩種通用形式:長選項(xiàng),由單詞之前加兩個減號組成短選項(xiàng),由單個字母之前加一個減號組成shell mysql -versionshell mysql -V一些選項(xiàng)是要賦值的。例如:shell mysql -host=shell mysql -h shell mysql -建立連接的選項(xiàng)MySQL用戶身份選項(xiàng)-user=“用戶名”或 u “用戶名”-password=“密碼值”或 p
6、“密碼值”如何指定連接參數(shù)用缺省主機(jī)名和用戶名(沒有密碼)連接服務(wù)器:shell mysql使用用戶名“myname”連接本地主機(jī)服務(wù)器,讓mysql提示用戶輸入密碼:shell mysql -host=localhost -password -user=myname與上例使用相同的選項(xiàng),但使用相應(yīng)的短選項(xiàng)形式:shell mysql -h localhost -p -u myname交互式使用mysqlmysql客戶端程序可以交互式地使用,或以批處理模式從文件中讀取查詢。交互式模式對日常使用是非常有用的,例如快速的SQL語句處理,以及測試SQL語句是如何工作的。對運(yùn)行保存在文本文件中的SQL
7、語句(也稱為SQL腳本),批處理是很有用的。例如:mysql SELECT VERSION(); 或shell mysql -u user_name -ppassword -e SELECT VERSION() 語句結(jié)束符有多個結(jié)束符可用于終結(jié)語句:mysql SELECT VERSION(), DATABASE();mysql SELECT VERSION(), DATABASE()g 可以用mysql命令DELIMITER來改變結(jié)束符:mysql DELIMITER go mysql SELECT COUNT(*) - FROM world.City - go G序列也被用作語句結(jié)束符,但
8、它還有其它影響,即導(dǎo)致mysql以垂直方式顯示結(jié)果:mysql SELECT VERSION(), DATABASE() G 語句結(jié)束符mysql允許使用多個輸入行來鍵入一個查詢:mysql SELECT Name, Population FROM City - WHERE CountryCode = IND - AND Population 3000000; 如果一條語句導(dǎo)致錯誤,mysql將顯示服務(wù)器返回的錯誤信息:mysql This is an invalid statement;如果想要終止一條正在編寫的語句,可鍵入c。為了退出mysql,可使用q、QUIT或EXIT:mysql q
9、 mysql提示符mysql提示符為了重新定義“mysql”提示符,可使用prompt命令;mysql prompt win 1win 1在提示符中放入當(dāng)前信息,諸如用戶、主機(jī)和數(shù)據(jù)庫;mysqlprompt (uh) dPROMPT set to (uh) d(rootlocalhost) world為了將提示符轉(zhuǎn)換為缺省形式,應(yīng)輸入不帶參數(shù)的prompt命令或R。(rootlocalhost) worldpromptReturning to default PROMPT of mysqlmysql在mysql中使用編輯鍵mysql客戶端支持輸入行的編輯,這使得它可以回調(diào)以前的輸入行并可以進(jìn)
10、行編輯。在Unix/Linux上,它還支持“tab”完成鍵,從而可以更容易地輸入查詢。四個方向鍵在Unix下,mysql客戶端擁有全部的readline功能會話期間命令歷史的保存在mysql中使用腳本文件一個包含SQL語句并將要被執(zhí)行的輸入文件叫做腳本文件或SQL批處理文件。處理腳本文件的方法之一是用SOURCE命令在mysql中執(zhí)行它:mysql SOURCE input_file例如:mysql SOURCE C:/scripts/my_commands.sqlmysql SOURCE ./scripts/my_commands.sql客戶端命令與SQL語句當(dāng)mysql在運(yùn)行中發(fā)布一條SQ
11、L語句時,程序?qū)⒃撜Z句發(fā)送到MySQL服務(wù)器來執(zhí)行。SELECT、INSERT、UPDATE和DELETE都是這類輸入的示例。mysql也會知道其中哪些是自己的命令而非SQL語句。例如:QUITSOURCESTATUSHELP第三章 表數(shù)據(jù)查詢目 標(biāo)使用SELECT語法執(zhí)行基本的、單個表的查詢聚集查詢結(jié)果使用UNION關(guān)鍵字連接多個SELECT語句的結(jié)果SELECT語句SELECT語句主要被用于查詢數(shù)據(jù)庫中的一個或多個表里的數(shù)據(jù)。SELECT語句表示數(shù)據(jù)庫中一組特定的數(shù)據(jù)記錄。SELECT語句的基本的語法模式如下:SELECT FROM 例如:mysql SELECT Name FROM Co
12、untry;mysql SELECT 1+2; 基本的SELECT使用許多子句及它們的結(jié)合都可以用于SELECT語句中:FROM:指定從哪些表中獲取數(shù)據(jù)DISTINCT:消除重復(fù)的記錄行WHERE:只返回滿足特定條件(也叫過濾器)的記錄行ORDER BY:按照表達(dá)式列表排序記錄LIMIT:返回特定部分的數(shù)據(jù),而不是所有的結(jié)果集示例:SELECT DISTINCT FROM WHERE ORDER BY LIMIT 使用FROMFROM子句在SELECT語句中是可選項(xiàng),它出現(xiàn)在語句的表達(dá)式之后,而表達(dá)式是在SELECT關(guān)鍵字后面出現(xiàn)。FROM子句指定語句要處理的表。非限定表名FROM 例如:FR
13、OM Country限定的表名FROM .例如:FROM world.Country表的別名在SQL語句里,在FROM子句里引用的表可以給定一個臨時的名稱,該名稱叫做表的別名。 使用DISTINCT如果查詢的結(jié)果中包含重復(fù)的記錄,該重復(fù)記錄要被刪除以生成每行都是唯一的結(jié)果集。為了達(dá)到這個目的,可在SELECT關(guān)鍵字后添加DISTINCT關(guān)鍵字。mysql SELECT Continent FROM Country;mysql SELECT DISTINCT Continent FROM Country;在指定的列里,DISTINCT將所有的NULL值當(dāng)作相同的值。mysql SELECT i,
14、 j FROM t;mysql SELECT DISTINCT i, j FROM t;使用WHEREWHERE子句將過濾滿足特定條件的記錄。例如:mysql SELECT ID, Name, District FROM city WHERE Name = New York;MySQL支持許多不同類型的運(yùn)算符,這依賴于操作數(shù)的數(shù)據(jù)類型,或操作數(shù)與運(yùn)算符處理的值的數(shù)據(jù)類型。運(yùn)算比較 邏輯例如:mysql SELECT Name, Population - FROM Country - WHERE Population 50000000 AND - (Continent = Europe OR C
15、ode = USA);mysql SELECT ID, Name, District - FROM city - WHERE Name IN (New York, Rochester, Syracuse);關(guān)于NULL如果有一個操作數(shù)的結(jié)果是NULL,則大多數(shù)運(yùn)算符的求值結(jié)果也會是NULL。當(dāng)NULL值表達(dá)式在函數(shù)中被用于操作數(shù)時,運(yùn)算符將產(chǎn)生NULL。WHERE子句也有相同的情況,WHERE子句會丟棄那些條件不是TRUE的記錄。在SELECT語句里使用ORDER BY如果有必要讓輸出記錄按某一特定的順序返回,可以使用ORDER BY子句以顯示如何排序結(jié)果集。mysql SELECT Name
16、 FROM Country ORDER BY Name;可以在ORDER BY表達(dá)式后使用ASC或DESC來明確指定記錄按升序或降序排列。mysql SELECT Name - FROM Country - ORDER BY Name DESC;還可以用多個表達(dá)式同時排序,每個表達(dá)式有自己的排列順序。mysql SELECT Name, Continent - FROM Country - ORDER BY Continent DESC, Name ASC;在SELECT語句里使用LIMIT當(dāng)一個查詢返回許多記錄行時,有必要通過增加LIMIT子句來限定只顯示部分記錄。LIMIT子句可以采用以下
17、一個或兩個參數(shù):LIMIT row_countLIMIT skip_count, row_count例如:mysql SELECT Name FROM Country ORDER BY Name LIMIT 3;mysql SELECT Name FROM Country ORDER BY Name LIMIT 2,3;它常見的用處是獲取包含某個特定列的最小或最大值的行,例如:mysql SELECT * FROM Country ORDER BY SurfaceArea LIMIT 1;mysql SELECT Name, Population - FROM Country - ORDER
18、BY Population DESC LIMIT 5;聚集查詢結(jié)果有可能出現(xiàn)這種情況,結(jié)果集里的一行對應(yīng)于底層基表里的一組記錄行。這個過程叫聚合,并且這樣一個結(jié)果集被稱為聚集。計(jì)算一組值的摘要值的函數(shù)(例如AVG()被稱為“聚集”函數(shù)。MIN()MAX()SUM()AVG()STD()COUNT()GROUP_CONCAT()聚集查詢結(jié)果示例例如,使用COUNT(*)函數(shù)來統(tǒng)計(jì)world數(shù)據(jù)庫中Country表中的行數(shù)。mysql SELECT COUNT(*) FROM Country;現(xiàn)在,指定統(tǒng)計(jì)Capital列而產(chǎn)生不同的結(jié)果,因?yàn)椴皇敲總€國家都有Capital,NULL值將不會被統(tǒng)計(jì)
19、:mysql SELECT COUNT(Capital) FROM Country;用SELECT與GROUP BY分組所有在GROUP BY子句中指定的表達(dá)式里,具有相同結(jié)合值的記錄行將按一組處理,在結(jié)果集里以一行結(jié)束。聚集函數(shù)可以與GROUP BY一起使用將記錄分組。當(dāng)帶有GROUP BY子句時,聚集函數(shù)將為每個組統(tǒng)計(jì)值。mysql SELECT Continent, AVG(Population) - FROM Country - GROUP BY Continent;帶GROUP_CONCAT()的分組GROUP_CONCAT()函數(shù)將每組的結(jié)果字符串連接起來。例如,將南美洲的國家按特
20、定的政府形式創(chuàng)建國家的列表:mysql SELECT GovernmentForm, GROUP_CONCAT(Name) AS Countries - FROM Country - WHERE Continent = South America - GROUP BY GovernmentFormG帶WITH ROLLUP的分組可在GROUP BY子句里使用WITH ROLLUP修飾符來產(chǎn)生多個級別的統(tǒng)計(jì)值。例如:mysql SELECT Continent, SUM(Population) as pop - FROM Country - GROUP BY Continent - WITH R
21、OLLUP;mysql SELECT Continent, AVG(Population) AS avg_pop - FROM Country - GROUP BY Continent WITH ROLLUP;HAVINGHAVING子句被用于消除基于聚集值的記錄行。例如:mysql SELECT Continent, SUM(Population) AS pop - FROM Country - GROUP BY Continent - HAVING SUM(Population) 100000000;使用UNIONUNION關(guān)鍵字能夠?qū)蓚€或多個SELECT語句的結(jié)果連接起來。其語句是:S
22、ELECT UNIONSELECT 缺省地,UNION消除結(jié)果集中的重復(fù)記錄。為了獲得所有的記錄行,可用UNION ALL取代每個UNION實(shí)例。UNION在下面情況下將很有用:多個表中有相似的信息,并且需要從這些表中立刻獲取記錄。需要從同一個表中獲取幾組記錄,但是表現(xiàn)每組的條件并不容易寫在一個單個的WHERE子句里。使用UNION例如:mysql CREATE TABLE list1 ( - subscriber CHAR(60), - email CHAR(60) - );mysql CREATE TABLE list2 ( - name CHAR(96), - address CHAR(
23、128) - );mysql CREATE TABLE list3 ( - email CHAR(50), - real_name CHAR(30) - );mysql SELECT subscriber, email FROM list1 - UNION - SELECT name, address FROM list2 - UNION - SELECT real_name, email FROM list3;使用UNION總體而言,ORDER BY與LIMIT可用于排序與限定一個UNION結(jié)果集。mysql(SELECT subscriber, email FROM list1) - UN
24、ION -(SELECT name, address FROM list2) - UNION -(SELECT real_name, email FROM list3) - ORDER BY email LIMIT 10;在UNION中,可以將ORDER BY與LIMIT應(yīng)用于單獨(dú)的SELECT語句中。mysql(SELECT subscriber, email FROM list1 ORDER BY email LIMIT 5) - UNION -(SELECT name, address FROM list2 ORDER BY address LIMIT 5) - UNION -(SELE
25、CT real_name, email FROM list3 ORDER BY email LIMIT 5);第四章 數(shù)據(jù)類型目 標(biāo)描述三個主要類別的數(shù)據(jù)類型理解字符集與校對規(guī)則分配合適的數(shù)據(jù)類型給表實(shí)體理解NULL與NOT NULL的含義與使用數(shù)據(jù)類型概述在MySQL中,可用的數(shù)據(jù)類型共分為四個主要類別:數(shù)值數(shù)字值(整數(shù)、浮點(diǎn)、定點(diǎn)數(shù)、位字段值)字符文本字符串二進(jìn)制二進(jìn)制數(shù)據(jù)字符串時間時間和日期ABC的數(shù)據(jù)類型A) Apt B)BriefC)Complete使用數(shù)據(jù)類型創(chuàng)建表創(chuàng)建表時,每個列的聲明包括列名、識別該列保存信息的數(shù)據(jù)類型以及可能的其它屬性(選項(xiàng))以用來明確定義MySQL如何處理該
26、列。例如:mysql CREATE TABLE people ( id INT, first_nameCHAR(30), last_name CHAR(30) );數(shù)值數(shù)據(jù)類型為了保存數(shù)值數(shù)據(jù),MySQL提供以下類型:整數(shù)類型:保存整數(shù)數(shù)字浮點(diǎn)類型:保存近似數(shù)值數(shù)據(jù)定點(diǎn)類型:保存精確數(shù)值位類型:保存位字段數(shù)值當(dāng)選擇一個數(shù)值數(shù)據(jù)類型時,應(yīng)考慮以下因素:數(shù)據(jù)類型數(shù)值的范圍列值所需要的存儲空間數(shù)量列的精度和標(biāo)度(適用于浮點(diǎn)和定點(diǎn)數(shù))整數(shù)類型以下列表是MySQL支持的整數(shù)數(shù)據(jù)類型:TINYINT SMALLINT MEDIUMINT INT或INTEGERBIGINT 例如:Population IN
27、T(11)浮點(diǎn)類型浮點(diǎn)數(shù)據(jù)類型包括FLOAT和DOUBLE。它們都被用來表示近似數(shù)值數(shù)據(jù),包含整數(shù)部分、小數(shù)部分或二者都有。FLOATDOUBLE對于FLOAT和DOUBLE,如果列可以為NULL,則缺省值是NULL,如果列不能為NULL,其缺省值是0。浮點(diǎn)類型FLOAT數(shù)據(jù)類型可以用以下不同的表示法來指定:不指定精度:FLOAT使用二進(jìn)制精度:FLOAT (M)指定總的數(shù)字位數(shù)與小數(shù)部分的數(shù)字位數(shù):FLOAT (D,F(xiàn))沒有任何精度:DOUBLE指定數(shù)值的位數(shù)與小數(shù)部分位數(shù):DOUBLE(D,F(xiàn))例如:GNP FLOAT(10,2)定點(diǎn)類型定點(diǎn)數(shù)據(jù)類型是DECIMAL,它被用來保存精確數(shù)值。
28、它們包含整數(shù)部分、小數(shù)部分或二者都有。DECIMAL數(shù)據(jù)類型用下列語法定義:DECIMAL(P,S)例如:cost DECIMAL(10,2)在MySQL中,NUMERIC數(shù)據(jù)類型與DECIMAL是相同的類型。 BIT類型BIT數(shù)據(jù)類型表示位字段值。BIT列指定了每個值所需要的位數(shù),從1到64位。例如:bit_col1 BIT(4)bit_col2 BIT(20)BIT列可以用數(shù)字表達(dá)式賦值。例如,b1111等于15,b1000000等于64。 字符串?dāng)?shù)據(jù)類型以下列出了MySQL提供的字符串?dāng)?shù)據(jù)類型。所有這些類型都可用于保存非結(jié)構(gòu)化格式的字符串:CHAR 固定長度字符串VARCHAR 可變長度
29、字符串TEXT 可變長度字符串MySQL還定義了兩種結(jié)構(gòu)化字符串類型:ENUM 由一組固定的有效值組成的枚舉SET 由一組固定的有效值組成的集合CHAR類型定義一個列為CHAR數(shù)據(jù)類型的語法如下:CHAR(L)L代表CHAR值可以接受的最大的字符數(shù)。CHAR列的每個值都將占用L個字符,即使該值不需要整個可用的長度。VARCHAR類型這種數(shù)據(jù)類型被用來存儲可變長度的字符串。其定義的語法是:VARCHAR(L)例如:Language VARCHAR(30)CountryLanguage表中的某個實(shí)例值只使用25個字符,盡管允許30個字符:Southern Slavic Languages文本類型文
30、本類型由一組非結(jié)構(gòu)化的、可變長度的字符串組成,它最適合于存儲訪問頻率低且相當(dāng)大的字符串。TINYTEXTTEXTMEDIUMTEXTLONGTEXTENUM類型ENUM類型是一個枚舉數(shù)據(jù)類型。語法ENUM(value1,vaulN)示例Continent ENUM(Asia,Europe,North Americal,Africa,Oceania,Antarctica,South American)SET類型SET類型可以從給定的列表中選擇將多個值組合為一個有效的值。語法SET(value1,valueN)示例special_features SET (Trailers, Commentari
31、es, Deleted Scenes, Behind the Scenes)字符集與校對規(guī)則的支持字符集是一套符號和編碼,其中包含了編碼規(guī)則以定義字符如何被編碼為數(shù)字。在字符比較時,所有字符串都按校對規(guī)則進(jìn)行比較。校對規(guī)則是一套比較序列的規(guī)則,它定義了字符的排序順序,以及管理單個字符和字符串如何與其它值進(jìn)行比較??捎孟旅娴恼Z句顯示可用的字符集:mysql SHOW CHARACTER SET;一個給定的字符集可以有幾個校對規(guī)則可用。這使得同一個字符集可以選擇不同的排序順序。mysql SHOW COLLATION LIKE latin1%;二進(jìn)制類型下面列舉了二進(jìn)制數(shù)據(jù)類型:BINARYVAR
32、BINARY除了這些類型,MySQL還支持很多BLOB類型。什么是BLOB?BLOB是一種可變長度的非結(jié)構(gòu)化的二進(jìn)制數(shù)據(jù)集合。通常地,BLOB是圖像、語音或其它多媒體對象。BLOB術(shù)語是二進(jìn)制大對象(Binary Large Object)的字首縮寫。MySQL支持的BLOB類型有以下幾種:TINYBLOBBLOBMEDIUMBLOB LONGBLOB時間數(shù)據(jù)類型MySQL提供了用來存儲不同類型時間信息的數(shù)據(jù)類型。TIME類型 用于存儲時間部分的信息YEAR類型 用兩位數(shù)字或四位數(shù)字格式表示年,缺省的是四位數(shù)字格式DATE類型 用于存儲完整的日歷日期DATETIME類型 存儲日期與時間信息TI
33、MESTAMP類型 與DATETIME一樣存儲日期和時間時間數(shù)據(jù)類型總結(jié)NULL的含義在SQL中,NULL值是一個特殊的值,表示無法計(jì)算或未知的值。對于可為NULL的列,出現(xiàn)NULL值有不同的含義。所有原因都可以歸為兩類:未 知不可用何時使用NULL在數(shù)據(jù)庫設(shè)計(jì)的開始階段,如果某列中有些數(shù)據(jù)是不可用的,這時需要詳查并決定是否允許NULL值。同時,對已有的表,如果發(fā)現(xiàn)的問題是由于列中出現(xiàn)了NULL值引起的,可以修改表的定義以允許NULL值。例如:LifeExpectancy FLOAT(3, 1) DEFAULT NULL在MySQL中,列缺省是可以為NULL的(除了TIMESTAMP列),除非
34、特定聲明它不能為NULL。何時不用NULL有時,可能不允許列為NULL,通常的情況是當(dāng)該列為主鍵時。作為主鍵列缺省是不能為NULL的,TIMESTAMP列也是不能為NULL的。另外,可以使用NOT NULL來聲明該列不為NULL。例如:Name CHAR(35) NOT NULLIsOfficial ENUM(T, F) NOT NULL DEFAULT F第五章 SQL表達(dá)式目 標(biāo)使用表達(dá)式組件在表達(dá)式中使用數(shù)值、字符串和時間值SQL表達(dá)式的組件表達(dá)式通常出現(xiàn)在SELECT、DELETE或UPDATE語句的WHERE子句里,用來表示要獲取、刪除或修改的記錄。表達(dá)式也可以被用于許多其他地方,例
35、如,SELECT語句輸出列的列表中、ORDER BY或GROUP BY子句中。表達(dá)式由直接量(數(shù)字、字符串、日期與時間)、內(nèi)置的常量(例如NULL、TRUE與FALSE)、表的列引用及函數(shù)調(diào)用組成。SQL表達(dá)式示例下列語句使用表的列從Country表里獲取國家的名稱與人口:mysql SELECT Name, Population FROM Country;可以直接使用沒有保存在表里的直接量數(shù)據(jù)值。例如:mysql SELECT 14, -312.82, 4.32E-03, I am a string;另一個產(chǎn)生數(shù)據(jù)值的方法是調(diào)用函數(shù)。例如:mysql SELECT CURDATE(), VE
36、RSION();復(fù)雜的SQL表達(dá)式示例mysql SELECT Name, - TRUNCATE(Population/SurfaceArea,2) AS people/sq. Km, - IF(GNP GNPOld, Increasing, Not increasing) AS GNP Trend - FROM Country - ORDER BY Name LIMIT 10;數(shù)字表達(dá)式數(shù)字可以是精確值直接量或近似值直接量。精確值直接量是不帶指數(shù)的,而近似值直接量是用帶指數(shù)的科學(xué)記數(shù)法表示的。精確值數(shù)字是整數(shù)值或小數(shù)值。近似值直接量表示為浮點(diǎn)數(shù)(像DOUBLE數(shù)據(jù)類型),并且有尾數(shù)與指數(shù)。幾
37、乎所有包含有NULL部分的數(shù)字表達(dá)式都將運(yùn)算為NULL。例如:mysql SELECT 1.1 + 2.2 = 3.3, 1.1E0 + 2.2E0 = 3.3E0;如果在數(shù)字表達(dá)式里混合了數(shù)字與字符串,MySQL將字符串轉(zhuǎn)換為數(shù)字并執(zhí)行數(shù)字操作:mysql SELECT 1 + 1, 1 = 1;字符串表達(dá)式表達(dá)式里的直接量字符串使用帶引號的值表示。在表達(dá)式里直接使用字符串通常出現(xiàn)在比較操作中。 小于= 小于或等于= 等于 等于(也可用于NULL值)或!= 不等于= 大于或等于 大于BETWEENAND 測試字符串是否在該值的范圍內(nèi)字符串表達(dá)式在MySQL里,字符串的連接通常是使用CONCA
38、T()函數(shù)來實(shí)現(xiàn)的:mysql SELECT CONCAT(abc, def, REPEAT(X,3);缺省地,“|”運(yùn)算符被當(dāng)作邏輯或(OR)操作。mysql SELECT abc | def;在PIPES_AS_CONCAT被啟用后,“|”將產(chǎn)生字符串連接: mysql SET sql_mode = PIPES_AS_CONCAT;mysql SELECT abc | def;字符串比較里的大小寫敏感字符串表達(dá)式包含了來自于特定字符集中的字符,它與字符集里可用的一個校對規(guī)則(排列順序)相關(guān)聯(lián)。字符由單字節(jié)或多字節(jié)組成,而校對規(guī)則可能是大小寫不敏感的或大小寫敏感的。直接量字符串的缺省字符和校
39、對規(guī)則依賴于系統(tǒng)變量character_set_connection與collation_connection的值。缺省的字符集是latin1,缺省的校對規(guī)則是latin1_swedish_ci,校對規(guī)則名稱后面的“_ci”顯示它是大小寫不敏感的。mysql SELECT Hello = hello;字符串比較里的大小寫敏感一個給定的校對規(guī)則可能會出現(xiàn)某種重音字符與其他字符的比較是相同的。例如,“”與“ue”在缺省的latin1_swedish_ci校對規(guī)則里是不同的,但在latin1_german2_ci校對規(guī)則里卻是相同的: mysql SELECT Mller = Muller;mysq
40、l SET collation_connection = latin1_german2_ci;mysql SELECT Mller = Muller;使用LIKE模式匹配有時有必要找到類似的值,而此時模式匹配將非常有用。expression LIKE pattern被用于模式的字符串直接量里,字符_與%有特殊的含義(“元字符”),它表示一個通配符而不是字符本身的含義:字符%匹配任何零或多個字符序列。字符_(下劃線)匹配任何單字符。模式也可以與這些元字符結(jié)合使用。mysql SELECT Name FROM Country - WHERE Name LIKE United%;為了顛倒匹配模式,使
41、用NOT LIKE而不用LIKE:mysql SELECT Name FROM Country - WHERE Name NOT LIKE United%;使用正則表達(dá)式來進(jìn)行模式匹配還有一個更強(qiáng)大的模式匹配運(yùn)算符:REGEXP或RLIKE。LIKE與RLIKE的區(qū)別是RLIKE的模式是正則表達(dá)式。使用正則表達(dá)式,你可以測試復(fù)雜的模式,例如:URLIP地址E-mail地址電話號碼郵政編碼 使用正則表達(dá)式示例mysql SELECT Name FROM City - WHERE Name RLIKE nat;mysql SELECT Name FROM City - WHERE Name RLI
42、KE New.*rk$;mysql SELECT Name FROM City - WHERE Name RLIKE Los | Las;mysql SELECT Name FROM City - WHERE Name RLIKE Laos;mysql SELECT CityName, StreetName FROM Addresses WHERE - PostalCode RLIKE A-HJ-NP-Z0-94(A-Z3)?$;轉(zhuǎn)義字符如果想要匹配正則表達(dá)式里的字符本身,必須使用轉(zhuǎn)義。mysql SELECT RLIKE ;ERROR 1139 (42000): Got error trai
43、ling backslash () from regexpmysql SELECT RLIKE ;mysql SELECT RLIKE ;時間表達(dá)式可通過以下方式來產(chǎn)生時間值:從已有的DATE、DATETIME或TIME列復(fù)制數(shù)據(jù)。執(zhí)行內(nèi)置的函數(shù)返回一個DATE、DATETIME或TIME列。構(gòu)建一個由服務(wù)器來執(zhí)行的時間數(shù)據(jù)的字符串表達(dá)式。時間表達(dá)式日期組件:DATEYYYY-MM-DDTIMEHH:MM:SSDATETIMEYYYY-MM-DD HH:MI:SSTIMESTAMPYYYY-MM-DD HH:MI:SSDAY DDMONTHMMQUARTERQYEARYYYY時間表達(dá)式為了執(zhí)行
44、內(nèi)部的計(jì)算,可使用INTERVAL關(guān)鍵字與一個單元值。例如:mysql SELECT 2010-01-01 + INTERVAL 10 DAY, INTERVAL 10 DAY + 2010-01-01;mysql SELECT 2010-01-01 - INTERVAL 10 DAY;第六章 數(shù)據(jù)庫目 標(biāo)理解MySQL的數(shù)據(jù)目錄使用好的實(shí)踐經(jīng)驗(yàn)進(jìn)行數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)選擇合適的數(shù)據(jù)庫標(biāo)識符創(chuàng)建、修改和刪除數(shù)據(jù)庫數(shù)據(jù)庫屬性MySQL服務(wù)器通過執(zhí)行存儲、檢索與操作數(shù)據(jù)行來管理數(shù)據(jù)。行是包含在表中,而表是包含在數(shù)據(jù)庫中。MySQL使用文件系統(tǒng)的一個目錄來表示一個數(shù)據(jù)庫,這種目錄被稱作數(shù)據(jù)庫目錄。對于一個
45、特定的MySQL服務(wù)器,它所有的數(shù)據(jù)庫目錄都有一個共同的父目錄:data目錄。設(shè)計(jì)實(shí)踐當(dāng)設(shè)計(jì)數(shù)據(jù)庫時,要考慮兩件重要的事情:存儲的信息:要保存什么樣的信息?要問的問題:發(fā)送到數(shù)據(jù)庫的查詢。為了實(shí)踐良好的設(shè)計(jì),可以運(yùn)用不同的MySQL技術(shù):鍵 用于標(biāo)識唯一的數(shù)據(jù)標(biāo)準(zhǔn)化 精煉數(shù)據(jù)庫表以提高效率的過程建模 數(shù)據(jù)庫結(jié)構(gòu)的圖形表示鍵超鍵(Super Key)即表中的一組列,用來唯一標(biāo)識表中的一行。候選鍵(Candidate Key)是一個能標(biāo)識一行的最小列組。主鍵(Primary Key)就是一個候選鍵,被設(shè)計(jì)(或創(chuàng)建)為精確定義一個唯一的行。表中的主鍵能夠被另一個表所引用,從而連接兩個表。引用鍵被稱作
46、外鍵(Foreign Key)。使用鍵的好處:降低查找時間強(qiáng)化每行的唯一標(biāo)識主鍵不能包含NULL(未知或空值)鍵的示例常見的圖表系統(tǒng)實(shí)體關(guān)系圖ERD是一個很常見的數(shù)據(jù)模型或圖表,用于數(shù)據(jù)模型概念的高級描述,它還提供了表示這類模型數(shù)據(jù)的圖形表示。這類模型通常被用于信息系統(tǒng)設(shè)計(jì)的第一階段;例如,在需求分析中,它們被用于描述所需的信息和/或要被保存在數(shù)據(jù)庫里的信息類型。基本的ERD關(guān)系符號標(biāo)準(zhǔn)化在關(guān)系型數(shù)據(jù)庫設(shè)計(jì)中,標(biāo)準(zhǔn)化是細(xì)化數(shù)據(jù)庫設(shè)計(jì)的過程,以此確保每個獨(dú)立的信息塊僅被存放在一個地方(除外鍵外)。對于復(fù)雜表的標(biāo)準(zhǔn)化,通常是將其分解為一系列的小表。該過程將刪除行里的冗余組以及列里的重復(fù)數(shù)據(jù)。為什么
47、要標(biāo)準(zhǔn)化?消除冗余數(shù)據(jù) 消除列與鍵的無關(guān)性隔離獨(dú)立的多重關(guān)系world數(shù)據(jù)庫標(biāo)準(zhǔn)化的實(shí)例其中有一個表是CountryLanguage。為什么語言不包含在Country表里?因?yàn)椴煌瑖依锟赡苡卸喾N語言增加更多的列到Country表結(jié)構(gòu)里將導(dǎo)致效率低下同樣,還有只適合于語言自身的詳細(xì)信息可能與國家的其他信息沒有任何關(guān)系(例如,官方語言、講每種語言的人口百分比)在創(chuàng)建該表時,標(biāo)準(zhǔn)化的目的達(dá)到了,因?yàn)樗男畔⒅槐4嬖谝粋€地方,并且通過主鍵與其他表關(guān)聯(lián)標(biāo)準(zhǔn)的樣式標(biāo)準(zhǔn)化有許多級別,每個連續(xù)的級別都對數(shù)據(jù)的修改、異常的消除提供了強(qiáng)有力的保障。第一標(biāo)準(zhǔn)樣式(1NF)第二標(biāo)準(zhǔn)樣式(2NF)第三標(biāo)準(zhǔn)樣式(3
48、NF)一對多關(guān)系標(biāo)準(zhǔn)化數(shù)據(jù)庫的最積極結(jié)果之一是產(chǎn)生了表之間的關(guān)系。World數(shù)據(jù)庫也有這種關(guān)系的實(shí)例:一個國家對多種語言一個國家對多個城市標(biāo)識符標(biāo)識符是一個別名、數(shù)據(jù)庫、表、列或索引的簡單名稱。標(biāo)識符可以是非引用的或引用的。如果是非引用的,它必須遵循以下規(guī)則:標(biāo)識符可以包含所有文字?jǐn)?shù)字字符、下劃線(_)和美元符號($)標(biāo)識符可以以任何合法的字符,甚至數(shù)字開始標(biāo)識符不能全部為數(shù)字標(biāo)識符可以被引用將保留單詞作為標(biāo)識符保留單詞是特殊的標(biāo)識符。例如,函數(shù)名稱、表名或列名均不能被用作標(biāo)識符,否則會出現(xiàn)錯誤。例如:mysql CREATE TABLE t (order INT NOT NULL, d DA
49、TE NOT NULL);mysql SELECT 1 AS INTEGER;將保留單詞作為標(biāo)識符為了使用保留單詞作為數(shù)據(jù)庫、表、列或索引標(biāo)識符,有一到兩種可用的引用方式,它依賴于服務(wù)器的SQL模式。mysql CREATE TABLE t (order INT NOT NULL UNIQUE, d DATE NOT NULL);mysql CREATE TABLE t (order INT NOT NULL UNIQUE, d DATE NOT NULL);為了將保留單詞作為別名,可以使用單引號、雙引號或倒引號來引用它。mysql SELECT 1 AS INTEGER;mysql SELE
50、CT 1 AS INTEGER;mysql SELECT 1 AS INTEGER;當(dāng)然,好的辦法是避免使用函數(shù)名為標(biāo)識符。使用限定名稱列與表的標(biāo)識符可以用限定形式書寫。表名也可以用所屬的數(shù)據(jù)庫名稱來限定它。mysql SELECT * FROM Country;mysql SELECT * FROM world.Country;列名也可以通過與它所屬的表名一起使用來限定。mysql SELECT Name FROM Country;mysql SELECT Country.Name FROM Country;mysql SELECT world.Country.Name FROM world
51、.Country;創(chuàng)建數(shù)據(jù)庫可使用CREATE DATABASE(SCHEMA)語句創(chuàng)建一個新的數(shù)據(jù)庫。mysql CREATE DATABASE mydb;如果想確認(rèn)數(shù)據(jù)庫是否存在,可增加IF NOT EXISTS子句:mysql CREATE DATABASE IF NOT EXISTS mydb;CHARACTER SET與COLLATE為數(shù)據(jù)庫分配缺省的字符集與校對規(guī)則。mysql CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_danish_ci;數(shù)據(jù)庫的缺省字符集與校對規(guī)則信息保存在數(shù)據(jù)庫目錄下的db.opt文件中。創(chuàng)建數(shù)據(jù)
52、庫創(chuàng)建數(shù)據(jù)庫并不影響當(dāng)前的數(shù)據(jù)庫作為缺省庫。為了選擇新的數(shù)據(jù)庫為缺省數(shù)據(jù)庫,應(yīng)執(zhí)行USE語句:mysql USE mydb;SHOW CREATE DATABASE可顯示CREATE DATABASE語句:mysql SHOW CREATE DATABASE world G修改數(shù)據(jù)庫ALTER DATABASE語句可修改已有數(shù)據(jù)庫的選項(xiàng)。mysql ALTER DATABASE mydb COLLATE utf8_polish_ci;mysql ALTER DATABASE mydb CHARACTER SET latin1 COLLATE utf8_polish_ci;ALTER DATAB
53、ASE里的數(shù)據(jù)庫名是可選的。不能使用ALTER DATABASE來修改數(shù)據(jù)庫名稱。只有一個方法可以改變名稱:備份數(shù)據(jù)庫。用新的名稱創(chuàng)建新的數(shù)據(jù)庫,然后裝載數(shù)據(jù),最后刪除舊的數(shù)據(jù)庫。刪除數(shù)據(jù)庫當(dāng)不再需要某個數(shù)據(jù)庫時,可以使用DROP DATABASE語句刪除它:mysql DROP DATABASE mydb;為了避免因數(shù)據(jù)庫不存在而產(chǎn)生錯誤,可以使用IF EXISTS子句;mysql DROP DATABASE IF EXISTS mydb;DROP DATABASE不需要數(shù)據(jù)庫為空。當(dāng)刪除一個數(shù)據(jù)庫時,MySQL將刪除它包含的所有對象,例如表、存儲過程、觸發(fā)器等等。一個數(shù)據(jù)庫是data目錄下
54、的一個子目錄來表示。服務(wù)器只刪除它能識別的由自己創(chuàng)建的文件與目錄(例如,.frm文件或RAID目錄),它不會刪除其他的文件與目錄。第七章 表目 標(biāo)創(chuàng)建表修改表清空表刪除表分配與使用外鍵創(chuàng)建表創(chuàng)建表的語法如下,其中包括各種列與表的選項(xiàng):CREATE TABLE ( , ,)例如:mysql CREATE TABLE CountryLanguage ( - CountryCode CHAR(3) NOT NULL, - Language CHAR(30) NOT NULL, - IsOfficial ENUM(True,False) NOT NULL DEFAULT False, - Percen
55、tage FLOAT(3,1) NOT NULL, - PRIMARY KEY (CountryCode, Language) - ) - ENGINE = MyISAM - COMMENT = Lists Language Spoken;表的屬性選項(xiàng)可用于在CREATE TABLE語句中定義該表的全局行為。定義的格式為: = 幾個常用的表選項(xiàng):ENGINE = COMMENT = DEFAULT CHARSET SET | CHARSET = DEFAULT COLLATE = 表的選項(xiàng)實(shí)例CREATE TABLE CountryLanguage( )ENGINE MyISAMCOMMENT
56、 List Language SpokeCHARSET utf8COLLATE utf8_unicode_ci;列的選項(xiàng)幾個常見的列選項(xiàng):NULL與NOT NULL DEFAULT AUTO_INCREMENT約 束約束是一個規(guī)則,它定義了對存儲在表中的各行的特殊限制。約束常被用來保護(hù)數(shù)據(jù)庫的一致性。約束的類型:PRIMARY KEY UNIQUEFOREIGN KEY列和約束選項(xiàng)的實(shí)例:mysql CREATE TABLE City ( - ID INT NOT NULL AUTO_INCREMENT, - Name CHAR(35) NOT NULL DEFAULT “, - Countr
57、yCode CHAR(3) NOT NULL DEFAULT “, - District CHAR(20) NOT NULL DEFAULT “, - Population INT NOT NULL DEFAULT 0, - PRIMARY KEY (ID), - FOREIGN KEY (CountryCode) REFERENCES Country(Code) - ) ENGINE=MyISAM CHARSET=latin1;SHOW CREATE TABLESHOW CREATE TABLE語句可用于獲取已有表的結(jié)構(gòu)描述文本。mysql SHOW CREATE TABLE CityG基于
58、已有的表創(chuàng)建新表MySQL提供了兩種基于一個表創(chuàng)建另一個表的方法:CREATE TABLEAS SELECTCREATE TABLELIKECREATE TABLEAS SELECT根據(jù)SELECT語句的返回結(jié)果,創(chuàng)建一個空表或非空的表:例如:mysql CREATE TABLE CityCopy1 - AS - SELECT * FROM City;mysql CREATE TABLE CityCopy2 - AS - SELECT * FROM City - WHERE Population 2000000;mysql CREATE TABLE CityCopy3 - AS - SELEC
59、T * FROM City LIMIT 0;mysql CREATE TABLE CityCopy4 - AS - SELECT col1, col2 FROM City;CREATE TABLELIKECREATE TABLELIKE與CREATE TABLESELECT結(jié)果的不同在于前者創(chuàng)建一個空表。mysql CREATE TABLE t ( - i INT NOT NULL AUTO_INCREMENT, - PRIMARY KEY (i) - ) ENGINE = InnoDB;mysql CREATE TABLE copy1 SELECT * FROM t LIMIT 0;mysq
60、l CREATE TABLE copy2 LIKE t;mysql SHOW CREATE TABLE copy1Gmysql SHOW CREATE TABLE copy2G臨時表可以通過在CREATE TABLE語句中使用TEMPORARY關(guān)鍵字來創(chuàng)建臨時表。臨時表與非臨時表有以下不同:它只在創(chuàng)建的會話里可見臨時表只存在于會話生命周期中臨時表可以與非臨時表有相同的名稱臨時表只可以使用ALTER TABLERENAME TO來改名臨時表不能使用SHOW TABLES顯示,也不在information_schema.TABLES表里。臨時表示例mysql CREATE TEMPORARY TA
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中英語 Unit 3 Period 2 Using language(時態(tài))教學(xué)設(shè)計(jì) 外研版必修第一冊
- 四年級數(shù)學(xué)(簡便運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案
- 住宅樓水電維修合同范例
- 企業(yè)排查合同范例
- 原料保管合同范本
- 借條合同范例寫
- 綜合實(shí)踐活動 設(shè)計(jì)、制作一個機(jī)械模型 教學(xué)設(shè)計(jì)-2024-2025學(xué)年蘇科版物理九年級上冊
- 冰魚銷售合同范例
- 農(nóng)場養(yǎng)殖轉(zhuǎn)租合同范本
- 藥房員工個人工作總結(jié)范文
- 新教科版一年級科學(xué)下冊第二單元第5課《它們吃什么》課件
- 坡面土壤侵蝕過程模擬-深度研究
- 互聯(lián)網(wǎng)護(hù)理服務(wù)典型案例
- 礦泉水購銷合同范本2025年
- PLC培訓(xùn)課件教學(xué)課件
- 南京財(cái)經(jīng)大學(xué)C語言期末(共六卷)含答案解析
- 課題申報(bào)書:極端雨雪天氣下城市交通多層動態(tài)網(wǎng)絡(luò)韌性建模及優(yōu)化研究
- 2024北京東城初一(上)期末語文試卷及答案
- 2025年煤礦從業(yè)人員安全培訓(xùn)考試題庫
- 四年級數(shù)學(xué)(四則混合運(yùn)算帶括號)計(jì)算題專項(xiàng)練習(xí)與答案
- 壓鑄車間生產(chǎn)管理制度(4篇)
評論
0/150
提交評論