mysql

什么是數(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容