什么是數(shù)據(jù)庫(kù)?
數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪(fǎng)問(wèn),管理,檢索和復(fù)制所保存數(shù)據(jù)。
其他類(lèi)型的數(shù)據(jù)存儲(chǔ),可以使用,如獲取文件系統(tǒng)上的文件或內(nèi)存中的大的哈希表,但數(shù)據(jù)并寫(xiě)入不會(huì)那么快,但這些類(lèi)型的系統(tǒng)易于使用。
所以今天,我們使用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)來(lái)存儲(chǔ)和管理體積龐大的數(shù)據(jù)。這就是所謂關(guān)系數(shù)據(jù)庫(kù),因?yàn)樗械臄?shù)據(jù)存儲(chǔ)到不同的表和關(guān)系建立使用主鍵或外鍵等其它鍵。
一個(gè)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)是一種軟件是:
使您能夠?qū)崿F(xiàn)具有表,列和索引的數(shù)據(jù)庫(kù)
保證了各種表的行之間的引用完整性
自動(dòng)更新索引
解釋SQL查詢(xún)和聯(lián)合各表的信息。
RDBMS術(shù)語(yǔ):
在我們開(kāi)始講解MySQL數(shù)據(jù)庫(kù)系統(tǒng)之前,讓我們修訂數(shù)據(jù)庫(kù)數(shù)的定義。
數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)是表的集合,具有相關(guān)數(shù)據(jù)。
表:表是用數(shù)據(jù)矩陣。在一個(gè)數(shù)據(jù)庫(kù)中的表看起來(lái)就像一個(gè)簡(jiǎn)單的電子表格。
列:一列(數(shù)據(jù)元素)包含一個(gè)的數(shù)據(jù)和相同種類(lèi),例如,列郵政編碼。
行:一行(=元組,條目或記錄)是一組相關(guān)的數(shù)據(jù),例如一個(gè)訂閱的數(shù)據(jù)。
冗余:存儲(chǔ)數(shù)據(jù)兩次,冗余使系統(tǒng)更快。
主鍵:主鍵是唯一的。不能在一個(gè)表中出現(xiàn)的一個(gè)鍵兩次。使用鍵可以快速找到一行。
外鍵:外鍵是兩個(gè)表之間的連接值。
復(fù)合鍵:復(fù)合鍵(復(fù)合鍵)是由多個(gè)列,因?yàn)橛袝r(shí)一個(gè)列是不夠唯一標(biāo)識(shí)鍵的。
索引:在數(shù)據(jù)庫(kù)中的索引類(lèi)似于索引在一本書(shū)(書(shū)的目錄)。
參照完整性:參照完整性可以確保外鍵值總是指向現(xiàn)有的行。
MySQL 數(shù)據(jù)庫(kù)
MySQL是一個(gè)快速,易于使用的RDBMS,被用于許多小型和大型企業(yè)。MySQL由一個(gè)瑞典公司MySQL AB支持。正在開(kāi)發(fā),銷(xiāo)售。MySQL變得如此受歡迎,因?yàn)樵S多很好的理由:
MySQL在一個(gè)開(kāi)源許可下發(fā)布。所以使用它不要擔(dān)心什么問(wèn)題。
MySQL本身是非常強(qiáng)大的程序。它擁有可處理最昂貴,最強(qiáng)大的數(shù)據(jù)庫(kù)軟件包的相當(dāng)大一部分功能。
MySQL使用眾所周知的SQL數(shù)據(jù)語(yǔ)言的標(biāo)準(zhǔn)形式。
MySQL可運(yùn)行在許多類(lèi)操作系統(tǒng)和許多語(yǔ)言,包括 PHP, PERL, C, C++, JAVA 等
MySQL運(yùn)行得非常快,甚至在大型數(shù)據(jù)集也可以運(yùn)行得很好。
MySQL與PHP非常友好,是最受贊賞的Web開(kāi)發(fā)語(yǔ)言。
MySQL支持大型數(shù)據(jù)庫(kù),可達(dá)5千萬(wàn)行以上的表。 表的默認(rèn)文件大小限制為4GB,但可以增加(如果操作系統(tǒng)可以處理它),800萬(wàn)TB是一個(gè)理論極限(TB).
MySQL是定制的。開(kāi)源GPL許可允許程序員修改MySQL軟件,以適應(yīng)自己的特定環(huán)境。
、驗(yàn)證MySQL安裝
MySQL已經(jīng)被成功安裝后,基礎(chǔ)表已經(jīng)被初始化,并且服務(wù)器已經(jīng)啟動(dòng),可以通過(guò)一些簡(jiǎn)單的測(cè)試驗(yàn)證。
使用中mysqladmin工具程序來(lái)獲取服務(wù)器狀態(tài)
使用 mysqladmin 來(lái)檢查服務(wù)器版本。在目錄 D:\software\mysql-5.6.25-winx64\bin
D:\software\mysql-5.6.25-winx64\bin> mysqladmin --version
看到結(jié)果如下:
mysqladmin? Ver 8.42 Distrib 5.6.25, for Win64 on x86_64
如果看到這樣的消息,則有可能是在安裝了一些問(wèn)題,需要一些幫助解決它。
使用MySQL客戶(hù)端執(zhí)行簡(jiǎn)單的SQL命令
可以使用MySQL客戶(hù)端使用 mysql 命令連接到 MySQL 服務(wù)器。此時(shí),不需要給任何密碼,因?yàn)槟J(rèn)情況下它被設(shè)置為空。
所以,只需要使用下面的命令:
D:\software\mysql-5.6.25-winx64\bin> mysql
應(yīng)該出現(xiàn)一個(gè)mysql>提示符。 現(xiàn)在,已連接到MySQL服務(wù)器,可以在MySQL的命令>提示符下執(zhí)行所有SQL,如下:
mysql>SHOW DATABASES;+----------+|Database|+----------+|mysql||test|+----------+2rowsinset(0.13sec)
安裝后的步驟:
MySQL附帶了一個(gè)空密碼有的root用戶(hù)。成功后安裝了數(shù)據(jù)庫(kù)和客戶(hù)端,需要進(jìn)行如下設(shè)置root密碼:
D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root password "123456";
注:
1. 關(guān)閉正在運(yùn)行的MySQL服務(wù)。
2. 打開(kāi)DOS窗口,轉(zhuǎn)到 D:\software\mysql-5.6.25-winx64\bin 目錄。
3. 輸入mysqld --skip-grant-tables 回車(chē)。--skip-grant-tables 的意思是啟動(dòng)MySQL服務(wù)的時(shí)候跳過(guò)權(quán)限表認(rèn)證。
4. 再開(kāi)一個(gè)DOS窗口(因?yàn)閯偛拍莻€(gè)DOS窗口已經(jīng)不能動(dòng)了),轉(zhuǎn)到mysql\bin目錄。
5. 輸入mysql回車(chē),如果成功,將出現(xiàn)MySQL提示符 >。
6. 連接權(quán)限數(shù)據(jù)庫(kù): use mysql; 。
6. 改密碼:update user set password=password("123456") where user="root";(別忘了最后加分號(hào)) 。
7. 刷新權(quán)限(必須步驟):flush privileges;
8. 退出 quit。
9. 注銷(xiāo)系統(tǒng),再進(jìn)入,使用用戶(hù)名root和剛才設(shè)置的新密碼 123456 登錄。
現(xiàn)在使MySQL服務(wù)器的連接,那么使用下面的命令:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p
Enter password: ******
2、運(yùn)行和關(guān)閉MySQL服務(wù)器
首先檢查MySQL服務(wù)器正在運(yùn)行與否。在資源管理器查看有沒(méi)有mysqld的進(jìn)程,如果MySQL正在運(yùn)行,那么會(huì)看到列出來(lái)的 mysqld 進(jìn)程。如果服務(wù)器沒(méi)有運(yùn)行,那么可以使用下面的命令來(lái)啟動(dòng)它:
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 ...
現(xiàn)在,如果想關(guān)閉已經(jīng)運(yùn)行的 MySQL 服務(wù)器,那么可以使用下面的命令做到這一點(diǎn):
D:\software\mysql-5.6.25-winx64\bin>mysqladmin -u root -p shutdown
Enter password: ******
3、設(shè)置MySQL用戶(hù)帳戶(hù)
要添加一個(gè)新用戶(hù)到 MySQL,只需要在數(shù)據(jù)庫(kù)中的新記錄添加到用戶(hù)表:mysql.user
下面是添加新用戶(hù):yiibai 的例子,給定 SELECT, INSERT 和 UPDATE權(quán)限并使用密碼:yiibai123; SQL 查詢(xún)是:
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)
當(dāng)要添加一個(gè)新用戶(hù),記得要PASSWORD()函數(shù)加密MySQL新使用的密碼。正如在上面的例子中看到密碼為mypass,進(jìn)行加密后為:*59A8740AAC5DBCB2907F38891BE42957F699CB77
注意最后要使用 FLUSH PRIVILEGES 語(yǔ)句。 這告訴服務(wù)器重新加載授權(quán)表。如果不使用它,那么將無(wú)法使用新的用戶(hù)帳戶(hù)連接到MySQL服務(wù)器,至少在服務(wù)器重新啟動(dòng)后才可以。
也可以通過(guò)在用戶(hù)設(shè)置表以下幾列的值為'Y',指定給新用戶(hù)的權(quán)限,在執(zhí)行INSERT查詢(xún)后,也可以在以后使用UPDATE查詢(xún)更新它們:
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
下面我們來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù):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;
添加用戶(hù)帳戶(hù)的另一種方式是通過(guò)使用GRANT SQL命令; 下面的例子將增加用戶(hù)zara 并使用密碼zara123 為特定數(shù)據(jù)庫(kù):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';
這也將創(chuàng)建一條記錄在MySQL數(shù)據(jù)庫(kù)中的表: user
注意: MySQL不會(huì)終止命令,直到給一個(gè)分號(hào)(;)在SQL命令的結(jié)尾。
my.ini 文件配置
大多數(shù)情況下,不需要去修改這個(gè)文件。默認(rèn)情況下,它會(huì)具有以下項(xiàng):
[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
在這里,可以指定錯(cuò)誤日志為其它的目錄,否則不應(yīng)該更改此文件中的任何內(nèi)容。
管理 mysql 命令
這里是重要的MySQL命令,經(jīng)常在MySQL數(shù)據(jù)庫(kù)的管理或工作中使用:
USE Databasename : 用于選擇在MySQL工作區(qū)指定的數(shù)據(jù)庫(kù)。
SHOW DATABASES: 列出了MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)中的所有可訪(fǎng)問(wèn)的數(shù)據(jù)庫(kù)。
SHOW TABLES: 顯示已經(jīng)選擇數(shù)據(jù)庫(kù)中的表的命令。
SHOW COLUMNS FROM tablename: 顯示屬性,屬性類(lèi)型,關(guān)鍵信息,NULL是否被允許,默認(rèn)值和其它的表信息。
SHOW INDEX FROM tablename: 提供所有指標(biāo)的詳細(xì)信息表,其中包括PRIMARY KEY.
SHOW TABLE STATUS LIKE tablename\G: 報(bào)告MySQL的數(shù)據(jù)庫(kù)管理系統(tǒng)的性能和統(tǒng)計(jì)數(shù)據(jù)的詳細(xì)信息。
4、使用MySQL二進(jìn)制連接MySQL
可以使用MySQL二進(jìn)制在命令提示符下建立MySQL數(shù)據(jù)庫(kù)的連接。
示例:
下面是一個(gè)簡(jiǎn)單的例子,從命令提示符連接MySQL服務(wù)器:
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p
Enter password:
注意,這里密碼為空,直接回車(chē)就就進(jìn)入mysql>命令提示符下,能夠執(zhí)行任何SQL命令。以下是上述命令的結(jié)果:
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 用戶(hù),但可以使用任何其他用戶(hù)。任何用戶(hù)將能夠執(zhí)行所有的SQL操作(前提這個(gè)用戶(hù)有對(duì)應(yīng)執(zhí)行SQL權(quán)限)。
任何時(shí)候使用exit命令在mysql>提示符下,從MySQL數(shù)據(jù)庫(kù)斷開(kāi)。
mysql>exitBye
5、MySQL創(chuàng)建數(shù)據(jù)庫(kù)
需要特殊權(quán)限創(chuàng)建或刪除一個(gè)MySQL數(shù)據(jù)庫(kù)。因此,假如有權(quán)使用 root 用戶(hù),就可以用mysql中的mysqladmin來(lái)創(chuàng)建數(shù)據(jù)庫(kù)。
示例:
下面是一個(gè)簡(jiǎn)單的例子,創(chuàng)建名為 tutorials 的數(shù)據(jù)庫(kù)。
D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root -p create tutorials
Enter password:<回車(chē)>
或
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p
Enter password:
mysql>create database yiibai_tutorials1;
mysql>create database yiibai_tutorials2;
這將創(chuàng)建一個(gè)MySQL數(shù)據(jù)庫(kù):yiibai_tutorials1? 和 yiibai_tutorials2,使用下面命令查看結(jié)果:
mysql> show databases;
+--------------------+
| Database? ? ? ? ? |
+--------------------+
| information_schema |
| mysql? ? ? ? ? ? ? |
| performance_schema |
| test? ? ? ? ? ? ? |
| yiibai_tutorials1? |
| yiibai_tutorials2? |
+--------------------+
6 rows in set (0.00 sec)
6、MySQL刪除數(shù)據(jù)庫(kù)
需要特殊權(quán)限來(lái)創(chuàng)建或刪除一個(gè)MySQL數(shù)據(jù)庫(kù)。因此,假如你有機(jī)會(huì)獲得root用戶(hù)來(lái)登錄,可以用mysql中mysqladmin二進(jìn)制來(lái)創(chuàng)建任何數(shù)據(jù)庫(kù)。
在刪除任何數(shù)據(jù)庫(kù)時(shí)要注意,因?yàn)閯h除數(shù)據(jù)庫(kù)時(shí)所有的數(shù)據(jù)在數(shù)據(jù)庫(kù)中。
下面是一個(gè)例子,用來(lái)刪除前面的章節(jié)中所創(chuàng)建的數(shù)據(jù)庫(kù):
D:\software\mysql-5.6.25-winx64\bin> mysqladmin -u root -p drop yiibai_tutorials1
Enter password:******
這會(huì)給出一個(gè)警告,它會(huì)確認(rèn)你是否真的要?jiǎng)h除這個(gè)數(shù)據(jù)庫(kù)或不刪除。
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)
使用下面命令看刪除后,數(shù)據(jù)庫(kù)的列表情況:
mysql> show databases;
+--------------------+
| Database? ? ? ? ? |
+--------------------+
| information_schema |
| mysql? ? ? ? ? ? ? |
| performance_schema |
| test? ? ? ? ? ? ? |
| yiibai? ? ? ? ? ? |
+--------------------+
6 rows in set (0.00 sec)
連接到MySQL服務(wù)器后,則需要選擇特定的數(shù)據(jù)庫(kù)的來(lái)工作。這是因?yàn)榭赡苡卸鄠€(gè)數(shù)據(jù)庫(kù)可使用在MySQL服務(wù)器上。
7、從命令提示符選擇MySQL數(shù)據(jù)庫(kù)
這是非常簡(jiǎn)單的,從MySQL>提示符下選擇一個(gè)特定的數(shù)據(jù)庫(kù)。可以使用SQL命令的 user 來(lái)選擇一個(gè)特定的數(shù)據(jù)庫(kù)。
示例:
下面是一個(gè)例子,選擇數(shù)據(jù)庫(kù)為 test :
D:\software\mysql-5.6.25-winx64\bin> mysql -u root -p
Enter password:
mysql> use test;
Database changed
mysql>
現(xiàn)在,我們已經(jīng)選擇 test 數(shù)據(jù)庫(kù),后續(xù)所有操作將在 test 數(shù)據(jù)庫(kù)上執(zhí)行。
注意: 所有的數(shù)據(jù)庫(kù)名,表名,表中的字段名稱(chēng)是區(qū)分大小寫(xiě)的。所以,我們必須使用適當(dāng)?shù)拿Q(chēng),在給定任何SQL命令。
8、MySQL表字段類(lèi)型
正確地定義的表中的字段在數(shù)據(jù)庫(kù)的整體優(yōu)化是非常重要的。我們應(yīng)該只使用真正需要使用類(lèi)型和字段的大小; 如果知道只使用2個(gè)字符,就不使用10個(gè)字符寬定義一個(gè)字段。這些類(lèi)型的字段(或列),也被稱(chēng)為數(shù)據(jù)類(lèi)型,數(shù)據(jù)存儲(chǔ)這些字段之中。
MySQL使用許多不同的數(shù)據(jù)類(lèi)型,總體上分為三類(lèi):數(shù)字,日期,時(shí)間和字符串類(lèi)型。
數(shù)字?jǐn)?shù)據(jù)類(lèi)型
MySQL使用所有標(biāo)準(zhǔn)的ANSI SQL數(shù)字?jǐn)?shù)據(jù)類(lèi)型,所以,如果在學(xué)習(xí)MySQL之前,有接觸過(guò)其它不同的數(shù)據(jù)庫(kù)系統(tǒng),那么這些定義看起來(lái)很熟悉。下面列出了常見(jiàn)的數(shù)字?jǐn)?shù)據(jù)類(lèi)型及其說(shuō)明:
INT - 正常大小的整數(shù),可以帶符號(hào)。如果是有符號(hào)的,它允許的范圍是從-2147483648到2147483647。如果是無(wú)符號(hào),允許的范圍是從0到4294967295。 可以指定多達(dá)11位的寬度。
TINYINT - 一個(gè)非常小的整數(shù),可以帶符號(hào)。如果是有符號(hào),它允許的范圍是從-128到127。如果是無(wú)符號(hào),允許的范圍是從0到255,可以指定多達(dá)4位數(shù)的寬度。
SMALLINT - 一個(gè)小的整數(shù),可以帶符號(hào)。如果有符號(hào),允許范圍為-32768至32767。如果無(wú)符號(hào),允許的范圍是從0到65535,可以指定最多5位的寬度。
MEDIUMINT - 一個(gè)中等大小的整數(shù),可以帶符號(hào)。如果有符號(hào),允許范圍為-8388608至8388607。 如果無(wú)符號(hào),允許的范圍是從0到16777215,可以指定最多9位的寬度。
BIGINT - 一個(gè)大的整數(shù),可以帶符號(hào)。如果有符號(hào),允許范圍為-9223372036854775808到9223372036854775807。如果無(wú)符號(hào),允許的范圍是從0到18446744073709551615. 可以指定最多20位的寬度。
FLOAT(M,D) - 不能使用無(wú)符號(hào)的浮點(diǎn)數(shù)字??梢远x顯示長(zhǎng)度(M)和小數(shù)位數(shù)(D)。這不是必需的,并且默認(rèn)為10,2。其中2是小數(shù)的位數(shù),10是數(shù)字(包括小數(shù))的總數(shù)。小數(shù)精度可以到24個(gè)浮點(diǎn)。
DOUBLE(M,D) - 不能使用無(wú)符號(hào)的雙精度浮點(diǎn)數(shù)。可以定義顯示長(zhǎng)度(M)和小數(shù)位數(shù)(D)。 這不是必需的,默認(rèn)為16,4,其中4是小數(shù)的位數(shù)。小數(shù)精度可以達(dá)到53位的DOUBLE。 REAL是DOUBLE同義詞。
DECIMAL(M,D) - 非壓縮浮點(diǎn)數(shù)不能是無(wú)符號(hào)的。在解包小數(shù),每個(gè)小數(shù)對(duì)應(yīng)于一個(gè)字節(jié)。定義顯示長(zhǎng)度(M)和小數(shù)(D)的數(shù)量是必需的。 NUMERIC是DECIMAL的同義詞。
日期和時(shí)間類(lèi)型
MySQL的日期和時(shí)間數(shù)據(jù)類(lèi)型包括:
DATE - 以YYYY-MM-DD格式的日期,在1000-01-01和9999-12-31之間。 例如,1973年12月30日將被存儲(chǔ)為1973-12-30。
DATETIME - 日期和時(shí)間組合以YYYY-MM-DD HH:MM:SS格式,在1000-01-01 00:00:00 到9999-12-31 23:59:59之間。例如,1973年12月30日下午3:30,會(huì)被存儲(chǔ)為1973-12-30 15:30:00。
TIMESTAMP - 1970年1月1日午夜之間的時(shí)間戳,到2037的某個(gè)時(shí)候。這看起來(lái)像前面的DATETIME格式,無(wú)需只是數(shù)字之間的連字符; 1973年12月30日下午3點(diǎn)30分將被存儲(chǔ)為19731230153000(YYYYMMDDHHMMSS)。
TIME - 存儲(chǔ)時(shí)間在HH:MM:SS格式。
YEAR(M) - 以2位或4位數(shù)字格式來(lái)存儲(chǔ)年份。如果長(zhǎng)度指定為2(例如YEAR(2)),年份就可以為1970至2069(70?69)。如果長(zhǎng)度指定為4,年份范圍是1901-2155,默認(rèn)長(zhǎng)度為4。
字符串類(lèi)型
雖然數(shù)字和日期類(lèi)型比較有意思,但存儲(chǔ)大多數(shù)數(shù)據(jù)都可能是字符串格式。 下面列出了在MySQL中常見(jiàn)的字符串?dāng)?shù)據(jù)類(lèi)型。
CHAR(M) - 固定長(zhǎng)度的字符串是以長(zhǎng)度為1到255之間個(gè)字符長(zhǎng)度(例如:CHAR(5)),存儲(chǔ)右空格填充到指定的長(zhǎng)度。 限定長(zhǎng)度不是必需的,它會(huì)默認(rèn)為1。
VARCHAR(M) - 可變長(zhǎng)度的字符串是以長(zhǎng)度為1到255之間字符數(shù)(高版本的MySQL超過(guò)255); 例如: VARCHAR(25). 創(chuàng)建VARCHAR類(lèi)型字段時(shí),必須定義長(zhǎng)度。
BLOB or TEXT - 字段的最大長(zhǎng)度是65535個(gè)字符。 BLOB是“二進(jìn)制大對(duì)象”,并用來(lái)存儲(chǔ)大的二進(jìn)制數(shù)據(jù),如圖像或其他類(lèi)型的文件。定義為T(mén)EXT文本字段還持有大量的數(shù)據(jù); 兩者之間的區(qū)別是,排序和比較上存儲(chǔ)的數(shù)據(jù),BLOB大小寫(xiě)敏感,而TEXT字段不區(qū)分大小寫(xiě)。不用指定BLOB或TEXT的長(zhǎng)度。
TINYBLOB 或 TINYTEXT - BLOB或TEXT列用255個(gè)字符的最大長(zhǎng)度。不指定TINYBLOB或TINYTEXT的長(zhǎng)度。
MEDIUMBLOB or MEDIUMTEXT - BLOB或TEXT列具有16777215字符的最大長(zhǎng)度。不指定MEDIUMBLOB或MEDIUMTEXT的長(zhǎng)度。
LONGBLOB 或 LONGTEXT -? BLOB或TEXT列具有4294967295字符的最大長(zhǎng)度。不指定LONGBLOB或LONGTEXT的長(zhǎng)度。
ENUM - 枚舉,這是一個(gè)奇特的術(shù)語(yǔ)列表。當(dāng)定義一個(gè)ENUM,要?jiǎng)?chuàng)建它的值的列表,這些是必須用于選擇的項(xiàng)(也可以是NULL)。例如,如果想要字段包含“A”或“B”或“C”,那么可以定義為ENUM為 ENUM(“A”,“B”,“C”)也只有這些值(或NULL)才能用來(lái)填充這個(gè)字段。
8、MySQL創(chuàng)建表
表的創(chuàng)建命令需要:
表的名稱(chēng)
字段名稱(chēng)
定義每個(gè)字段(類(lèi)型、長(zhǎng)度等)
語(yǔ)法
下面是通用的SQL語(yǔ)法用來(lái)創(chuàng)建MySQL表:
CREATE TABLE table_name (column_name column_type);
現(xiàn)在,我們將在 test 數(shù)據(jù)庫(kù)中創(chuàng)建以下表。
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 )
);
在這里,一些數(shù)據(jù)項(xiàng)需要解釋?zhuān)?/p>
字段使用NOT NULL屬性,是因?yàn)槲覀儾幌M@個(gè)字段的值為NULL。 因此,如果用戶(hù)將嘗試創(chuàng)建具有NULL值的記錄,那么MySQL會(huì)產(chǎn)生錯(cuò)誤。
字段的AUTO_INCREMENT屬性告訴MySQL自動(dòng)增加id字段下一個(gè)可用編號(hào)。
關(guān)鍵字PRIMARY KEY用于定義此列作為主鍵??梢允褂枚禾?hào)分隔多個(gè)列來(lái)定義主鍵。
通過(guò)命令提示符來(lái)創(chuàng)建表
在mysql>提示符下,創(chuàng)建一個(gè)MySQL表這是很容易的。使用 SQL 命令 CREATE TABLE 來(lái)創(chuàng)建表。
下面是一個(gè)例子,創(chuàng)建一個(gè)表: 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不會(huì)終止命令,直到給一個(gè)分號(hào)(;)表示SQL命令結(jié)束。
查看創(chuàng)建表的結(jié)果:
9、MySQL刪除表
刪除現(xiàn)有MySQL表這是很容易的,但必須非常小心,當(dāng)刪除表后丟失的數(shù)據(jù)將不能恢復(fù)。
語(yǔ)法
這是用來(lái)刪除MySQL表的通用SQL語(yǔ)法:
DROP TABLE table_name ;
從命令行提示符刪除表
這需要只是在 MySQL>提示符下執(zhí)行DROP TABLE SQL命令。
下面是一個(gè)例子,它將刪除表: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>
10、MySQL插入數(shù)據(jù)
想要將數(shù)據(jù)插入到MySQL表,需要使用SQL INSERT INTO命令。 可以通過(guò)用mysql>提示符或通過(guò)使用像PHP腳本將任何數(shù)據(jù)插入到MySQL表。
語(yǔ)法
這里是INSERT INTO命令將數(shù)據(jù)插入到MySQL表的通用SQL語(yǔ)法:
INSERT INTO table_name(field1,field2,...fieldN)VALUES(value1,value2,...valueN);
要插入字符串類(lèi)型數(shù)據(jù),則需要雙或單引號(hào)保留到所有的值,例如:- "value".
這將使用SQL 的INSERT INTO命令將數(shù)據(jù)插入到MySQL表:tutorials_tbl
示例
下面的例子將創(chuàng)建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>
注意: 請(qǐng)注意,所有的箭頭符號(hào)(->)不是SQL命令的一部分; 它表示一個(gè)新行,是由MySQL提示符按下回車(chē)鍵沒(méi)有給出一個(gè)分號(hào),命令自動(dòng)創(chuàng)建在行尾。
在上面的例子中,未提供 tutorial_id 對(duì)應(yīng)的值,因?yàn)樵趧?chuàng)建表時(shí)它會(huì)自動(dòng)創(chuàng)建,這個(gè)字段我們給了AUTO_INCREMENT選項(xiàng)。因此MySQL會(huì)自動(dòng)分配插入ID的值。 這里, NOW() 是MySQL函數(shù),返回當(dāng)前的日期和時(shí)間。
11、MySQL SELECT查詢(xún)
SQL SELECT命令用于從MySQL數(shù)據(jù)庫(kù)獲取數(shù)據(jù)??梢栽贛ySQL>提示符使用這個(gè)命令,以及任何像PHP的腳本和語(yǔ)言等。
語(yǔ)法
下面是通用的SQL的SELECT命令語(yǔ)法,從MySQL表獲取數(shù)據(jù):
SELECT field1,field2,...fieldN table_name1,table_name2...[WHEREClause][OFFSET M][LIMIT N]
可以使用分隔的一個(gè)或多個(gè)逗號(hào)從多個(gè)表,以及使用WHERE子句包括各種條件,但WHERE子句是SELECT命令的可選部分
可以在一個(gè)SELECT命令指定讀取一個(gè)或多個(gè)字段
可以指定星號(hào)(*)代替選擇的字段。在這種情況下,將返回所有字段
可以指定任意的條件在 WHERE 子句后面
可以使用OFFSET指定一個(gè)偏移量,SELECT從那里開(kāi)始返回記錄。默認(rèn)情況下 offset 的值是 0
可以使用LIMIT屬性限制返回的數(shù)量
這將使用SQL SELECT命令從MySQL 表 tutorials_tbl 讀取數(shù)據(jù)
示例
下面的例子將從 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>
12、MySQL WHERE子句
我們已經(jīng)看到使用SQL SELECT命令從MySQL表中獲取數(shù)據(jù)。我們可以用 WHERE子句來(lái)篩選出結(jié)果的條件子句。使用WHERE子句,我們可以指定一個(gè)選擇標(biāo)準(zhǔn),從表中選擇所需的記錄。
語(yǔ)法
下面是SELECT命令使用WHERE子句來(lái)從MySQL表數(shù)據(jù)的通用SQL語(yǔ)法:
SELECT field1,field2,...fieldN table_name1,table_name2...[WHERE condition1[AND[OR]]condition2.....
可以使用逗號(hào)分隔一個(gè)或多個(gè)表,以及WHERE子句包括各種條件,但WHERE子句只是SELECT命令的可選部分
可以指定使用任何條件在WHERE子句中
可以指定一個(gè)以上的條件在使用AND或OR運(yùn)算符中
WHERE子句可以用DELETE 或 UPDATE的SQL命令一起,也可以指定一個(gè)條件使用。
WHERE子句就像是if一個(gè)條件在編程語(yǔ)言中, 此子句是用來(lái)比較給定值的字段值在MySQL表是否可用。如果從外部給定值等于在MySQL表可用字段值,那么它返回該行。
這里是運(yùn)算符的列表,它可以在WHERE子句中使用。
假設(shè)字段A=10,字段B=20,則:
操作符描述示例
=檢查兩個(gè)操作數(shù)的值是否相等,如果是,則條件變?yōu)檎妗?A = B) 不為 true.
!=檢查兩個(gè)操作數(shù)的值是否相等,如果值不相等,則條件變?yōu)檎妗?A != B) 為 true.
>檢查左操作數(shù)的值是否大于右操作數(shù)的值,如果是,則條件為真。(A > B) 不為 true.
<檢查左操作數(shù)的值是否小于右操作數(shù)的值,如果是,則條件為真。(A < B) 為 true.
>=檢查左操作數(shù)的值是否大于或等于右操作數(shù)的值,如果是,則條件為真。(A >= B) 不為 true.
<=檢查左操作數(shù)的值是否小于或等于右操作數(shù)的值,如果是,則條件變?yōu)檎妗?A <= B) 為 true.
當(dāng)想要從一個(gè)表中提取所選行,尤其是當(dāng)使用MySQL聯(lián)接的WHERE子句是非常有用的。 聯(lián)接在另一章討論。
搜索使用主鍵進(jìn)行快速搜索記錄是常見(jiàn)的做法。
如果給定的條件不匹配表任何記錄,那么查詢(xún)將不會(huì)返回任何行。
使用SQL SELECT命令以及WHERE子句,從MySQL表tutorials_tbl選擇獲取數(shù)據(jù)。
示例
下面的例子將從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>
除非執(zhí)行字符串LIKE比較,比較是不區(qū)分大小寫(xiě)??梢允褂肂INARY關(guān)鍵字使搜索區(qū)分大小寫(xiě)如下:
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>
13、MySQL UPDATE查詢(xún)
可能會(huì)有一個(gè)需要,要在一個(gè)MySQL表中的現(xiàn)有數(shù)據(jù)進(jìn)行修改??梢酝ㄟ^(guò)使用SQL UPDATE命令來(lái)執(zhí)行??梢孕薷娜魏蜯ySQL表中任何字段的值。
語(yǔ)法
這里是UPDATE命令修改數(shù)據(jù)到MySQL表的通用SQL語(yǔ)法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
完全可以更新一個(gè)或多個(gè)字段。
可以指定使用任何條件在WHERE子句中。
可以一次更新一個(gè)表中的值。
當(dāng)想更新表中選定行,WHERE子句是非常有用的。
使用SQL UPDATE命令以及WHERE子句來(lái)更新選定數(shù)據(jù)到MySQL表tutorials_tbl。
示例
下面的例子將更新 tutorial_id 為3 的紀(jì)錄中的 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>
14、MySQL DELETE查詢(xún)
如果想從任何MySQL表中刪除紀(jì)錄,那么可以使用SQL命令:DELETE FROM. 可以使用這個(gè)命令在MySQL>提示符,以及PHP等腳本的語(yǔ)言。
語(yǔ)法
這里是DELETE命令從一個(gè)MySQL表中刪除數(shù)據(jù)的通用的SQL語(yǔ)法:
DELETE FROM table_name [WHERE Clause]
如果WHERE子句沒(méi)有指定,則所有MySQL表中的記錄將被刪除。
可以指定使用任何條件在WHERE子句中。
可以一次刪除一個(gè)表中的所有記錄。
當(dāng)要?jiǎng)h除一個(gè)表中選擇特定行,WHERE子句是非常有用的。
使用SQL DELETE命令,在WHERE子句中選定 MySQL 表 tutorials_tbl 的數(shù)據(jù)將被刪除。
示例
下面的例子將刪除 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>
15、MySQL LIKE子句
我們已經(jīng)看到使用SQL SELECT命令從MySQL表中獲取數(shù)據(jù)。也可以使用WHERE子句來(lái)選擇所需的記錄條件子句。
WHERE等于子句號(hào)(=)用來(lái)精確匹配工作,如類(lèi)似 “tutorial_author='yiibai'”。 但也有可能,我們要求過(guò)濾掉所有的結(jié)果,tutorial_author應(yīng)包含的名稱(chēng):"jay"。這可以通過(guò)使用SQL LIKE子句以及WHERE子句來(lái)處理。
如果SQL LIKE子句連同 % 字符使用,那么它會(huì)像在UNIX上的元字符(*),列出了所有的文件或目錄在命令提示符下。
如果沒(méi)有字符%,LIKE子句是非常相似的等號(hào)在WHERE子句中使用的效果。
語(yǔ)法
下面是SELECT命令連同LIKE子句來(lái)從MySQL表獲取數(shù)據(jù)的通用SQL語(yǔ)法:
SELECT field1,field2,...fieldN table_name1,table_name2...WHERE field1 LIKE condition1[AND[OR]]filed2='somevalue'
可以指定使用任何條件在WHERE子句中
可以使用LIKE子句在WHERE子句中
可以使用LIKE子句代替等號(hào)(=)
當(dāng)LIKE連同%符號(hào)使用,那么它就會(huì)像一個(gè)元字符的搜索
可以指定一個(gè)以上的條件使用AND或OR運(yùn)算符
WHERE... LIKE子句可以使用SQL命令的DELETE 或 UPDATE ,也可以指定一個(gè)條件
使用SQL SELECT命令以及WHERE ... LIKE子句從MySQL表tutorials_tbl 選擇獲取數(shù)據(jù)并返回
示例
下面的例子是從 tutorials_tbl 表中獲取作者的名稱(chēng)以 aul 結(jié)尾的所有記錄:
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>
16、MySQL ORDER BY排序結(jié)果
我們已經(jīng)看到使用SQL SELECT命令從MySQL表中獲取數(shù)據(jù)。當(dāng)選擇數(shù)據(jù)行,MySQL服務(wù)器可以自由地返回它們的順序,除非有指示它按照怎樣的結(jié)果進(jìn)行排序。但是排序結(jié)果可以通過(guò)增加一個(gè)ORDER BY子句設(shè)定列名稱(chēng)或要排序的列。
語(yǔ)法
這是使用ORDER BY子句從MySQL表數(shù)據(jù)進(jìn)行排序的SELECT命令的通用SQL語(yǔ)法:
SELECT field1,field2,...fieldN table_name1,table_name2...ORDER BY field1,[field2...][ASC[DESC]]
可以排序返回所列出提供的任何字段的結(jié)果
可以在多個(gè)字段排序結(jié)果
可以使用關(guān)鍵字ASC或DESC來(lái)執(zhí)行升序或降序排序。默認(rèn)情況下,按升序排列
可以使用WHERE ... LIKE子句以通用的方式放置條件
在命令提示符使用ORDER BY子句
使用SQL SELECT命令與ORDER BY子句,從MySQL表tutorials_tbl獲取數(shù)據(jù)。
示例
嘗試下面的例子,它返回的結(jié)果是按升序排列的。
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>
驗(yàn)證所有的作者名稱(chēng)列出來(lái)是按升序排列。
17、MySQL Join聯(lián)接
到目前為止,我們只是從一個(gè)表讀取數(shù)據(jù)。這是相對(duì)簡(jiǎn)單的,但在大多數(shù)現(xiàn)實(shí)中的MySQL使用,需要從多個(gè)表中,在單個(gè)查詢(xún)獲得數(shù)據(jù)。
可以在單個(gè)SQL查詢(xún)中使用多個(gè)表。連接MySQL中的行在兩個(gè)或多個(gè)表到一個(gè)表。
可以使用Join在SELECT,UPDATE和DELETE語(yǔ)句加入MySQL表。我們將看到LEFT JOIN的例子, 這與簡(jiǎn)單的MySQL JOIN有所不同。
假設(shè)我們有兩個(gè)表 tcount_tbl 和 tutorials_tbl,在數(shù)據(jù)庫(kù):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>
現(xiàn)在,我們可以寫(xiě)一個(gè)SQL查詢(xún)來(lái)連接這兩個(gè)表。此查詢(xún)將從表tutorials_tbl和tcount_tbl 選擇所有作者的教程數(shù)量。
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>
18、MySQL NULL值
我們已經(jīng)看到SQL SELECT命令和WHERE子句一起使用,來(lái)從MySQL表中提取數(shù)據(jù),但是,當(dāng)我們?cè)噲D給出一個(gè)條件,比較字段或列值設(shè)置為NULL,它確不能正常工作。
為了處理這種情況,MySQL提供了三大運(yùn)算符
IS NULL: 如果列的值為NULL,運(yùn)算結(jié)果返回 true
IS NOT NULL: 如果列的值不為NULL,運(yùn)算結(jié)果返回 true
<=>: 運(yùn)算符比較值,(不同于=運(yùn)算符)即使兩個(gè)空值它返回 true
涉及NULL的條件是特殊的。不能使用= NULL或!= NULL來(lái)匹配查找列的NULL值。這樣的比較總是失敗,因?yàn)樗遣豢赡芨嬖V它們是否是true。 甚至 NULL = NULL 也是失敗的。
要查找列的值是或不是NULL,使用IS NULL或IS NOT NULL。
在命令提示符,使用NULL值:
假設(shè)在 test 數(shù)據(jù)庫(kù)中的表 tcount_tbl 它包含兩個(gè)列 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,查詢(xún)應(yīng)該這樣寫(xiě):
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)
19、MySQL正則表達(dá)式
在前面我們已經(jīng)看到了MySQL的模式匹配:LIKE ...%. MySQL支持另一種類(lèi)型的模式匹配的操作基于正則表達(dá)式和正則表達(dá)式運(yùn)算符。如果知道PHP或Perl,那么它是非常簡(jiǎn)單的,因?yàn)檫@匹配非常相似于腳本正則表達(dá)式。
以下是模式的表格,其可以連同REGEXP運(yùn)算符使用。
模式什么樣的模式匹配
^開(kāi)始的一個(gè)字符串
$結(jié)束的一個(gè)字符串
.任意單個(gè)字符
[...]方括號(hào)中列出的任何字符
[^...]任何字符方括號(hào)之間不會(huì)被列出
p1|p2|p3交替;匹配的任何模式 p1, p2, 或 p3
*前一個(gè)元素的零個(gè)或多個(gè)實(shí)例
+前面元素的一或多個(gè)實(shí)例
{n}前一個(gè)元素的n個(gè)實(shí)例
{m,n}前一個(gè)元素的 m 到 n 個(gè)實(shí)例
示例
現(xiàn)在根據(jù)上面的表格,可以在不同的設(shè)備類(lèi)型用SQL查詢(xún)來(lái)滿(mǎn)足要求。在這里,列出一些的理解。考慮有一個(gè)表稱(chēng)為 person_tbl,它是有一個(gè) name 字段:
查詢(xún)查找所有以 “st” 開(kāi)頭的名字:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查詢(xún)找到所有以 'ok' 結(jié)尾的名字
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查詢(xún)查找其中包含 'mar' 所有的名字
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查詢(xún)查找以元音 'ok' 結(jié)尾的所有名稱(chēng)
mysql>SELECT name FROM person_tbl WHERE name REGEXP'^[aeiou]|ok$';
20、MySQL事務(wù)
事務(wù)是數(shù)據(jù)庫(kù)處理操作,其中執(zhí)行就好像它是一個(gè)單一的一組有序的工作單元。換言之,事務(wù)將永遠(yuǎn)不會(huì)是完全的,除非在組內(nèi)每個(gè)單獨(dú)的操作是成功的。如果事務(wù)中的任何操作失敗,整個(gè)事務(wù)將失敗。
實(shí)際上,許多SQL查詢(xún)組成到一個(gè)組,將執(zhí)行所有這些一起作為事務(wù)的一部分。
事務(wù)性質(zhì)
事務(wù)具有以下四個(gè)標(biāo)準(zhǔn)屬性,通常由首字母縮寫(xiě)ACID簡(jiǎn)稱(chēng):
原子性: 確保了工作單位中的所有操作都成功完成; 否則,事務(wù)被中止,在失敗時(shí)會(huì)被回滾到事務(wù)操作以前的狀態(tài)。
一致性:可確保數(shù)據(jù)庫(kù)在正確的更改狀態(tài)在一個(gè)成功提交事務(wù)。
隔離: 使事務(wù)相互獨(dú)立地操作。
持久性: 確保了提交事務(wù)的結(jié)果或系統(tǒng)故障情況下仍然存在作用。
在MySQL中,事務(wù)以BEGIN WORK語(yǔ)句開(kāi)始開(kāi)始工作,并使用COMMIT或ROLLBACK語(yǔ)句結(jié)束。SQL命令在開(kāi)始和結(jié)束語(yǔ)句之間構(gòu)成大量事務(wù)。
提交和回滾
這兩個(gè)關(guān)鍵字Commit和Rollback主要用于MySQL的事務(wù)。
當(dāng)一個(gè)成功的事務(wù)完成后,COMMIT命令發(fā)出的變化對(duì)所有涉及的表將生效。
如果發(fā)生故障,ROLLBACK命令發(fā)出后,事務(wù)中引用的每個(gè)表將恢復(fù)到事務(wù)開(kāi)始之前的狀態(tài)。
可以通過(guò)設(shè)置AUTOCOMMIT這個(gè)會(huì)話(huà)變量控制事務(wù)的行為。如果AUTOCOMMIT設(shè)置為1(默認(rèn)值),那么每個(gè)SQL語(yǔ)句(在事務(wù)或不在事務(wù))被認(rèn)為是一個(gè)完整的事務(wù)并提交,在默認(rèn)情況下是在當(dāng)它完成時(shí)。當(dāng)AUTOCOMMIT設(shè)置為0,通過(guò)發(fā)出SET AUTOCOMMIT=0命令, 隨后的一系列語(yǔ)句就像一個(gè)事務(wù),但并沒(méi)有任何活動(dòng)被提交直到一個(gè)明確的發(fā)出 COMMIT 語(yǔ)句。
可以通過(guò)使用PHP 的 mysql_query()函數(shù)執(zhí)行這些SQL命令。
關(guān)于事務(wù)通用示例
此事件序列是獨(dú)立于所使用的編程語(yǔ)言; 邏輯路徑可以是任何編程語(yǔ)言,使用它在創(chuàng)建應(yīng)用程序中創(chuàng)建。
可以通過(guò)使用 mysql_query()函數(shù)執(zhí)行這些PHP SQL命令
開(kāi)始事務(wù)是通過(guò)發(fā)出SQL命令BEGIN WORK
類(lèi)似發(fā)出的一個(gè)或多個(gè)SQL命令 SELECT, INSERT, UPDATE 或 DELETE.
根據(jù)要求,檢查是否有任何錯(cuò)誤
如果有錯(cuò)誤,發(fā)出ROLLBACK命令,否則執(zhí)行COMMIT命令。
在MySQL的事務(wù)安全表類(lèi)型
不能直接使用事務(wù),可以使用但它們沒(méi)有安全保障。如果打算使用事務(wù)在MySQL編程,那么需要使用一個(gè)特殊的方式來(lái)創(chuàng)建表。 有許多類(lèi)型的表其支持事務(wù),但目前最流行的一種是:InnoDB.
支持InnoDB表需要特定的編譯參數(shù),在源代碼編譯MySQL時(shí)。如果MySQL版本不支持InnoDB,得要求互聯(lián)網(wǎng)服務(wù)提供商建立一個(gè)版本的MySQL的InnoDB表類(lèi)型的支持,或 下載并安裝MySQL-Max二進(jìn)制分發(fā)的Windows版本,或者Linux/UNIX開(kāi)發(fā)環(huán)境中工作的表類(lèi)型。
如果你的MySQL安裝支持InnoDB表,簡(jiǎn)直就是一個(gè)TYPE= InnoDB的定義添加到表創(chuàng)建語(yǔ)句后面。例如,下面的代碼創(chuàng)建一個(gè)名為 tcount_tbl 的 InnoDB 類(lèi)型表:
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)
請(qǐng)檢查下面的鏈接了解更多有關(guān):InnoDB
可以使用其它類(lèi)型的表 GEMINI 或 BDB, 但它取決于安裝MySQL時(shí),是否支持這兩種類(lèi)型。
21、MySQL Alter命令
當(dāng)想改變表名,MySQL的ALTER命令非常有用, 在添加或刪除任何表字段到現(xiàn)有列在表中。
讓我們開(kāi)始創(chuàng)建一個(gè)表為 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)
刪除,添加或重新定義列
假設(shè)想要從上面MySQL的表中刪除一個(gè)現(xiàn)有列,那么使用ALTER命令以及DROP子句如下:
mysql> ALTER TABLE testalter_tbl? DROP i;
如果在表中列是唯一的一個(gè),那么DROP將無(wú)法正常工作。
要添加列,使用ADD并指定列定義。下面的語(yǔ)句將存儲(chǔ)到 i 列:testalter_tbl:
mysql> ALTER TABLE testalter_tbl ADD i INT;
發(fā)出這條語(yǔ)句后,testalter將包含當(dāng)?shù)谝淮蝿?chuàng)建表時(shí)的兩列, 但不會(huì)有完全一樣的結(jié)構(gòu)。這是因?yàn)樾碌牧斜惶砑拥奖碇袝r(shí),默認(rèn)排在最后一列。因此,即使 i 列原來(lái)是 mytbl 的第一列,但現(xiàn)在它是最后一列。
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 來(lái)指定新的列應(yīng)放置col_name之后。 試試下面的ALTER TABLE語(yǔ)句,使用 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子句中使用。這意味著,如果你想在表中重新排位現(xiàn)有列,首先必須刪除(DROP )它,然后在新的位置添加(ADD)它。
更改列定義或名稱(chēng)
要改變列的定義,使用MODIFY 或CHANGE 子句以及ALTER命令。 例如, 要改變字段 c 從 CHAR(1) 修改為 CHAR(10), 那么可以這樣做:
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
CHANGE語(yǔ)法可能有點(diǎn)不同。CHANGE關(guān)鍵字后的名稱(chēng)是要修改的列,然后指定新的定義,其中包括新的名稱(chēng)。試試下面的例子:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
如果現(xiàn)在使用CHANGE轉(zhuǎn)換i列從BIGINT為INT,但不改變列名,該語(yǔ)句執(zhí)行預(yù)期:
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
ALTER TABLE影響Null和缺省值屬性
當(dāng)使用 MODIFY 或 CHANGE修改列,還可以指定該列是否能為NULL值以及它的默認(rèn)值。事實(shí)上,如果你不這樣做,MySQL也會(huì)自動(dòng)分配這些屬性值。
下面是一個(gè)例子,這里 NOT NULL列將使用100作為默認(rèn)值。
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
如果不使用上面的命令,那么MySQL將填補(bǔ)使用NULL 來(lái)填充所有列值。
更改列的默認(rèn)值
可以使用ALTER命令更改任何列的默認(rèn)值。嘗試下面的例子。
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)
從任何一列刪除默認(rèn)的約束,可以使用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)
更改表類(lèi)型
可以通過(guò)使用ALTER命令以及TYPE子句修改表的類(lèi)型。試試下面的例子,將 testalter_tbl 的類(lèi)型更改為MyISAM 表類(lèi)型。
若想要知道一個(gè)表的當(dāng)前類(lèi)型,那么可使用 SHOW TABLE STATUS 語(yǔ)句。
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)