學(xué)習(xí)文檔:http://www.runoob.com/MySQL/mysql-tutorial.html
在我們開始學(xué)習(xí)MySQL 數(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)兩個表。復(fù)合鍵:復(fù)合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復(fù)合索引。索引:使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。類似于書籍的目錄。參照完整性: 參照的完整性要求關(guān)系中不允許引用不存在的實(shí)體。與實(shí)體完整性是關(guān)系模型必須滿足的完整性約束條件,目的是保證數(shù)據(jù)的一致性。MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),目前屬于Oracle公司。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
Mysql是開源的,所以你不需要支付額外的費(fèi)用。Mysql支持大型的數(shù)據(jù)庫。可以處理擁有上千萬條記錄的大型數(shù)據(jù)庫。MySQL使用標(biāo)準(zhǔn)的SQL數(shù)據(jù)語言形式。Mysql可以允許于多個系統(tǒng)上,并且支持多種語言。這些編程語言包括C、C++、Python、java、Perl、php、Eiffel、Ruby和Tcl等。Mysql對PHP有很好的支持,PHP是目前最流行的Web開發(fā)語言。MySQL支持大型數(shù)據(jù)庫,支持5000萬條記錄的數(shù)據(jù)倉庫,32位系統(tǒng)表文件最大可支持4GB,64位系統(tǒng)支持最大的表文件為8TB。Mysql是可以定制的,采用了GPL協(xié)議,你可以修改源碼來開發(fā)自己的Mysql系統(tǒng)。所有平臺的Mysql下載地址為: MySQL 下載. 挑選你需要的 MySQL Community Server 版本及對應(yīng)的平臺。
Linux平臺上推薦使用RPM包來安裝Mysql,MySQL AB提供了以下RPM包的下載地址:
MySQL - MySQL服務(wù)器。你需要該選項(xiàng),除非你只想連接運(yùn)行在另一臺機(jī)器上的MySQL服務(wù)器。MySQL-client - MySQL 客戶端程序,用于連接并操作Mysql服務(wù)器。MySQL-devel - 庫和包含文件,如果你想要編譯其它MySQL客戶端,例如Perl模塊,則需要安裝該RPM包。MySQL-shared - 該軟件包包含某些語言和應(yīng)用程序需要動態(tài)裝載的共享庫(libmysqlclient.so*),使用MySQL。MySQL-bench - MySQL數(shù)據(jù)庫服務(wù)器的基準(zhǔn)和性能測試工具。以下安裝Mysql RMP的實(shí)例是在SuSE Linux系統(tǒng)上進(jìn)行,當(dāng)然該安裝步驟也適合應(yīng)用于其他支持RPM的Linux系統(tǒng),如:Centos。
安裝步驟如下:
使用root用戶登陸你的Linux系統(tǒng)。
下載Mysql RPM包,下載地址為:MySQL 下載。
通過以下命令執(zhí)行Mysql安裝,rpm包為你下載的rpm包:
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm以上安裝mysql服務(wù)器的過程會創(chuàng)建mysql用戶,并創(chuàng)建一個mysql配置文件my.cnf。
你可以在/usr/bin和/usr/sbin中找到所有與MySQL相關(guān)的二進(jìn)制文件。所有數(shù)據(jù)表和數(shù)據(jù)庫將在/var/lib/mysql目錄中創(chuàng)建。
以下是一些mysql可選包的安裝過程,你可以根據(jù)自己的需要來安裝:
[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm啟動及關(guān)閉 MySQL 服務(wù)器
首先,我們需要通過以下命令來檢查MySQL服務(wù)器是否啟動:
ps -ef | grep mysqld如果MySql已經(jīng)啟動,以上命令將輸出mysql進(jìn)程列表, 如果mysql未啟動,你可以使用以下命令來啟動mysql服務(wù)器:
root@host# cd /usr/bin./mysqld_safe &如果你想關(guān)閉目前運(yùn)行的 MySQL 服務(wù)器, 你可以執(zhí)行以下命令:
root@host# cd /usr/bin./mysqladmin -u root -p shutdownEnter passWord: ******/etc/my.cnf 文件配置
一般情況下,你不需要修改該配置文件,該文件默認(rèn)配置如下:
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock[mysql.server]user=mysqlbasedir=/var/lib[safe_mysqld]err-log=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid在配置文件中,你可以指定不同的錯誤日志文件存放的目錄,一般你不需要改動這些配置。
實(shí)例
你可以嘗試以下實(shí)例來連接到你的 MySQL 服務(wù)器:
<html><head><meta charset="utf-8"> <title>Connecting MySQL Server</title></head><body><?php $dbhost = 'localhost:3306'; //mysql服務(wù)器主機(jī)地址 $dbuser = 'guest'; //mysql用戶名 $dbpass = 'guest123';//mysql用戶名密碼 $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_close($conn);?></body></html>MySQL NULL 值處理
我們已經(jīng)知道MySQL使用 SQL SELECT 命令及 WHERE 子句來讀取數(shù)據(jù)表中的數(shù)據(jù),但是當(dāng)提供的查詢條件字段為 NULL 時,該命令可能就無法正常工作。
為了處理這種情況,MySQL提供了三大運(yùn)算符:
IS NULL: 當(dāng)列的值是NULL,此運(yùn)算符返回true。IS NOT NULL: 當(dāng)列的值不為NULL, 運(yùn)算符返回true。<=>: 比較操作符(不同于=運(yùn)算符),當(dāng)比較的的兩個值為NULL時返回true。關(guān)于 NULL 的條件比較運(yùn)算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在MySQL中,NULL值與任何其它值的比較(即使是NULL)永遠(yuǎn)返回false,即 NULL = NULL 返回false 。
MySQL中處理NULL使用IS NULL和IS NOT NULL運(yùn)算符。
MySQL 臨時表
MySQL 臨時表在我們需要保存一些臨時數(shù)據(jù)時是非常有用的。臨時表只在當(dāng)前連接可見,當(dāng)關(guān)閉連接時,Mysql會自動刪除表并釋放所有空間。
臨時表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就無法使用MySQL的臨時表。不過現(xiàn)在一般很少有再使用這么低版本的MySQL數(shù)據(jù)庫服務(wù)了。
MySQL臨時表只在當(dāng)前連接可見,如果你使用PHP腳本來創(chuàng)建MySQL臨時表,那沒當(dāng)PHP腳本執(zhí)行完成后,該臨時表也會自動銷毀。
如果你使用了其他MySQL客戶端程序連接MySQL數(shù)據(jù)庫服務(wù)器來創(chuàng)建臨時表,那么只有在關(guān)閉客戶端程序時才會銷毀臨時表,當(dāng)然你也可以手動銷毀。
實(shí)例
以下展示了使用MySQL 臨時表的簡單實(shí)例,以下的SQL代碼可以適用于PHP腳本的mysql_query()函數(shù)。
mysql> CREATE TEMPORARY TABLE SalesSummary ( -> PRoduct_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0);Query OK, 0 rows affected (0.00 sec)MySQL 序列使用
MySQL序列是一組整數(shù):1, 2, 3, ...,由于一張數(shù)據(jù)表只能有一個字段自增主鍵, 如果你想實(shí)現(xiàn)其他字段也實(shí)現(xiàn)自動增加,就可以使用MySQL序列來實(shí)現(xiàn)。
本章我們將介紹如何使用MySQL的序列。
重置序列
如果你刪除了數(shù)據(jù)表中的多條記錄,并希望對剩下數(shù)據(jù)的AUTO_INCREMENT列進(jìn)行重新排列,那么你可以通過刪除自增的列,然后重新添加來實(shí)現(xiàn)。 不過該操作要非常小心,如果在刪除的同時又有新記錄添加,有可能會出現(xiàn)數(shù)據(jù)混亂。操作如下所示:
mysql> ALTER TABLE insect DROP id;mysql> ALTER TABLE insect -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, -> ADD PRIMARY KEY (id);設(shè)置序列的開始值
一般情況下序列的開始值為1,但如果你需要指定一個開始值100,那我們可以通過以下語句來實(shí)現(xiàn):
mysql> CREATE TABLE insect -> ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100, -> PRIMARY KEY (id), -> name VARCHAR(30) NOT NULL, # type of insect -> date DATE NOT NULL, # date collected -> origin VARCHAR(30) NOT NULL # where collected);或者你也可以在表創(chuàng)建成功后,通過以下語句來實(shí)現(xiàn):
mysql> ALTER TABLE t AUTO_INCREMENT = 100;MySQL 導(dǎo)出數(shù)據(jù)
MySQL中你可以使用SELECT...INTO OUTFILE語句來簡單的導(dǎo)出數(shù)據(jù)到文本文件上。
使用 SELECT ... INTO OUTFILE 語句導(dǎo)出數(shù)據(jù)
以下實(shí)例中我們將數(shù)據(jù)表 runoob_tbl 數(shù)據(jù)導(dǎo)出到 /tmp/tutorials.txt 文件中:
mysql> SELECT * FROM runoob_tbl -> INTO OUTFILE '/tmp/tutorials.txt';你可以通過命令選項(xiàng)來設(shè)置數(shù)據(jù)輸出的指定格式,以下實(shí)例為導(dǎo)出 CSV 格式:
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/tutorials.txt' -> FIELDS TERMINATED BY ',' ENCLOSED BY '"' -> LINES TERMINATED BY '/r/n';在下面的例子中,生成一個文件,各值用逗號隔開。這種格式可以被許多程序使用。
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'LINES TERMINATED BY '/n'FROM test_table;SELECT ... INTO OUTFILE 語句有以下屬性:
LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。為了將一個數(shù)據(jù)庫的數(shù)據(jù)寫入一個文件,使用SELECT ... INTO OUTFILE,為了將文件讀回數(shù)據(jù)庫,使用LOAD DATA INFILE。SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被選擇的行寫入一個文件中。該文件被創(chuàng)建到服務(wù)器主機(jī)上,因此您必須擁有FILE權(quán)限,才能使用此語法。輸出不能是一個已存在的文件。防止文件數(shù)據(jù)被篡改。你需要有一個登陸服務(wù)器的賬號來檢索文件。否則 SELECT ... INTO OUTFILE 不會起任何作用。在UNIX中,該文件被創(chuàng)建后是可讀的,權(quán)限由MySQL服務(wù)器所擁有。這意味著,雖然你就可以讀取該文件,但可能無法將其刪除。導(dǎo)出表作為原始數(shù)據(jù)
mysqldump是mysql用于轉(zhuǎn)存儲數(shù)據(jù)庫的實(shí)用程序。它主要產(chǎn)生一個SQL腳本,其中包含從頭重新創(chuàng)建數(shù)據(jù)庫所必需的命令CREATE TABLE INSERT等。
使用mysqldump導(dǎo)出數(shù)據(jù)需要使用 --tab 選項(xiàng)來指定導(dǎo)出文件指定的目錄,該目標(biāo)必須是可寫的。以下實(shí)例將數(shù)據(jù)表 runoob_tbl 導(dǎo)出到 /tmp 目錄中:
$ mysqldump -u root -p --no-create-info / --tab=/tmp RUNOOB runoob_tblpassword ******導(dǎo)出SQL格式的數(shù)據(jù)
導(dǎo)出SQL格式的數(shù)據(jù)到指定文件,如下所示:
$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txtpassword ******以上命令創(chuàng)建的文件內(nèi)容如下:
-- MySQL dump 8.23---- Host: localhost Database: RUNOOB----------------------------------------------------------- Server version 3.23.58---- Table structure for table `runoob_tbl`--CREATE TABLE runoob_tbl ( runoob_id int(11) NOT NULL auto_increment, runoob_title varchar(100) NOT NULL default '', runoob_author varchar(40) NOT NULL default '', submission_date date default NULL, PRIMARY KEY (runoob_id), UNIQUE KEY AUTHOR_INDEX (runoob_author)) TYPE=MyISAM;---- Dumping data for table `runoob_tbl`--INSERT INTO runoob_tbl VALUES (1,'Learn PHP','John Poul','2007-05-24');INSERT INTO runoob_tbl VALUES (2,'Learn MySQL','Abdul S','2007-05-24');INSERT INTO runoob_tbl VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');如果你需要導(dǎo)出整個數(shù)據(jù)庫的數(shù)據(jù),可以使用以下命令:
$ mysqldump -u root -p RUNOOB > database_dump.txtpassword ******如果需要備份所有數(shù)據(jù)庫,可以使用以下命令:
$ mysqldump -u root -p --all-databases > database_dump.txtpassword ******--all-databases 選項(xiàng)在 MySQL 3.23.12 及以后版本加入。
該方法可用于實(shí)現(xiàn)數(shù)據(jù)庫的備份策略。
將數(shù)據(jù)表及數(shù)據(jù)庫拷貝至其他主機(jī)
如果你需要將數(shù)據(jù)拷貝至其他的 MySQL 服務(wù)器上, 你可以在 mysqldump 命令中指定數(shù)據(jù)庫名及數(shù)據(jù)表。
在源主機(jī)上執(zhí)行以下命令,將數(shù)據(jù)備份至 dump.txt 文件中:
$ mysqldump -u root -p database_name table_name > dump.txtpassword *****如果完整備份數(shù)據(jù)庫,則無需使用特定的表名稱。
如果你需要將備份的數(shù)據(jù)庫導(dǎo)入到MySQL服務(wù)器中,可以使用以下命令,使用以下命令你需要確認(rèn)數(shù)據(jù)庫已經(jīng)創(chuàng)建:
$ mysql -u root -p database_name < dump.txtpassword *****你也可以使用以下命令將導(dǎo)出的數(shù)據(jù)直接導(dǎo)入到遠(yuǎn)程的服務(wù)器上,但請確保兩臺服務(wù)器是相通的,是可以相互訪問的:</p>$ mysqldump -u root -p database_name / | mysql -h other-host.com database_name以上命令中使用了管道來將導(dǎo)出的數(shù)據(jù)導(dǎo)入到指定的遠(yuǎn)程主機(jī)上。
MySQL 導(dǎo)入數(shù)據(jù)
MySQL中可以使用兩種簡單的方式來導(dǎo)入MySQL導(dǎo)出的數(shù)據(jù)。
使用 LOAD DATA 導(dǎo)入數(shù)據(jù)
MySQL 中提供了LOAD DATA INFILE語句來插入數(shù)據(jù)。 以下實(shí)例中將從當(dāng)前目錄中讀取文件 dump.txt ,將該文件中的數(shù)據(jù)插入到當(dāng)前數(shù)據(jù)庫的 mytbl 表中。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;如果指定LOCAL關(guān)鍵詞,則表明從客戶主機(jī)上按路徑讀取文件。如果沒有指定,則文件在服務(wù)器上按路徑讀取文件。
你能明確地在LOAD DATA語句中指出列值的分隔符和行尾標(biāo)記,但是默認(rèn)標(biāo)記是定位符和換行符。
兩個命令的 FIELDS 和 LINES 子句的語法是一樣的。兩個子句都是可選的,但是如果兩個同時被指定,F(xiàn)IELDS 子句必須出現(xiàn)在 LINES 子句之前。
如果用戶指定一個 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可選的,不過,用戶必須至少指定它們中的一個。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl -> FIELDS TERMINATED BY ':' -> LINES TERMINATED BY '/r/n';LOAD DATA 默認(rèn)情況下是按照數(shù)據(jù)文件中列的順序插入數(shù)據(jù)的,如果數(shù)據(jù)文件中的列與插入表中的列不一致,則需要指定列的順序。
如,在數(shù)據(jù)文件中的列順序是 a,b,c,但在插入表的列順序?yàn)閎,c,a,則數(shù)據(jù)導(dǎo)入語法如下:
mysql> LOAD DATA LOCAL INFILE 'dump.txt' -> INTO TABLE mytbl (b, c, a);使用 mysqlimport 導(dǎo)入數(shù)據(jù)
mysqlimport客戶端提供了LOAD DATA INFILEQL語句的一個命令行接口。mysqlimport的大多數(shù)選項(xiàng)直接對應(yīng)LOAD DATA INFILE子句。
從文件 dump.txt 中將數(shù)據(jù)導(dǎo)入到 mytbl 數(shù)據(jù)表中, 可以使用以下命令:
$ mysqlimport -u root -p --local database_name dump.txtpassword *****mysqlimport命令可以指定選項(xiàng)來設(shè)置指定格式,命令語句格式如下:
$ mysqlimport -u root -p --local --fields-terminated-by=":" / --lines-terminated-by="/r/n" database_name dump.txtpassword *****mysqlimport 語句中使用 --columns 選項(xiàng)來設(shè)置列的順序:
$ mysqlimport -u root -p --local --columns=b,c,a / database_name dump.txtpassword *****mysqlimport的常用選項(xiàng)介紹
| 選項(xiàng) | 功能 | 
|---|---|
| -d or --delete | 新數(shù)據(jù)導(dǎo)入數(shù)據(jù)表中之前刪除數(shù)據(jù)數(shù)據(jù)表中的所有信息 | 
| -f or --force | 不管是否遇到錯誤,mysqlimport將強(qiáng)制繼續(xù)插入數(shù)據(jù) | 
| -i or --ignore | mysqlimport跳過或者忽略那些有相同唯一 關(guān)鍵字的行, 導(dǎo)入文件中的數(shù)據(jù)將被忽略。 | 
| -l or -lock-tables | 數(shù)據(jù)被插入之前鎖住表,這樣就防止了, 你在更新數(shù)據(jù)庫時,用戶的查詢和更新受到影響。 | 
| -r or -replace | 這個選項(xiàng)與-i選項(xiàng)的作用相反;此選項(xiàng)將替代 表中有相同唯一關(guān)鍵字的記錄。 | 
| --fields-enclosed- by= char | 指定文本文件中數(shù)據(jù)的記錄時以什么括起的, 很多情況下 數(shù)據(jù)以雙引號括起。 默認(rèn)的情況下數(shù)據(jù)是沒有被字符括起的。 | 
| --fields-terminated- by=char | 指定各個數(shù)據(jù)的值之間的分隔符,在句號分隔的文件中, 分隔符是句號。您可以用此選項(xiàng)指定數(shù)據(jù)之間的分隔符。 默認(rèn)的分隔符是跳格符(Tab) | 
| --lines-terminated- by=str | 此選項(xiàng)指定文本文件中行與行之間數(shù)據(jù)的分隔字符串 或者字符。 默認(rèn)的情況下mysqlimport以newline為行分隔符。 您可以選擇用一個字符串來替代一個單個的字符: 一個新行或者一個回車。 | 
mysqlimport命令常用的選項(xiàng)還有-v 顯示版本(version), -p 提示輸入密碼(password)等。
新聞熱點(diǎn)
疑難解答
圖片精選