概念
數(shù)據(jù)庫是計(jì)算機(jī)應(yīng)用系統(tǒng)中的一種專門管理數(shù)據(jù)資源的系統(tǒng)。數(shù)據(jù)庫就是一組經(jīng)過計(jì)算機(jī)整理后的數(shù)據(jù),存儲(chǔ)在一個(gè)或者多個(gè)文件中,而管理這個(gè)數(shù)據(jù)庫的軟件就稱為數(shù)據(jù)庫管理系統(tǒng)。
主流的軟件開發(fā)中應(yīng)用數(shù)據(jù)庫有Oracle,SQL Server,PostgreSQL,MySQL等。
數(shù)據(jù)庫在Web開發(fā)中的重要地位
動(dòng)態(tài)網(wǎng)站都是對(duì)數(shù)據(jù)進(jìn)行操作,我們平時(shí)瀏覽網(wǎng)頁時(shí),會(huì)發(fā)現(xiàn)網(wǎng)頁的內(nèi)容會(huì)經(jīng)常變化,而頁面的主體結(jié)構(gòu)框架沒變,Web系統(tǒng)的開發(fā)基本上都離不開數(shù)據(jù)庫,因?yàn)槿魏螙|西都要存放在數(shù)據(jù)庫中。
所謂的動(dòng)態(tài)網(wǎng)站就是基于數(shù)據(jù)庫開發(fā)的系統(tǒng),最重要的就是數(shù)據(jù)管理,或者說我們?cè)陂_發(fā)時(shí)都是在圍繞數(shù)據(jù)庫在寫程序。我們?cè)賮砘仡櫹耊eb工作原理:

環(huán)境準(zhǔn)備
PHPstudy


環(huán)境變量
-
win 鍵搜索編輯系統(tǒng)環(huán)境變量 點(diǎn)擊進(jìn)入
image.png -
依次如圖,將 MYSQL 加入環(huán)境變量中去
image.png
命令行連接
-
win + R鍵 輸入cmd呼出命令行窗口
image.png - 測(cè)試 MYSQL 是否能正確運(yùn)行 輸入
mysql -V
image.png - 連接數(shù)據(jù)庫 輸入
mysql -uroot -p回車并輸入密碼
mysql –h 服務(wù)器主機(jī)地址 –u 用戶名 –p 用戶密碼

認(rèn)識(shí) SQL
對(duì)數(shù)據(jù)庫服務(wù)器中數(shù)據(jù)的管理,必須使用客戶機(jī)程序成功連接以后,再通過必要的操作指令對(duì)其進(jìn)行操作,這種數(shù)據(jù)庫操作指令被稱為SQL(Structured Query Language)語言,即結(jié)構(gòu)化查詢語言。
MySQL支持SQL作為自己的數(shù)據(jù)庫語言,SQL是一種專門用于查詢和修改數(shù)據(jù)庫里的數(shù)據(jù),以及對(duì)數(shù)據(jù)庫進(jìn)行管理和維護(hù)的標(biāo)準(zhǔn)化語言。
SQL語言結(jié)構(gòu)簡潔,功能強(qiáng)大,簡單易學(xué),所以自從IBM公司1981年退出以來,SQL語言得到了廣泛的應(yīng)用。
無論是Oracle,Sybase,Informix,SQL Server這些大型的數(shù)據(jù)庫管理系統(tǒng),還是像Visual Foxpro,PowerBuilder這些PC上常用的數(shù)據(jù)庫開發(fā)系統(tǒng),都支持SQL語言作為查詢語言。
創(chuàng)建數(shù)據(jù)庫
- 建立數(shù)據(jù)庫:
CREATE DATABASE [IF NOT EXISTS] 數(shù)據(jù)庫名稱;
- 刪除數(shù)據(jù)庫:
DROP DATABASE [IF EXISTS] 數(shù)據(jù)庫名稱;
- 顯示當(dāng)前數(shù)據(jù)庫服務(wù)器下的所有數(shù)據(jù)庫列表:
SHOW DATABASES;
- 選擇數(shù)據(jù)庫:
USE 數(shù)據(jù)庫名稱;
注意:
1.MySQL數(shù)據(jù)庫中命令不區(qū)分大小寫。
2.每創(chuàng)建一個(gè)數(shù)據(jù)庫,就會(huì)在data目錄下創(chuàng)建一個(gè)以此數(shù)據(jù)庫名稱命名的文件夾。
3.在Windows下,數(shù)據(jù)庫名稱也是不區(qū)分大小寫的,但在Linux下,數(shù)據(jù)庫名稱嚴(yán)格區(qū)分大小寫。
數(shù)據(jù)表概念
數(shù)據(jù)表是數(shù)據(jù)庫中的基本對(duì)象元素,以記錄(行)和字段(列)組成的二維結(jié)構(gòu)用于存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)表由表結(jié)構(gòu)和表內(nèi)容兩部分組成,先建立表結(jié)構(gòu),然后才能輸入數(shù)據(jù)。數(shù)據(jù)表結(jié)構(gòu)設(shè)計(jì)主要包括字段名稱、字段類型和字段屬性的設(shè)置。
通常情況下,同一個(gè)數(shù)據(jù)庫中可以有多個(gè)數(shù)據(jù)表,但表名必須是唯一的,表中每一條記錄描述了一個(gè)相關(guān)信息的集合,每一個(gè)字段必須為唯一的,每個(gè)字段都需要指定數(shù)據(jù)類型。
數(shù)據(jù)列四大數(shù)據(jù)類型
數(shù)值類數(shù)據(jù)列類型
| 數(shù)據(jù)類型 | 存儲(chǔ)空間 | 說明 | 取值范圍 |
|---|---|---|---|
| TINYINT | 1字節(jié) | 非常小的整數(shù) | 帶符號(hào)值:-128127、無符號(hào)值:0255 |
| SMALLINT | 2字節(jié) | 較小的整數(shù) | 帶符號(hào)值:-3276832767、無符號(hào)值:065535 |
| MEDIUMINT | 3字節(jié) | 中等大小的整數(shù) | 帶符號(hào)值:-83886088388607、無符號(hào)值:016777215 |
| INT | 4字節(jié) | 標(biāo)準(zhǔn)整數(shù) | 帶符號(hào)值:-21474836482147483647、無符號(hào)值:04294967295 |
| BIGINT | 8字節(jié) | 大整數(shù) | 帶符號(hào)值:-263263-1、無符號(hào)值:0264-1 |
| FLOAT | 4或8字節(jié) | 單精度浮點(diǎn)數(shù) | 最小非零值:+- 1.175494351E-38、最大非零值:+- 3.402823466E+38 |
| DOUBLE | 8字節(jié) | 雙精度浮點(diǎn)數(shù) | 最小非零值:+- 2.225073E-308、最大非零值:+- 1.797693E+308 |
| DECIMAL | 自定義 | 以字符串形式表示的浮點(diǎn)數(shù) | 取決于存儲(chǔ)單元字節(jié)數(shù) |
整型注意事項(xiàng):
INT(3)、SMALLINT(3)等整型后面的數(shù)字不會(huì)影響數(shù)值的存儲(chǔ)范圍,只會(huì)影響顯示
整型后面的數(shù)字只有配合零填充的時(shí)候才有實(shí)際意義。
整型后面的數(shù)字可以省略
浮點(diǎn)型注意事項(xiàng):
浮點(diǎn)型后面的數(shù)字會(huì)將存入的數(shù)字四舍五入,例如:把一個(gè)1.234存入FLOAT(6,1)數(shù)據(jù)列中,結(jié)果是1.2,6代表顯示長度,1代表小數(shù)位長度,會(huì)四舍五入。
字符串類數(shù)據(jù)列類型
| 數(shù)據(jù)類型 | 存儲(chǔ)空間 | 說明 | 取值范圍 |
|---|---|---|---|
| CHAR[(M)] | M字節(jié) | 定長字符串 | M字節(jié) |
| VARCHAR[(M)] | L+1字節(jié) | 可變字符串 | M字節(jié) |
| TINYBLOB,TINYTEXT | L+1字節(jié) | 非常小的BLOB(二進(jìn)制大對(duì)象)和文本串 | 28-1字節(jié) |
| BLOB,TEXT | L+2字節(jié) | 小BLOB和文本串 | 216-1字節(jié) |
| MEDIUMBLOB,MEDIUMTEXT | L+3字節(jié) | 中等的BLOB和文本串 | 224-1字節(jié) |
| LONGBLOB,LONGTEXT | L+4字節(jié) | 大BLOB和文本串 | 232-1字節(jié) |
| ENUM(‘value1’,’value2’…) | 1或2字節(jié) | 枚舉:可賦予某個(gè)枚舉成員 | 65535個(gè)成員 |
| SET(‘value1’,‘value2’…) | 1,2,3,4或8字節(jié) | 集合:可賦予多個(gè)集合成員 | 64個(gè)成員 |
字符串類型注意事項(xiàng):
CHAR和VARCHAR類型的長度范圍都在0~255之間
在使用CHAR和VARCHAR類型時(shí),當(dāng)我們傳入的實(shí)際的值的長度大于指定的長度,字符串會(huì)被截取至指定長度
在使用CHAR類型時(shí),如果我們傳入的值的長度小于指定長度,實(shí)際長度會(huì)使用空格補(bǔ)至指定長度在使用VARCHAR類型時(shí),如果我們傳入的值的長度小于指定長度,實(shí)際長度即為傳入字符串的長度,不會(huì)使用空格填補(bǔ)
CHAR要比VARCHAR效率更高,當(dāng)占用空間較大
BLOB和TEXT類型是可以存放任意大數(shù)據(jù)的數(shù)據(jù)類型
BLOB區(qū)分大小寫,TEXT不區(qū)分大小寫ENUM和SET類型是特殊的的串類型,其列值必須從固定的串集中選擇
ENUM只能選擇其中一個(gè)值,SET可以選擇多個(gè)值
日期和時(shí)間類數(shù)據(jù)列類型
| 數(shù)據(jù)類型 | 存儲(chǔ)空間 | 說明 | 取值范圍 |
|---|---|---|---|
| DATE | 3 字節(jié) | “YYYY-MM-DD”格式表示的日期值 | 1000-01-01~9999-12-31 |
| TIME | 3 字節(jié) | “hh:mm:ss”格式表示的時(shí)間值 | -838:59:59-838:59:59 |
| DATETIME | 8 字節(jié) | “YYYY-MM-DD hh:mm:ss”格式 | 1000-01-01 00:00:00~9999-12-31 |
| TIMESTAMP | 4 字節(jié) | “YYYYMMDDhhmmss”格式表示的時(shí)間戳 | 19700101000000-2037年的某個(gè)時(shí)刻 |
| YEAR | 1 字節(jié) | “YYYY”格式的年份值 | 1901~2155 |
日期類型注意事項(xiàng):
- 存儲(chǔ)日期時(shí),我們可以使用整型來進(jìn)行存儲(chǔ)時(shí)間戳,這樣做便于我們進(jìn)行日期的計(jì)算
NULL值
NULL值注意事項(xiàng):
NULL意味著“沒有值”或“未知值”
可以測(cè)試某個(gè)值是否為NULL
不能對(duì)NULL值進(jìn)行算術(shù)計(jì)算
對(duì)NULL值進(jìn)行算術(shù)運(yùn)算,其結(jié)果還是NULL
0或NULL都意味著假,其余值都意味著真
數(shù)據(jù)字段屬性
UNSIGNED
只能用于設(shè)置數(shù)值類型,不允許出現(xiàn)負(fù)數(shù)
最大存儲(chǔ)長度會(huì)增加一倍
ZEROFILL
只能用于設(shè)置數(shù)值類型,在數(shù)值之前會(huì)自動(dòng)用0補(bǔ)齊不足的位數(shù)
AUTO_INCREMENT
用于設(shè)置字段的自動(dòng)增長屬性,每增加一條記錄,該字段的值會(huì)自動(dòng)加1
NULL和NOT NULL
默認(rèn)為NULL,即插入值時(shí)沒有在此字段插入值,默認(rèn)為NULL值,如果指定了NOT NULL,則必須在插入值時(shí)在此字段填入值
DEFAULT
可以通過此屬性來指定一個(gè)默認(rèn)值,如果沒有在此列添加值,那么默認(rèn)添加此值
創(chuàng)建索引
在MySQL中,主要有四類索引:
- 主鍵索引(PRIMARY KEY)
主鍵索引是關(guān)系數(shù)據(jù)庫中最常見的索引類型,主要作用是確定數(shù)據(jù)表里一條特定的數(shù)據(jù)記錄的位置。我們可以在字段后添加PRIMARY KEY來對(duì)字段設(shè)置為主鍵索引。
注意:
1.最好為每張表指定一個(gè)主鍵,但不是必須指定。
2.一個(gè)表只能指定一個(gè)主鍵,而且主鍵的值不能為空
3.主鍵可以有多個(gè)候選索引(例如NOT NULL,AUTO_INCREMENT)
- 唯一索引(UNIQUE)
唯一索引與主鍵索引一樣,都可以防止創(chuàng)建重復(fù)的值。但是,不同之處在于,每個(gè)數(shù)據(jù)表中只能有一個(gè)主鍵索引,但可以有多個(gè)唯一索引。我們使用關(guān)鍵字UNIQUE對(duì)字段定義為唯一索引。
- 常規(guī)索引(INDEX)
常規(guī)索引技術(shù)是關(guān)系數(shù)據(jù)查詢中最重要的技術(shù),如果要提升數(shù)據(jù)庫的性能,索引優(yōu)化是首先應(yīng)該考慮的,因?yàn)樗苁刮覀兊臄?shù)據(jù)庫得到最大性能方面的提升。常規(guī)索引也存在缺點(diǎn):
1.多占用磁盤空間
2.會(huì)減慢插入,刪除和修改操作
3.需要按照索引列上排序格式執(zhí)行
創(chuàng)建索引我們可以使用INDEX和KEY關(guān)鍵字隨表一同創(chuàng)建。
- 全文索引(FULLTEXT)
全文索引在MySQL中是一個(gè)FULLTEXT類型索引,但FULLTEXT索引只能用于MyISAM表,并且只可以在CHAR、VARCHAR或TEXT類型的列上創(chuàng)建,也允許創(chuàng)建在一個(gè)或多個(gè)數(shù)據(jù)列上。
但是FULLTEXT是不支持中文全文索引的,所以我們將來會(huì)使用效率更高的全文索引引擎Sphinx。
數(shù)據(jù)表的存儲(chǔ)類型及存儲(chǔ)位置
MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等多種數(shù)據(jù)表類型,在創(chuàng)建一個(gè)新MySQL數(shù)據(jù)表時(shí),可以為它設(shè)置一個(gè)類型。
MyISAM和InnoDB兩種表類型最為重要:
1.MyISAM數(shù)據(jù)表類型的特點(diǎn)是成熟、穩(wěn)定和易于管理。
2.MyISAM表類型會(huì)產(chǎn)生碎片空間,要經(jīng)常使用OPTIMIZE TABLE命令去清理表空間
3.MyISAM不支持事務(wù)處理,InnoDB支持
4.MyISAM不支持外鍵,InnoDB支持
5.MyISAM表類型的數(shù)據(jù)表效率更高
6.MyISAM表類型的數(shù)據(jù)表會(huì)產(chǎn)生三個(gè)文件,InnoDB表類型表默認(rèn)只會(huì)產(chǎn)生一個(gè)文件。
字符集
創(chuàng)建表的時(shí)候,如果沒有明確地指定任何字符集,則新創(chuàng)建數(shù)據(jù)表的字符集將由MySQL配置文件里charcter-set-server選項(xiàng)的設(shè)置決定。
在創(chuàng)建數(shù)據(jù)表時(shí)如果需要指定默認(rèn)的字符集與之相同,但MySQL客戶程序在與服務(wù)器通信時(shí)使用的字符集,我們需要使用default-character-set選項(xiàng)或通過SQL命令SET NAMES utf8來指定一個(gè)字符集為utf8.
創(chuàng)建表
創(chuàng)建數(shù)據(jù)表之前,我們應(yīng)該注意:
1.創(chuàng)建數(shù)據(jù)庫(如已存在則不需要?jiǎng)?chuàng)建)
2.選擇數(shù)據(jù)庫
3.在該數(shù)據(jù)庫當(dāng)中創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表需要注意:
1.指定數(shù)據(jù)表的名稱(數(shù)據(jù)表不能重名)
2.指定該表的字段名稱、字段數(shù)據(jù)類型、字段索引
3.指定表類型和表默認(rèn)字符集(可省略)
建表實(shí)例
| 中文名 | 字段名 | 數(shù)據(jù)類型 | 屬性 | 索引 |
|---|---|---|---|---|
| 用戶編號(hào) | id | INT | UNSIGNED NOT NULL AUTO_INCREMENT | 主鍵 |
| 用戶名稱 | username | VARCHAR(50) | NOT NULL | 普通 |
| 口令 | userpass | VARCHAR(50) | NOT NULL | 普通 |
| 聯(lián)系電話 | telno | VARCHAR(20) | NOT NULL | 唯一 |
| 性別 | sex | ENUM(‘男’,’女’) | NOT NULL DEFAULT ‘男’ | |
| 出生日期 | birthday | DATE | NOT NULL DEFAULT ‘0000-00-00’ |
CREATE TABLE IF NOT EXISTS `users`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`userpass` VARCHAR(50) NOT NULL,
`telno` VARCHAR(20) NOT NULL UNIQUE,
`sex` ENUM('nan','nv') NOT NULL DEFAULT 'nan',
`birthday` DATE NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY(`id`),
INDEX username_index(`username`),
INDEX userpass_index(`userpass`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci ;
注意事項(xiàng):
1.表的字段之間要使用逗號(hào)隔開。
2.建表的最后一句一定不能有逗號(hào)。
3.表名稱和字段名稱盡量不要使用MySQL系統(tǒng)的關(guān)鍵字
4.如果一定要使用關(guān)鍵字,我們可以使用反引號(hào)將表名稱和字段名稱包含起來來進(jìn)行過濾屏蔽。
5.使用反引號(hào)會(huì)使建表效率增高。
6.數(shù)據(jù)表名稱和字段名稱不能重名
7.AUTO_INCREMENT屬性必須依附于主鍵索引或唯一索引
修改數(shù)據(jù)表
修改表的語法:
ALTER TABLE 表名 ACTION;
我們可以對(duì)表進(jìn)行修改字段,添加字段,刪除字段,添加索引,刪除索引,更改表名稱,更改字段名稱,更改auto_increment屬性的初始值等。
修改字段:
我們使用change或者是modify關(guān)鍵字
ALTER TABLE `uses` CHANGE `username` `uname` VARCHAR(32) NOT NULL;
ALTER TABLE `users` MODIFY `username` VARCHAR(32) NOT NULL;
由上例可以發(fā)現(xiàn):
change可以改變字段名稱,而modify不可以
添加字段:
我們使用add關(guān)鍵字
ALTER TABLE `uses` ADD `tname` VARCHAR(32) NOT NULL;
這樣我們就會(huì)新增一個(gè)tname字段。
刪除字段:
我們使用drop關(guān)鍵字
ALTER TABLE `users` DROP `tname`;
這樣我們會(huì)刪除tname字段
添加索引:
我們使用add關(guān)鍵字
ALTER TABLE `uses` ADD INDEX/UNIQUE/PRIMARY KEY 索引名稱(字段名稱)
這樣會(huì)在該字段上建立索引(普通索引,唯一索引,主鍵索引)。
刪除索引:
ALTER TABLE `users` DROP INDEX/UNIQUE/PRIMARY KEY 索引名稱;
這樣我們會(huì)刪除這個(gè)索引,我們可以使用show indexes from 表名查看當(dāng)前表索引。
更改表名稱:
我們使用rename關(guān)鍵字
ALTER TABLE 舊表名 RENAME AS 新表名
將舊表名更改為新表名
更改AUTO_INCREMENT初始值:
ALTER TABLE 表名稱 AUTO_INCREMENT=1
將AUTO_INCREMENT的初始值設(shè)置為1
刪除表:
DROP TABLE [IF EXISTS] 表名稱;
操作數(shù)據(jù)表中的數(shù)據(jù)記錄(DML語句)
使用INSERT語句向數(shù)據(jù)表中添加數(shù)據(jù)
插入數(shù)據(jù)是向已經(jīng)存在的數(shù)據(jù)表中添加一條新的記錄,應(yīng)該使用INSERT INTO語句。
格式:
INSERT INTO 表名 [(字段名1,字段名2,…字段名n)] VALUES(‘值1’,‘值2’,…,’值n’);
或者
INSERT INTO 表名 [(字段名1,字段名2,…字段名n)] VALUES(‘值1’,‘值2’,…,‘值n’),(‘值1’,‘值2’,…,’值n’);
使用UPDATE語句更新數(shù)據(jù)表中已存在的數(shù)據(jù)
SQL語句可以使用UPDATE語句對(duì)表中的一列或多列數(shù)據(jù)進(jìn)行修改,必須指定需要修改的字段,并且需要賦予的新值。還要給出必要的WHERE子句指定要更新的數(shù)據(jù)行。
格式:
UPDATE 表名 SET 字段名=表達(dá)式 [,…][WHERE 條件]
[ORDER BY 字段][LIMIT 行數(shù)]
使用DELETE語句刪除數(shù)據(jù)表中不需要的數(shù)據(jù)記錄
DELETE語句用來刪除數(shù)據(jù)表中的一條或多條數(shù)據(jù)記錄。
格式:
DELETE FROM 表名 [WHERE 條件][ORDER BY 字段][LIMIT 行數(shù)]
通過DQL命令查詢數(shù)據(jù)表中的數(shù)據(jù)
查詢語句可以完成簡單的單表查詢,也可以完成復(fù)雜的多表查詢和嵌套查詢。SELECT語句主要用于數(shù)據(jù)的查詢檢索,是SQL語言的核心,在SQL語言中SELECT語句的使用頻率是最高的。
格式:
SELECT [ALL|DISTINCT]{*|table.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}FROM 表名
[WHERE子句]
[GROUP BY..][HAVING..][ORDER BY..][LIMIT count];
選擇特定的字段
最簡單的查詢語句是使用SELECT語句檢索記錄的特定字段,多個(gè)字段可以用逗號(hào)分隔,例如:
SELECT username,password FROM user;
也可以使用*從表中檢索出所有字段,使用SELECT *主要是針對(duì)用戶的書寫方便而言的。如果一張表當(dāng)中的數(shù)據(jù)多大幾百萬,就意味著資源的浪費(fèi)和漫長的查詢等待,所以實(shí)際應(yīng)用時(shí)要盡量避免使用它,而把查詢的列名準(zhǔn)確地列出來,也可以按自己指定的列順序輸出。
使用AS子句為字段取別名
如果想為返回的列取一個(gè)新的標(biāo)題,以及經(jīng)過對(duì)字段的計(jì)算或總結(jié)之后,產(chǎn)生了一個(gè)新的值,希望把它放到一個(gè)新的列里顯示,則用AS保留。例如:在上例的輸出結(jié)果中使用中文字段名,可以在MySQL控制臺(tái)中輸入的命令如下所示:
SELECT username as '用戶名' FROM user;
定義別名時(shí)一定要使用單引號(hào)引起來,其中AS關(guān)鍵字是可選的,在原字段名和別名之間使用一個(gè)空格即可。
SELECT username ‘用戶名’ FROM user;
DISTINCT關(guān)鍵字的使用
如果在使用SELECT語句返回的記錄結(jié)果中包含重復(fù)的記錄,可以使用DISTINCT關(guān)鍵字取消重復(fù)的數(shù)據(jù),只返回一個(gè)。另外,要注意DISTINCT關(guān)鍵字的作用是整個(gè)查詢的列表,而不是單獨(dú)的一列。DISTINCT會(huì)消耗一定的服務(wù)器資源,如果不指定,會(huì)默認(rèn)使用ALL關(guān)鍵字作為檢索模式
SELECT DISTINCT gid FROM user_group;
在SELECT語句中使用表達(dá)式的列
在SQL中的表達(dá)式用法和PHP程序相似,主要包括算術(shù)表達(dá)式、邏輯表達(dá)式,以及使用SQL函數(shù)表達(dá)式等。
例如:
SELECT version(),1.23*10;
使用WHERE子句按條件檢索
在SELECT語句中,可以使用WHERE子句指定搜索條件,實(shí)現(xiàn)從數(shù)據(jù)表中檢索出符合條件的記錄。其中,搜索條件可以由一個(gè)或多個(gè)邏輯表達(dá)式組成,這些表達(dá)式指定關(guān)于某一記錄是真或假的條件。在WHERE子句中,可以通過邏輯操作符和比較操作符指定基本的表達(dá)式條件。
- 邏輯操作符
| 操作符 | 語法 | 描述 |
|---|---|---|
| AND 或 && | a AND b 或 a && b | 邏輯與,若兩個(gè)操作數(shù)同時(shí)為真,則為真 |
| OR 或 丨丨 | a OR b 或 a丨丨b | 邏輯或,只要有一個(gè)操作數(shù)為真,則為真 |
| XOR | a XOR b | 邏輯異或,若有且僅有一個(gè)操作數(shù)為真,則為真 |
| NOT 或 ! | NOT a 或 !a | 邏輯非,若操作數(shù)為假,則為真 |
- 比較操作符
| 數(shù)據(jù)列類型 | 存儲(chǔ)空間 說明 | 取值范圍 |
|---|---|---|
| = | a=b | 若操作數(shù)a與操作數(shù)b相等,則為真 |
| <=> | a<=>b | 若a與b相等,則為真,可以用于NULL值比較 |
| !=或<> | a!=b或a<>b | 若操作數(shù)a與b不相等,為真 |
| < | a<b | 若操作數(shù)a小于b,為真 |
| <= | a<=b | 若操作數(shù)a大于b,為真 |
| > | a>b | 若操作數(shù)a大于b,為真 |
| >= | a>=b | 若操作數(shù)a大于等于b,為真 |
| IS NULL | a IS NULL | 若操作數(shù)a為NULL,為真 |
| IS NOT NULL | a IS NOT NULL | 若操作數(shù)a不為NULL,為真 |
| BETWEEN | a BETWEEN b AND c | 若a在b和c之間,為真 |
| NOT BETWEEN | a NOT BETWEEN b AND c | 若操作數(shù)a不在b和c之間,為真 |
| LIKE | a LIKE b | SQL模式匹配,若a匹配b,為真 |
| NOT LIKE | a NOT LIKE b | SQL模式匹配,若a不匹配b,則為真 |
| IN | a IN (b1,b2….) | 若a等于b1,b2,b3,…中的某一個(gè),則為真 |
在構(gòu)造搜索條件時(shí),要注意只能對(duì)數(shù)值數(shù)據(jù)類型的記錄進(jìn)行算術(shù)運(yùn)算,并且只能在相同的數(shù)據(jù)類型之間進(jìn)行記錄的比較。
根據(jù)空值(NULL)確定檢索條件
空值只能定義在允許NULL字段中出現(xiàn),NULL值是特殊的值,代表“無值”,與零值(0)和空字符串('')都不相同。當(dāng)在不支持默認(rèn)值的字段中未輸入值,或在字段中顯式的設(shè)置為空,就會(huì)出現(xiàn)空值,但不能用處理已知值的方式來處理NULL。為了進(jìn)行NULL值的搜索,必須采用特殊的語法。如果要檢索NULL值,必須使用IS NULL和IS NOT NULL關(guān)鍵字。
使用BEETWEEN AND進(jìn)行范圍比較查詢
如果需要對(duì)某個(gè)字段通過范圍的值進(jìn)行比較查詢,可以使用BETWEEN AND關(guān)鍵字實(shí)現(xiàn),其中AND是多重條件符號(hào),比較時(shí)也包括邊界條件。也可以使用>=和<=完成同樣的功能。
使用IN進(jìn)行范圍比對(duì)查詢
在WHERE子句中,使用IN關(guān)鍵字并在后面的括號(hào)()中提供一個(gè)值的列表,以供與相應(yīng)的字段進(jìn)行比較。該列表中至少應(yīng)該存在一個(gè)值,如果有多個(gè)值可以使用逗號(hào),分隔。
使用LIKE進(jìn)行模糊查詢
在SELECT語句的WHERE子句中,可以使用LIKE關(guān)鍵字對(duì)數(shù)據(jù)表中的記錄進(jìn)行模糊查詢,將查詢結(jié)果鎖定在一個(gè)范圍內(nèi)。在查詢條件中通常會(huì)與_和%兩個(gè)通配符一起使用,可以實(shí)現(xiàn)復(fù)雜的檢索查詢。這兩個(gè)通配符的含義分別如下:
- 百分號(hào)“%”:表示0個(gè)或任意多個(gè)字符。
- 下畫線“_”:表示單個(gè)的任意一個(gè)字符。
相反的,不匹配我們使用NOT LIKE
多表查詢(連接查詢)
多表查詢給用戶帶來很大的靈活性,可以在任何時(shí)候增加新的數(shù)據(jù)類型,為不同實(shí)體創(chuàng)建新的表,然后通過連接進(jìn)行查詢。包括兩種形式:
-
非等值和等值的多表查詢
多表查詢和普通的單表查詢相似,都是使用SELECT語句。只不過在多表查詢時(shí)需要把多張表的名字,全部填寫在FROM子句中,并用逗號(hào),將表名分開。同時(shí),也可以對(duì)數(shù)據(jù)表使用別名進(jìn)行引用。另外,為了在查詢時(shí)區(qū)分多個(gè)表中出現(xiàn)的重復(fù)字段名,可以在字段列表中使用表名.列名的形式,如果不存在重名的列,可以省略表名。
-
自身連接查詢
連接查詢操作不僅可以用于多個(gè)表之間,也可以是一個(gè)表與其自己進(jìn)行連接,稱為自身連接查詢。當(dāng)一個(gè)表所代表的實(shí)體之間有關(guān)系時(shí),就可以使用自身連接查詢。
-
復(fù)合連接查詢
前面介紹的多表查詢是兩個(gè)表之間,只有一個(gè)WHERE子句查詢條件。如果在FROM子句后面有n個(gè)表需要查詢,則在WHERE子句中就需要有多個(gè)連接條件。至少要比出現(xiàn)的表格數(shù)量少1個(gè),也就是不能少于n?1個(gè)查詢條件,多個(gè)條件使用AND關(guān)鍵詞連接即可。
嵌套查詢(子查詢)
這種查詢是在一個(gè)SELECT語句的WHERE子句中,包含另一個(gè)SELECT語句,也可以稱為子查詢。在子查詢中只能返回一列,并將形成的結(jié)果又作為父查詢的條件,在主句中進(jìn)行進(jìn)一步查詢。 SQL語言允許多層嵌套查詢,即一個(gè)子查中還可以有其他子查詢。嵌套查詢的求解方法是由里向外處理,即每個(gè)子查詢都是在上一級(jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。
使用ORDER BY對(duì)查詢結(jié)果排序
使用SELECT語句獲取數(shù)據(jù)表中的數(shù)據(jù)時(shí),返回的記錄一般是無規(guī)則排列的,有可能每次獲取的查詢記錄截然不同。為了使用檢索的結(jié)果方便閱讀,可以在SELECT語句中使用ORDER BY子句,對(duì)檢索的結(jié)果進(jìn)行排序。
ORDER BY后面可以接一列或多列用于排序的字段,并且使用DESC或ASC關(guān)鍵字設(shè)計(jì)字段排序的方式。默認(rèn)情況下按照升序排列,即使用ASC關(guān)鍵字。否則要按照降序排列,必須使用DESC關(guān)鍵字。ORDER BY子句可以和SELECT語句中的其他子句一起使用,但在子查詢中不能有ORDER BY子句,因?yàn)镺RDER BY子句只能對(duì)最終查詢結(jié)果排序。
使用LIMIT
如果在數(shù)據(jù)表中的記錄數(shù)非常多,一次從表中返回大量的記錄不僅檢索的速度慢,用戶閱讀也很不方便。所以在通過SELECT語句檢索時(shí),使用LIMIT子句一次取少量的記錄,而用分頁的方式繼續(xù)閱讀后面的數(shù)據(jù)。
LIMIT子句也可以和其他的SELECT子句一起使用,它可以指定兩個(gè)參數(shù),分別用以設(shè)置返回記錄的起始位置,和返回記錄的數(shù)量。
LIMIT子句也可以只使用一個(gè)參數(shù),表示從開頭位置,即偏移量為0的位置返回指定數(shù)量的記錄,在上例中使用的“LIMIT 0, 5”等價(jià)于“LIMIT 5”。
使用統(tǒng)計(jì)函數(shù)
在數(shù)據(jù)庫系統(tǒng)中提供了一系列的內(nèi)置統(tǒng)計(jì)函數(shù),在SQL查詢中使用這些統(tǒng)計(jì)函數(shù)可以更有效地處理數(shù)據(jù)。這些統(tǒng)計(jì)函數(shù)把存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù),描述為一個(gè)整體而不是一行行孤立的記錄。
| 統(tǒng)計(jì)函數(shù) | 描述 |
|---|---|
| COUNT() | 返回滿足SELECT語句中指定條件的記錄數(shù),例如,COUNT(*)返回找到的記錄行數(shù) |
| SUM() | 通常為數(shù)值字段或表達(dá)列作統(tǒng)計(jì),返回一列的總和 |
| AVG() | 通常為數(shù)值字段或表達(dá)列作統(tǒng)計(jì),返回一列的平均值 |
| MAX() | 可以為數(shù)值字段、字符字段或表達(dá)列作統(tǒng)計(jì),返回一列中最大的值 |
| MIN() | 可以為數(shù)值字段、字符字段或表達(dá)列統(tǒng)計(jì),返回一列中最小的值 |
這些函數(shù)通常用在SELECT子句中,作為結(jié)果數(shù)據(jù)集的字段返回的結(jié)果。在SELECT語句的SELECT子句中使用函數(shù)的語法如下:
SELECT 函數(shù)名(列名1 或*),...函數(shù)名(列名n) FROM 表名;
使用GROUP BY對(duì)查詢結(jié)果分組
前面使用統(tǒng)計(jì)函數(shù)返回的是所有記錄的統(tǒng)計(jì)結(jié)果,如果要對(duì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì),就需要使用GROUP BY子句。這將可以允許用戶在對(duì)數(shù)據(jù)進(jìn)行分類的基礎(chǔ)上,進(jìn)行再查詢。GROUP BY子句將表按列值分組,列的值相同的分為一組。如果GROUP BY后面有多個(gè)列名,則先按第一個(gè)列名分組,再在每組中按第二個(gè)列名分組。
需要注意的是,在GROUP BY子句中不支持對(duì)字段分配別名,也不支持任何使用了統(tǒng)計(jì)函數(shù)的集合列。
在完成數(shù)據(jù)結(jié)果的分組查詢和統(tǒng)計(jì)后,還可以使用HAVING子句來對(duì)查詢的結(jié)果,進(jìn)行進(jìn)一步的篩選。
在SELECT語句的子句中:WHERE子句選擇所需要的行;GROUP BY子句進(jìn)行了必要的分組整理;而HAVING子句對(duì)最后的分組結(jié)果進(jìn)行了重新篩選。



