本教程主要是面向想學習MySQL的初學者,在經過本教程的學習後,可以對MySQL有一個初步的認識並能比較熟練地操做MySQL數據庫。html
一、MySQL安裝(Window7 安裝)
在任何版本的 Windows 默認安裝是如今比之前要容易得多,MySQL巧妙地打包安裝程序。只需下載安裝包,隨地把它解壓縮,並運行 mysql.exe. 下載地址:http://dev.mysql.com/downloads/ 頁面以下圖所示:node
這裏點擊:DOWNLOAD 連接,進入一下頁面:python
這裏點擊:DOWNLOAD 連接,進入一下頁面:
mysql
這裏要求註冊網站賬號,但能夠直接經過。如上點擊 "No thanks, just start my download",繼續下一步:正則表達式
提示下載保存文件,下載完成後(本教程中下載完成的文件是:mysql-5.6.25-winx64.zip)解壓文件放到目錄:D:\software 下,這是一個免安裝包,這裏不須要安裝步驟。sql
在本教程中MySQL執行文件在:D:\software\mysql-5.6.25-winx64\bin, 它經過從命令提示符第一次進入測試MySQL服務器。轉到mysqld服務器的位置,這裏進入 D:\software\mysql-5.6.25-winx64\bin,而後輸入mysqld.exe,數據庫
注:或直接雙擊文件:mysqld.exe 啓動MySQL服務,若是不啓動數據庫,如下的步驟沒法操做;編程
若是一切順利,會看到有關啓動和InnoDB一些消息。若是沒有看到,可能有權限問題。請確保保存數據的目錄能夠訪問任何根據用戶(多是MySQL)運行數據庫進程。安全
MySQL不會本身添加到開始菜單,並無特別漂亮的GUI的方式來中止服務器。 所以,若是傾向於經過雙擊可執行 mysqld 啓動服務器,應該記住經過並用 mysqladmin,任務列表,任務管理器或其餘 Windows 特定方式來執行。
驗證MySQL安裝
MySQL已經被成功安裝後,基礎表已經被初始化,而且服務器已經啓動,能夠經過一些簡單的測試驗證。
使用中mysqladmin工具程序來獲取服務器狀態
使用 mysqladmin 來檢查服務器版本。在目錄 D:\software\mysql-5.6.25-winx64\bin
D:\software\mysql-5.6.25-winx64\bin> mysqladmin --version
看到結果以下:
mysqladmin Ver 8.42 Distrib 5.6.25, for Win64 on x86_64
若是看到這樣的消息,則有多是在安裝了一些問題,須要一些幫助解決它。
使用MySQL客戶端執行簡單的SQL命令
可使用MySQL客戶端使用 mysql 命令鏈接到 MySQL 服務器。此時,不須要給任何密碼,由於默認狀況下它被設置爲空。
因此,只須要使用下面的命令:
D:\software\mysql-5.6.25-winx64\bin> mysql
應該出現一個mysql>提示符。 如今,已鏈接到MySQL服務器,能夠在MySQL的命令>提示符下執行全部SQL,以下:
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.13 sec)
安裝後的步驟:
MySQL附帶了一個空密碼有的root用戶。成功後安裝了數據庫和客戶端,須要進行以下設置root密碼:
D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root password "123456";
注:
1. 關閉正在運行的MySQL服務。2. 打開DOS窗口,轉到 D:\software\mysql-5.6.25-winx64\bin 目錄。
3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啓動MySQL服務的時候跳過權限表認證。
4. 再開一個DOS窗口(由於剛纔那個DOS窗口已經不能動了),轉到mysql\bin目錄。
5. 輸入mysql回車,若是成功,將出現MySQL提示符 >。
6. 鏈接權限數據庫: use mysql; 。
6. 改密碼:update user set password=password("123456") where user="root";(別忘了最後加分號) 。
7. 刷新權限(必須步驟):flush privileges;
8. 退出 quit。
9. 註銷系統,再進入,使用用戶名root和剛纔設置的新密碼 123456 登陸。
如今使MySQL服務器的鏈接,那麼使用下面的命令:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p Enter password: ******
二、運行和關閉MySQL服務器
首先檢查MySQL服務器正在運行與否。在資源管理器查看有沒有mysqld的進程,若是MySQL正在運行,那麼會看到列出來的 mysqld 進程。若是服務器沒有運行,那麼可使用下面的命令來啓動它:
D:\software\mysql-5.6.25-winx64\bin>mysqld 2015-07-30 22:59:20 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2015-07-30 22:59:20 0 [Note] mysqld (mysqld 5.6.25) starting as process 3028 ...
如今,若是想關閉已經運行的 MySQL 服務器,那麼可使用下面的命令作到這一點:
D:\software\mysql-5.6.25-winx64\bin>mysqladmin -u root -p shutdown Enter password: ******
三、設置MySQL用戶賬戶
要添加一個新用戶到 MySQL,只須要在數據庫中的新記錄添加到用戶表:mysql.user
下面是添加新用戶:yiibai 的例子,給定 SELECT, INSERT 和 UPDATE權限並使用密碼:yiibai123; SQL 查詢是:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p Enter password: mysql> use mysql; Database changed mysql> INSERT INTO user (host, user, password, select_priv, insert_priv, update_priv) VALUES ('localhost', 'yiibai', PASSWORD('123456'), 'Y', 'Y', 'Y'); Query OK, 1 row affected (0.20 sec) mysql> FLUSH PRIVILEGES; Query OK, 1 row affected (0.01 sec) mysql> SELECT host, user, password FROM user WHERE user = 'yiibai'; +-----------+---------+------------------+ | host | user | password | +-----------+---------+------------------+ | localhost | yiibai | *59A8740AAC5DBCB2907F38891BE42957F699CB77 | +-----------+---------+------------------+ 1 row in set (0.00 sec)
當要添加一個新用戶,記得要PASSWORD()函數加密MySQL新使用的密碼。正如在上面的例子中看到密碼爲mypass,進行加密後爲:*59A8740AAC5DBCB2907F38891BE42957F699CB77
注意最後要使用 FLUSH PRIVILEGES 語句。 這告訴服務器從新加載受權表。若是不使用它,那麼將沒法使用新的用戶賬戶鏈接到MySQL服務器,至少在服務器從新啓動後才能夠。
也能夠經過在用戶設置表如下幾列的值爲'Y',指定給新用戶的權限,在執行INSERT查詢後,也能夠在之後使用UPDATE查詢更新它們:
-
Select_priv
-
Insert_priv
-
Update_priv
-
Delete_priv
-
Create_priv
-
Drop_priv
-
Reload_priv
-
Shutdown_priv
-
Process_priv
-
File_priv
-
Grant_priv
-
References_priv
-
Index_priv
-
Alter_priv
下面咱們來建立一個數據庫:tutorials,使用如下命令:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p password; Enter password:
mysql>create database tutorials default character set utf8 collate utf8_general_ci;
添加用戶賬戶的另外一種方式是經過使用GRANT SQL命令; 下面的例子將增長用戶zara 並使用密碼zara123 爲特定數據庫:tutorials
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p password; Enter password: mysql> use mysql; Database changed mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON tutorials.* -> TO 'yiibai'@'localhost' -> IDENTIFIED BY '123456';
這也將建立一條記錄在MySQL數據庫中的表: user
注意: MySQL不會終止命令,直到給一個分號(;)在SQL命令的結尾。
my.ini 文件配置
大多數狀況下,不須要去修改這個文件。默認狀況下,它會具備如下項:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock [mysql.server] user=mysql basedir=/var/lib [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
在這裏,能夠指定錯誤日誌爲其它的目錄,不然不該該更改此文件中的任何內容。
管理 mysql 命令
這裏是重要的MySQL命令,常常在MySQL數據庫的管理或工做中使用:
-
USE Databasename : 用於選擇在MySQL工做區指定的數據庫。
-
SHOW DATABASES: 列出了MySQL數據庫管理系統中的全部可訪問的數據庫。
-
SHOW TABLES: 顯示已經選擇數據庫中的表的命令。
-
SHOW COLUMNS FROM tablename: 顯示屬性,屬性類型,關鍵信息,NULL是否被容許,默認值和其它的表信息。
-
SHOW INDEX FROM tablename: 提供全部指標的詳細信息表,其中包括PRIMARY KEY.
-
SHOW TABLE STATUS LIKE tablename\G: 報告MySQL的數據庫管理系統的性能和統計數據的詳細信息。
四、使用MySQL二進制鏈接MySQL
可使用MySQL二進制在命令提示符下創建MySQL數據庫的鏈接。
示例:
下面是一個簡單的例子,從命令提示符鏈接MySQL服務器:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p Enter password:
注意,這裏密碼爲空,直接回車就就進入mysql>命令提示符下,可以執行任何SQL命令。如下是上述命令的結果:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.25 MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
在上面的例子中,咱們使用 root 用戶,但可使用任何其餘用戶。任何用戶將可以執行全部的SQL操做(前提這個用戶有對應執行SQL權限)。
任什麼時候候使用exit命令在mysql>提示符下,從MySQL數據庫斷開。
mysql> exit Bye
五、MySQL建立數據庫
須要特殊權限建立或刪除一個MySQL數據庫。所以,假若有權使用 root 用戶,就能夠用mysql中的mysqladmin來建立數據庫。示例:
下面是一個簡單的例子,建立名爲 tutorials 的數據庫。
D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root -p create tutorials Enter password:<回車>
或
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p Enter password: mysql>create database yiibai_tutorials1; mysql>create database yiibai_tutorials2;
這將建立一個MySQL數據庫:yiibai_tutorials1 和 yiibai_tutorials2,使用下面命令查看結果:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | yiibai_tutorials1 | | yiibai_tutorials2 | +--------------------+ 6 rows in set (0.00 sec)
六、MySQL刪除數據庫
須要特殊權限來建立或刪除一個MySQL數據庫。所以,假如你有機會得到root用戶來登陸,能夠用mysql中mysqladmin二進制來建立任何數據庫。
在刪除任何數據庫時要注意,由於刪除數據庫時全部的數據在數據庫中。
下面是一個例子,用來刪除前面的章節中所建立的數據庫:
D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root -p drop yiibai_tutorials1 Enter password:******這會給出一個警告,它會確認你是否真的要刪除這個數據庫或不刪除。
Dropping the database is potentially a very bad thing to do. Any data stored in the database will be destroyed. Do you really want to drop the 'yiibai_tutorials1' database [y/N] y Database "yiibai_tutorials1" dropped或使用:
mysql> drop database yiibai_tutorials1; Query OK, 0 rows affected (0.01 sec)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | yiibai | +--------------------+ 6 rows in set (0.00 sec)
鏈接到MySQL服務器後,則須要選擇特定的數據庫的來工做。這是由於可能有多個數據庫可以使用在MySQL服務器上。
七、從命令提示符選擇MySQL數據庫
這是很是簡單的,從MySQL>提示符下選擇一個特定的數據庫。可使用SQL命令的 user 來選擇一個特定的數據庫。
示例:
下面是一個例子,選擇數據庫爲 test :
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p Enter password: mysql> use test; Database changed mysql>
如今,咱們已經選擇 test 數據庫,後續全部操做將在 test 數據庫上執行。
注意: 全部的數據庫名,表名,表中的字段名稱是區分大小寫的。因此,咱們必須使用適當的名稱,在給定任何SQL命令。
八、MySQL表字段類型
正確地定義的表中的字段在數據庫的總體優化是很是重要的。咱們應該只使用真正須要使用類型和字段的大小; 若是知道只使用2個字符,就不使用10個字符寬定義一個字段。這些類型的字段(或列),也被稱爲數據類型,數據存儲這些字段之中。
MySQL使用許多不一樣的數據類型,整體上分爲三類:數字,日期,時間和字符串類型。
數字數據類型
MySQL使用全部標準的ANSI SQL數字數據類型,因此,若是在學習MySQL以前,有接觸過其它不一樣的數據庫系統,那麼這些定義看起來很熟悉。下面列出了常見的數字數據類型及其說明:
-
INT - 正常大小的整數,能夠帶符號。若是是有符號的,它容許的範圍是從-2147483648到2147483647。若是是無符號,容許的範圍是從0到4294967295。 能夠指定多達11位的寬度。
-
TINYINT - 一個很是小的整數,能夠帶符號。若是是有符號,它容許的範圍是從-128到127。若是是無符號,容許的範圍是從0到255,能夠指定多達4位數的寬度。
-
SMALLINT - 一個小的整數,能夠帶符號。若是有符號,容許範圍爲-32768至32767。若是無符號,容許的範圍是從0到65535,能夠指定最多5位的寬度。
-
MEDIUMINT - 一箇中等大小的整數,能夠帶符號。若是有符號,容許範圍爲-8388608至8388607。 若是無符號,容許的範圍是從0到16777215,能夠指定最多9位的寬度。
-
BIGINT - 一個大的整數,能夠帶符號。若是有符號,容許範圍爲-9223372036854775808到9223372036854775807。若是無符號,容許的範圍是從0到18446744073709551615. 能夠指定最多20位的寬度。
-
FLOAT(M,D) - 不能使用無符號的浮點數字。能夠定義顯示長度(M)和小數位數(D)。這不是必需的,而且默認爲10,2。其中2是小數的位數,10是數字(包括小數)的總數。小數精度能夠到24個浮點。
-
DOUBLE(M,D) - 不能使用無符號的雙精度浮點數。能夠定義顯示長度(M)和小數位數(D)。 這不是必需的,默認爲16,4,其中4是小數的位數。小數精度能夠達到53位的DOUBLE。 REAL是DOUBLE同義詞。
-
DECIMAL(M,D) - 非壓縮浮點數不能是無符號的。在解包小數,每一個小數對應於一個字節。定義顯示長度(M)和小數(D)的數量是必需的。 NUMERIC是DECIMAL的同義詞。
日期和時間類型
MySQL的日期和時間數據類型包括:
-
DATE - 以YYYY-MM-DD格式的日期,在1000-01-01和9999-12-31之間。 例如,1973年12月30日將被存儲爲1973-12-30。
-
DATETIME - 日期和時間組合以YYYY-MM-DD HH:MM:SS格式,在1000-01-01 00:00:00 到9999-12-31 23:59:59之間。例如,1973年12月30日下午3:30,會被存儲爲1973-12-30 15:30:00。
-
TIMESTAMP - 1970年1月1日午夜之間的時間戳,到2037的某個時候。這看起來像前面的DATETIME格式,無需只是數字之間的連字符; 1973年12月30日下午3點30分將被存儲爲19731230153000(YYYYMMDDHHMMSS)。
-
TIME - 存儲時間在HH:MM:SS格式。
-
YEAR(M) - 以2位或4位數字格式來存儲年份。若是長度指定爲2(例如YEAR(2)),年份就能夠爲1970至2069(70〜69)。若是長度指定爲4,年份範圍是1901-2155,默認長度爲4。
字符串類型
雖然數字和日期類型比較有意思,但存儲大多數數據均可能是字符串格式。 下面列出了在MySQL中常見的字符串數據類型。
-
CHAR(M) - 固定長度的字符串是以長度爲1到255之間個字符長度(例如:CHAR(5)),存儲右空格填充到指定的長度。 限定長度不是必需的,它會默認爲1。
-
VARCHAR(M) - 可變長度的字符串是以長度爲1到255之間字符數(高版本的MySQL超過255); 例如: VARCHAR(25). 建立VARCHAR類型字段時,必須定義長度。
-
BLOB or TEXT - 字段的最大長度是65535個字符。 BLOB是「二進制大對象」,並用來存儲大的二進制數據,如圖像或其餘類型的文件。定義爲TEXT文本字段還持有大量的數據; 二者之間的區別是,排序和比較上存儲的數據,BLOB大小寫敏感,而TEXT字段不區分大小寫。不用指定BLOB或TEXT的長度。
-
TINYBLOB 或 TINYTEXT - BLOB或TEXT列用255個字符的最大長度。不指定TINYBLOB或TINYTEXT的長度。
-
MEDIUMBLOB or MEDIUMTEXT - BLOB或TEXT列具備16777215字符的最大長度。不指定MEDIUMBLOB或MEDIUMTEXT的長度。
-
LONGBLOB 或 LONGTEXT - BLOB或TEXT列具備4294967295字符的最大長度。不指定LONGBLOB或LONGTEXT的長度。
-
ENUM - 枚舉,這是一個奇特的術語列表。當定義一個ENUM,要建立它的值的列表,這些是必須用於選擇的項(也能夠是NULL)。例如,若是想要字段包含「A」或「B」或「C」,那麼能夠定義爲ENUM爲 ENUM(「A」,「B」,「C」)也只有這些值(或NULL)才能用來填充這個字段。
八、MySQL建立表
表的建立命令須要:
-
表的名稱
-
字段名稱
-
定義每一個字段(類型、長度等)
語法
下面是通用的SQL語法用來建立MySQL表:
CREATE TABLE table_name (column_name column_type);
如今,咱們將在 test 數據庫中建立如下表。
create table tutorials_tbl( tutorial_id INT NOT NULL AUTO_INCREMENT, tutorial_title VARCHAR(100) NOT NULL, tutorial_author VARCHAR(40) NOT NULL, submission_date DATE, PRIMARY KEY ( tutorial_id ) );
在這裏,一些數據項須要解釋:
-
字段使用NOT NULL屬性,是由於咱們不但願這個字段的值爲NULL。 所以,若是用戶將嘗試建立具備NULL值的記錄,那麼MySQL會產生錯誤。
-
字段的AUTO_INCREMENT屬性告訴MySQL自動增長id字段下一個可用編號。
-
關鍵字PRIMARY KEY用於定義此列做爲主鍵。可使用逗號分隔多個列來定義主鍵。
經過命令提示符來建立表
在mysql>提示符下,建立一個MySQL表這是很容易的。使用 SQL 命令 CREATE TABLE 來建立表。
下面是一個例子,建立一個表: tutorials_tbl:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p Enter password: mysql> use tutorials; Database changed mysql> CREATE TABLE tutorials_tbl( -> tutorial_id INT NOT NULL AUTO_INCREMENT, -> tutorial_title VARCHAR(100) NOT NULL, -> tutorial_author VARCHAR(40) NOT NULL, -> submission_date DATE, -> PRIMARY KEY ( tutorial_id ) -> ); Query OK, 0 rows affected (0.16 sec) mysql>
注: MySQL不會終止命令,直到給一個分號(;)表示SQL命令結束。
查看建立表的結果:

九、MySQL刪除表
刪除現有MySQL表這是很容易的,但必須很是當心,當刪除表後丟失的數據將不能恢復。
語法
這是用來刪除MySQL表的通用SQL語法:
DROP TABLE table_name ;
從命令行提示符刪除表
這須要只是在 MySQL>提示符下執行DROP TABLE SQL命令。
下面是一個例子,它將刪除表:tutorials_tbl:
root@host# mysql -u root -p Enter password: mysql> use test; Database changed mysql> DROP TABLE tutorials_tbl; Query OK, 0 rows affected (0.8 sec) mysql>
十、MySQL插入數據
想要將數據插入到MySQL表,須要使用SQL INSERT INTO命令。 能夠經過用mysql>提示符或經過使用像PHP腳本將任何數據插入到MySQL表。
語法
這裏是INSERT INTO命令將數據插入到MySQL表的通用SQL語法:
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
要插入字符串類型數據,則須要雙或單引號保留到全部的值,例如:- "value".
這將使用SQL 的INSERT INTO命令將數據插入到MySQL表:tutorials_tbl
示例
下面的例子將建立3條記錄到表:tutorials_tbl
root@host# mysql -u root -p password; Enter password: mysql> use use; Database changed mysql> INSERT INTO tutorials_tbl (tutorial_title, tutorial_author, submission_date) VALUES ("Learn PHP", "Paul", NOW()); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO tutorials_tbl ->(tutorial_title, tutorial_author, submission_date) ->VALUES ->("Learn MySQL", "Saya", NOW()); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO tutorials_tbl ->(tutorial_title, tutorial_author, submission_date) ->VALUES ->("JAVA Tutorial", "yiibai", '2015-05-06'); Query OK, 1 row affected (0.01 sec) mysql>
注意: 請注意,全部的箭頭符號(->)不是SQL命令的一部分; 它表示一個新行,是由MySQL提示符按下回車鍵沒有給出一個分號,命令自動建立在行尾。
在上面的例子中,未提供 tutorial_id 對應的值,由於在建立表時它會自動建立,這個字段咱們給了AUTO_INCREMENT選項。所以MySQL會自動分配插入ID的值。 這裏, NOW() 是MySQL函數,返回當前的日期和時間。
十一、MySQL SELECT查詢
SQL SELECT命令用於從MySQL數據庫獲取數據。能夠在MySQL>提示符使用這個命令,以及任何像PHP的腳本和語言等。
語法
下面是通用的SQL的SELECT命令語法,從MySQL表獲取數據:
SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE Clause] [OFFSET M ][LIMIT N]
-
可使用分隔的一個或多個逗號從多個表,以及使用WHERE子句包括各類條件,但WHERE子句是SELECT命令的可選部分
-
能夠在一個SELECT命令指定讀取一個或多個字段
-
能夠指定星號(*)代替選擇的字段。在這種狀況下,將返回全部字段
-
能夠指定任意的條件在 WHERE 子句後面
-
可使用OFFSET指定一個偏移量,SELECT從那裏開始返回記錄。默認狀況下 offset 的值是 0
-
可使用LIMIT屬性限制返回的數量
這將使用SQL SELECT命令從MySQL 表 tutorials_tbl 讀取數據
示例
下面的例子將從 tutorials_tbl 表返回全部記錄:
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> SELECT * from tutorials_tbl; +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | Paul | 2015-07-17 | | 2 | Learn MySQL | Saya | 2015-07-17 | | 3 | JAVA Tutorial | yiibai | 2007-05-06 | +-------------+----------------+-----------------+-----------------+ 3 rows in set (0.25 sec) mysql>
十二、MySQL WHERE子句
咱們已經看到使用SQL SELECT命令從MySQL表中獲取數據。咱們能夠用 WHERE子句來篩選出結果的條件子句。使用WHERE子句,咱們能夠指定一個選擇標準,從表中選擇所需的記錄。
語法
下面是SELECT命令使用WHERE子句來從MySQL表數據的通用SQL語法:
SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
-
可使用逗號分隔一個或多個表,以及WHERE子句包括各類條件,但WHERE子句只是SELECT命令的可選部分
-
能夠指定使用任何條件在WHERE子句中
-
能夠指定一個以上的條件在使用AND或OR運算符中
-
WHERE子句能夠用DELETE 或 UPDATE的SQL命令一塊兒,也能夠指定一個條件使用。
WHERE子句就像是if一個條件在編程語言中, 此子句是用來比較給定值的字段值在MySQL表是否可用。若是從外部給定值等於在MySQL表可用字段值,那麼它返回該行。
這裏是運算符的列表,它能夠在WHERE子句中使用。
假設字段A=10,字段B=20,則:
操做符 | 描述 | 示例 |
---|---|---|
= | 檢查兩個操做數的值是否相等,若是是,則條件變爲真。 | (A = B) 不爲 true. |
!= | 檢查兩個操做數的值是否相等,若是值不相等,則條件變爲真。 | (A != B) 爲 true. |
> | 檢查左操做數的值是否大於右操做數的值,若是是,則條件爲真。 | (A > B) 不爲 true. |
< | 檢查左操做數的值是否小於右操做數的值,若是是,則條件爲真。 | (A < B) 爲 true. |
>= | 檢查左操做數的值是否大於或等於右操做數的值,若是是,則條件爲真。 | (A >= B) 不爲 true. |
<= | 檢查左操做數的值是否小於或等於右操做數的值,若是是,則條件變爲真。 | (A <= B) 爲 true. |
當想要從一個表中提取所選行,尤爲是當使用MySQL聯接的WHERE子句是很是有用的。 聯接在另外一章討論。
搜索使用主鍵進行快速搜索記錄是常見的作法。
若是給定的條件不匹配表任何記錄,那麼查詢將不會返回任何行。
使用SQL SELECT命令以及WHERE子句,從MySQL表tutorials_tbl選擇獲取數據。
示例
下面的例子將從tutorials_tbl表中做者的名字是yiibai全部記錄返回:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> SELECT * from tutorials_tbl WHERE tutorial_author='yiibai'; +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 3 | JAVA Tutorial | yiibai | 2007-05-21 | +-------------+----------------+-----------------+-----------------+ 1 rows in set (0.01 sec) mysql>
除非執行字符串LIKE比較,比較是不區分大小寫。可使用BINARY關鍵字使搜索區分大小寫以下:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> SELECT * from tutorials_tbl \ WHERE BINARY tutorial_author='yiibai'; Empty set (0.02 sec) mysql>
1三、MySQL UPDATE查詢
可能會有一個須要,要在一個MySQL表中的現有數據進行修改。能夠經過使用SQL UPDATE命令來執行。能夠修改任何MySQL表中任何字段的值。
語法
這裏是UPDATE命令修改數據到MySQL表的通用SQL語法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
-
徹底能夠更新一個或多個字段。
-
能夠指定使用任何條件在WHERE子句中。
-
能夠一次更新一個表中的值。
當想更新表中選定行,WHERE子句是很是有用的。
使用SQL UPDATE命令以及WHERE子句來更新選定數據到MySQL表tutorials_tbl。
示例
下面的例子將更新 tutorial_id 爲3 的紀錄中的 tutorial_title 字段。
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> UPDATE tutorials_tbl -> SET tutorial_title='Learning JAVA' -> WHERE tutorial_id=3; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql>
1四、MySQL DELETE查詢
若是想從任何MySQL表中刪除紀錄,那麼可使用SQL命令:DELETE FROM. 可使用這個命令在MySQL>提示符,以及PHP等腳本的語言。
語法
這裏是DELETE命令從一個MySQL表中刪除數據的通用的SQL語法:
DELETE FROM table_name [WHERE Clause]
-
若是WHERE子句沒有指定,則全部MySQL表中的記錄將被刪除。
-
能夠指定使用任何條件在WHERE子句中。
-
能夠一次刪除一個表中的全部記錄。
當要刪除一個表中選擇特定行,WHERE子句是很是有用的。
使用SQL DELETE命令,在WHERE子句中選定 MySQL 表 tutorials_tbl 的數據將被刪除。
示例
下面的例子將刪除 tutorial_tbl表中 tutorial_id爲3的一條記錄。
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> DELETE FROM tutorials_tbl WHERE tutorial_id=3; Query OK, 1 row affected (0.23 sec) mysql>
1五、MySQL LIKE子句
咱們已經看到使用SQL SELECT命令從MySQL表中獲取數據。也可使用WHERE子句來選擇所需的記錄條件子句。
WHERE等於子句號(=)用來精確匹配工做,如相似 「tutorial_author='yiibai'」。 但也有可能,咱們要求過濾掉全部的結果,tutorial_author應包含的名稱:"jay"。這能夠經過使用SQL LIKE子句以及WHERE子句來處理。
若是SQL LIKE子句連同 % 字符使用,那麼它會像在UNIX上的元字符(*),列出了全部的文件或目錄在命令提示符下。
若是沒有字符%,LIKE子句是很是類似的等號在WHERE子句中使用的效果。
語法
下面是SELECT命令連同LIKE子句來從MySQL表獲取數據的通用SQL語法:
SELECT field1, field2,...fieldN table_name1, table_name2... WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
-
能夠指定使用任何條件在WHERE子句中
-
可使用LIKE子句在WHERE子句中
-
可使用LIKE子句代替等號(=)
-
當LIKE連同%符號使用,那麼它就會像一個元字符的搜索
-
能夠指定一個以上的條件使用AND或OR運算符
-
WHERE... LIKE子句可使用SQL命令的DELETE 或 UPDATE ,也能夠指定一個條件
使用SQL SELECT命令以及WHERE ... LIKE子句從MySQL表tutorials_tbl 選擇獲取數據並返回
示例
下面的例子是從 tutorials_tbl 表中獲取做者的名稱以 aul 結尾的全部記錄:
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> SELECT * from tutorials_tbl WHERE tutorial_author LIKE '%aul'; +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 3 | JAVA Tutorial | Paul | 2015-07-17 | +-------------+----------------+-----------------+-----------------+ 1 rows in set (0.01 sec) mysql>
1六、MySQL ORDER BY排序結果
咱們已經看到使用SQL SELECT命令從MySQL表中獲取數據。當選擇數據行,MySQL服務器能夠自由地返回它們的順序,除非有指示它按照怎樣的結果進行排序。可是排序結果能夠經過增長一個ORDER BY子句設定列名稱或要排序的列。
語法
這是使用ORDER BY子句從MySQL表數據進行排序的SELECT命令的通用SQL語法:
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]
-
能夠排序返回所列出提供的任何字段的結果
-
能夠在多個字段排序結果
-
可使用關鍵字ASC或DESC來執行升序或降序排序。默認狀況下,按升序排列
-
可使用WHERE ... LIKE子句以通用的方式放置條件
在命令提示符使用ORDER BY子句
使用SQL SELECT命令與ORDER BY子句,從MySQL表tutorials_tbl獲取數據。
示例
嘗試下面的例子,它返回的結果是按升序排列的。
root@host# mysql -u root -p password; Enter password: mysql> use use; Database changed mysql> SELECT * from tutorials_tbl ORDER BY tutorial_author ASC; +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | Paul | 2015-07-17 | | 2 | Learn MySQL | Saya | 2015-07-17 | | 3 | Learning JAVA | Yiibai | 2007-05-06 | +-------------+----------------+-----------------+-----------------+ 3 rows in set mysql>
驗證全部的做者名稱列出來是按升序排列。
1七、MySQL Join聯接
到目前爲止,咱們只是從一個表讀取數據。這是相對簡單的,但在大多數現實中的MySQL使用,須要從多個表中,在單個查詢得到數據。
能夠在單個SQL查詢中使用多個表。鏈接MySQL中的行在兩個或多個表到一個表。
可使用Join在SELECT,UPDATE和DELETE語句加入MySQL表。咱們將看到LEFT JOIN的例子, 這與簡單的MySQL JOIN有所不一樣。
假設咱們有兩個表 tcount_tbl 和 tutorials_tbl,在數據庫:test ,完整列表以下:
示例
試試下面的例子:
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> create table tcount_tbl( -> tutorial_author varchar(24) not null, -> tutorial_count int(10) not null default 0 ); Query OK, 0 rows affected mysql> INSERT INTO tcount_tbl (tutorial_author, tutorial_count) VALUES('mahran', 10); mysql> INSERT INTO tcount_tbl (tutorial_author, tutorial_count) VALUES('mahnaz', 0); mysql> INSERT INTO tcount_tbl (tutorial_author, tutorial_count) VALUES('Jen', 0); mysql> INSERT INTO tcount_tbl (tutorial_author, tutorial_count) VALUES('Gill', 20); mysql> INSERT INTO tcount_tbl (tutorial_author, tutorial_count) VALUES('Paul', 10); mysql> INSERT INTO tcount_tbl (tutorial_author, tutorial_count) VALUES('yiibai', 10); mysql> SELECT * FROM tcount_tbl; +-----------------+----------------+ | tutorial_author | tutorial_count | +-----------------+----------------+ | mahran | 10 | | mahnaz | 0 | | Jen | 0 | | Gill | 20 | | Paul | 10 | | yiibai | 10 | +-----------------+----------------+ 6 rows in set (0.01 sec) mysql> SELECT * from tutorials_tbl; +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | Paul | 2015-07-17 | | 2 | Learn MySQL | Saya | 2015-07-17 | | 3 | Learning JAVA | yiibai | 2007-05-06 | +-------------+----------------+-----------------+-----------------+ 3 rows in set (0.00 sec) mysql>
如今,咱們能夠寫一個SQL查詢來鏈接這兩個表。此查詢將從表tutorials_tbl和tcount_tbl 選擇全部做者的教程數量。
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count -> FROM tutorials_tbl a, tcount_tbl b -> WHERE a.tutorial_author = b.tutorial_author; +-------------+-----------------+----------------+ | tutorial_id | tutorial_author | tutorial_count | +-------------+-----------------+----------------+ | 1 | Paul | 10 | | 3 | Yiibai | 10 | +-------------+-----------------+----------------+ 2 rows in set (0.01 sec) mysql>
1八、MySQL NULL值
咱們已經看到SQL SELECT命令和WHERE子句一塊兒使用,來從MySQL表中提取數據,可是,當咱們試圖給出一個條件,比較字段或列值設置爲NULL,它確不能正常工做。
爲了處理這種狀況,MySQL提供了三大運算符
-
IS NULL: 若是列的值爲NULL,運算結果返回 true
-
IS NOT NULL: 若是列的值不爲NULL,運算結果返回 true
-
<=>: 運算符比較值,(不一樣於=運算符)即便兩個空值它返回 true
涉及NULL的條件是特殊的。不能使用= NULL或!= NULL來匹配查找列的NULL值。這樣的比較老是失敗,由於它是不可能告訴它們是不是true。 甚至 NULL = NULL 也是失敗的。
要查找列的值是或不是NULL,使用IS NULL或IS NOT NULL。
在命令提示符,使用NULL值:
假設在 test 數據庫中的表 tcount_tbl 它包含兩個列 tutorial_author 和 tutorial_count, 其中 tutorial_count 的值爲NULL代表其值未知:
示例
試試下面的例子:
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> drop table tcount_tbl; Query OK, 0 rows affected (0.05 sec) mysql> create table tcount_tbl -> ( -> tutorial_author varchar(40) NOT NULL, -> tutorial_count INT -> ); Query OK, 0 rows affected (0.05 sec) mysql> INSERT INTO tcount_tbl -> (tutorial_author, tutorial_count) values ('mahran', 20); mysql> INSERT INTO tcount_tbl -> (tutorial_author, tutorial_count) values ('mahnaz', NULL); mysql> INSERT INTO tcount_tbl -> (tutorial_author, tutorial_count) values ('Jen', NULL); mysql> INSERT INTO tcount_tbl -> (tutorial_author, tutorial_count) values ('Gill', 20); mysql> SELECT * from tcount_tbl; +-----------------+----------------+ | tutorial_author | tutorial_count | +-----------------+----------------+ | mahran | 20 | | mahnaz | NULL | | Jen | NULL | | Gill | 20 | +-----------------+----------------+ 4 rows in set (0.00 sec) mysql>
能夠看到,= 及 != 不能與 NULL值不能正常工做(匹配)以下:
mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL; Empty set (0.00 sec) mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL; Empty set (0.01 sec)
要查找記錄中,其中 tutorial_count 列的值是或不是NULL,查詢應該這樣寫:
mysql> SELECT * FROM tcount_tbl -> WHERE tutorial_count IS NULL; +-----------------+----------------+ | tutorial_author | tutorial_count | +-----------------+----------------+ | mahnaz | NULL | | Jen | NULL | +-----------------+----------------+ 2 rows in set (0.00 sec) mysql> SELECT * from tcount_tbl -> WHERE tutorial_count IS NOT NULL; +-----------------+----------------+ | tutorial_author | tutorial_count | +-----------------+----------------+ | mahran | 20 | | Gill | 20 | +-----------------+----------------+ 2 rows in set (0.00 sec)
1九、MySQL正則表達式
在前面咱們已經看到了MySQL的模式匹配:LIKE ...%. MySQL支持另外一種類型的模式匹配的操做基於正則表達式和正則表達式運算符。若是知道PHP或Perl,那麼它是很是簡單的,由於這匹配很是類似於腳本正則表達式。
如下是模式的表格,其能夠連同REGEXP運算符使用。
模式 | 什麼樣的模式匹配 |
---|---|
^ | 開始的一個字符串 |
$ | 結束的一個字符串 |
. | 任意單個字符 |
[...] | 方括號中列出的任何字符 |
[^...] | 任何字符方括號之間不會被列出 |
p1|p2|p3 | 交替;匹配的任何模式 p1, p2, 或 p3 |
* | 前一個元素的零個或多個實例 |
+ | 前面元素的一或多個實例 |
{n} | 前一個元素的n個實例 |
{m,n} | 前一個元素的 m 到 n 個實例 |
示例
如今根據上面的表格,能夠在不一樣的設備類型用SQL查詢來知足要求。在這裏,列出一些的理解。考慮有一個表稱爲 person_tbl,它是有一個 name 字段:
查詢查找全部以 「st」 開頭的名字:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查詢找到全部以 'ok' 結尾的名字
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查詢查找其中包含 'mar' 全部的名字
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查詢查找以元音 'ok' 結尾的全部名稱
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
20、MySQL事務
事務是數據庫處理操做,其中執行就好像它是一個單一的一組有序的工做單元。換言之,事務將永遠不會是徹底的,除非在組內每一個單獨的操做是成功的。若是事務中的任何操做失敗,整個事務將失敗。
實際上,許多SQL查詢組成到一個組,將執行全部這些一塊兒做爲事務的一部分。
事務性質
事務具備如下四個標準屬性,一般由首字母縮寫ACID簡稱:
-
原子性: 確保了工做單位中的全部操做都成功完成; 不然,事務被停止,在失敗時會被回滾到事務操做之前的狀態。
-
一致性:可確保數據庫在正確的更改狀態在一個成功提交事務。
-
隔離: 使事務相互獨立地操做。
-
持久性: 確保了提交事務的結果或系統故障狀況下仍然存在做用。
在MySQL中,事務以BEGIN WORK語句開始開始工做,並使用COMMIT或ROLLBACK語句結束。SQL命令在開始和結束語句之間構成大量事務。
提交和回滾
這兩個關鍵字Commit和Rollback主要用於MySQL的事務。
-
當一個成功的事務完成後,COMMIT命令發出的變化對全部涉及的表將生效。
-
若是發生故障,ROLLBACK命令發出後,事務中引用的每一個表將恢復到事務開始以前的狀態。
能夠經過設置AUTOCOMMIT這個會話變量控制事務的行爲。若是AUTOCOMMIT設置爲1(默認值),那麼每一個SQL語句(在事務或不在事務)被認爲是一個完整的事務並提交,在默認狀況下是在當它完成時。當AUTOCOMMIT設置爲0,經過發出SET AUTOCOMMIT=0命令, 隨後的一系列語句就像一個事務,但並無任何活動被提交直到一個明確的發出 COMMIT 語句。
能夠經過使用PHP 的 mysql_query()函數執行這些SQL命令。
關於事務通用示例
此事件序列是獨立於所使用的編程語言; 邏輯路徑能夠是任何編程語言,使用它在建立應用程序中建立。
能夠經過使用 mysql_query()函數執行這些PHP SQL命令
-
開始事務是經過發出SQL命令BEGIN WORK
-
相似發出的一個或多個SQL命令 SELECT, INSERT, UPDATE 或 DELETE.
-
根據要求,檢查是否有任何錯誤
-
若是有錯誤,發出ROLLBACK命令,不然執行COMMIT命令。
在MySQL的事務安全表類型
不能直接使用事務,可使用但它們沒有安全保障。若是打算使用事務在MySQL編程,那麼須要使用一個特殊的方式來建立表。 有許多類型的表其支持事務,但目前最流行的一種是:InnoDB.
支持InnoDB表須要特定的編譯參數,在源代碼編譯MySQL時。若是MySQL版本不支持InnoDB,得要求互聯網服務提供商創建一個版本的MySQL的InnoDB表類型的支持,或 下載並安裝MySQL-Max二進制分發的Windows版本,或者Linux/UNIX開發環境中工做的表類型。
若是你的MySQL安裝支持InnoDB表,簡直就是一個TYPE= InnoDB的定義添加到表建立語句後面。例如,下面的代碼建立一個名爲 tcount_tbl 的 InnoDB 類型表:
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> create table tcount_tbl -> ( -> tutorial_author varchar(40) NOT NULL, -> tutorial_count INT -> ) TYPE=InnoDB; Query OK, 0 rows affected (0.05 sec)
請檢查下面的連接瞭解更多有關: InnoDB
可使用其它類型的表 GEMINI 或 BDB, 但它取決於安裝MySQL時,是否支持這兩種類型。
2一、MySQL Alter命令
當想改變表名,MySQL的ALTER命令很是有用, 在添加或刪除任何表字段到現有列在表中。
讓咱們開始建立一個表爲 testalter_tbl。
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> create table testalter_tbl -> ( -> i INT, -> c CHAR(1) -> ); Query OK, 0 rows affected (0.05 sec) mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | i | int(11) | YES | | NULL | | | c | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
刪除,添加或從新定義列
假設想要從上面MySQL的表中刪除一個現有列,那麼使用ALTER命令以及DROP子句以下:
mysql> ALTER TABLE testalter_tbl DROP i;
若是在表中列是惟一的一個,那麼DROP將沒法正常工做。
要添加列,使用ADD並指定列定義。下面的語句將存儲到 i 列:testalter_tbl:
mysql> ALTER TABLE testalter_tbl ADD i INT;
發出這條語句後,testalter將包含當第一次建立表時的兩列, 但不會有徹底同樣的結構。這是由於新的列被添加到表中時,默認排在最後一列。所以,即便 i 列原來是 mytbl 的第一列,但如今它是最後一列。
mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
若要指示列在表中的特定位置,要麼使用FIRST把它放在第一列或AFTER col_name 來指定新的列應放置col_name以後。 試試下面的ALTER TABLE語句,使用 SHOW COLUMNS 看看有什麼影響:
ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT FIRST; ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRST 和 AFTER 只能在ADD子句中使用。這意味着,若是你想在表中從新排位現有列,首先必須刪除(DROP )它,而後在新的位置添加(ADD)它。
更改列定義或名稱
要改變列的定義,使用MODIFY 或CHANGE 子句以及ALTER命令。 例如, 要改變字段 c 從 CHAR(1) 修改成 CHAR(10), 那麼能夠這樣作:
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
CHANGE語法可能有點不一樣。CHANGE關鍵字後的名稱是要修改的列,而後指定新的定義,其中包括新的名稱。試試下面的例子:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
若是如今使用CHANGE轉換i列從BIGINT爲INT,但不改變列名,該語句執行預期:
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
ALTER TABLE影響Null和缺省值屬性
當使用 MODIFY 或 CHANGE修改列,還能夠指定該列是否能爲NULL值以及它的默認值。事實上,若是你不這樣作,MySQL也會自動分配這些屬性值。
下面是一個例子,這裏 NOT NULL列將使用100做爲默認值。
mysql> ALTER TABLE testalter_tbl -> MODIFY j BIGINT NOT NULL DEFAULT 100;
若是不使用上面的命令,那麼MySQL將填補使用NULL 來填充全部列值。
更改列的默認值
可使用ALTER命令更改任何列的默認值。嘗試下面的例子。
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | 1000 | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
從任何一列刪除默認的約束,可使用ALTER命令以及DROP子句。
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
更改表類型
能夠經過使用ALTER命令以及TYPE子句修改表的類型。試試下面的例子,將 testalter_tbl 的類型更改成MyISAM 表類型。
若想要知道一個表的當前類型,那麼可以使用 SHOW TABLE STATUS 語句。
mysql> ALTER TABLE testalter_tbl TYPE = MYISAM; mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G *************************** 1. row **************** Name: testalter_tbl Type: MyISAM Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 25769803775 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2015-06-03 18:35:36 Update_time: 2015-06-03 18:35:36 Check_time: NULL Create_options: Comment: 1 row in set (0.00 sec)
重命名錶
要重命名錶,使用ALTER TABLE語句的RENAME選項。試試下面的例子是用來重命名testalter_tbl爲alter_tbl。
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
可使用ALTER命令來建立並在MySQL的文件刪除索引。咱們將在下一章看到此功能。
2二、MySQL索引
數據庫索引是一種數據結構,目的是提升表的操做速度。可使用一個或多個列,提供快速隨機查找和訪問記錄的高效排序來建立索引。
要建立的索引,應當認爲哪列將用於使SQL查詢,建立對這些列的一個或多個索引。
實際上,索引也是表,其中保存主鍵或索引字段的指針並指向每一個記錄到實際的表的類型。
用戶沒法看到索引,它們只是用來加速查詢,並將被用於數據庫搜索引擎在查找記錄時提升速度。
INSERT和UPDATE語句須要更多的時間來建立索引,做爲在SELECT語句快速在這些表上操做。其緣由是,在執行插入或更新數據時,數據庫須要將插入或更新索引值也更新。
簡單和惟一索引
能夠在表上建立惟一值索引。惟一索引意味着兩行不能有相同的索引值。下面是在表上建立索引的語法
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...);
可使用一個或多個列來建立索引。例如,咱們可使用tutorial_author 來建立一個 tutorials_tbl 索引。
CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author)
能夠在表上建立一個簡單的索引。建立簡單的索引只是省略UNIQUE關鍵字。簡單的索引能夠在表中重複的值。
若是想索引的列的值按降序排列,能夠列名以後添加保留字DESC。
mysql> CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author DESC)
使用ALTER命令來添加和刪除索引
有四種類型的索引能夠添加到一個表:
-
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 此語句添加一個主鍵(PRIMARY KEY),這意味着索引值必須是惟一的,而不能爲空。
-
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 此語句建立一個索引的量的值必須是惟一的(除了不能使用NULL值,其它的能夠出現屢次)。
-
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 這增長普通的索引,其中的任何值的出現屢次。
-
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list): 這將建立一個用於文本搜索目的一種特殊的FULLTEXT索引。
下面是一個添加索引到現有表的例子。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
您能夠經過使用ALTER命令以及DROP子句來刪除索引。試試下面的例子,用來刪除上面建立的索引。
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
使用ALTER命令來添加和刪除PRIMARY KEY
也能夠用一樣的方法添加主鍵。但要在列確保主鍵正常使用,須要指定使用 NOT NULL。
下面是一個例子添加主鍵在現有的表。列須要添加 NOT NULL 屬性,而後再添加爲一個主鍵。
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
可使用ALTER命令刪除主鍵以下:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
要刪除索引的不是主鍵,必須指定索引名。
顯示索引信息
可使用SHOW INDEX命令,列出全部與表相關的索引。 垂直格式輸出(由\G指定),這是常常有用的語句,以免長線歸納輸出:
試試下面的例子:
mysql> SHOW INDEX FROM table_name\G
........
2三、MySQL臨時表
臨時表可能在某些狀況下是很是有用的,以保持臨時數據。 臨時表的最重要的事情是,當前客戶端會話結束時,它們將會被刪除。
臨時表是在MySQL版本3.23中增長的。若是使用MySQL 3.23以前的舊版本,是不能使用臨時表的,但可使用堆表。
如前所述,臨時表將只持續在會話存在時。若是在運行一個PHP腳本代碼,臨時表會自動在腳本執行完畢時刪除。若是是經過MySQL客戶端程序鏈接到MySQL數據庫服務器, 那麼臨時表會一直存在,直到關閉客戶端或手動銷燬表。
示例
下面是一個例子,顯示臨時表的使用。
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> INSERT INTO SalesSummary -> (product_name, total_sales, avg_unit_price, total_units_sold) -> VALUES -> ('cucumber', 100.25, 90, 2); mysql> SELECT * FROM SalesSummary; +--------------+-------------+----------------+------------------+ | product_name | total_sales | avg_unit_price | total_units_sold | +--------------+-------------+----------------+------------------+ | cucumber | 100.25 | 90.00 | 2 | +--------------+-------------+----------------+------------------+ 1 row in set (0.00 sec)
當發出SHOW TABLES命令,臨時表不會被列在表的列表中。如今,若是註銷MySQL會話,而後發出SELECT命令,那麼會發如今數據庫中沒有可用的數據。即便是臨時表也不存在了。
刪除臨時表
默認狀況下,當數據庫鏈接被終止,全部的臨時表被MySQL刪除。儘管如此,若是想在結束會話前刪除它們,那麼可經過發出DROP TABLE命令。
如下是刪除一個臨時表的例子:
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> INSERT INTO SalesSummary -> (product_name, total_sales, avg_unit_price, total_units_sold) -> VALUES -> ('cucumber', 100.25, 90, 2); mysql> SELECT * FROM SalesSummary; +--------------+-------------+----------------+------------------+ | product_name | total_sales | avg_unit_price | total_units_sold | +--------------+-------------+----------------+------------------+ | cucumber | 100.25 | 90.00 | 2 | +--------------+-------------+----------------+------------------+ 1 row in set (0.00 sec) mysql> DROP TABLE SalesSummary; mysql> SELECT * FROM SalesSummary; ERROR 1146: Table 'test.SalesSummary' doesn't exist
2四、MySQL複製表
可能有一種狀況,當須要一個表精確的副本,那麼CREATE TABLE... SELECT可能達不到目的,由於副本必須包含相同的索引,默認值等等。
能夠經過如下步驟處理這種狀況:
-
使用 SHOW CREATE TABLE以得到CREATE TABLE語句用於指定源表的結構,索引和全部其它的。
-
修改語句用來更改表名爲克隆表並執行該語句。經過這種方式,將有確切的克隆表。
-
或者,若是須要複製以及表的內容,再發出一個INSERT INTO... SELECT語句。
示例
試試下面的例子來建立表tutorials_tbl的一個克隆表。
步驟1:
獲取有關表的完整結構。
mysql> SHOW CREATE TABLE tutorials_tbl \G; *************************** 1. row *************************** Table: tutorials_tbl Create Table: CREATE TABLE `tutorials_tbl` ( `tutorial_id` int(11) NOT NULL auto_increment, `tutorial_title` varchar(100) NOT NULL default '', `tutorial_author` varchar(40) NOT NULL default '', `submission_date` date default NULL, PRIMARY KEY (`tutorial_id`), UNIQUE KEY `AUTHOR_INDEX` (`tutorial_author`) ) TYPE=MyISAM 1 row in set (0.00 sec) ERROR: No query specified
步驟2:
重命名該表,並建立另外一個表。
mysql> CREATE TABLE `clone_tbl` ( -> `tutorial_id` int(11) NOT NULL auto_increment, -> `tutorial_title` varchar(100) NOT NULL default '', -> `tutorial_author` varchar(40) NOT NULL default '', -> `submission_date` date default NULL, -> PRIMARY KEY (`tutorial_id`), -> UNIQUE KEY `AUTHOR_INDEX` (`tutorial_author`) -> ) TYPE=MyISAM; Query OK, 0 rows affected (1.80 sec)
步驟3:
執行步驟2後,將在數據庫中建立一張克隆表。若是想從舊錶複製數據到新表,那麼能夠經過使用INSERT INTO... SELECT語句來作到這一點。
mysql> INSERT INTO clone_tbl (tutorial_id, -> tutorial_title, -> tutorial_author, -> submission_date) -> SELECT tutorial_id,tutorial_title, -> tutorial_author,submission_date, -> FROM tutorials_tbl; Query OK, 3 rows affected (0.07 sec) Records: 3 Duplicates: 0 Warnings: 0
最後,這是想要確切複製的一張表。
2五、MySQL數據庫信息
有三個信息,常常要從MySQL獲取。
-
有關查詢結果的信息: 這包括任何SELECT,UPDATE或DELETE語句所影響的記錄數量。
-
有關表和數據庫的信息: 這包括關於表和數據庫的結構的信息。
-
關於MySQL服務器的信息: 這包括數據庫服務器的當前狀態,版本號等。
在mysql的提示符下,很容易獲得這些信息,但若是使用Perl或PHP的API,須要顯式調用各類API來獲取這些信息。 下面的部分將說明如何獲取這些信息。
獲取經過查詢影響的行數量
PERL 示例
在DBI腳本,受影響的行數是經過do( )或execute( )返回,這取決於如何執行查詢:
# Method 1 # execute $query using do( ) my $count = $dbh->do ($query); # report 0 rows if an error occurred printf "%d rows were affected\n", (defined ($count) ? $count : 0); # Method 2 # execute query using prepare( ) plus execute( ) my $sth = $dbh->prepare ($query); my $count = $sth->execute ( ); printf "%d rows were affected\n", (defined ($count) ? $count : 0);
PHP 示例
在PHP中,調用mysql_affected_rows()函數,以找出查詢多少行改變:
$result_id = mysql_query ($query, $conn_id); # report 0 rows if the query failed $count = ($result_id ? mysql_affected_rows ($conn_id) : 0); print ("$count rows were affected\n");
列出表和數據庫
這很容易列出數據庫服務器中的全部可用的數據庫和表。但若是結果可能爲null,那麼可能沒有足夠的權限。
除了下面提到的方法,還能夠用SHOW TABLES或SHOW DATABASES來查詢得到表或數據庫列表,不管是在 PHP 或 Perl 中。
PERL 示例
# Get all the tables available in current database. my @tables = $dbh->tables ( ); foreach $table (@tables ){ print "Table Name $table\n"; }
PHP 示例
<?php $con = mysql_connect("localhost", "user", "password"); if (!$con) { die('Could not connect: ' . mysql_error()); } $db_list = mysql_list_dbs($con); while ($db = mysql_fetch_object($db_list)) { echo $db->Database . "<br />"; } mysql_close($con); ?>
獲取服務器元數據
有哪些能夠在mysql提示符下執行,或使用任何如PHP腳原本獲取各類有關數據庫服務器的重要信息。
命令 | 描述 |
---|---|
SELECT VERSION( ) | 服務器版本字符串 |
SELECT DATABASE( ) | 當前數據庫名稱(若是沒有,則爲空) |
SELECT USER( ) | 當前用戶名 |
SHOW STATUS | 服務器狀態指示 |
SHOW VARIABLES | 服務器配置變量 |
2六、MySQL序列的使用
序列是一組整數如1,2,3,...爲了在須要時生成的。數據庫中序列是經常使用的,由於不少應用都須要在表的每行中,包含一個惟一的值,而且序列提供了一種簡單的方法來生成它們。本章將介紹如何在MySQL中使用序列。
使用AUTO_INCREMENT列
在MySQL中最簡單使用序列的方式是定義一個列AUTO_INCREMENT,而後其他事情由MySQL來打理。
示例
嘗試下面的例子。在建立表以後,它會插入幾行此表中,但在這裏不給出記錄ID,由於它由MySQL自動增長。
mysql> CREATE TABLE insect -> ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id), -> name VARCHAR(30) NOT NULL, # type of insect -> date DATE NOT NULL, # date collected -> origin VARCHAR(30) NOT NULL # where collected ); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO insect (id,name,date,origin) VALUES -> (NULL,'housefly','2003-09-19','kitchen'), -> (NULL,'millipede','2004-09-11','driveway'), -> (NULL,'grasshopper','2015-02-10','front yard'); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM insect ORDER BY id; +----+-------------+------------+------------+ | id | name | date | origin | +----+-------------+------------+------------+ | 1 | housefly | 2003-09-19 | kitchen | | 2 | millipede | 2004-09-11 | driveway | | 3 | grasshopper | 2015-02-10 | front yard | +----+-------------+------------+------------+ 3 rows in set (0.00 sec)
獲取AUTO_INCREMENT值
LAST_INSERT_ID( )是一個SQL函數,這樣能夠了解如何發出SQL語句,從任何客戶端中使用它。 以其餘方式,Perl 和 PHP 腳本提供了獨有的函數來獲取最後一條記錄的自動遞增值。
2七、MySQL重複處理
表或結果集有時含有重複記錄。有時,它是容許的,但有時它被要求中止使用重複記錄。有時,須要識別重複記錄並從表中刪除它們。本章將介紹如何防止在一個表中,以及如何刪除已有的重複記錄。
防止在一個表發生重複記錄
可使用適當表字段的PRIMARY KEY 或 UNIQUE 來防止重複記錄。讓咱們來看看下面的例子:下表中沒有這樣的索引或主鍵,因此這裏容許 first_name 和last_name 記錄重複。
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name) );
若是插入一條與現有記錄重複到表,在列或定義索引列,表中一個惟一索引的存在一般會致使錯誤的發生。
應該使用 INSERT IGNORE 而不是INSERT。若是記錄與現有現有不重複時,MySQL將其正常插入。若是記錄是一個重複的,則 IGNORE 關鍵字告訴MySQL丟棄它而不會產生錯誤。
下面的例子不會有錯誤,也不會插入重複的記錄。
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas'); Query OK, 1 row affected (0.00 sec) mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas'); Query OK, 0 rows affected (0.00 sec)
使用REPLACE而不是INSERT。若是記錄是新的,它插入就像使用 INSERT。若是它是重複的,新的記錄將取代舊的記錄:
mysql> REPLACE INTO person_tbl (last_name, first_name) -> VALUES( 'Ajay', 'Kumar'); Query OK, 1 row affected (0.00 sec) mysql> REPLACE INTO person_tbl (last_name, first_name) -> VALUES( 'Ajay', 'Kumar'); Query OK, 2 rows affected (0.00 sec)
INSERT IGNORE和REPLACE應根據實現的重複處理行爲來選擇。INSERT忽略保持第一套重複記錄,並丟棄剩下的。REPLACE保持最後一組重複的和擦除任何較早的記錄。
另外一種方法是強制惟一性是增長惟一(UNIQUE)索引,而不是一個主鍵(PRIMARY KEY)。
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10) UNIQUE (last_name, first_name) );
統計和標識重複
如下是查詢以統計first_name和last_name 在表中的重複記錄數。
mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
這個查詢將返回person_tbl表中的全部重複記錄的列表.在通常狀況下,識別的集合值重複,執行如下步驟:
-
肯定哪些列包含可重複值
-
列出這些列中的列選擇列表,使用COUNT(*)
-
列出的列也可使用 GROUP BY 子句
-
添加一個HAVING子句,經過分組計算出惟一值數大於1的記錄重複
從查詢結果消除重記錄
可使用SELECT語句以及DISTINCT一塊兒在一個表中找出可用惟一記錄。
mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl -> ORDER BY last_name;
替代DISTINCT方法是添加GROUP BY子句列名稱到選擇的列。這有刪除重複並選擇在指定的列值的惟一組合的效果:
mysql> SELECT last_name, first_name -> FROM person_tbl -> GROUP BY (last_name, first_name);
使用表的更換刪除重複
若是一個表中重複的記錄,並要刪除該表中的全部重複的記錄,那麼能夠參考下面的程序:
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex -> FROM person_tbl; -> GROUP BY (last_name, first_name); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl;
從表中刪除重複記錄的一個簡單的方法就添加索引(INDEX) 或 主鍵(PRIMAY KEY)到該表。即便該表已經提供,可使用此技術來刪除重複的記錄。
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
2八、MySQL和SQL注入
若是經過網頁須要用戶輸入一些數據信息,並將其插入到MySQL數據庫,這是一個引入SQL注入安全問題的機會。這一節將學習如何防止這種狀況的發生,並幫助保護腳本和MySQL語句。
一般注入是在當要求用戶輸入時,相似他們的姓名,只是一個名字,他們給出,會在不知不覺中包含MySQL的語句會在數據庫運行。
永遠不要信任用戶提供的數據,這個過程只有在數據驗證後,做爲一項規則,這是經過模式匹配進行。在下面的例子中,用戶名被限制在字母+數字+字符加下劃線,並在8-20個字符之間的長度 - 能夠根據須要修改這些規則。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username not accepted"; }
爲了說明問題,考慮這個片斷:
// supposed input $name = "Qadir'; DELETE FROM users;"; mysql_query("SELECT * FROM users WHERE name='{$name}'");
該函數調用從表中檢索用戶記錄,其中名稱列匹配由用戶指定的名稱。 在正常狀況下,$name將只包含字母數字字符,或多是空格,如字符串ilia。 但在這裏,經過附加一個全新的查詢到$name,在調用數據庫變成災難:注入DELETE查詢刪除全部的用戶記錄。
幸運的是,若是使用MySQL,mysql_query()函數不容許查詢堆疊或一個函數調用執行多個查詢。若是嘗試堆疊查詢,調用失敗。
然而,其餘PHP數據庫擴展,如SQLite和PostgreSQL,它們會樂意地進行堆查詢,執行一個字符串提供的查詢,並建立一個嚴重的安全問題。
防止SQL注入
能夠在腳本語言,如 Perl和PHP巧妙地處理全部轉義字符。MySQL擴展爲PHP提供mysql_real_escape_string()函數來轉義輸入的特殊字符。
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name='{$name}'");
LIKE的困境
爲了解決LIKE困境,自定義的轉義機制必須把用戶提供%和_字符到常量。使用addcslashes()函數,它可讓指定的字符範圍轉義。
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_ mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
2九、MySQL數據庫導出(備份方法)
導出表數據到一個文本文件的最簡單方法是使用SELECT... INTO OUTFILE語句直接將導出查詢結果導出到服務器主機上的文件。
使用導出數據SELECT... INTO OUTFILE語句
語句的語法結合了常規的SELECT INTO與OUTFILE filename 末尾。默認的輸出格式與LOAD DATA是同樣的,因此下面的語句導出 tutorials_tbl 表到C:\tutorials.txt 並使用製表符分隔,換行結尾的文件:
mysql> SELECT * FROM tutorials_tbl -> INTO OUTFILE 'C:\tutorials.txt';
能夠利用選項來講明如何引號和分隔列,更改記錄輸出格式。 使用CRLF爲結束行導出tutorial_tbl 爲CSV格式表格,使用如下語句:
mysql> SELECT * FROM passwd INTO OUTFILE 'C:\tutorials.txt' -> FIELDS TERMINATED BY ',' ENCLOSED BY '"' -> LINES TERMINATED BY '\r\n';
SELECT... INTO OUTFILE具備如下屬性:
-
輸出的文件是直接由MySQL服務器建立的,所以,文件名應指明想要的文件名,它會被寫到服務器主機上。還有就是語句相似於沒有LOCAL版本的LOAD DATA的本地版本。
-
必須有MySQL的FILE權限來執行SELECT ... INTO語句。
-
輸出文件必須還不存在。 這防止MySQL弄錯文件很重要。
-
應該有服務器主機或某種方式來檢索該主機上登陸賬戶的文件。不然,SELECT ... INTO OUTFILE可能沒有任何值給出。
-
在UNIX下,文件建立全部人都是可讀的,由MySQL服務器所擁有。這意味着,雖然可以讀取該文件,可能沒法將其刪除。
導出表做爲原始數據
mysqldump程序用於複製或備份表和數據庫。它能夠寫入表輸出做爲一個原始數據文件,或爲一組從新建立表中的INSERT語句的記錄。
轉儲一個表做爲一個數據文件,必須指定一個--tab 選項指定目錄,讓MySQL服務器寫入文件。
例如,從數據庫test中的tutorials_tbl錶轉儲到一個文件在C:\tmp目錄,可以使用這樣的命令:
$ mysqldump -u root -p --no-create-info \ --tab=c:\tmp TEST tutorials_tbl password ******
以SQL格式導出表內容或定義
以SQL格式的表導出到一個文件,使用這樣的命令:
$ mysqldump -u root -p test tutorials_tbl > dump.txt password ******
這將建立一個具備如下內容折文件,以下:
-- MySQL dump 8.53 -- -- Host: localhost Database: test --------------------------------------------------------- -- Server version 5.5.58 -- -- Table structure for table `tutorials_tbl` -- CREATE TABLE tutorials_tbl ( tutorial_id int(11) NOT NULL auto_increment, tutorial_title varchar(100) NOT NULL default '', tutorial_author varchar(40) NOT NULL default '', submission_date date default NULL, PRIMARY KEY (tutorial_id), UNIQUE KEY AUTHOR_INDEX (tutorial_author) ) TYPE=MyISAM; -- -- Dumping data for table `tutorials_tbl` -- INSERT INTO tutorials_tbl VALUES (1,'Learn PHP','John Poul','2012-01-04'); INSERT INTO tutorials_tbl VALUES (2,'Learn MySQL','Abdul S','2015-05-14'); INSERT INTO tutorials_tbl VALUES (3,'JAVA Tutorial','Sanjay','2014-05-10');
要轉儲多個表,全部數據庫名稱參數後跟它們的名字。要轉儲整個數據庫,不須要在數據庫以後命名(附加)任何表:
$ mysqldump -u root -p test > database_dump.txt password ******
要備份全部可用的數據庫在主機上,使用如下命令:
$ mysqldump -u root -p --all-databases > database_dump.txt password ******
--all-databases選項可在MySQL 3.23.12以後的版本使用。
該方法可用於實現數據庫的備份策略。
複製表或數據庫到另外一臺主機
若是想從一個MySQL服務器複製表或數據庫到另外一臺,使用mysqldump以及數據庫名和表名。
在源主機上運行下面的命令。將轉儲完整的數據庫到文件dump.txt:
$ mysqldump -u root -p database_name table_name > dump.txt password *****
能夠複製完整的數據庫,而無需使用特定的表名,如上所述。
如今ftp dump.txt文件在另外一臺主機上,並使用下面的命令。運行此命令以前,請確保已建立數據庫名稱在目標服務器上。
$ mysql -u root -p database_name < dump.txt password *****
另外一種方式來實現這一點,無需使用一箇中間文件是來發送,mysqldump輸出直接經過網絡到遠程MySQL服務器。若是能夠從源數據庫所在的主機那裏鏈接兩個服務器,使用此命令(請確保兩個服務器能夠訪問):
$ mysqldump -u root -p database_name \ | mysql -h other-host.com database_name
命令mysqldump的一半鏈接到本地服務器,並轉儲輸出寫入管道。另外一半MySQL鏈接到other-host.com遠程MySQL服務器。它讀取管道輸入併發送每條語句到other-host.com服務器。
30、MySQL數據庫導入(恢復數據方法)
MySQL中有兩種簡單的方法可從之前備份的文件數據加載(恢復)到MySQL數據庫。
使用LOAD DATA導入數據
MySQL提供了一個大容量數據加載的LOAD DATA語句。下面是一個讀取文件C:\dump.txt 並將其加載到當前數據庫表mytbl的例子聲明:
mysql> LOAD DATA LOCAL INFILE 'C:\dump.txt' INTO TABLE mytbl;
-
若是LOCAL關鍵詞不存在,MySQL查找使用絕對路徑在服務器主機上的數據文件,徹底指定文件的位置,從文件系統的根開始。 MySQL讀取從給定的位置的文件。
-
默認狀況下,LOAD DATA假設數據文件包含一個行由製表符分隔範圍內被換行(新行)分割行和數據值。
-
要明確指定一個文件格式,使用FIELDS子句來描述一行內字段的特徵,LINES子句指定的行結束序列。下面的LOAD DATA語句指定的數據文件包含由冒號和行,是由回車和新行字符結束分隔其值:
mysql> LOAD DATA LOCAL INFILE 'C:\dump.txt' INTO TABLE mytbl -> FIELDS TERMINATED BY ':' -> LINES TERMINATED BY '\r\n';
-
LOAD DATA假定數據文件中的列具備相同的順序在表中的列。若是不是這樣,能夠指定一個列表來指示哪些表列數據文件列應該被裝入。 假設表中的列A,B和C,但在數據文件連續列對應於列B,C,和A。能夠像這樣加載文件:
mysql> LOAD DATA LOCAL INFILE 'dump.txt' -> INTO TABLE mytbl (b, c, a);
使用mysqlimport導入數據
MySQL還包括一個實用程序名:mysqlimport,它充當圍繞LOAD DATA包裝器 這樣就能夠直接從命令行輸入加載文件。
從 dump.txt 加載數據到表mytbl,使用下面的命令在命令行提示符。
$ mysqlimport -u root -p --local database_name dump.txt password *****
若是使用mysqlimport,命令行選項提供的格式說明。對應於上述兩個LOAD DATA 語句的 mysqlimport 命令以下:
$ mysqlimport -u root -p --local --fields-terminated-by=":" \ --lines-terminated-by="\r\n" database_name dump.txt password *****
在 mysqlimport 中指定的選項順序並不重要,但它們都應該在數據庫名的前面。
mysqlimport語句使用--columns選項來指定列的順序:
$ mysqlimport -u root -p --local --columns=b,c,a \ database_name dump.txt password *****
處理引號和特殊字符
除了TERMINATED,FIELDS子句能夠指定其餘格式選項。默認狀況下,LOAD DATA假設值是加引號的,並解釋反斜線(\)做爲特殊字符轉義字符。要明確註明引用字符值, 使用ENCLOSED BY; MySQL將剝離字符的數據值末端在輸入處理期間。要更改默認的轉義字符,可以使用ESCAPED BY。
當指定ENCLOSED BY,代表引號字符應該從數據值被剝離,有可能經過加一次或經過轉義字符,確實包含引號字符在數據值前。例如,若是引號和轉義字符是" 和 \,輸入 "a""b\"c" 將被解釋爲:a"b"c
對於 mysqlimport,相應的命令行選項引號和轉義值是經過 --fields-enclosed-by 和 --fields-escaped-by來指定。
3一、MySQL實用函數
這裏是全部重要的 MySQL 函數的列表。每一個函數都用合適的例子來講明以下。
-
MySQL Group By 子句 - MySQL的GROUP BY語句以及SQL聚合函數,用於相似SUM提供某些數據庫表的列來分組結果數據集
-
MySQL IN 子句 - 這是一個子句,它能夠用來連同任何MySQL查詢語句以指定條件
-
MySQL BETWEEN 子句 - 這是一個子句,它能夠用來與任何MySQL查詢來指定條件
-
MySQL UNION關鍵字 - 使用UNION操做多個結果集組合成一個結果集
-
MySQL COUNT函數 - MySQL的COUNT聚合函數用於計算一個數據庫表中的行數
-
MySQL MAX 函數 - MySQL的MAX聚合函數容許咱們選擇某些列的最高(最大)值
-
MySQL MIN函數 - MySQL的MIN聚合函數容許咱們選擇某些列的最低(最小)值
-
MySQL AVG函數 - MySQL的AVG聚合函數是用來對某些表的列求它的平均值
-
MySQL SUM函數 - MySQL的SUM聚合函數容許選擇某列的總和
-
MySQL SQRT函數 - 這是用來生成給定數的平方根
-
MySQL RAND函數 - 使用MySQL命令產生一個隨機數
-
MySQL CONCAT函數 - 這是用來鏈接MySQL命令中的任何字符串
-
MySQL DATE 和 Time 時間日期函數 - MySQL日期和時間相關的函數完整列表
-
MySQL數字函數 - 在MySQL中操做數字的MySQL函數完整列表
-
MySQL字符串函數 - 在MySQL中的字符串操做的MySQL函數的完整列表