第1章 初識(shí)MySQL
1.1 數(shù)據(jù)庫(kù)基礎(chǔ)
1.1.1 什么是數(shù)據(jù)庫(kù)
1.1.2 表
1.1.3 數(shù)據(jù)類型
1.1.4 主鍵
1.2 數(shù)據(jù)庫(kù)技術(shù)構(gòu)成.
1.2.1 數(shù)據(jù)庫(kù)系統(tǒng)
1.2.2 SQL 語(yǔ)言
1.2.3數(shù)據(jù)庫(kù)訪問(wèn)接口
1.3 什么是 MySQL
1-3.1 客戶機(jī)-服務(wù)器軟件
1.3.2 MySQL
1.3.3 MySQL 的優(yōu)勢(shì)
1.3.4 MySQL 5.7 的新功能
1.4 MySQL工具
1.4.1 MySQL命令行實(shí)用程序
1.4.2 MySQL Workbench
1.5 如何學(xué)習(xí)MySQL
第2章 MySQL的安裝與配置
第3章 數(shù)據(jù)庫(kù)的基本操作
3.1 創(chuàng)建數(shù)據(jù)庫(kù)
3.2 刪除數(shù)據(jù)庫(kù)
3.3 數(shù)據(jù)庫(kù)存儲(chǔ)引擎
3.3.1 MySQL存儲(chǔ)引擎簡(jiǎn)介
3.3.2 InnoDB存儲(chǔ)引擎
3.3.3 MylSAM存儲(chǔ)引擎
3.3.4 MEMORY存儲(chǔ)引擎
3.3.5存儲(chǔ)引擎的選擇
3.4 綜合案例——數(shù)據(jù)庫(kù)的創(chuàng)建和刪除
3.5 專家解惑
3.6 經(jīng)典習(xí)題
第4章 數(shù)據(jù)表的基本操作
4.1創(chuàng)建數(shù)據(jù)表
4.1.1 創(chuàng)建表的語(yǔ)法形式
4.1.2 使用主鍵約束
4.1.3 使用外鍵約束
4.1.4 使用非空約束
4.1.5 使用唯一性約束
4.1.6 使用默認(rèn)約束
4.1.7 設(shè)置表的屬性值自動(dòng)增加
4.2 查看數(shù)據(jù)表結(jié)構(gòu)
4.2.1 查看表基本結(jié)構(gòu)語(yǔ)句DESCRIBE
4.2.2 查看表詳細(xì)結(jié)構(gòu)語(yǔ)句SHOW CREATE TABLE
4.3 修改數(shù)據(jù)表
4.3.1 修改表名
4.3.2 修改字段的數(shù)據(jù)類型
4.3.3 修改字段名
4.3.4 添加字段
4.3.5 刪除字段
4.3.6 修改字段的排列位置
4.3.7 更改表的存儲(chǔ)引擎
4.3.8 刪除表的外鍵約束
4.4 刪除數(shù)據(jù)表
4.4.1 刪除沒有被關(guān)聯(lián)的表
4.4.2 刪除被其他表關(guān)聯(lián)的主表
4.5 綜合案例——數(shù)據(jù)表的基本操作
4.6 專家解惑
4.7 經(jīng)典習(xí)題
第5章 數(shù)據(jù)類型和運(yùn)算符
5.1 MySQL數(shù)據(jù)類型介紹
5.1.1 整數(shù)類型
5.1.2 浮點(diǎn)數(shù)類型和定點(diǎn)數(shù)類型
5.1.3 日期與時(shí)間類型
5.1.4 文本字符串類型
5.1.5 二進(jìn)制字符串類型
5.2 如何選擇數(shù)據(jù)類型
5.3 常見運(yùn)算符介紹
5.3.1 運(yùn)算符概述
5.3.2 算術(shù)運(yùn)算符
5.3.3 比較運(yùn)算符
5.3.4 邏輯運(yùn)算符
5.3.5 位運(yùn)算符
5.3.6 運(yùn)算符的優(yōu)先級(jí)
5.4 綜合案例——運(yùn)算符的使用
5.5 專家解惑
5.6 經(jīng)典習(xí)題
第1章 初識(shí)MySQL
1.1 數(shù)據(jù)庫(kù)基礎(chǔ)
? 數(shù)據(jù)庫(kù)由一批數(shù)據(jù)構(gòu)成有序的集合,這些數(shù)據(jù)被存放在結(jié)構(gòu)化的數(shù)據(jù)表里.數(shù)據(jù)表之間相互關(guān)聯(lián),反映了客觀事物間的本質(zhì)聯(lián)系.數(shù)據(jù)庫(kù)系統(tǒng)提供對(duì)數(shù)據(jù)的安全控制和完整性控制.本節(jié)將介紹數(shù)據(jù)庫(kù)中的一些基本概念,包括:數(shù)據(jù)庫(kù)的定義、數(shù)據(jù)表的定義和數(shù)據(jù)類型等.
1.1.1什么是數(shù)據(jù)庫(kù)
? 數(shù)據(jù)庫(kù)的概念誕生于60年前,隨著信息技術(shù)和市場(chǎng)的快速發(fā)展,數(shù)據(jù)庫(kù)技術(shù)層出不窮,隨著應(yīng)用的拓展和深入,數(shù)據(jù)庫(kù)的數(shù)量和規(guī)模越來(lái)越大,其誕生和發(fā)展給計(jì)算機(jī)信息管理帶來(lái)了一場(chǎng)巨大的革命.
數(shù)據(jù)庫(kù)的發(fā)展大致劃分為如下幾個(gè)階段:人工管理階段、文件系統(tǒng)階段、數(shù)據(jù)庫(kù)系統(tǒng)階段、高級(jí)數(shù)據(jù)庫(kù)階段.其種類大概有3種:層次式數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)式數(shù)據(jù)庫(kù)和關(guān)系式數(shù)據(jù)庫(kù).不同種類的數(shù)據(jù)庫(kù)按不同的數(shù)據(jù)結(jié)構(gòu)來(lái)聯(lián)系和組織.
? 對(duì)于數(shù)據(jù)庫(kù)的概念,沒有一個(gè)完全固定的定義,隨著數(shù)據(jù)庫(kù)歷史的發(fā)展,定義的內(nèi)容也有很大的差異,其中一種比較普遍的觀點(diǎn)認(rèn)為,數(shù)據(jù)庫(kù)(DataBase,DB)是一個(gè)長(zhǎng)期存儲(chǔ)在計(jì)算機(jī)內(nèi)的、有組織的、有共享的、統(tǒng)一管理的數(shù)據(jù)集合.它是一個(gè)按數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)和管理數(shù)據(jù)的計(jì)算機(jī)軟件系統(tǒng),即數(shù)據(jù)庫(kù)包含兩層含義:保管數(shù)據(jù)的"倉(cāng)庫(kù)",以及數(shù)據(jù)管理的方法和技術(shù).
? 數(shù)據(jù)庫(kù)的特點(diǎn)包括:實(shí)現(xiàn)數(shù)據(jù)共享,減少數(shù)據(jù)冗余;采用特定的數(shù)據(jù)類型;具有較高的數(shù)據(jù)獨(dú)立性;具有統(tǒng)一的數(shù)據(jù)控制功能.
1.1.2 表
? 在關(guān)系數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)表是一系列二維數(shù)組的集合,用來(lái)存儲(chǔ)數(shù)據(jù)和操作數(shù)據(jù)的邏輯結(jié)構(gòu).它由縱向的列和橫向的行組成,行被稱為記錄,是組織數(shù)據(jù)的單位;列被稱為字段,每一列表示記錄的一個(gè)屬性,都有相應(yīng)的描述信息,如數(shù)據(jù)類型、數(shù)據(jù)寬度等.
1.1.3 數(shù)據(jù)類型
? 數(shù)據(jù)類型決定了數(shù)據(jù)在計(jì)算機(jī)中的存儲(chǔ)格式,代表不同的信息類型.常用的數(shù)據(jù)類型有:整數(shù)數(shù)據(jù)類型、浮點(diǎn)數(shù)數(shù)據(jù)類型、精確小數(shù)類型、二進(jìn)制數(shù)據(jù)類型、日期/時(shí)間數(shù)據(jù)類型、字符串?dāng)?shù)據(jù)類型.
1.1.4 主鍵
? 主鍵(Primary Key)又稱主碼,用于唯一地標(biāo)識(shí)表中的每一條記錄.可以定義表中的一列或多列為主鍵,主鍵列上不能有兩行相同的值,也不能為空值.
1.2數(shù)據(jù)庫(kù)技術(shù)構(gòu)成
? 數(shù)據(jù)庫(kù)系統(tǒng)由硬件部分和軟件部分共同構(gòu)成,硬件主要用于存儲(chǔ)數(shù)據(jù)庫(kù)中的數(shù)據(jù),包括計(jì)算機(jī)、存儲(chǔ)設(shè)備等.軟件部分則主要包括DBMS、支持DBMS運(yùn)行的操作系統(tǒng),以及支持多種語(yǔ)言進(jìn)行應(yīng)用開發(fā)的訪問(wèn)技術(shù)等.本節(jié)將介紹數(shù)據(jù)庫(kù)的技術(shù)構(gòu)成.
1.2.1數(shù)據(jù)庫(kù)系統(tǒng)
數(shù)據(jù)庫(kù)系統(tǒng)有3個(gè)主要的組成部分.
- 數(shù)據(jù)庫(kù):用于存儲(chǔ)數(shù)據(jù)的地方.
- 數(shù)據(jù)庫(kù)管理系統(tǒng):用于管理數(shù)據(jù)庫(kù)的軟件.
- 數(shù)據(jù)庫(kù)應(yīng)用程序:為了提高數(shù)據(jù)庫(kù)系統(tǒng)的處理能力所使用的管理數(shù)據(jù)庫(kù)的軟件補(bǔ)充.
? 數(shù)據(jù)庫(kù)提供了一個(gè)存儲(chǔ)空間用以存儲(chǔ)各種數(shù)據(jù),可以將數(shù)據(jù)庫(kù)視為一個(gè)存儲(chǔ)數(shù)據(jù)的容器.一個(gè)數(shù)據(jù)庫(kù)可能包含許多文件,一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中通常包含許多數(shù)據(jù)庫(kù).
? 數(shù)據(jù)庫(kù)管理系統(tǒng)(DataBase Management System,DBMS)是用戶創(chuàng)建、管理和維護(hù)數(shù)據(jù)庫(kù)時(shí)所使用的軟件,位于用戶與操作系統(tǒng)之間,對(duì)數(shù)據(jù)庫(kù)進(jìn)行統(tǒng)一管理.DBMS能定義數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),提供數(shù)據(jù)的操作機(jī)制,維護(hù)數(shù)據(jù)庫(kù)的安全性、完整性和可靠性.
? 雖然已經(jīng)有了DBMS,但是在很多情況下,DBMS無(wú)法滿足對(duì)數(shù)據(jù)管理的要求.數(shù)據(jù)庫(kù)應(yīng)用程序(DataBase Application)的使用可以滿足對(duì)數(shù)據(jù)管理的更高要求,還可以使數(shù)據(jù)管理過(guò)程更加直觀和友好.數(shù)據(jù)庫(kù)應(yīng)用程序負(fù)責(zé)與DBMS進(jìn)行通信、訪問(wèn)和管理DBMS中存儲(chǔ)的數(shù)據(jù),允許用戶插入、修改、刪除DB中的數(shù)據(jù).
1.2.2 SQL語(yǔ)言
? 對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢和修改操作的語(yǔ)言叫做SQL.SQL的含義是結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language).SQL有許多不同的類型,有3個(gè)主要的標(biāo)準(zhǔn):ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)機(jī)構(gòu))SQL,對(duì) ANSI SQL修改后在1992年采納的標(biāo)準(zhǔn),稱為SQL-92或SQL2.最近的SQL-99標(biāo)準(zhǔn),從SQL2擴(kuò)充而來(lái)并增加了對(duì)象關(guān)系特征和許多其他新功能.其次,各大數(shù)據(jù)庫(kù)廠商提供不同版本的SQL,這些版本的SQL不但能包括原始的ANSI標(biāo)準(zhǔn),而且在很大程度上支持SQL-92標(biāo)準(zhǔn).
SQL包含以下4個(gè)部分:
-(1)數(shù)據(jù)定義語(yǔ)言(DDL):DROP、CREATE ALTER等語(yǔ)句
-(2)數(shù)據(jù)操作語(yǔ)言(DML):INSERT UPDATE(修改)、DELETE(刪除)語(yǔ)句.
-(3)數(shù)據(jù)查詢語(yǔ)言(DQL):SELECT語(yǔ)句.
-(4)數(shù)據(jù)控制語(yǔ)言(DCL):GRANT REVOKE、COMMIT、ROLLBACK等語(yǔ)句.
1.2.3 數(shù)據(jù)庫(kù)訪問(wèn)接口
? 不同的程序設(shè)計(jì)語(yǔ)言會(huì)有各自不同的數(shù)據(jù)庫(kù)訪問(wèn)接口,程序語(yǔ)言通過(guò)這些接口,執(zhí)行SQL語(yǔ)句,進(jìn)行數(shù)據(jù)庫(kù)管理.主要的數(shù)據(jù)庫(kù)訪問(wèn)接口有:
1.ODBC
? Open Database Connectivity(ODBC,開放數(shù)據(jù)庫(kù)互連)技術(shù)為訪問(wèn)不同的SQL數(shù)據(jù)庫(kù)提供了一個(gè)共同的接口.ODBC使用SQL作為訪問(wèn)數(shù)據(jù)的標(biāo)準(zhǔn).這一接口提供了最大限度的互操作性:一個(gè)應(yīng)用程序可以通過(guò)共同的一組代碼訪問(wèn)不同的SQL數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS).
? 一個(gè)基于ODBC的應(yīng)用程序?qū)?shù)據(jù)庫(kù)的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數(shù)據(jù)庫(kù)操作由對(duì)應(yīng)的DBMS的ODBC驅(qū)動(dòng)程序完成.也就是說(shuō),不論是Access、MySQL還是Oracle數(shù)據(jù)庫(kù),均可用ODBCAPI進(jìn)行訪問(wèn).由此可見,ODBC的最大優(yōu)點(diǎn)是能以統(tǒng)一的方式處理所有的數(shù)據(jù)庫(kù).
2.JDBC
? Java Data Base Connectivity(JDBC,Java 數(shù)據(jù)庫(kù)連接)用于Java應(yīng)用程序連接數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)方法,是一種用于執(zhí)行SOL語(yǔ)句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫的類和接口組成.
3.ADO.NET
? ADO.NET是微軟在.NET框架下開發(fā)設(shè)計(jì)的一組用于和數(shù)據(jù)源進(jìn)行交互的面向?qū)ο箢悗?kù).ADO.NET提供了對(duì)關(guān)系數(shù)據(jù)、XML和應(yīng)用程序數(shù)據(jù)的訪問(wèn),允許和不同類型的數(shù)據(jù)源以及數(shù)據(jù)庫(kù)進(jìn)行交互.
4.PDO
? PDO(PHP Data Object)為PHP訪問(wèn)數(shù)據(jù)庫(kù)定義了一個(gè)輕量級(jí)的、一致性的接口,它提供了一個(gè)數(shù)據(jù)訪問(wèn)抽象層,這樣,無(wú)論使用什么數(shù)據(jù)庫(kù),都可以通過(guò)一致的函數(shù)執(zhí)行查詢和獲取數(shù)據(jù).PDO是PHP5新加入的一個(gè)重大功能.
5.總結(jié)
? 針對(duì)不同的程序語(yǔ)言,MySQL提供了不同數(shù)據(jù)庫(kù)的訪問(wèn)連接驅(qū)動(dòng),讀者可以在下載頁(yè)面(http:/dev.MySQL.com/downloads/)下載相關(guān)驅(qū)動(dòng).
1.3 什么是MySQL
? MySQL是一個(gè)小型關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),與其他大型數(shù)據(jù)庫(kù)管理系統(tǒng)(例如Oracle、DB2、SQL Server等)相比,MySQL規(guī)模小、功能有限,但是它體積小、速度快、成本低,且它提供的功能對(duì)稍微復(fù)雜的應(yīng)用來(lái)說(shuō)已經(jīng)夠用,這些特性使得MySQL成為世界上最受歡迎的開放源代碼數(shù)據(jù)庫(kù).本節(jié)將介紹MySQL的特點(diǎn).
1.3.1客戶機(jī)-服務(wù)器軟件
? 主從式架構(gòu)(Client-server model)或客戶端-服務(wù)器(Client/Server)結(jié)構(gòu)簡(jiǎn)稱C/S結(jié)構(gòu),是一種網(wǎng)絡(luò)架構(gòu),通常在該網(wǎng)絡(luò)架構(gòu)下軟件分為客戶端(Client)和服務(wù)器(Server).
? 服務(wù)器是整個(gè)應(yīng)用系統(tǒng)資源的存儲(chǔ)與管理中心,多個(gè)客戶端則各自處理相應(yīng)的功能,共同實(shí)現(xiàn)完整的應(yīng)用.在客戶/服務(wù)器結(jié)構(gòu)中,客戶端用戶的請(qǐng)求被傳送到數(shù)據(jù)庫(kù)服務(wù)器,數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行處理后,將結(jié)果返回給用戶,從而減少了網(wǎng)絡(luò)數(shù)據(jù)傳輸量.
? 用戶使用應(yīng)用程序時(shí),首先啟動(dòng)客戶端,通過(guò)有關(guān)命令告知服務(wù)器進(jìn)行連接以完成各種操作,而服務(wù)器則按照此請(qǐng)示提供相應(yīng)的服務(wù).每一個(gè)客戶端軟件的實(shí)例都可以向一個(gè)服務(wù)器或應(yīng)用程序服務(wù)器發(fā)出請(qǐng)求.
? 這種系統(tǒng)的特點(diǎn)就是,客戶端和服務(wù)器程序不在同一臺(tái)計(jì)算機(jī)上運(yùn)行,這些客戶端和服務(wù)器程序通常歸屬不同的計(jì)算機(jī).
? 主從式架構(gòu)通過(guò)不同的途徑應(yīng)用于很多不同類型的應(yīng)用程序,比如,現(xiàn)在人們最熟悉的在因特網(wǎng)上使用的網(wǎng)頁(yè).例如,當(dāng)顧客想要在當(dāng)當(dāng)網(wǎng)站上買書的時(shí)候,電腦和網(wǎng)頁(yè)瀏覽器就被當(dāng)作一個(gè)客戶端,同時(shí),組成當(dāng)當(dāng)網(wǎng)的電腦、數(shù)據(jù)庫(kù)和應(yīng)用程序就被當(dāng)作服務(wù)器.當(dāng)顧客的網(wǎng)頁(yè)瀏覽器向當(dāng)當(dāng)網(wǎng)請(qǐng)求搜尋數(shù)據(jù)庫(kù)相關(guān)的圖書時(shí),當(dāng)當(dāng)網(wǎng)服務(wù)器從當(dāng)當(dāng)網(wǎng)的數(shù)據(jù)庫(kù)中找出所有該類型的圖書信息,結(jié)合成一個(gè)網(wǎng)頁(yè),再發(fā)送回顧客的瀏覽器.服務(wù)器端一般使用高性能的計(jì)算機(jī),并配合使用不同類型的數(shù)據(jù)庫(kù),比如Oracle、Sybase或者是MySQL等;客戶端需要安裝專門的軟件,比如專門開發(fā)的客戶端工具瀏覽器等.
1.3.2MySQL版本
針對(duì)不同用戶,MySQL分為兩個(gè)不同的版本:
- MySQL Community Server(社區(qū)版):該版本完全免費(fèi),但是官方不提供技術(shù)支持.
- MySQL Enterprise Server(企業(yè)版服務(wù)器):它能夠以很高性價(jià)比為企業(yè)提供數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用,支持ACID事物處理,提供完整的提交、回滾、崩潰恢復(fù)和行級(jí)鎖定功能.但是該版本需付費(fèi)使用,官方提供電話技術(shù)支持.
MySQL的命名機(jī)制由3個(gè)數(shù)字和1個(gè)后綴組成,例如:MySQL-5.7.10
-(1)第1個(gè)數(shù)字(5)是主版本號(hào),描述了文件格式,所有版本5的發(fā)行版都有相同的文
-(2)第2個(gè)數(shù)字(7)是發(fā)行級(jí)別,主版本號(hào)和發(fā)行級(jí)別組合在一起便構(gòu)成了發(fā)行
-(3)第3個(gè)數(shù)字(10)是在此發(fā)行系列的版本號(hào),隨每次新分發(fā)版本遞增.通常選擇已
在 MySQL開發(fā)過(guò)程中,同時(shí)存在多個(gè)發(fā)布系列,每個(gè)發(fā)布處在成熟度的不同階段.
1.3.3 MySQL的優(yōu)勢(shì)
MySQL的主要優(yōu)勢(shì)如下:
- 速度:運(yùn)行速度快.
- 價(jià)格:MySQL對(duì)多數(shù)個(gè)人來(lái)說(shuō)是免費(fèi)的.
- 容易使用:與其他大型數(shù)據(jù)庫(kù)的設(shè)置和管理相比,其復(fù)雜程度較低,易于學(xué)習(xí).
- 可移植性:能夠工作在眾多不同的系統(tǒng)平臺(tái)上,例如:Windows、Linux、Unix、Mac OS等.
- 豐富的接口:提供了用于C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等語(yǔ)言的API.
- 支持查詢語(yǔ)言:MySQL可以利用標(biāo)準(zhǔn)SQL語(yǔ)法和支持ODBC(開放式數(shù)據(jù)庫(kù)連接)的應(yīng)用程序.
- 安全性和連接性:十分靈活和安全的權(quán)限和密碼系統(tǒng),允許基于主機(jī)的驗(yàn)證.連接到服務(wù)器時(shí),所有的密碼傳輸均采用加密形式,從而保證了密碼安全.并且由于MySQL是網(wǎng)絡(luò)化的,因此可以在因特網(wǎng)上的任何地方訪問(wèn),提高數(shù)據(jù)共享的效率.
1.3.4MySQL5.7的新功能
和MySQL5.6相比,MySQL5.7的新功能主要包括以下幾個(gè)方面.
- 1.支持JSON
JSON(Java Script Object Notation的縮寫)是一種存儲(chǔ)信息的格式,可以很好地替代XML.從MySQL5.7.8版本開始,MySQL將支持JSON,而在此版本之前,只能通過(guò)strings之類的通用形式來(lái)存儲(chǔ)JSON文件,這樣做的缺陷很明顯,就是必須要自行確認(rèn)和解析數(shù)據(jù)、解決更新中的困難、在執(zhí)行插入操作時(shí)忍受較慢的速度. - 2.性能和可擴(kuò)展性
改進(jìn)InnoDB的可擴(kuò)展性和臨時(shí)表的性能,從而實(shí)現(xiàn)更快的網(wǎng)絡(luò)和大數(shù)據(jù)加載等操作. - 3.改進(jìn)復(fù)制以提高可用性的性能
改進(jìn)復(fù)制包括多源復(fù)制、多從線程增強(qiáng)、在線GTIDs和增強(qiáng)的半同步復(fù)制. - 4.性能模式提供更好的視角
增加了許多新的監(jiān)控功能,以減少空間和過(guò)載,使用新的SYS模式顯著提高易用性. - 5.安全
以安全第一為宗旨,提供了很多新的功能,從而保證數(shù)據(jù)庫(kù)的安全. - 6.優(yōu)化
重寫了大部分解析器、優(yōu)化器和成本模型,這提高了可維護(hù)性、可擴(kuò)展性和性能. - 7.GIS
MySQL5.7全新的功能,包括InnoDB空間索引,使用Boost.Geometry,同時(shí)提高完整性和標(biāo)準(zhǔn)符合性.
1.4 MySQL 工具
? MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)提供了許多命令行工具,這些工具可以用來(lái)管理MySQ務(wù)器、對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)控制、管理MySQL用戶以及數(shù)據(jù)庫(kù)備份和恢復(fù)工具等.而且MySQL提供了圖形化的管理工具,這使得對(duì)數(shù)據(jù)庫(kù)的操作更加簡(jiǎn)單.本節(jié)將為讀者介紹這些工具的作用.
1.4.1 MySQL命令行實(shí)用程序
MySQL服務(wù)器端實(shí)用工具程序如下:
- mysqld:SQL后臺(tái)程序(即MySQL服務(wù)器進(jìn)程).該程序必須運(yùn)行之后,客戶端才能通過(guò)連接服務(wù)器來(lái)訪問(wèn)數(shù)據(jù)庫(kù).
- mysqld safe:服務(wù)器啟動(dòng)腳本.在UNIX和NetWare 中推薦使用mysqld safe來(lái)啟動(dòng)mysqld 服務(wù)器.mysqld_safe增加了一些安全特性,例如當(dāng)出現(xiàn)錯(cuò)誤時(shí)重啟服務(wù)器并向錯(cuò)誤日志文件寫入運(yùn)行時(shí)間信息.
- mysql.server:服務(wù)器啟動(dòng)腳本.在UNIX中的MySQL分發(fā)版包括mysql.server腳本.該腳本用于使用包含為特定級(jí)別的、運(yùn)行啟動(dòng)服務(wù)的腳本的、運(yùn)行目錄的系統(tǒng).它調(diào)用mysqld_safe來(lái)啟動(dòng)MySQL服務(wù)器.
- mysql_multi:服務(wù)器啟動(dòng)腳本,可以啟動(dòng)或停止系統(tǒng)上安裝的多個(gè)服務(wù)器.
- myisamchk:用來(lái)描述、檢查、優(yōu)化和維護(hù)MyISAM表的實(shí)用工具.
- mysqlbug:MySQL缺陷報(bào)告腳本.它可以用來(lái)向MySQL郵件系統(tǒng)發(fā)送缺陷報(bào)告.
- mysql_install_db:該腳本用默認(rèn)權(quán)限創(chuàng)建MySQL授權(quán)表.通常只是在系統(tǒng)上首次安裝MySQL時(shí)執(zhí)行一次.
MySQL客戶端實(shí)用工具程序如下:
- myisampack MyISAM表以產(chǎn)生更小的只讀表的一個(gè)工具.
- mysql:交互式輸入SQL語(yǔ)句或從文件以批處理模式執(zhí)行它們的命令行工具.
- mysqlaccess:檢查訪問(wèn)主機(jī)名、用戶名和數(shù)據(jù)庫(kù)組合的權(quán)限的腳本.
- MySQLadmin:執(zhí)行管理操作的客戶程序,例如創(chuàng)建或刪除數(shù)據(jù)庫(kù),重載授權(quán)表, 將表刷新到硬盤上,以及重新打開日志文件.MySQLadmin還可以用來(lái)檢索版本、進(jìn)程,以及服務(wù)器的狀態(tài)信息.
- mysqlbinlog:從二進(jìn)制日志讀取語(yǔ)句的工具.在二進(jìn)制日志文件中包含執(zhí)行過(guò)的語(yǔ)句,可用來(lái)幫助系統(tǒng)從崩潰中恢復(fù).
- mysqlcheck:檢查、修復(fù)、分析以及優(yōu)化表的表維護(hù)客戶程序.
- mysqldump MySQL數(shù)據(jù)庫(kù)轉(zhuǎn)儲(chǔ)到一個(gè)文件(例如SQL語(yǔ)句或tab分隔符文本的客戶程序).
- mysqlhotcopy:MyISAM或ISAM表的工具.
- mysqlimport:使用LOAD DATA INFILE將文本文件導(dǎo)入相關(guān)表的客戶程序.
- mysqlshow:顯示數(shù)據(jù)庫(kù)、表、列以及索引相關(guān)信息的客戶程序.
- perror:MySQL錯(cuò)誤代碼含義的工具.
1.4.2 MySQL workbench
1.5 如何學(xué)習(xí)MySQL
- 培養(yǎng)興趣
- 夯實(shí)基礎(chǔ)
- 及時(shí)學(xué)習(xí)新知識(shí)
- 多實(shí)踐操作
第2章 MySQL的安裝與配置
第3章 數(shù)據(jù)庫(kù)的基本操作
3.1 創(chuàng)建數(shù)據(jù)庫(kù)
show databases:查看當(dāng)前所有的數(shù)據(jù)庫(kù)
create database name:創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
show create database name:查看創(chuàng)建數(shù)據(jù)庫(kù)的定義
3.2 刪除數(shù)據(jù)庫(kù)
drop database name:刪除數(shù)據(jù)庫(kù),不存在則報(bào)錯(cuò)
注意點(diǎn):數(shù)據(jù)庫(kù)刪除之后所有的數(shù)據(jù)和表也會(huì)被刪除,且不能被恢復(fù).
3.3 數(shù)據(jù)庫(kù)存儲(chǔ)引擎
數(shù)據(jù)庫(kù)存儲(chǔ)引擎是數(shù)據(jù)庫(kù)底層軟件組件,數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)操作.不同的存儲(chǔ)引擎提供不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平等功能,使用不同的存儲(chǔ)引擎,還可以獲得特定的功能.現(xiàn)在許多不同的數(shù)據(jù)庫(kù)管理系統(tǒng)都支持多種不同的數(shù)據(jù)引擎. MySQL的核心就是存儲(chǔ)引擎.
3.3.1 MySQL存儲(chǔ)引擎簡(jiǎn)介
MySQL提供了多個(gè)不同的存儲(chǔ)引擎,包括處理事務(wù)安全表的引擎和處理非事務(wù)安全表的引擎.在MySL中,不需要在整個(gè)服務(wù)器中使用同一種存儲(chǔ)引擎,針對(duì)具體的要求,可以對(duì)每一個(gè)表使用不同的存儲(chǔ)引擎.MySQL5.7支持的存儲(chǔ)引擎有:InnoDB, MyISAM, Memory, Merge, Archive, Federated,CSV, BLACKHOLE等.可以使用 SHOW ENGINES語(yǔ)句查看系統(tǒng)所支持的引擎類型,結(jié)果如下.
| Engine | Support | Comment | Transactions | XA | Savepoints |
|--------------------|---------+----------------------------------------------------------------|--------------|------|------------|
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine(anything you write to it disappears)| NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
3.3.2 InnoDB存儲(chǔ)引擎
InnoDB是事務(wù)型數(shù)據(jù)庫(kù)的首選引擎,支持事務(wù)安全表(ACID),支持行鎖定和外鍵.MySQL5.5.5之后, InnoDB作為默認(rèn)存儲(chǔ)引擎, InnoDB主要特性有:
- InnoDB給 MySQL提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)存儲(chǔ)引擎.InnoDB鎖定在行級(jí)并且也在 SELECT語(yǔ)句中提供一個(gè)類似 Oracle的非鎖定讀.這些功能增加了多用戶部署和性能.在SQL查詢中,可以自由地將 InnoDB類型的表與其他 MySQL的表的類型混合起來(lái),甚至在同一個(gè)查詢中也可以混合.
- InnoDB是為處理巨大數(shù)據(jù)量的最大性能設(shè)計(jì).它的CPU效率可能是任何其他基于磁盤的關(guān)系數(shù)據(jù)庫(kù)引擎所不能匹敵的.
- InnoDB存儲(chǔ)引擎完全與 MySQL服務(wù)器整合, InnoDB存儲(chǔ)引擎為在主內(nèi)存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池. InnoDB將它的表和索引存在一個(gè)邏輯表空間中,表空間可以包含數(shù)個(gè)文件(或原始磁盤分區(qū)).這與MyISAM表不同,比如在 MyISAM表中每個(gè)表被存在分離的文件中.InnoDB表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統(tǒng).
- InnoDB支持外鍵完整性約束( FOREIGN KEY).存儲(chǔ)表中的數(shù)據(jù)時(shí),每張表的存儲(chǔ)都按主鍵順序存放,如果沒有顯示在表定義時(shí)指定主鍵,InnoDB會(huì)為每一行生成一個(gè)6B的 ROWID,并以此作為主鍵.
- InnoDB被用在眾多需要高性能的大型數(shù)據(jù)庫(kù)站點(diǎn)上,InnoDB不創(chuàng)建目錄,使用 InnoDB時(shí), MySQL將在 MySQL數(shù)據(jù)目錄下創(chuàng)建一個(gè)名為ibdatal的10MB大小的自動(dòng)擴(kuò)展數(shù)據(jù)文件,以及兩個(gè)名為ib_logfile0和ib_logfile的5MB大小的日志文件.
3.3.3 MyISAM存儲(chǔ)引擎
MyISAM基于ISAM的存儲(chǔ)引擎,并對(duì)其進(jìn)行擴(kuò)展.它是在Web、數(shù)據(jù)存儲(chǔ)和其他應(yīng)用環(huán)境下最常使用的存儲(chǔ)引擎之一. MyISAM擁有較高的插入、查詢速度,但不支持事務(wù).在MySQL5.5.5之前的版本中, MyISAM是默認(rèn)存儲(chǔ)引擎. MyISAM主要特性有:
- 大文件(達(dá)63位文件長(zhǎng)度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持.
- 當(dāng)把刪除、更新及插入操作混合使用的時(shí)候,動(dòng)態(tài)尺寸的行產(chǎn)生更少碎片.這要通過(guò)合并相鄰被刪除的塊,以及若下一個(gè)塊被刪除,就擴(kuò)展到下一塊來(lái)自動(dòng)完成.
- 每個(gè) MyISAM表最大索引數(shù)是64,這可以通過(guò)重新編譯來(lái)改變.每個(gè)索引最大的列數(shù)是16個(gè).
- 最大的鍵長(zhǎng)度是1000B,這也可以通過(guò)編譯來(lái)改變.對(duì)于鍵長(zhǎng)度超過(guò)250B的情況,一個(gè)超過(guò)1024B的鍵將被用上.
- BLOB和TEXT列可以被索引.
- NULL值被允許在索引的列中.這個(gè)值占每個(gè)鍵的0~1個(gè)字節(jié).
- 所有數(shù)字鍵值以高字節(jié)優(yōu)先被存儲(chǔ)以允許一個(gè)更高的索引壓縮.
- 每表一個(gè) AUTO INCREMENT列的內(nèi)部處理. MyISAM為 INSERT和 UPDATE操作自動(dòng)更新這一列.這使得 AUTO INCREMENT列更快(至少10%).在序列頂?shù)闹当粍h除 之后就不能再利用.
- 可以把數(shù)據(jù)文件和索引文件放在不同目錄.
- 每個(gè)字符列可以有不同的字符集
- 有 VARCHAR的表可以固定或動(dòng)態(tài)記錄長(zhǎng)度.
- VARCHAR和CHAR列可以多達(dá)64KB.
使用 MyISAM引擎創(chuàng)建數(shù)據(jù)庫(kù),將生產(chǎn)3個(gè)文件.文件的名字以表的名字開始,擴(kuò)展名指出文件類型:fm文件存儲(chǔ)表定義,數(shù)據(jù)文件的擴(kuò)展名為MYD( MYData),索引文件的擴(kuò)展名是.MYI(MYIndex)).
3.3.4 MEMORY 存儲(chǔ)引擎
MEMORY存儲(chǔ)引擎將表中的數(shù)據(jù)存儲(chǔ)到內(nèi)存中,為查詢和引用其他表數(shù)據(jù)提供快速訪問(wèn).MEMORY主要特性有:
- MEMORY表的每個(gè)表可以有多達(dá)32個(gè)索引,每個(gè)索引16列,以及500B的最大鍵長(zhǎng)度.
- MEMORY存儲(chǔ)引擎執(zhí)行HASH和BTREE索引.
- 可以在一個(gè)MEMORY表中有非唯一鍵.
- MEMORY表使用一個(gè)固定的記錄長(zhǎng)度格式.
- MEMORY不支持BLOB或TEXT列.
- MEMORY支持AUTOINCREMENT列和對(duì)可包含NULL值的列的索引.
- MEMORY表在所有客戶端之間共享(就像其他任何非TEMPORARY表).
- MEMORY表內(nèi)容被存在內(nèi)存中,內(nèi)存是MEMORY表和服務(wù)器在查詢處理時(shí)的空閑中創(chuàng)建的內(nèi)部表共享.
- 當(dāng)不再需要MEMORY表的內(nèi)容時(shí),要釋放被MEMORY表使用的內(nèi)存,應(yīng)該執(zhí)行DELETE FROM或TRUNCATETABLE,或者刪除整個(gè)表(使用DROPTABLE).
3.3.5存儲(chǔ)引擎的選擇
不同存儲(chǔ)引擎都有各自的特點(diǎn),以適應(yīng)不同的需求,如表所示.為了做出選擇,首先需要考慮每一個(gè)存儲(chǔ)引擎提供了哪些不同的功能.
存儲(chǔ)引擎比較
|功能|MyISAM|Memory|InnoDB|Archive|
|---|---|---|---|---|---|
|存儲(chǔ)限制|256TB|RAM|64TB|None|
|支持事務(wù)|No|No|Yes|No|
|支持全文索引|Yes|No|No|No|
|支持?jǐn)?shù)索引|Yes|Yes|Yes|No|
|支持哈希索引|No|Yes|No|No|
|支持?jǐn)?shù)據(jù)緩存|No|N/A|Yes|No|
|支持外鍵|No|No|Yes|No|
如果要提供提交、回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)能力,并要求實(shí)現(xiàn)并發(fā)控制,InnoDB MyISAM引擎能提 供較高的處理效率;如果只是臨時(shí)存放數(shù)據(jù),數(shù)據(jù)量不大,并且不需要較高的數(shù)據(jù)安全性,可 以選擇將數(shù)據(jù)保存在內(nèi)存中的 Memory MySQL中使用該引擎作為臨時(shí)表,存放查詢的 中間結(jié)果.如果只有 INSERT SELECT操作,可以選擇 Archive引擎, Archive存儲(chǔ)引擎支持高并發(fā)的插入操作,但是本身并不是事務(wù)安全的. Archive存儲(chǔ)引擎非常適合存儲(chǔ)歸檔數(shù)據(jù), 如記錄日志信息可以使用 Archive引擎.
使用哪一種引擎要根據(jù)需要靈活選擇,一個(gè)數(shù)據(jù)庫(kù)中多個(gè)表可以使用不同引擎以滿足各種性能和實(shí)際需求.使用合適的存儲(chǔ)引擎將會(huì)提高整個(gè)數(shù)據(jù)庫(kù)的性能.
3.4 綜合案例----數(shù)據(jù)庫(kù)的創(chuàng)建和刪除
3.5 專家解惑
如何查看默認(rèn)存儲(chǔ)引擎?
show variables likes 'storage_engine';
第4章 數(shù)據(jù)表的基本操作
4.1 創(chuàng)建數(shù)據(jù)表
4.1.1 創(chuàng)建表
創(chuàng)建數(shù)據(jù)表的語(yǔ)句為 create table.語(yǔ)法規(guī)則如下:
create table <表名>
(
字段名1,數(shù)據(jù)類型[列級(jí)別約束條件],默認(rèn)值;
字段名2,數(shù)據(jù)類型[列級(jí)別約束條件],默認(rèn)值;
...
[表級(jí)別約束條件]
);
使用CREATETABLE創(chuàng)建表時(shí),必須指定以下信息:
- (1)要?jiǎng)?chuàng)建的表的名稱,不區(qū)分大小寫,不能使用SQL語(yǔ)言中的關(guān)鍵字,如DROP、ALTER、INSERT等.
- (2)數(shù)據(jù)表中每一個(gè)列(字段)的名稱和數(shù)據(jù)類型,如果創(chuàng)建多個(gè)列,要用逗號(hào)隔開.
4.1.2使用主鍵約束
主鍵,又稱主碼,是表中一列或多列的組合.主鍵約束(Primary Key Constraint)要求主鍵列的數(shù)據(jù)唯一,并且不允許為空.主鍵能夠唯一地標(biāo)識(shí)表中的一條記錄,可以結(jié)合外鍵來(lái)定 義不同數(shù)據(jù)表之間的關(guān)系,并且可以加快數(shù)據(jù)庫(kù)查詢的速度.主鍵和記錄之間的關(guān)系如同身份 證和人之間的關(guān)系,它們之間是一一對(duì)應(yīng)的.主鍵分為兩種類型:單字段主鍵和多字段聯(lián)合主鍵.
1.單字段主鍵
單字段主鍵由一個(gè)字段組成,SQL語(yǔ)句格式分為以下兩種情況.
(1)在定義列的同時(shí)指定主鍵,語(yǔ)法規(guī)則如下:
字段名數(shù)據(jù)類型 PRIMARY KEY默認(rèn)值
(2)在定義完所有列之后指定主鍵
CONSTRAINT<約束名>] PRIMARY KEY[字段名]
4.1.3使用外鍵約束
外鍵用來(lái)在兩個(gè)表的數(shù)據(jù)之間建立鏈接,它可以是一列或者多列.一個(gè)表可以有一個(gè)或多個(gè)外鍵.外鍵對(duì)應(yīng)的是參照完整性,一個(gè)表的外鍵可以為空值,若不為空值,則每一個(gè)外鍵值必須等于另一個(gè)表中主鍵的某個(gè)值.
外鍵:首先它是表中的一個(gè)字段,它可以不是本表的主鍵,但對(duì)應(yīng)另外一個(gè)表的主鍵.外鍵主要作用是保證數(shù)據(jù)引用的完整性,定義外鍵后,不允許刪除在另一個(gè)表中具有關(guān)聯(lián)關(guān)系的行.外鍵的作用是保持?jǐn)?shù)據(jù)的一致性、完整性.
主表(父表):對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的那個(gè)表即是主表
從表(子表):對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中外鍵所在的那個(gè)表即是從表
創(chuàng)建外鍵的語(yǔ)法規(guī)則如下:
[ CONSTRAINT<外鍵名>1 FOREIGN KEY字段名1 [,字段名2,...]
REFERENCES<主表名>主鍵列1 [,主鍵列2,...]
"外鍵名"為定義的外鍵約束的名稱,一個(gè)表中不能有相同名稱的外鍵:"字段名"表示字表需要添加外鍵約束的字段列;"主表名"即被字表外鍵所依賴的表的名稱;"主鍵列"表示主表中定義的主鍵列,或者列組成.
4.1.4使用非空約束
非空約束(Not Null Constraint)指字段的值不能為空.對(duì)于使用了非空約束的字段,如果用戶在添加數(shù)據(jù)時(shí)沒有指定值,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)報(bào)錯(cuò).
非空約束的語(yǔ)法規(guī)則如下:字段名數(shù)據(jù)類型 not nul11
4.1.5使用唯一性約束
唯一性約束( Unique Constraint)要求該列唯一,允許為空,但只能出現(xiàn)一個(gè)空值.唯一約束可以確保一列或者幾列不出現(xiàn)重復(fù)值.
唯一性約束的語(yǔ)法規(guī)則如下:
(1)在定義完列之后直接指定唯一約束,語(yǔ)法規(guī)則如下:字段名數(shù)據(jù)類型 UNIQUE
(2)在定義完所有列之后指定唯一約束,語(yǔ)法規(guī)則如下:[CONSTRAINT UNIQUE(<字段名>)
UNIQUE PRIMARY KEY的區(qū)別:一個(gè)表中可以有多個(gè)字段聲明為UNIQUE,但只能有一個(gè)PRIMARY KEY聲明;聲明為PRIMAY KEY的列不允許有空值但是聲明為UNIQUE的字段允許空值(NULL)的存在.
4.1.6使用默認(rèn)約束
默認(rèn)約束( Default Constraint)指定某列的默認(rèn)值.
默認(rèn)約束的語(yǔ)法規(guī)則如下:字段名數(shù)據(jù)類型 DEFAULT默認(rèn)值
4.1.7設(shè)置表的屬性值自動(dòng)增加
在數(shù)據(jù)庫(kù)應(yīng)用中,經(jīng)常希望在每次插入新記錄時(shí),系統(tǒng)自動(dòng)生成字段的主鍵值.可以通過(guò)為表主鍵添加AUTO_INCREMENT關(guān)鍵字來(lái)實(shí)現(xiàn).默認(rèn)的,在 MySQL中AUTO_INCREMENT的初始值是1,每新增一條記錄,字段值自動(dòng)加1.一個(gè)表只能有一個(gè)字段使用AUTO_INCREMENT約束,且該字段必須為主鍵的一部分.
AUTO_INCREMENT約束的字段可以是任何整數(shù)類型(TINYINT、SMALLIN、INT、BIGINT等).
設(shè)置表的屬性值自動(dòng)增加的語(yǔ)法規(guī)則如下: 字段名數(shù)據(jù)類型 AUTO INCREMENT
4.2 查看數(shù)據(jù)表結(jié)構(gòu)
4.2.1 查看表基本結(jié)構(gòu)語(yǔ)句DESCRIBE
DESCRIBE/DESC語(yǔ)句可以查看表的字段信息,其中包括:字段名、字段數(shù)據(jù)類型、是否為主鍵、是否有默認(rèn)值等.
語(yǔ)法規(guī)則如下:DESCRIBE 表名; 或者簡(jiǎn)寫為:DESC 表名;
4.2.2 查看表詳細(xì)結(jié)構(gòu)語(yǔ)句SHOW CREATE TABLE
SHOW CREATE TABLE語(yǔ)句可以用來(lái)顯示創(chuàng)建表時(shí)的CREATE TABLE語(yǔ)句
語(yǔ)法格式如下:SHOW CREATE TABLE <表名> \G;
4.3修改數(shù)據(jù)表
修改表指的是修改數(shù)據(jù)庫(kù)中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu).MySQL使用ALTER TABLE語(yǔ)句修改表.
常用的修改表的操作有:修改表名、修改字段數(shù)據(jù)類型或字段名、增加和刪除字段、修改字段的排列位置、更改表的存儲(chǔ)引擎、刪除表的外鍵約束等. 本節(jié)將對(duì)和修改表有關(guān)的操作進(jìn)行講解.
4.3.1修改表名
MySQL是通過(guò)ALTER TABLE語(yǔ)句來(lái)實(shí)現(xiàn)表名的修改的
語(yǔ)法規(guī)則如下:ALTER TABLE <舊表名〉RENAME [TO] <新表名>;
其中TO為可選參數(shù),使用與否均不影響結(jié)果.
4.3.2修改字段的數(shù)據(jù)類型
修改字段的數(shù)據(jù)類型,就是把字段的數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型.
語(yǔ)法規(guī)則如下:ALTER TABLE〈表名〉MODIFY <字段名〉<數(shù)據(jù)類型>
其中"表名"指要修改數(shù)據(jù)類型的字段所在表的名稱,"字段名"指需要修改的字段, "數(shù)據(jù)類型"指修改后字段的新數(shù)據(jù)類型.
4.3.3修改字段名
語(yǔ)法規(guī)則如下:ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數(shù)據(jù)類型>;
其中,"舊字段名"指修改前的字段名;"新字段名"指修改后的字段名;"新數(shù)據(jù)類型"指修改后的數(shù)據(jù)類型,如果不需要修改字段的數(shù)據(jù)類型,可以將新數(shù)據(jù)類型設(shè)置成與原來(lái)一樣即可,但數(shù)據(jù)類型不能為空.
CHANGE也可以只修改數(shù)據(jù)類型,實(shí)現(xiàn)和MODIFY同樣的效果,方法是將SQL語(yǔ)句中的"新字段名"和"舊字段名"設(shè)置為相同的名稱,只改變"數(shù)據(jù)類型".
由于不同類型的數(shù)據(jù)在機(jī)器中存儲(chǔ)的方式及長(zhǎng)度并不相同,修改數(shù)據(jù)類型可能會(huì)影響到數(shù)據(jù)表中已有的數(shù)據(jù)記錄.因此,當(dāng)數(shù)據(jù)庫(kù)表中已經(jīng)有數(shù)據(jù)時(shí),不要輕易修改數(shù)據(jù)類型.
4.3.4添加字段
隨著業(yè)務(wù)需求的變化,可能需要在已經(jīng)存在的表中添加新的字段.一個(gè)完整字段包括字段名、數(shù)據(jù)類型、完整性約束.
添加字段的語(yǔ)法格式如下:ALTER TABLE <表名> ADD <新字段名> <數(shù)據(jù)類型> [約束條件][FIRST | AFTER 已存在字段名];
新字段名為需要添加的字段的名稱;"FIRST"為可選參數(shù),其作用是將新添加的字段設(shè)置為表的第一個(gè)字段;"AFTER"為可選參數(shù),其作用是將新添加的字段添加到指定的"已存在字段名"的后面.
"FIRST"或"AFTER已存在字段名"用于指定新增字段在表中的位置,如果SQL語(yǔ)句中沒有這兩個(gè)參數(shù),則默認(rèn)將新添加的字段設(shè)置為數(shù)據(jù)表的最后列.
4.3.5刪除字段
刪除字段是將數(shù)據(jù)表中的某個(gè)字段從表中移除
語(yǔ)法格式如下:ALTER TABLE <表名> DROP <字段名>;
"字段名"指需要從表中刪除的字段的名稱.
4.3.6修改字段的排列位置
對(duì)于一個(gè)數(shù)據(jù)表來(lái)說(shuō),在創(chuàng)建的時(shí)候,字段在表中的排列順序就已經(jīng)確定了.但表的結(jié)構(gòu)并不是完全不可以改變的,可以通過(guò)ALTER TABLE來(lái)改變表中字段的相對(duì)位置.
語(yǔ)法格式如下:ALTER TABLE <表名> MODIFY <字段1> <數(shù)據(jù)類型> FIRST | AFTER <字段2>;
"字段1"指要修改位置的字段,"數(shù)據(jù)類型"指"字段1"的數(shù)據(jù)類型,"FIRST"為可選參數(shù),指將"字段1"修改為表的第一個(gè)字段,"AFTER字段2"指將"字段1"插入到"字段2"后面.
4.3.7更改表的存儲(chǔ)引擎
通過(guò)前面章節(jié)的學(xué)習(xí),知道存儲(chǔ)引擎是MySQL中的數(shù)據(jù)存儲(chǔ)在文件或者內(nèi)存中時(shí)采用的不同技術(shù)實(shí)現(xiàn) .可以根據(jù)自己的需要,選擇不同的引擎,甚至可以為每一張表選擇不同的存儲(chǔ)引擎.
MySQL中主要存儲(chǔ)引擎有:MylSAM、InnoDB、MEMORY(HEAP)、BDB、FEDERATED等.
可以使用SHOW ENGINES;語(yǔ)句查看系統(tǒng)支持的存儲(chǔ)引擎.
下表列出了 5.5.13版本的 MySQL所支持的存儲(chǔ)引擎.
MySQL支持的存儲(chǔ)引擎
| 引擎名 | 是否支持 |
|---|---|
| FEDERATED | 否 |
| MRG MYISAM | 是 |
| MylSAM | 是 |
| BLACKHOLE | 是 |
| CSV | 是 |
| MEMORY | 是 |
| ARCHIVE | 是 |
| InnoDB | 默認(rèn) |
| PERFORMANCE SCHEMA | 是 |
更改表的存儲(chǔ)引擎的語(yǔ)法格式如下:ALTER TABLE <表名> ENGITNE=<更改后的存儲(chǔ)引擎>;
4.3.8刪除表的外鍵約束
對(duì)于數(shù)據(jù)庫(kù)中定義的外鍵,如果不再需要,可以將其刪除.外鍵一旦刪除,就會(huì)解除主表和從表間的關(guān)聯(lián)關(guān)系
刪除外鍵的語(yǔ)法格式如下:ALTER TABLE <表名〉DROP FOREIGN KEY <外鍵約束名>
"外鍵約束名"指在定義表時(shí)CONSTRAINT關(guān)鍵字后面的參數(shù)
4.4刪除數(shù)據(jù)表
刪除數(shù)據(jù)表就是將數(shù)據(jù)庫(kù)中已經(jīng)存在的表從數(shù)據(jù)庫(kù)中刪除.注意,在刪除表的同時(shí),表的定義和表中所有的數(shù)據(jù)均會(huì)被刪除.因此, 在進(jìn)行刪除操作前,最好對(duì)表中的數(shù)據(jù)做個(gè)備份,以免造成無(wú)法挽回的后果.本節(jié)將詳細(xì)講解數(shù)據(jù)庫(kù)表的刪除方法.
4.4.1刪除沒有被關(guān)聯(lián)的表
在MySQL中,使用DROP TABLE可以一次刪除一個(gè)或多個(gè)沒有被其他表關(guān)聯(lián)的數(shù)據(jù)表
語(yǔ)法格式如下:DROP TABLE [IF EXISTS] 表1,表2,...,表n;
其中"表n"指要?jiǎng)h除的表的名稱,后面可以同時(shí)刪除多個(gè)表,只需將要?jiǎng)h除的表名依次寫在后面,相互之間用逗號(hào)隔開即可.如果要?jiǎng)h除的數(shù)據(jù)表不存在,則MySQL會(huì)提示一條錯(cuò)誤信息
4.4.2刪除被其他表關(guān)聯(lián)的主表
數(shù)據(jù)表之間存在外鍵關(guān)聯(lián)的情況下,如果直接刪除父表,結(jié)果會(huì)顯示失敗.原因是直接刪除,將破壞表的參照完整性.如果必須要?jiǎng)h除,可以先刪除與它關(guān)聯(lián)的子表,再刪除父表,只是這樣同時(shí)刪除了兩個(gè)表中的數(shù)據(jù).但有的情況下可能要保留子表,這時(shí)如要單獨(dú)刪除父表,只需將關(guān)聯(lián)的表的外鍵約束條件取消,然后就可以刪除父表.
4.5 綜合案例----數(shù)據(jù)表的基本操作
4.6 專家解惑
疑問(wèn)1:表刪除操作須謹(jǐn)慎
表刪除操作將把表的定義和表中的數(shù)據(jù)一起刪除,并且MySQL在執(zhí)行刪除操作時(shí),不會(huì)有任何的確認(rèn)信息提示,因此執(zhí)行刪除操時(shí),應(yīng)當(dāng)慎重.在刪除表前,最好對(duì)表中的數(shù)據(jù)進(jìn)行備份,這樣當(dāng)操作失誤時(shí),可以對(duì)數(shù)據(jù)進(jìn)行恢復(fù),以免造成無(wú)法挽回的后果.
同樣地,在使用ALTER TABLE進(jìn)行表的基本修改操作時(shí),在執(zhí)行操作過(guò)程之前,也應(yīng)該確保對(duì)數(shù)據(jù)進(jìn)行完整的備份,因?yàn)閿?shù)據(jù)庫(kù)的改變是無(wú)法撤銷的,如果添加了一個(gè)不需要的字段,可以將其刪除;相同的,如果刪除了一個(gè)需要的列,該列下面的所有數(shù)據(jù)都將會(huì)丟失'疑問(wèn)2:每一表中都要有一主鍵嗎?
并不是每一個(gè)表中都需要主鍵,如果多個(gè)表之間進(jìn)行連接操作時(shí),需要用到主鍵.因此并不需要為每個(gè)表建立主鍵,而且有些情況最好不使用主鍵.疑問(wèn)3:并不是每個(gè)表都可以任意選擇存儲(chǔ)引擎.
外鍵約束(FOREIGN KEY)不能跨引擎使用.MySQL支持多種存儲(chǔ)引擎,每一個(gè)表都可以指定一個(gè)不同的存儲(chǔ)引擎,但是要注意:外鍵約束是用來(lái)保證數(shù)據(jù)的參照完整性,如果表之間需要關(guān)聯(lián)外鍵,卻指定了不同的存儲(chǔ)引擎,這些表 之間是不能創(chuàng)建外鍵約束的.所以說(shuō),存儲(chǔ)引擎的選擇也不完全是隨意的.疑問(wèn)4:帶AUTOJNCREMENT約束的字段值是從1開始的嗎?
默認(rèn)的,在MySQL中,AUTOJNCREMENT的初始值是1,每新增一條記錄,字段值自動(dòng)加設(shè)置自增屬性(AUTO_INCREMENT)的時(shí)候,還可以指定第一條插入記錄的自増字段的值,這樣新插入的記錄的自增字段值從初始值開始遞增,如在tb_emp8中插入第一條記錄, 同時(shí)指定id值為5,則以后插入的記錄的id值就會(huì)從6開始往上增加.添加唯一性的主鍵約束時(shí),往往需要設(shè)置字段自動(dòng)增加屬性.
第5章 數(shù)據(jù)類型與運(yùn)算符
5.1 MySQL數(shù)據(jù)類型介紹
MySQL支持多種數(shù)據(jù)類型,主要有數(shù)值類型、日期/時(shí)間類型和字符串類型.
- 數(shù)值數(shù)據(jù)類型:包括整數(shù)類型 TINYINT. SMALLINT. MEDIUMINT、INT、BIGINT. 浮點(diǎn)小數(shù)數(shù)據(jù)類型FLOAT和DOUBLE,定點(diǎn)小數(shù)類型DECIMAL.
- 日期/時(shí)間類型:包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP.
- 字符串類型:包括 CHAR、VARCHAR, BINARY. VARBINARY, BLOB、TEXT、ENUM和SET等.字符串類型又分為文本字符串和二進(jìn)制字符串.
5.1.1整數(shù)類型
數(shù)值型數(shù)據(jù)類型主要用來(lái)存儲(chǔ)數(shù)字,MySQL提供了多種數(shù)值數(shù)據(jù)類型,不同的數(shù)據(jù)類型提供不同的取值范圍,可以存儲(chǔ)的值范圍越大,其所需要的存儲(chǔ)空間也會(huì)越大.
MySQL主要提供的整數(shù)類型有:TINYINT、SMALLINT, MEDIUMINT, INT(INTEGER)、BIGINT.整數(shù)類型的屬性字段可以添加AUTO_INCREMENT自增約束條件.
從表中可以看到,不同類型整數(shù)存儲(chǔ)所需的字節(jié)數(shù)是不同的,占用字節(jié)數(shù)最小的是 TINYINT類型,占用字節(jié)最大的是BIGINT類型,相應(yīng)的占用字節(jié)越多的類型所能表示的數(shù) 值范圍越大.
MySQL中的整數(shù)型數(shù)據(jù)類型
|類型名稱|說(shuō)明|存儲(chǔ)需求|有符號(hào)|無(wú)符號(hào)|
|---|---|---|
|TINYINT|很小的整數(shù)|1個(gè)字節(jié)|-128127|0255|
|SMALLINT|小的整數(shù)|2個(gè)字節(jié)|-3276832767|065535|
|MEDIUMINT|中等大小的整數(shù)|3個(gè)字節(jié)|-8388608~8388607|0-16777215|
|INT(INTEGER)|普通大小的整數(shù)|4個(gè)字節(jié)|-2147483648~2147483647|0-4294967295|
|BIGINT|大整數(shù)|8個(gè)字節(jié)|-92233720368547758089223372036854775807|018446744073709551615|
注意:顯示寬度和數(shù)據(jù)類型的取值范圍是無(wú)關(guān)的.顯示寬度只是指明MySQL最大可能顯示的數(shù)字個(gè)數(shù),數(shù)值的位數(shù)小于指定的寬度時(shí)會(huì)由空格填充;如果插入了大于顯示寬度的值,只要該值不超過(guò)該類型整數(shù)的取值范圍,數(shù)值依然可以插入,而且能夠顯示出來(lái).例如,假如向year字段插入一個(gè)數(shù)值19999,當(dāng)使用SELECT查詢?cè)摿兄档臅r(shí)候,MySQL顯示的將是完整的帶有5位數(shù)字的19999,而不是4位數(shù)字的值.
其他整型數(shù)據(jù)類型也可以在定義表結(jié)構(gòu)時(shí)指定所需要的顯示寬度,如果不指定,則系統(tǒng)為每一種類型指定默認(rèn)的寬度值.
不同的整數(shù)類型有不同的取值范圍,并且需要不同的存儲(chǔ)空間,因此,應(yīng)該根據(jù)實(shí)際需要選擇最合適的類型,這樣有利于提高查詢的效率和節(jié)省存儲(chǔ)空間.
提示:顯示寬度只用于顯示,并不能限制取值范圍和占用空間,如:INT(3)會(huì)占用4個(gè)字節(jié)的存儲(chǔ)空間,并且允許的最大值也不會(huì)是999,而是INT整型所允許的最大值.
5.1.2浮點(diǎn)數(shù)類型和定點(diǎn)數(shù)類型
MySQL中使用浮點(diǎn)數(shù)和定點(diǎn)數(shù)來(lái)表示小數(shù).浮點(diǎn)類型有兩種:單精度浮點(diǎn)類型(FLOAT)和雙精度浮點(diǎn)類型(DOUBLE).定點(diǎn)類型只有一種:DECIMAL.浮點(diǎn)類型和定點(diǎn)類型都可以用(M, N)來(lái)表示,其中M稱為精度,表示總共的位數(shù);N稱為標(biāo)度,是表示小數(shù)的位數(shù).
MySQL中的小數(shù)類型
| 類型名稱 | 說(shuō)明 | 存儲(chǔ)需求 |
|---|---|---|
| FLOAT | 單精度浮點(diǎn)數(shù) | 4個(gè)字節(jié) |
| DOUBLE | 雙精度浮點(diǎn)數(shù) | 8個(gè)字節(jié) |
| DECIMAL(M,D), DEC | 定點(diǎn)數(shù) | (M+2)個(gè)字節(jié) |
DECIMAL類型不同于FLOAT和DOUBLE, DECIMAL實(shí)際是以串存放的,DECIMAL可能的最大取值范圍與DOUBLE一樣,但是其有效的取值范圍由M和D的值決定.如果改變M而固定D,則其取值范圍將隨M的變大而變大.從表可以看到,DECIMAL的存儲(chǔ)空間并不是固定的,而由其精度值M決定,占用M+2個(gè)字節(jié).
FLOAT類型的取值范圍如下:
- 有符號(hào)的取值范圍:-3.402823466E+38 ~ -1.175494351E-38.
- 無(wú)符號(hào)的取值范圍:0 和 1.175494351E-38 ~ 3.402823466E+38.
DOUBLE類型的取值范圍如下:
- 有符號(hào)的取值范圍:-1.7976931348623157E+308 ~ 2.2250738585072014E-308.
- 無(wú)符號(hào)的取值范圍:0 和 2.2250738585072014E-308 ~ 1.7976931348623157E+308.
不論是定點(diǎn)還是浮點(diǎn)類型,如果用戶指定的精度超出精度范圍,則會(huì)四舍五入進(jìn)行處理.
FLOA T和DOUBLE在不指定精度時(shí),默認(rèn)會(huì)按照實(shí)際的精度(由計(jì)算機(jī)硬件和操作系統(tǒng)決定),DECIMAL如不指定精度,默認(rèn)為(10,0).
浮點(diǎn)數(shù)相對(duì)于定點(diǎn)數(shù)的優(yōu)點(diǎn)是在長(zhǎng)度一定的情況下,浮點(diǎn)數(shù)能夠表示更大的數(shù)據(jù)范圍;它的缺點(diǎn)是會(huì)引起精度問(wèn)題.
提示:在MySQL中,定點(diǎn)數(shù)以字符串形式存儲(chǔ),在對(duì)精度要求比較高的時(shí)候(如貨幣,科學(xué)數(shù)據(jù)等)使用DECIMAL的類型比較好,另外兩個(gè)浮點(diǎn)數(shù)進(jìn)行減法和比較運(yùn)算時(shí)也容易出問(wèn)題,所以在使用浮點(diǎn)型時(shí)需要注意,并盡量避免做浮點(diǎn)數(shù)比較.
5.1.3日期與時(shí)間類型
MySQL中有多種表示日期的數(shù)據(jù)類型,主要有:DATETIME、DATE、TIMESTAMP、TIME和YEAR.
日期與時(shí)間數(shù)據(jù)類型
|類型名稱|日期格式|范圍|存儲(chǔ)需求|
|YEAR|YYYY|1901~2155|1字節(jié)|
|TIME|HH:MM:SS|-838:59:59~838:59:59|3字節(jié)|
|DATA|YYYY-MM-DD|1000-01-01~9999-12-03|3字節(jié)|
|DATATIME|YYYY-MM-DD HH:MM:SS|1000-01-01 00:00:00~9999-12-03 23:59:59|8字節(jié)|
|TIMESTAMP|YYYY-MM-DD HH:MM:SS|1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC|4字節(jié)|
1.YEAR
YEAR類型是一個(gè)單字節(jié)類型用于表示年,在存儲(chǔ)時(shí)只需要1個(gè)字節(jié).可以使用各種格式指定YEAR值,如下所示:
- 以4位字符串或者4位數(shù)字格式表示的YEAR,范圍為'1901'?'2155'.輸入 格式為'YYYY'或者YYYY,例如,輸入'2010'或2010,插入到數(shù)據(jù)庫(kù)的值均為2010.
- 以2位字符串格式表示的YEAR,范圍為'00'到'99'.'00'?'69'和'70'? '99'范圍的值分別被轉(zhuǎn)換為2000-2069和1970?1999范圍的YEAR值.'0'與'00'的作用相同.插入超過(guò)取值范圍的值將被轉(zhuǎn)換為2000.
- 以2位數(shù)字表示的YEAR,范圍為1?99.1?69和70?99范圍的值分別被轉(zhuǎn)換為 2001-2069和1970-1999范圍的YEAR值.注意:在這里0值將被轉(zhuǎn)換為0000,而不是2000.
提示:兩位整數(shù)范圍與兩位字符串范圍稍有不同,例如:插入2000年,讀者可能會(huì)使用數(shù)宇格 式的0表示YEAR,實(shí)際上,插入數(shù)據(jù)庫(kù)的值為0000,而不是所希望的2000.只有使用字符串格式的'0'或'00',才可以被正確地解釋為2000.非法YEAR值將被轉(zhuǎn)換為0000.
2.TIME
TIME類型用于只需要時(shí)間信息的值,在存儲(chǔ)時(shí)需要3個(gè)字節(jié).格式為'HH:MM:SS'.
HH表示小時(shí);MM表示分鐘;SS表示秒.TIME類型的取值范圍為-838:59:59 ~ 838:59:59, 小時(shí)部分會(huì)如此大的原因是TIME類型不僅可以用于表示一天的時(shí)間(必須小于24小時(shí)),還可能是某個(gè)事件過(guò)去的時(shí)間或兩個(gè)事件之間的時(shí)間間隔(可以大于24小時(shí),或者甚至為負(fù)).可以使用各種格式指定TIME值,如下所示:
- 'D HH:MM:SS'格式的字符串.還可以使用下面任何一種"非嚴(yán)格"的語(yǔ)法:'HH:MM:SS'、'HH:MM'、'DHH:MM'、'DHH' 或 'SS'.這里的 D 表示日,可以取0~34之間的值.在插入數(shù)據(jù)庫(kù)時(shí),D被轉(zhuǎn)換為小時(shí)保存,格式為"D*24 + HH".
- 'HHMMSS'格式的、沒有間隔符的字符串或者HHMMSS格式的數(shù)值,假定是有意義的時(shí)間.例如:'101112'被理解為'10:11:12',但'109712'是不合法的(它有一個(gè)沒有意義的分鐘部分),存儲(chǔ)時(shí)將變?yōu)?0:00:00.
提示:
為TIME列分配簡(jiǎn)寫值時(shí)應(yīng)注意:如果沒有冒號(hào),MySQL解釋值時(shí),假定最右邊的兩位表示秒.(MySQL解釋TIME值為過(guò)去的時(shí)間而不是當(dāng)天的時(shí)間).例如,讀者可能認(rèn)為'1112'和1112表示11:12:00(即11點(diǎn)過(guò)12分),但MySQL將它們解釋為00:11:12(即11分12秒).同樣'12'和12被解釋為00:00:120相反,TIME值中如果使用冒號(hào)則肯定被看作當(dāng)天的時(shí)間.也就是說(shuō),'11:12'表示11:12:00,而不是00:11:12.
在使用'DHH'格式時(shí),小時(shí)一定要使用雙位數(shù)值,如果是小于10的小時(shí)數(shù),應(yīng)在前面加0.
- DATE類型
DATE類型用在僅需要日期值時(shí),沒有時(shí)間部分,在存儲(chǔ)時(shí)需要3個(gè)字節(jié).日期格式為'YYYY-MM-DD'其中YYYY表示年;MM表示月;DD表示日.在給DATE類型的字段賦值時(shí),可以使用字符串類型或者數(shù)字類型的數(shù)據(jù)插入,只要符合DATE的日期格式即可, 如下:
- 以YYYYY-MM-DD,或者'YYYYMMDD'字符串格式表示的日期,取值范圍為 '1000-01-01' ~ '9999-12-3'.例如,輸入 '2012-12-31'或者 '20121231' ,插入數(shù)據(jù)庫(kù)的曰期都為2012-12-31.
- 以'YY-MM-DD'或者"YYMMDD'字符串格式表示的日期,在這里YY表示兩位的年值.包含兩位年值的日期會(huì)令人模糊,因?yàn)椴恢朗兰o(jì).MySQL使用以下規(guī)則解釋兩位年值:'00?69'范圍的年值轉(zhuǎn)換為'2000?2069';'70?99'范圍的年值轉(zhuǎn)換為*1970- 1999'.例如,輸入'12-12-31',插入數(shù)據(jù)庫(kù)的日期為2012-12-31;輸入'981231',插入數(shù)據(jù)的日期為1998-12-31.
- 以YY-MM-DD或者YYMMDD數(shù)字格式表示的日期,與前面相似,00-69范圍的年值轉(zhuǎn)換為2000-2069; 70?99范圍的年值轉(zhuǎn)換為1970?1999.例如,輸入12-12-31插入數(shù) 據(jù)庫(kù)的曰期為2012-12-31;輸入981231,插入數(shù)據(jù)的日期為1998-12-31.
- 使用CURRENT_DATE或者NOW(),插入當(dāng)前系統(tǒng)日期.
提示:
MySQL允許"不嚴(yán)格"語(yǔ)法:任何標(biāo)點(diǎn)符號(hào)都可以用作日期部分之間的間隔符.例如,'98-11-31'、'98.11.31'、'98/11/31' 和 '98@11@31' 是等價(jià)的,這些值也可以正確地插入到數(shù)據(jù)庫(kù).
- DATETIME
DATETIME類型用在需要同時(shí)包含日期和時(shí)間信息的值,在存儲(chǔ)時(shí)需要8個(gè)字節(jié).曰期格式為'YYYY-MM-DDHH:MM:SS',其中YYYY表示年;MM表示月;DD表示日;HH表示小時(shí);MM表示分鐘;SS表示秒.在給DATETIME類型的字段賦值時(shí),可以使用字符串類型或者數(shù)字類型的數(shù)據(jù)插入,只要符合DATETIME的日期格式即可,如下所示:
- 以 'YYYY-MM-DDHH:MM:SS'或者'YYYYMMDDHHMMSS'字符串格式表示 的值,取值范圍為 '1000-01-01 00:00:00' — '9999-12-3 23:59:59'.例如輸入 '2012-12-31 05:05:05' 或者'20121231050505' ,插入數(shù)據(jù)庫(kù)的 DATETIME 值都為 2012-12-31 05:05:05o
- 以:YY-MM-DDHH:MM:SS'或者'YYMMDDHHMMSS'字符串格式表示的日期, 在這里YY表示兩位的年值.與前面相同,'00?69'范圍的年值轉(zhuǎn)換為'2000?2069'; '70? 99'范圍的年值轉(zhuǎn)換為'1970?1999'.例如輸入'12-12-31 05:05:05',插入數(shù)據(jù)庫(kù)的 DATETIME 為 2012-12-31 05:05:05;輸入 '980505050505',插入數(shù)據(jù)庫(kù)的 DATETIME 為 1998-05-05 05:05:05.
- 以YYYYMMDDHHMMSS或者YYMMDDHHMMSS數(shù)字格式表示的日期和時(shí)間, 例如輸入 20121231050505,插入數(shù)據(jù)庫(kù)的 DATETIME 為 2012-12-31 05:05:05:輸入 981231050505,插入數(shù)據(jù)的 DATETIME 為 1998-12-31 05:05:05
提示:
MySQL允許"不嚴(yán)格"語(yǔ)法:任何標(biāo)點(diǎn)符號(hào)都可以用作日期部分或時(shí)間部分之間的間隔"符.例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 113045'和'98@12@31 llA30A45,是等價(jià)的,這些值都可以正確地插入數(shù)據(jù)庫(kù).
- TIMESTAMP
TIMESTAMP的顯示格式與DATETIME相同,顯示寬度固定在19個(gè)字符,日期格式為 YYYY-MM-DD HH:MM:SS,在存儲(chǔ)時(shí)需要4個(gè)字節(jié).但是TIMESTAMP列的取值范圍小于 DATETIME 的取值范圍,為 U970-01-01 00:00:01* UTC?'2038-01-19 03:14:07' UTC,其 中,UTC(Coordinated Universal Time),為世界標(biāo)準(zhǔn)時(shí)間,因此在插入數(shù)據(jù)時(shí),要保證在合 法的取值范圍內(nèi).
TIMESTAMP與DATETIME除了存儲(chǔ)字節(jié)和支持的范圍不同外,還有一個(gè)最大的區(qū)別就 是:DATETIME在存儲(chǔ)日期數(shù)據(jù)時(shí),按實(shí)際輸入的格式存儲(chǔ),即輸入什么就存儲(chǔ)什么, 與時(shí)區(qū)無(wú)關(guān);而TIMESTAMP值的存儲(chǔ)是以UTC(世界標(biāo)準(zhǔn)時(shí)間)格式保存的,存儲(chǔ)時(shí) 對(duì)當(dāng)前時(shí)區(qū)進(jìn)行轉(zhuǎn)換,檢索時(shí)再轉(zhuǎn)換回當(dāng)前時(shí)區(qū).即查詢時(shí),根據(jù)當(dāng)前時(shí)區(qū)的不同,顯示 的時(shí)間值是不同的.
提示:
如果為一個(gè)DATETIME或TIMESTAMP對(duì)象分配一個(gè)DATE值,結(jié)果值的時(shí)間部分被設(shè)置為'00:00:00',因?yàn)镈ATE值未包含時(shí)間信息.如果為一個(gè)DATE對(duì)象分配一個(gè)DATETIME或TIMESTAMP值,結(jié)果值的時(shí)間部分被刪除,因?yàn)镈ATE值未包含時(shí)間信息.
5.1.4文本字符串類型
字符串類型用來(lái)存儲(chǔ)字符串?dāng)?shù)據(jù),除了可以存儲(chǔ)字符串?dāng)?shù)據(jù)之外,還可以存儲(chǔ)其他數(shù)據(jù),比如圖片和聲音的二進(jìn)制數(shù)據(jù).MySQL支持兩類字符型數(shù)據(jù):文本字符串和二進(jìn)制字符串. 本小節(jié)主要講解文本字符串類型,文本字符串可以進(jìn)行區(qū)分或者不區(qū)分大小寫的串比較,另外,還可以進(jìn)行模式匹配查找.MySQL中文本字符串類型指CHAR、VARCHAR, TEXT、ENUM 和SET
MySQL中文本字符串?dāng)?shù)據(jù)類型
| 類型名稱 | 說(shuō)明 | 存儲(chǔ)需求 |
|---|---|---|
| CHAR(M) | 固定長(zhǎng)度非二進(jìn)制字符串 | M字節(jié),1<=M<=255 |
| VARCHAR(M) | 變長(zhǎng)非二進(jìn)制字符串 | L+1 字節(jié),在此 L<=M 和 1 <= M <= 255 |
| TINYTEXT | 非常小的非二進(jìn)制字符串 | L+1字節(jié),在此L<2^8 |
| TEXT | 小的非二進(jìn)制字符串 | L+2字節(jié)'在此L<2^16 |
| MEDIUMTEXT | 中等大小的非二進(jìn)制字符串 | L+3字節(jié),在此L<2^24 |
| LONGTEXT | 大的非二進(jìn)制字符串L+4字節(jié),在此L<2^32 | |
| ENUM | 枚舉類型,只能有一個(gè)枚舉字符串值 | 1或2個(gè)字節(jié),取決于枚舉值的數(shù)目(最大值65535) |
| SET | 一個(gè)設(shè)置,字符串對(duì)象可以有零個(gè)或多個(gè) SET成員 | 1,2,3,4或8個(gè)字節(jié),取決于集合成員的數(shù)量(最多64個(gè)成員) |
1.CHAR和VARCHAR類型
CHAR(M)為固定長(zhǎng)度字符串,在定義時(shí)指定字符串列長(zhǎng).當(dāng)保存時(shí)在右側(cè)填充空格以達(dá)到指定的長(zhǎng)度.M表示列長(zhǎng)度,M的范圍是0-255個(gè)字符.例如,CHAR(4)定義了一個(gè)固定 長(zhǎng)度的字符串列,其包含的字符個(gè)數(shù)最大為4.當(dāng)檢索到CHAR值時(shí),尾部的空格將被刪除掉.
VARCHAR(M)是長(zhǎng)度可變的字符串,M表示最大列長(zhǎng)度.M的范圍是0~65535. VARCHAR的最大實(shí)際長(zhǎng)度由最長(zhǎng)的行的大小和使用的字符集確定,而其實(shí)際占用的空間為字符串的實(shí)際長(zhǎng)度加1.例如,VARCHAR(50)定義了一個(gè)最大長(zhǎng)度為50的字符串,如果插入
的字符串只有10個(gè)字符,則實(shí)際存儲(chǔ)的字符串為10個(gè)字符和一個(gè)字符串結(jié)束字符.VARCHAR在值保存和檢索時(shí)尾部的空格仍保留.
CHAR(4)與VARCHAR(4)存儲(chǔ)區(qū)別
| 插入值 | CHAR(4) | 存儲(chǔ)需求 | VARCHAR(4) | 存儲(chǔ)需求 |
|---|---|---|---|---|
| '' | ' ' | 4字節(jié) | '' | 1字節(jié) |
| 'ab' | 'ab ' | 4字節(jié) | 'ab' | 3字節(jié) |
| 'abc' | 'abc ' | 4字節(jié) | 'abc' | 4字節(jié) |
| 'abcd' | 'abcd' | 4字節(jié) | 'abcd' | 5字節(jié) |
| 'abcdef' | 'abcd'4字節(jié) | 'abcd' | 5字節(jié) |
對(duì)比結(jié)果可以看到,CHAR(4)定義了固定長(zhǎng)度為4的列,不管存入的數(shù)據(jù)長(zhǎng)度為多少, 所占用的空間均為4個(gè)字節(jié), VARCHAR(4)定義的列所占的字節(jié)數(shù)為實(shí)際長(zhǎng)度加1.
提示:
在表中,最后一行的值只有在使用"不嚴(yán)格"模式時(shí),字符串才會(huì)被截?cái)嗖迦?如果 MySQL運(yùn)行在"嚴(yán)格"模式,超過(guò)列長(zhǎng)度的值不會(huì)被保存,并且會(huì)出現(xiàn)錯(cuò)誤信息:"ERROR 1406(22001):Data too long for column",即字符串長(zhǎng)度超過(guò)指定長(zhǎng)度,無(wú)法插入.
- TEXT類型
TEXT列保存非二進(jìn)制字符串,如文章內(nèi)容、評(píng)論等.當(dāng)保存或查詢TEXT列的值時(shí),不刪除尾部空格.Text類型分為4種:TINYTEXT, TEXT、MEDIUMTEXT 和 LONGTEXT. 不同的TEXT類型的存儲(chǔ)空間和數(shù)據(jù)長(zhǎng)度不同.
- TINYTEXT最大長(zhǎng)度為255(28-1)字符的TEXT列.
- TEXT最大長(zhǎng)度為65 535(216-1)字符的TEXT列.
- MEDIUMTEXT 最大長(zhǎng)度為 16 777 215(224-1)字符的 TEXT 列.
- LONGTEXT 最大長(zhǎng)度為 4 294 967 295 或 4GB(232-1)字符的 TEXT 列.
- ENUM類型
ENUM是一個(gè)字符串對(duì)象,其值為表創(chuàng)建時(shí)在列規(guī)定中枚舉的一列值.語(yǔ)法格式如下:
字段名 ENUM('值1','值2',...,'值n')
字段名指將要定義的字段,值n指枚舉列表中的第n個(gè)值.ENUM類型的字段在取值時(shí),只能在指定的枚舉列表中取,而且一次只能取一個(gè).如果創(chuàng)建的成員中有空格時(shí),其尾部的空格將自動(dòng)被刪除.ENUM值在內(nèi)部用整數(shù)表示,每個(gè)枚舉值均有一個(gè)索引值:列表值所允許的成員值從1開始編號(hào),MySQL存儲(chǔ)的就是這個(gè)索引編號(hào).枚舉最多可以有65535個(gè)元素.
提示:
ENUM列總有一個(gè)默認(rèn)值.如果將ENUM列聲明為NULL, NULL值則為該列的一個(gè)有效值,并且默認(rèn)值為NULL.如果ENUM列被聲明為NOT NULL,其默認(rèn)值為允許的值 列表的第1個(gè)元素.
- SET類型
SET是一個(gè)字符串對(duì)象,可以有零或多個(gè)值,SET列最多可以有64個(gè)成員,其值為表創(chuàng)建吋規(guī)定的一列值.指定包括多個(gè)SET成員的SET列值時(shí),各成員之間用逗號(hào)(,)間隔開.語(yǔ)法格式如下:
SET('值 1','值 2','值n')
與ENUM類型相同,SET值在內(nèi)部用整數(shù)表示,列表中每一個(gè)值都有一個(gè)索引編號(hào).當(dāng)創(chuàng)建表時(shí),SET成員值的尾部空格將自動(dòng)被刪除.但與ENUM類型不同的是,ENUM類型的字段只能從定義的列值中選擇一個(gè)值插入,而SET類型的列可從定義的列值中選擇多個(gè)字符的聯(lián)合.
如果插入SET字段中列值有重復(fù),則MySQL自動(dòng)刪除重復(fù)的值;插入SET字段的值的 順序并不重要,MySQL會(huì)在存入數(shù)據(jù)庫(kù)時(shí),按照定義的順序顯示;如果插入了不正確的值,默認(rèn)情況下,MySQL將忽視這些值,并給出警告.
5.1.5二進(jìn)制字符串類型
前面講解了存儲(chǔ)文本的字符串類型,這一小節(jié)將講解MySQL中存儲(chǔ)二進(jìn)制數(shù)據(jù)的字符串 類型.MySQL中的二進(jìn)制數(shù)據(jù)類型有:BIT、BINARY. VARBINARY、TINYBLOB, BLOB、MEDIUMBLOB和LONGBLOB,本節(jié)將講解各類二進(jìn)制字符串 類型 的特 點(diǎn)和 使用 方法 .
MySQL中的二進(jìn)制字符串類型
| 類型名稱 | 說(shuō)明 | 存儲(chǔ)需求 |
|---|---|---|
| BIT(M) | 位字段類型 | 大約(M+7)/8個(gè)字節(jié) |
| BINARY(M) | 固定長(zhǎng)度二進(jìn)制字符串 | M個(gè)字節(jié) |
| VARBINARY(M) | 可變長(zhǎng)度二進(jìn)制字符串 | M+1個(gè)字節(jié) |
| TINYBLOB(M) | 非常小的BLOB | L+1字節(jié),在此L<2^8 |
| BLOB(M) | 小BLOB | L+2字節(jié),在此L<2^16 |
| MEDIUMBLOB(M) | 中等大小的BLOB | L+3字節(jié),在此L<2^24 |
| LONGBLOB(M) | 非常大的BLOB | L+4字節(jié),在此L<^32 |
1.BIT類型
BIT類型是位字段類型.M表示每個(gè)值的位數(shù),范圍為1-64.如果M被省略,默認(rèn)為1. 如果為BIT(M)列分配的值的長(zhǎng)度小于M位,在值的左邊用0填充.例如,為BIT(6)列分配一 個(gè)值b'101',其效果與分配b'000101'相同.BIT數(shù)據(jù)類型用來(lái)保存位字段值,例如:以二進(jìn)制的形式保存數(shù)據(jù)13, 13的二進(jìn)制形式為1101,在這里需要位數(shù)至少為4位的BIT類型,即可以定義列類型為BIT(4).大于二進(jìn)制1111的數(shù)據(jù)是不能插入BIT(4)類型的字段中的.
提示:
默認(rèn)情況下,MySQL不可以插入超出該列允許范圍的值,因而插入的數(shù)據(jù)要確保插入的 值在指定的范圍內(nèi).
2.BINARY 和 VARBINARY 類型
BINARY和VARBINARY類型類似于CHAR和VARCHAR,不同的是它們包含二進(jìn)制字節(jié)字符串.其使用的語(yǔ)法格式如下:
列名稱 BINARY(M)或者 VARBINARY(M)
BINARY類型的長(zhǎng)度是固定的,指定長(zhǎng)度之后,不足最大長(zhǎng)度的,將在它們右邊填充'\0'補(bǔ)齊以達(dá)到指定長(zhǎng)度.例如:指定列數(shù)據(jù) 類型為BINARY(3), 當(dāng)插入'a'時(shí),存儲(chǔ)的內(nèi)容實(shí)際為"a\0\0",當(dāng)插入"ab"時(shí),實(shí)際存儲(chǔ)的內(nèi)容為"ab\0",不管存儲(chǔ)的內(nèi)容是否達(dá)到指定的長(zhǎng)度,其存儲(chǔ)空間均為指定的值M.
VARBINARY類型的長(zhǎng)度是可變的,指定好長(zhǎng)度之后,其長(zhǎng)度可以在0到最大值之間. 例如:指定列數(shù)據(jù)類型為VARBINARY(20),如果插入的值的長(zhǎng)度只有10,則實(shí)際存儲(chǔ)空間為10加1,即其實(shí)際占用的空間為字符串的實(shí)際長(zhǎng)度加1.
- BLOB類型
BLOB是一個(gè)二進(jìn)制大對(duì)象,用來(lái)存儲(chǔ)可變數(shù)量的數(shù)據(jù)oBLOB類型分為4種:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它們可容納值的最大長(zhǎng)度不同.
BLOB類型的存儲(chǔ)范圍
| 數(shù)據(jù)類型 | 存儲(chǔ)范圍 |
|---|---|
| TINYBLOB | 最大長(zhǎng)度為255(2^8-1)B |
| BLOB | 最大長(zhǎng)度為65535(2^16-1)B |
| MEDIUMBLOB | 最大長(zhǎng)度為16777215(2^24-1)B |
| LONGBLOB | 最大長(zhǎng)度為4294967295B或4GB(2^32-1)B |
BLOB列存儲(chǔ)的是二進(jìn)制字符串(字節(jié)字符串);TEXT列存儲(chǔ)的是非二進(jìn)制字符串(字符字符串).BLOB列沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值;TEXT列有一個(gè)字符集,并且根據(jù)字符集對(duì)值進(jìn)行排序和比較.
5.2 如何選擇數(shù)據(jù)類型
MySQL提供了大量的數(shù)據(jù)類型,為了優(yōu)化存儲(chǔ),提高數(shù)據(jù)庫(kù)性能,在任何情況下均應(yīng)使用最精確的類型.即在所有可以表示該列值的類型中,該類型使用的存儲(chǔ)最少.
整數(shù)和浮點(diǎn)數(shù)
如果不需要小數(shù)部分,則使用整數(shù)來(lái)保存數(shù)據(jù);如果需要表示小數(shù)部分,則使用浮點(diǎn)數(shù)類型.對(duì)于浮點(diǎn)數(shù)據(jù)列,存入的數(shù)值會(huì)對(duì)該列定義的小數(shù)位進(jìn)行四舍五入.例如,如果列的值的范圍為1-99999,若使用整數(shù),則MEDIUMINT UNSIGNED是最好的類型;若需要存儲(chǔ)小數(shù), 則使用FLOAT類型.
浮點(diǎn)類型包括FLOAT和DOUBLE類型.DOUBLE類型精度比FLOAT類型高,因此,如要求存儲(chǔ)精度較高時(shí),應(yīng)選擇DOUBLE類型.浮點(diǎn)數(shù)和定點(diǎn)數(shù)
浮點(diǎn)數(shù)FLOAT、DOUBLE相對(duì)于定點(diǎn)數(shù)DECIMAL的優(yōu)勢(shì)是:在長(zhǎng)度一定的情況下,浮點(diǎn)數(shù)能表示更大的數(shù)據(jù)范圍,但是由于浮點(diǎn)數(shù) 容易產(chǎn)生誤差,因此對(duì)精確度要求比較高時(shí),建議使用DECIMAL來(lái)存儲(chǔ).DECIMAL在MySQL中是以字符串存儲(chǔ)的,用于定義貨幣等對(duì)精確度要求較高的數(shù)據(jù).在數(shù)據(jù)遷移中,float(M,D)是非標(biāo)準(zhǔn)SQL定義,數(shù)據(jù)庫(kù)遷移可能會(huì)出現(xiàn)問(wèn)題,最好不要這樣使用. 另外兩個(gè)浮點(diǎn)數(shù)進(jìn)行減法和比較運(yùn)算時(shí)也容易出問(wèn)題,因此在進(jìn)行計(jì)算的時(shí)候,一定要小心.如果進(jìn)行數(shù)值比較,最好使用DECIMAL類型.日期與時(shí)間類型
MySQL對(duì)于不同種類的日期和時(shí)間有很多的數(shù)據(jù)類型,比如YEAR和TIME.如果只需 要記錄年份,則使用YEAR類型即可;如果只記錄時(shí)間,只需使用TIME類型.
如果同時(shí)需要記錄日期和時(shí)間,則可以使用TIMESTAMP或者DATETIME類型.由于TIMESTAMP列的取值范圍小于DATETIME的取值范圍,因此存儲(chǔ)范圍較大的日期最好使用 DATETIME.
TIMESTAMP也有一個(gè)DATETIME不具備的屬性.默認(rèn)的情況下,當(dāng)插入一條記錄但并沒有指定TIMESTAMP這個(gè)列值時(shí),MySQ L會(huì)把TIMESTAMP列設(shè)為當(dāng)前的時(shí)間.因此當(dāng)需要插入記錄同時(shí)插入當(dāng)前時(shí)間時(shí),使用TIMESTAMP是方便的,另外TIMESTAMP在空間上比DATETIME更有效.CHAR與VARCHAR之間的特點(diǎn)與選擇
CHAR和VARCHAR的區(qū)別如下:
- CHAR是固定長(zhǎng)度字符,VARCHAR是可變長(zhǎng)度字符;
- CHAR會(huì)自動(dòng)刪除插入數(shù)據(jù)的尾部空格,VARCHAR不會(huì)刪除尾部空格.
CHAR是固定長(zhǎng)度,所以它的處理速度比VARCHAR的速度要快,但是它的缺點(diǎn)就是浪費(fèi)存儲(chǔ)空間.所以對(duì)存儲(chǔ)不大,但在速度上有要求的可以使用CHAR類型,反之可以使用VARCHAR類型來(lái)實(shí)現(xiàn).
存儲(chǔ)引擎對(duì)于選擇CHAR和VARCHAR的影響:
- 對(duì)于MylSAM存儲(chǔ)引擎:最好使用固定長(zhǎng)度的數(shù)據(jù)列代替可變長(zhǎng)度的數(shù)據(jù)列.這樣可以使整個(gè)表靜態(tài)化,從而使數(shù)據(jù)檢索更快,用空間換時(shí)間.
- 對(duì)于InnoDB存儲(chǔ)引擎:使用可變長(zhǎng)度的數(shù)據(jù)列,因?yàn)镮nnoDB數(shù)據(jù)表的存儲(chǔ)格式不分固定長(zhǎng)度和可變長(zhǎng)度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照實(shí)際的長(zhǎng)度存儲(chǔ),比較節(jié)省空間,所以對(duì)磁盤I/O和數(shù)椐存儲(chǔ)總量
比較好.
ENUM 和 SET
ENUM只能取單值,它的數(shù)據(jù)列表是一個(gè)枚舉集合.它的合法取值列表最多允許有65535個(gè)成員.因此,在需要從多個(gè)值中選取一個(gè)時(shí),可以使用ENUM.比如:性別字段適合定義 為ENUM類型,每次只能從'男'或'女'中取一個(gè)值.
SET可取多值.它的合法取值列表最多允許有64個(gè)成員.空字符串也是一個(gè)合法的SET值.在需要取多個(gè)值的時(shí)候,適合使用SET類型,比如:要存儲(chǔ)一個(gè)人興趣愛好,最好使用 SET類型.
ENUM和SET的值是以字符串形式出現(xiàn)的,但在內(nèi)部,MySQL以數(shù)值的形式存儲(chǔ)它們.BLOB 和 TEXT
BLOB是二進(jìn)制字符串,TEXT是非二進(jìn)制字符串,兩者均可存放大容量的信息.BLOB 主要存儲(chǔ)圖片、音頻信息等,而TEXT只能存儲(chǔ)純文本文件.
5.3 常見運(yùn)算符介紹
5.3.1運(yùn)算符概述
運(yùn)算符是告訴MySQL執(zhí)行特定算術(shù)或邏輯操作的符號(hào).MySQL的內(nèi)部運(yùn)算符很豐富, 主要有四大類,分別是:算術(shù)運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符.
- 算術(shù)運(yùn)算符
算術(shù)運(yùn)算符用于各類數(shù)值運(yùn)算,包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運(yùn)算,%). - 比較運(yùn)算符
比較運(yùn)算符用于比較運(yùn)算.包括大于(>)、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!=),以及 IN、BETWEEN AND, IS NULL> GREATEST> LEAST. LIKE、REGEXP 等. - 邏輯運(yùn)算符
邏輯運(yùn)算符的求值所得結(jié)果均為1(TRUE)、0(FALSE),這類運(yùn)算符有邏輯非(NOT或者!)、邏輯與(AND或者&&)、邏輯或(OR或者||)、邏輯異或(XOR). - 位操作作運(yùn)算符
位操作運(yùn)算符參與運(yùn)算的操作數(shù)按二進(jìn)制位進(jìn)行運(yùn)算.包括位與(&)、位或(I)、位非(~)、位異或(^)、左移(<<)、右移(>>)6種.
5.3.2算術(shù)運(yùn)算符
MySQL中的算術(shù)運(yùn)算符
| 運(yùn)算符 | 作用 |
|---|---|
| + | 加法運(yùn)算 |
| - | 減法運(yùn)算 |
| * | 乘法運(yùn)算 |
| / | 除法運(yùn)算,返回商 |
| % | 求余運(yùn)算,返回余數(shù) |
5.3.3比較運(yùn)算符
一個(gè)比較運(yùn)算符的結(jié)果總是1、0或者是NULL,比較運(yùn)算符經(jīng)常在 SELECT的查詢條件子句中使用,用來(lái)查詢滿足指定條件的記錄.
MySQL中的比較運(yùn)算符
| 運(yùn)算符 | 作用 |
|---|---|
| = | 等于 |
| <=> | 安全的等于 |
| <>(!=) | 不等于 |
| <= | 小于等于 |
| >= | 大于等于 |
| > | 大于 |
| IS NULL | 判斷一個(gè)值是否為NULL |
| IS NOT NULL | 判斷一個(gè)值是否不為NULL |
| LEAST | 在有兩個(gè)或多個(gè)參數(shù)時(shí),返回最小值 |
| GREATEST | 當(dāng)有兩或多個(gè)參數(shù)時(shí),返回最大值 |
| BETWEEN AND | 判斷一個(gè)值是否落在兩個(gè)值之間 |
| ISNULL | 與IS NULL作用相同 |
| IN | 判斷-個(gè)值是IN列表中的任意一個(gè)值 |
| NOT IN | 判斷一個(gè)值不是IN列表中的任意一個(gè)值 |
| LIKE | 通配符匹配 |
| REGEXP | 正則表達(dá)式匹配 |
1.等于運(yùn)算符(=)
等號(hào)(=)用來(lái)判斷數(shù)字、字符串和表達(dá)式是否相等.如果相等,返回值為1,否則返回值為0.
數(shù)值比較時(shí)有如下規(guī)則:
- 若有一個(gè)或兩個(gè)參數(shù)為NULL,則比較運(yùn)算的結(jié)果為NULL.
- 若同一個(gè)比較運(yùn)算中的兩個(gè)參數(shù)都是字符串,則按照字符串進(jìn)行比較.
- 若兩個(gè)參數(shù)均為整數(shù),則按照整數(shù)進(jìn)行比較.
- 若一個(gè)字符串和數(shù)字進(jìn)行相等判斷,則MySQL可以自動(dòng)將字符串轉(zhuǎn)換為數(shù)字.
2.安全耔運(yùn)算符(<=>)
這個(gè)操作符和=操作符執(zhí)行相同的比較操作,不過(guò)<=>可以用來(lái)判斷NULL值.在兩個(gè)操作數(shù)均為NULL時(shí),其返回值為1而不為NULL;而當(dāng)一個(gè)操作數(shù)為NULL時(shí),其返回值為0而不為NULL.
'<=>'在執(zhí)行比較操作時(shí)和的作用是相似的,唯一的區(qū)別是'<=>'可以用來(lái)對(duì)NULL進(jìn)行判斷,兩者都為NULL時(shí)返回值為1.
3.不等于運(yùn)算符( <>或者!=)
'<>'或者'!='用于判斷數(shù)字、字符串、表達(dá)式不相等的判斷.如果不相等,返冋值為1;否則返回值為0.這兩個(gè)運(yùn)算符不能用于判斷空值NULL.
4.小于或等于運(yùn)算符(<=)
'<='用來(lái)判斷左邊的操作數(shù)是否小于或者等于右邊的操作數(shù).如果小于或者等于,返回值為1,否則返回值為0.'<='不能用于判斷空值NULL.
5.小于運(yùn)算符(<)
'<'運(yùn)算符用來(lái)判斷左邊的操作數(shù)是否小于右邊的操作數(shù),如果小于,返回值為1;否則返回值為0. '<'不能用于判斷空值NULL.
6.大于或等于運(yùn)算符(>=)
'>='運(yùn)算符用來(lái)判斷左邊的操作數(shù)是否大于或者等于右邊的操作數(shù),如果大于或者等于,返回值為1;否則返回值為0.'>='不能用于判斷空值NULL.
大于運(yùn)算符(>)
'>'運(yùn)算符用來(lái)判斷左邊的操作數(shù)是否大于右邊的操作數(shù),如果大于,返回值為1;否則返回值為0.不能用于判斷空值NULL.IS NULL(ISNULL), IS NOT NULL 運(yùn)算符
IS NULL和ISNULL檢驗(yàn)一個(gè)值是否為NULL,如果為NULL,返回值為1.否則返回值為0;IS NOT NULL檢驗(yàn)一個(gè)值是否為非NULL,如果是非NULL,返回值為1;否則返回值為0.BETWEEN AND 運(yùn)算符
語(yǔ)法格式為:expr BETWEEN min AND max.假如expr大于或等于min且小于或等于max,則BETWEEN的返回值為1.否則返回值為0.LEAST運(yùn)算符
語(yǔ)法格式為:LEAST(值1,值2,...,值n),其中值n表示參數(shù)列表中有n個(gè)值.在有兩個(gè)或多個(gè)參數(shù)的情況下,返回最小值.假如任意一個(gè)自變量為NULL,則LEAST()的返回值為NULL.GREATEST(valuel ,value2,...)
語(yǔ)法格式為:GREATEST(值1,值2,...,值n),其中n表示參數(shù)列表中有n個(gè)值.當(dāng)有2個(gè)或多個(gè)參數(shù)時(shí),返回值為最大值,假如任意一個(gè)自變量為NULL,則GREATEST()的返回值為NULL.IN. NOT IN 運(yùn)算符
IN運(yùn)算符用來(lái)判斷操作數(shù)是否為IN列表中的其中一個(gè)值,如果是,返回值為1;否則返回值0.
NOT IN運(yùn)算符用來(lái)判斷表達(dá)式是否為IN列表中的其中一個(gè)值,如果不是,返回值為1:否則返回值為0.
LIKE
LIKE運(yùn)算符用來(lái)匹配字符串,語(yǔ)法格式為:expr LIKE匹配條件,如果expr滿足匹配條件,則返回值為1(TRUE);如果不匹配,則返回值為0(FALSE).若expr或匹配條件中 任何一個(gè)為NULL,則結(jié)果為NULL.
LIKE運(yùn)算符在進(jìn)行匹配時(shí),可以使用下面兩種通配符:
(1)'%',匹配任何數(shù)目的字符,甚至包括零字符.
(2)'_',只能匹配一個(gè)字符.REGEXP
REGEXP運(yùn)算符用來(lái)匹配字符串,語(yǔ)法格式為:expr REGEXP匹配條件,如果expr滿足匹配條件,返回1;如果不滿足,則返回0;若expr或匹配條件任意一個(gè)為NULL,則結(jié)果為NULL.
REGEXP運(yùn)算符在進(jìn)行匹配時(shí),常用的有下面幾種通配符:
- '^':匹配以該字符后面的字符開頭的字符串.
- '$':匹配以該字符后面的字符結(jié)尾的字符串.
- '.':匹配任何一個(gè)單字符.
- [...]:匹配在方括號(hào)內(nèi)的任何字符.例如,"[abc] "匹配"a"、"b"或"c". 為了命名字符的范圍,使用一個(gè)."[a-z]"匹配任何字母,而"[0-9]"匹配任何數(shù)字.
- '':匹配零個(gè)或多個(gè)在它前面的字符.例如,"X"匹配任何數(shù)量的'X'字符, "[0-9]*"匹配任何數(shù)量的數(shù)字,而匹配任何數(shù)量的任何字符.
5.3.4邏輯運(yùn)算符
在SQL中,所有邏輯運(yùn)算符的求值所得結(jié)果均為TRUE、FALSE或NULL.在MySQL中,它們體現(xiàn)為l(TRUE)、0(FALSE)和NULL.
MySQL中的邏輯運(yùn)算符
| 運(yùn)算符 | 作用 | ||
|---|---|---|---|
| NOT或者! | 邏輯非 | ||
| AND或者&& | 邏輯與 | ||
| OR或者 | 邏輯或 | ||
| XOR | 邏輯異或 |
NOT或者!
邏輯非運(yùn)算符NOT或者!表示當(dāng)操作數(shù)為0時(shí),所得值為1;當(dāng)操作數(shù)為非零值時(shí),所 得值為0;當(dāng)操作數(shù)為NULL時(shí),所得的返回值為NULL.AND 或者 &&
邏輯與運(yùn)算符AND或者&&表示當(dāng)所有操作數(shù)均為非零值、并且不為NULL時(shí),計(jì)算所得結(jié)果為1;當(dāng)一個(gè)或多個(gè)操作數(shù)為0時(shí),所得結(jié)果為0,其余情況返回值為NULL.OR或者||
邏輯或運(yùn)算符OR或者||表示當(dāng)兩個(gè)操作數(shù)均為非NULL值,且任意一個(gè)操作數(shù)為非零值時(shí),結(jié)果為1,否則結(jié)果為0;當(dāng)有一個(gè)操作數(shù)為NULL,且另一個(gè)操作數(shù)為非零值時(shí),則結(jié) 果為1,否則結(jié)果為NULL;當(dāng)兩個(gè)操作數(shù)均為NULL時(shí),則所得結(jié)果為NULL.
- XOR
邏輯異或運(yùn)算符XOR.當(dāng)任意一個(gè)操作數(shù)為NULL時(shí),返回值為NULL;對(duì)于非NULL 的操作數(shù),如果兩個(gè)操作數(shù)都是非0值或者都是0值,則返回結(jié)果為0;如果一個(gè)為0值,另一個(gè)為非0值,返回結(jié)果為1.
a XOR b 的計(jì)算等同于(a AND(NOT b))或者((NOT a)AND b)
5.3.5位運(yùn)算符
位運(yùn)算符是用來(lái)對(duì)二進(jìn)制字節(jié)中的位進(jìn)行測(cè)試、移位或者測(cè)試處理,MySQL中提供的位運(yùn)算符有按位 或(|),按 位與(&), 按位異或(^),按位左移(<<),按位右移(>>),按位取反(~).
MySQL中的位運(yùn)算符
| 運(yùn)算符 | 作用 |
|---|---|
| | | 位或 |
| & | 位與 |
| ^ | 位異或 |
| << | 位左移 |
| >> | 位右移 |
| ? | 位取反,反轉(zhuǎn)所有比特 |
1.位或運(yùn)算符(|)
位或運(yùn)算的實(shí)質(zhì)是將參與運(yùn)算的幾個(gè)數(shù)據(jù),按對(duì)應(yīng)的二進(jìn)制數(shù)逐位進(jìn)行邏輯或運(yùn)算.對(duì)應(yīng)的二進(jìn)制位有一個(gè)或兩個(gè)為1,則該位的運(yùn)算結(jié)果為1,否則為0.
2.位與運(yùn)算符(&)
位與運(yùn)算的實(shí)質(zhì)是將參與運(yùn)算的幾個(gè)操作數(shù),按對(duì)應(yīng)的二進(jìn)制數(shù)逐位進(jìn)行邏輯與運(yùn)算.對(duì)應(yīng)的二進(jìn)制位都為1,則該位的運(yùn)算結(jié)果為1,否則為0.
3.位異或運(yùn)算符(^)
位異或運(yùn)算的實(shí)質(zhì)是將參與運(yùn)算的兩個(gè)數(shù)據(jù),按對(duì)應(yīng)的二進(jìn)制數(shù)逐位進(jìn)行邏輯異或運(yùn)算.對(duì)應(yīng)位的二進(jìn)制數(shù)不同時(shí),對(duì)應(yīng)位的結(jié)果才為1.如果兩個(gè)對(duì)應(yīng)位數(shù)都為0或者都為1,則對(duì)應(yīng)位的結(jié)果為0.
4.位左移運(yùn)算符(<<)
位左移運(yùn)算符<<使指定的二進(jìn)制值的所有位都左移指定的位數(shù).左移指定位數(shù)之后,左邊高位的數(shù)值將被移出并丟棄,右邊低位空出的位置用0補(bǔ)齊.語(yǔ)法格式為:expr << n.這里 n指定值expr要移位的位數(shù).
5.位右移運(yùn)算符(>>)
位右移運(yùn)算符>>使指定的二進(jìn)制值的所有位都右移指定的位數(shù).右移指定位數(shù)之后,右 邊低位的數(shù)值將被移出并丟棄,左邊高位空出的位置用0補(bǔ)齊.語(yǔ)法格式為:expr >> n.這里 n指定值expr要移位的位數(shù).
6.位取反運(yùn)算符(~)
位取反運(yùn)算的實(shí)質(zhì)是將參與運(yùn)算的數(shù)據(jù),按對(duì)應(yīng)的二進(jìn)制數(shù)逐位反轉(zhuǎn),即1取反后變0, 0取反后變?yōu)?.
5.3.6運(yùn)算符的優(yōu)先級(jí)
運(yùn)算符的優(yōu)先級(jí)決定了不同的運(yùn)算符在表達(dá)式中計(jì)算的先后順序,表5.14列出了 MySQL中的各類運(yùn)算符及其優(yōu)先級(jí).
| 優(yōu)先級(jí) | 運(yùn)算符 | |
|---|---|---|
| 最低 | =(賦值運(yùn)算),:= | |
| , OR | ||
| XOR | ||
| &&, AND | ||
| NOT | ||
| BETWEEN, CASE, WHEN, THEN, ELSE | ||
| =(比較運(yùn)算),<=>,>=,>,<=,<,?,!= , IS, LIKE, REGEXP, IN | ||
| 1 | ||
| & | ||
| <<, >> | ||
| *, /(DIV), %(MOD) | ||
| ^ | ||
| -(負(fù)號(hào)),~(位反轉(zhuǎn)) | ||
| 最高 | I |
5.4 綜合案例--運(yùn)算符的使用
5.5 專家解惑
疑問(wèn)1:MySQL中如何使用特殊字符?
諸如單引號(hào)('),雙引號(hào)("),反斜線(1)等符號(hào),這些符號(hào)在MySQL中不能直接輸 入使用,否則會(huì)產(chǎn)生意料之外的結(jié)果.在MySQL中,這些特殊字符稱為轉(zhuǎn)義字符,在輸入時(shí) 需要以反斜線符號(hào)('V )開頭,所以在使用單引號(hào)和雙引號(hào)時(shí)應(yīng)分別輸入(V)或者(V), 輸入反斜線時(shí)應(yīng)該輸入(\),其他特殊字符還有回車符(\r),換行符(\n),制表符(\tab), 退格符(\b)等.在向數(shù)據(jù)庫(kù)中插入這些特殊字符時(shí),一定要進(jìn)行轉(zhuǎn)義處理.
疑問(wèn)2:MySQL中可以存儲(chǔ)文件嗎?
MySQL中的BLOB和TEXT字段類型可以存儲(chǔ)數(shù)據(jù)量較大的文件,可以使用這些數(shù)據(jù)類 型存儲(chǔ)圖像、聲音或者是大容量的文本內(nèi)容,例如網(wǎng)頁(yè)或者文檔.雖然使用BLOB或者TEXT 可以存 儲(chǔ)大容 量的數(shù) 據(jù),但 是對(duì)這 些字段 的處理會(huì) 降低數(shù)據(jù) 庫(kù)的性能 .如果并 非必要,可以選 擇只儲(chǔ)存文件的路徑.
疑問(wèn)3:MySQL中如何執(zhí)行區(qū)分大小寫的字符串t哦?
在Windows平臺(tái)下,MySQL是不區(qū)分大小的,因此字符串比較函數(shù)也不區(qū)分大小寫.如果想執(zhí)行區(qū)分大小寫的比較,可以在字符串前面添加BINARY關(guān)鍵字.例如默認(rèn)情況下,'a'='A'返回結(jié)果為1,如果使用BINARY關(guān)鍵字,BINARY 'a' = 'A'結(jié)果為0,在區(qū)分大 小寫的情況下,'a'與'A'并不相同.