概念
數(shù)據(jù)庫是計算機(jī)應(yīng)用系統(tǒng)中的一種專門管理數(shù)據(jù)資源的系統(tǒng)痊臭。數(shù)據(jù)庫就是一組經(jīng)過計算機(jī)整理后的數(shù)據(jù)藏畅,存儲在一個或者多個文件中蝙砌,而管理這個數(shù)據(jù)庫的軟件就稱為數(shù)據(jù)庫管理系統(tǒng)随夸。
主流的軟件開發(fā)中應(yīng)用數(shù)據(jù)庫有Oracle靖避,SQL Server潭枣,PostgreSQL,MySQL等幻捏。
數(shù)據(jù)庫在Web開發(fā)中的重要地位
動態(tài)網(wǎng)站都是對數(shù)據(jù)進(jìn)行操作盆犁,我們平時瀏覽網(wǎng)頁時,會發(fā)現(xiàn)網(wǎng)頁的內(nèi)容會經(jīng)常變化篡九,而頁面的主體結(jié)構(gòu)框架沒變谐岁,Web系統(tǒng)的開發(fā)基本上都離不開數(shù)據(jù)庫,因為任何東西都要存放在數(shù)據(jù)庫中榛臼。
所謂的動態(tài)網(wǎng)站就是基于數(shù)據(jù)庫開發(fā)的系統(tǒng)伊佃,最重要的就是數(shù)據(jù)管理,或者說我們在開發(fā)時都是在圍繞數(shù)據(jù)庫在寫程序沛善。我們再來回顧下Web工作原理:
環(huán)境準(zhǔn)備
PHPstudy
環(huán)境變量
-
win 鍵搜索編輯系統(tǒng)環(huán)境變量 點擊進(jìn)入
-
依次如圖航揉,將 MYSQL 加入環(huán)境變量中去
命令行連接
-
win + R
鍵 輸入cmd
呼出命令行窗口
- 測試 MYSQL 是否能正確運行 輸入
mysql -V
- 連接數(shù)據(jù)庫 輸入
mysql -uroot -p
回車并輸入密碼
mysql –h 服務(wù)器主機(jī)地址 –u 用戶名 –p 用戶密碼
認(rèn)識 SQL
對數(shù)據(jù)庫服務(wù)器中數(shù)據(jù)的管理,必須使用客戶機(jī)程序成功連接以后金刁,再通過必要的操作指令對其進(jìn)行操作帅涂,這種數(shù)據(jù)庫操作指令被稱為SQL(Structured Query Language)語言,即結(jié)構(gòu)化查詢語言尤蛮。
MySQL支持SQL作為自己的數(shù)據(jù)庫語言媳友,SQL是一種專門用于查詢和修改數(shù)據(jù)庫里的數(shù)據(jù),以及對數(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)建一個數(shù)據(jù)庫,就會在data目錄下創(chuàng)建一個以此數(shù)據(jù)庫名稱命名的文件夾容客。
3.在Windows下秕铛,數(shù)據(jù)庫名稱也是不區(qū)分大小寫的,但在Linux下缩挑,數(shù)據(jù)庫名稱嚴(yán)格區(qū)分大小寫但两。
數(shù)據(jù)表概念
數(shù)據(jù)表是數(shù)據(jù)庫中的基本對象元素,以記錄(行)和字段(列)組成的二維結(jié)構(gòu)用于存儲數(shù)據(jù)供置。數(shù)據(jù)表由表結(jié)構(gòu)和表內(nèi)容兩部分組成谨湘,先建立表結(jié)構(gòu),然后才能輸入數(shù)據(jù)芥丧。數(shù)據(jù)表結(jié)構(gòu)設(shè)計主要包括字段名稱紧阔、字段類型和字段屬性的設(shè)置。
通常情況下娄柳,同一個數(shù)據(jù)庫中可以有多個數(shù)據(jù)表寓辱,但表名必須是唯一的,表中每一條記錄描述了一個相關(guān)信息的集合赤拒,每一個字段必須為唯一的秫筏,每個字段都需要指定數(shù)據(jù)類型。
數(shù)據(jù)列四大數(shù)據(jù)類型
數(shù)值類數(shù)據(jù)列類型
數(shù)據(jù)類型 | 存儲空間 | 說明 | 取值范圍 |
---|---|---|---|
TINYINT | 1字節(jié) | 非常小的整數(shù) | 帶符號值:-128127挎挖、無符號值:0255 |
SMALLINT | 2字節(jié) | 較小的整數(shù) | 帶符號值:-3276832767这敬、無符號值:065535 |
MEDIUMINT | 3字節(jié) | 中等大小的整數(shù) | 帶符號值:-83886088388607、無符號值:016777215 |
INT | 4字節(jié) | 標(biāo)準(zhǔn)整數(shù) | 帶符號值:-21474836482147483647蕉朵、無符號值:04294967295 |
BIGINT | 8字節(jié) | 大整數(shù) | 帶符號值:-263263-1崔涂、無符號值:0264-1 |
FLOAT | 4或8字節(jié) | 單精度浮點數(shù) | 最小非零值:+- 1.175494351E-38、最大非零值:+- 3.402823466E+38 |
DOUBLE | 8字節(jié) | 雙精度浮點數(shù) | 最小非零值:+- 2.225073E-308始衅、最大非零值:+- 1.797693E+308 |
DECIMAL | 自定義 | 以字符串形式表示的浮點數(shù) | 取決于存儲單元字節(jié)數(shù) |
整型注意事項:
INT(3)冷蚂、SMALLINT(3)等整型后面的數(shù)字不會影響數(shù)值的存儲范圍,只會影響顯示
整型后面的數(shù)字只有配合零填充的時候才有實際意義汛闸。
整型后面的數(shù)字可以省略
浮點型注意事項:
浮點型后面的數(shù)字會將存入的數(shù)字四舍五入蝙茶,例如:把一個1.234存入FLOAT(6,1)數(shù)據(jù)列中,結(jié)果是1.2,6代表顯示長度诸老,1代表小數(shù)位長度隆夯,會四舍五入。
字符串類數(shù)據(jù)列類型
數(shù)據(jù)類型 | 存儲空間 | 說明 | 取值范圍 |
---|---|---|---|
CHAR[(M)] | M字節(jié) | 定長字符串 | M字節(jié) |
VARCHAR[(M)] | L+1字節(jié) | 可變字符串 | M字節(jié) |
TINYBLOB,TINYTEXT | L+1字節(jié) | 非常小的BLOB(二進(jìn)制大對象)和文本串 | 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é) | 枚舉:可賦予某個枚舉成員 | 65535個成員 |
SET(‘value1’蹄衷,‘value2’…) | 1,2,3,4或8字節(jié) | 集合:可賦予多個集合成員 | 64個成員 |
字符串類型注意事項:
CHAR和VARCHAR類型的長度范圍都在0~255之間
在使用CHAR和VARCHAR類型時忧额,當(dāng)我們傳入的實際的值的長度大于指定的長度,字符串會被截取至指定長度
在使用CHAR類型時愧口,如果我們傳入的值的長度小于指定長度睦番,實際長度會使用空格補至指定長度在使用VARCHAR類型時,如果我們傳入的值的長度小于指定長度耍属,實際長度即為傳入字符串的長度抡砂,不會使用空格填補
CHAR要比VARCHAR效率更高,當(dāng)占用空間較大
BLOB和TEXT類型是可以存放任意大數(shù)據(jù)的數(shù)據(jù)類型
BLOB區(qū)分大小寫恬涧,TEXT不區(qū)分大小寫ENUM和SET類型是特殊的的串類型注益,其列值必須從固定的串集中選擇
ENUM只能選擇其中一個值,SET可以選擇多個值
日期和時間類數(shù)據(jù)列類型
數(shù)據(jù)類型 | 存儲空間 | 說明 | 取值范圍 |
---|---|---|---|
DATE | 3 字節(jié) | “YYYY-MM-DD”格式表示的日期值 | 1000-01-01~9999-12-31 |
TIME | 3 字節(jié) | “hh:mm:ss”格式表示的時間值 | -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”格式表示的時間戳 | 19700101000000-2037年的某個時刻 |
YEAR | 1 字節(jié) | “YYYY”格式的年份值 | 1901~2155 |
日期類型注意事項:
- 存儲日期時溯捆,我們可以使用整型來進(jìn)行存儲時間戳丑搔,這樣做便于我們進(jìn)行日期的計算
NULL值
NULL值注意事項:
NULL意味著“沒有值”或“未知值”
可以測試某個值是否為NULL
不能對NULL值進(jìn)行算術(shù)計算
對NULL值進(jìn)行算術(shù)運算,其結(jié)果還是NULL
0或NULL都意味著假提揍,其余值都意味著真
數(shù)據(jù)字段屬性
UNSIGNED
只能用于設(shè)置數(shù)值類型啤月,不允許出現(xiàn)負(fù)數(shù)
最大存儲長度會增加一倍
ZEROFILL
只能用于設(shè)置數(shù)值類型,在數(shù)值之前會自動用0補齊不足的位數(shù)
AUTO_INCREMENT
用于設(shè)置字段的自動增長屬性劳跃,每增加一條記錄谎仲,該字段的值會自動加1
NULL和NOT NULL
默認(rèn)為NULL,即插入值時沒有在此字段插入值刨仑,默認(rèn)為NULL值郑诺,如果指定了NOT NULL,則必須在插入值時在此字段填入值
DEFAULT
可以通過此屬性來指定一個默認(rèn)值杉武,如果沒有在此列添加值辙诞,那么默認(rèn)添加此值
創(chuàng)建索引
在MySQL中,主要有四類索引:
- 主鍵索引(PRIMARY KEY)
主鍵索引是關(guān)系數(shù)據(jù)庫中最常見的索引類型轻抱,主要作用是確定數(shù)據(jù)表里一條特定的數(shù)據(jù)記錄的位置飞涂。我們可以在字段后添加PRIMARY KEY來對字段設(shè)置為主鍵索引。
注意:
1.最好為每張表指定一個主鍵祈搜,但不是必須指定较店。
2.一個表只能指定一個主鍵,而且主鍵的值不能為空
3.主鍵可以有多個候選索引(例如NOT NULL容燕,AUTO_INCREMENT)
- 唯一索引(UNIQUE)
唯一索引與主鍵索引一樣梁呈,都可以防止創(chuàng)建重復(fù)的值。但是缰趋,不同之處在于捧杉,每個數(shù)據(jù)表中只能有一個主鍵索引,但可以有多個唯一索引秘血。我們使用關(guān)鍵字UNIQUE對字段定義為唯一索引味抖。
- 常規(guī)索引(INDEX)
常規(guī)索引技術(shù)是關(guān)系數(shù)據(jù)查詢中最重要的技術(shù),如果要提升數(shù)據(jù)庫的性能灰粮,索引優(yōu)化是首先應(yīng)該考慮的仔涩,因為它能使我們的數(shù)據(jù)庫得到最大性能方面的提升。常規(guī)索引也存在缺點:
1.多占用磁盤空間
2.會減慢插入粘舟,刪除和修改操作
3.需要按照索引列上排序格式執(zhí)行
創(chuàng)建索引我們可以使用INDEX和KEY關(guān)鍵字隨表一同創(chuàng)建熔脂。
- 全文索引(FULLTEXT)
全文索引在MySQL中是一個FULLTEXT類型索引,但FULLTEXT索引只能用于MyISAM表柑肴,并且只可以在CHAR霞揉、VARCHAR或TEXT類型的列上創(chuàng)建,也允許創(chuàng)建在一個或多個數(shù)據(jù)列上晰骑。
但是FULLTEXT是不支持中文全文索引的适秩,所以我們將來會使用效率更高的全文索引引擎Sphinx。
數(shù)據(jù)表的存儲類型及存儲位置
MySQL支持MyISAM硕舆、InnoDB秽荞、HEAP、BOB抚官、ARCHIVE扬跋、CSV等多種數(shù)據(jù)表類型,在創(chuàng)建一個新MySQL數(shù)據(jù)表時凌节,可以為它設(shè)置一個類型钦听。
MyISAM和InnoDB兩種表類型最為重要:
1.MyISAM數(shù)據(jù)表類型的特點是成熟、穩(wěn)定和易于管理倍奢。
2.MyISAM表類型會產(chǎn)生碎片空間彪见,要經(jīng)常使用OPTIMIZE TABLE命令去清理表空間
3.MyISAM不支持事務(wù)處理,InnoDB支持
4.MyISAM不支持外鍵娱挨,InnoDB支持
5.MyISAM表類型的數(shù)據(jù)表效率更高
6.MyISAM表類型的數(shù)據(jù)表會產(chǎn)生三個文件余指,InnoDB表類型表默認(rèn)只會產(chǎn)生一個文件。
字符集
創(chuàng)建表的時候跷坝,如果沒有明確地指定任何字符集酵镜,則新創(chuàng)建數(shù)據(jù)表的字符集將由MySQL配置文件里charcter-set-server選項的設(shè)置決定。
在創(chuàng)建數(shù)據(jù)表時如果需要指定默認(rèn)的字符集與之相同柴钻,但MySQL客戶程序在與服務(wù)器通信時使用的字符集淮韭,我們需要使用default-character-set選項或通過SQL命令SET NAMES utf8來指定一個字符集為utf8.
創(chuàng)建表
創(chuàng)建數(shù)據(jù)表之前,我們應(yīng)該注意:
1.創(chuàng)建數(shù)據(jù)庫(如已存在則不需要創(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ù)據(jù)類型 | 屬性 | 索引 |
---|---|---|---|---|
用戶編號 | 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 ;
注意事項:
1.表的字段之間要使用逗號隔開蜡吧。
2.建表的最后一句一定不能有逗號。
3.表名稱和字段名稱盡量不要使用MySQL系統(tǒng)的關(guān)鍵字
4.如果一定要使用關(guān)鍵字占键,我們可以使用反引號將表名稱和字段名稱包含起來來進(jìn)行過濾屏蔽昔善。
5.使用反引號會使建表效率增高。
6.數(shù)據(jù)表名稱和字段名稱不能重名
7.AUTO_INCREMENT屬性必須依附于主鍵索引或唯一索引
修改數(shù)據(jù)表
修改表的語法:
ALTER TABLE 表名 ACTION;
我們可以對表進(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;
這樣我們就會新增一個tname字段难述。
刪除字段:
我們使用drop
關(guān)鍵字
ALTER TABLE `users` DROP `tname`;
這樣我們會刪除tname字段
添加索引:
我們使用add
關(guān)鍵字
ALTER TABLE `uses` ADD INDEX/UNIQUE/PRIMARY KEY 索引名稱(字段名稱)
這樣會在該字段上建立索引(普通索引楞艾,唯一索引,主鍵索引)龄广。
刪除索引:
ALTER TABLE `users` DROP INDEX/UNIQUE/PRIMARY KEY 索引名稱;
這樣我們會刪除這個索引硫眯,我們可以使用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語句對表中的一列或多列數(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語句檢索記錄的特定字段畦幢,多個字段可以用逗號分隔坎吻,例如:
SELECT username,password FROM user;
也可以使用*
從表中檢索出所有字段,使用SELECT *
主要是針對用戶的書寫方便而言的宇葱。如果一張表當(dāng)中的數(shù)據(jù)多大幾百萬瘦真,就意味著資源的浪費和漫長的查詢等待刊头,所以實際應(yīng)用時要盡量避免使用它,而把查詢的列名準(zhǔn)確地列出來诸尽,也可以按自己指定的列順序輸出原杂。
使用AS子句為字段取別名
如果想為返回的列取一個新的標(biāo)題,以及經(jīng)過對字段的計算或總結(jié)之后弦讽,產(chǎn)生了一個新的值,希望把它放到一個新的列里顯示膀哲,則用AS
保留往产。例如:在上例的輸出結(jié)果中使用中文字段名,可以在MySQL控制臺中輸入的命令如下所示:
SELECT username as '用戶名' FROM user;
定義別名時一定要使用單引號引起來某宪,其中AS
關(guān)鍵字是可選的仿村,在原字段名和別名之間使用一個空格即可。
SELECT username ‘用戶名’ FROM user兴喂;
DISTINCT關(guān)鍵字的使用
如果在使用SELECT語句返回的記錄結(jié)果中包含重復(fù)的記錄蔼囊,可以使用DISTINCT
關(guān)鍵字取消重復(fù)的數(shù)據(jù),只返回一個衣迷。另外畏鼓,要注意DISTINCT關(guān)鍵字的作用是整個查詢的列表,而不是單獨的一列壶谒。DISTINCT會消耗一定的服務(wù)器資源云矫,如果不指定,會默認(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子
句指定搜索條件菌瘪,實現(xiàn)從數(shù)據(jù)表中檢索出符合條件的記錄腮敌。其中,搜索條件可以由一個或多個邏輯表達(dá)式組成俏扩,這些表達(dá)式指定關(guān)于某一記錄是真或假的條件缀皱。在WHERE子句中,可以通過邏輯操作符和比較操作符指定基本的表達(dá)式條件动猬。
- 邏輯操作符
操作符 | 語法 | 描述 |
---|---|---|
AND 或 && | a AND b 或 a && b | 邏輯與,若兩個操作數(shù)同時為真啤斗,則為真 |
OR 或 丨丨 | a OR b 或 a丨丨b | 邏輯或,只要有一個操作數(shù)為真,則為真 |
XOR | a XOR b | 邏輯異或,若有且僅有一個操作數(shù)為真赁咙,則為真 |
NOT 或 钮莲! | NOT a 或 免钻!a | 邏輯非,若操作數(shù)為假,則為真 |
- 比較操作符
數(shù)據(jù)列類型 | 存儲空間 說明 | 取值范圍 |
---|---|---|
= | 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òu)造搜索條件時,要注意只能對數(shù)值數(shù)據(jù)類型的記錄進(jìn)行算術(shù)運算宫患,并且只能在相同的數(shù)據(jù)類型之間進(jìn)行記錄的比較骚勘。
根據(jù)空值(NULL)確定檢索條件
空值只能定義在允許NULL字段中出現(xiàn),NULL值是特殊的值撮奏,代表“無值”俏讹,與零值(0)和空字符串('')都不相同。當(dāng)在不支持默認(rèn)值的字段中未輸入值畜吊,或在字段中顯式的設(shè)置為空泽疆,就會出現(xiàn)空值,但不能用處理已知值的方式來處理NULL玲献。為了進(jìn)行NULL值的搜索殉疼,必須采用特殊的語法。如果要檢索NULL值捌年,必須使用IS NULL和IS NOT NULL關(guān)鍵字瓢娜。
使用BEETWEEN AND進(jìn)行范圍比較查詢
如果需要對某個字段通過范圍的值進(jìn)行比較查詢,可以使用BETWEEN AND
關(guān)鍵字實現(xiàn)礼预,其中AND是多重條件符號眠砾,比較時也包括邊界條件。也可以使用>=
和<=
完成同樣的功能托酸。
使用IN進(jìn)行范圍比對查詢
在WHERE子句中褒颈,使用IN
關(guān)鍵字并在后面的括號()
中提供一個值的列表柒巫,以供與相應(yīng)的字段進(jìn)行比較。該列表中至少應(yīng)該存在一個值谷丸,如果有多個值可以使用逗號,
分隔堡掏。
使用LIKE進(jìn)行模糊查詢
在SELECT語句的WHERE子句中,可以使用LIKE
關(guān)鍵字對數(shù)據(jù)表中的記錄進(jìn)行模糊查詢刨疼,將查詢結(jié)果鎖定在一個范圍內(nèi)泉唁。在查詢條件中通常會與_
和%
兩個通配符一起使用,可以實現(xiàn)復(fù)雜的檢索查詢揩慕。這兩個通配符的含義分別如下:
- 百分號“%”:表示0個或任意多個字符亭畜。
- 下畫線“_”:表示單個的任意一個字符。
相反的漩绵,不匹配我們使用NOT LIKE
多表查詢(連接查詢)
多表查詢給用戶帶來很大的靈活性贱案,可以在任何時候增加新的數(shù)據(jù)類型肛炮,為不同實體創(chuàng)建新的表止吐,然后通過連接進(jìn)行查詢。包括兩種形式:
-
非等值和等值的多表查詢
多表查詢和普通的單表查詢相似侨糟,都是使用SELECT語句碍扔。只不過在多表查詢時需要把多張表的名字,全部填寫在FROM子句中秕重,并用逗號,
將表名分開不同。同時,也可以對數(shù)據(jù)表使用別名進(jìn)行引用溶耘。另外二拐,為了在查詢時區(qū)分多個表中出現(xiàn)的重復(fù)字段名,可以在字段列表中使用表名.列名
的形式凳兵,如果不存在重名的列百新,可以省略表名。
-
自身連接查詢
連接查詢操作不僅可以用于多個表之間庐扫,也可以是一個表與其自己進(jìn)行連接饭望,稱為自身連接查詢。當(dāng)一個表所代表的實體之間有關(guān)系時形庭,就可以使用自身連接查詢铅辞。
-
復(fù)合連接查詢
前面介紹的多表查詢是兩個表之間,只有一個WHERE子句查詢條件萨醒。如果在FROM子句后面有n個表需要查詢斟珊,則在WHERE子句中就需要有多個連接條件。至少要比出現(xiàn)的表格數(shù)量少1個富纸,也就是不能少于n?1個查詢條件倍宾,多個條件使用AND
關(guān)鍵詞連接即可雏节。
嵌套查詢(子查詢)
這種查詢是在一個SELECT語句的WHERE子句中,包含另一個SELECT語句高职,也可以稱為子查詢钩乍。在子查詢中只能返回一列,并將形成的結(jié)果又作為父查詢的條件怔锌,在主句中進(jìn)行進(jìn)一步查詢寥粹。 SQL語言允許多層嵌套查詢,即一個子查中還可以有其他子查詢埃元。嵌套查詢的求解方法是由里向外處理涝涤,即每個子查詢都是在上一級查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件岛杀。
使用ORDER BY對查詢結(jié)果排序
使用SELECT語句獲取數(shù)據(jù)表中的數(shù)據(jù)時阔拳,返回的記錄一般是無規(guī)則排列的,有可能每次獲取的查詢記錄截然不同类嗤。為了使用檢索的結(jié)果方便閱讀糊肠,可以在SELECT語句中使用ORDER BY子句
,對檢索的結(jié)果進(jìn)行排序遗锣。
ORDER BY后面可以接一列或多列用于排序的字段货裹,并且使用DESC
或ASC
關(guān)鍵字設(shè)計字段排序的方式。默認(rèn)情況下按照升序排列精偿,即使用ASC關(guān)鍵字弧圆。否則要按照降序排列,必須使用DESC關(guān)鍵字笔咽。ORDER BY子句可以和SELECT語句中的其他子句一起使用搔预,但在子查詢中不能有ORDER BY子句,因為ORDER BY子句只能對最終查詢結(jié)果排序叶组。
使用LIMIT
如果在數(shù)據(jù)表中的記錄數(shù)非常多拯田,一次從表中返回大量的記錄不僅檢索的速度慢,用戶閱讀也很不方便扶叉。所以在通過SELECT語句檢索時勿锅,使用LIMIT
子句一次取少量的記錄,而用分頁的方式繼續(xù)閱讀后面的數(shù)據(jù)枣氧。
LIMIT子句也可以和其他的SELECT子句一起使用溢十,它可以指定兩個參數(shù),分別用以設(shè)置返回記錄的起始位置达吞,和返回記錄的數(shù)量张弛。
LIMIT子句也可以只使用一個參數(shù),表示從開頭位置,即偏移量為0的位置返回指定數(shù)量的記錄吞鸭,在上例中使用的“LIMIT 0, 5”等價于“LIMIT 5”寺董。
使用統(tǒng)計函數(shù)
在數(shù)據(jù)庫系統(tǒng)中提供了一系列的內(nèi)置統(tǒng)計函數(shù),在SQL查詢中使用這些統(tǒng)計函數(shù)可以更有效地處理數(shù)據(jù)刻剥。這些統(tǒng)計函數(shù)把存儲在數(shù)據(jù)庫中的數(shù)據(jù)遮咖,描述為一個整體而不是一行行孤立的記錄。
統(tǒng)計函數(shù) | 描述 |
---|---|
COUNT() | 返回滿足SELECT語句中指定條件的記錄數(shù)造虏,例如御吞,COUNT(*)返回找到的記錄行數(shù) |
SUM() | 通常為數(shù)值字段或表達(dá)列作統(tǒng)計,返回一列的總和 |
AVG() | 通常為數(shù)值字段或表達(dá)列作統(tǒng)計漓藕,返回一列的平均值 |
MAX() | 可以為數(shù)值字段陶珠、字符字段或表達(dá)列作統(tǒng)計,返回一列中最大的值 |
MIN() | 可以為數(shù)值字段享钞、字符字段或表達(dá)列統(tǒng)計揍诽,返回一列中最小的值 |
這些函數(shù)通常用在SELECT子句中,作為結(jié)果數(shù)據(jù)集的字段返回的結(jié)果栗竖。在SELECT語句的SELECT子句中使用函數(shù)的語法如下:
SELECT 函數(shù)名(列名1 或*)暑脆,...函數(shù)名(列名n) FROM 表名;
使用GROUP BY對查詢結(jié)果分組
前面使用統(tǒng)計函數(shù)返回的是所有記錄的統(tǒng)計結(jié)果,如果要對數(shù)據(jù)進(jìn)行分組統(tǒng)計划滋,就需要使用GROUP BY
子句饵筑。這將可以允許用戶在對數(shù)據(jù)進(jìn)行分類的基礎(chǔ)上埃篓,進(jìn)行再查詢处坪。GROUP BY子句將表按列值分組,列的值相同的分為一組架专。如果GROUP BY后面有多個列名同窘,則先按第一個列名分組,再在每組中按第二個列名分組部脚。
需要注意的是想邦,在GROUP BY子句中不支持對字段分配別名,也不支持任何使用了統(tǒng)計函數(shù)的集合列委刘。
在完成數(shù)據(jù)結(jié)果的分組查詢和統(tǒng)計后丧没,還可以使用HAVING
子句來對查詢的結(jié)果,進(jìn)行進(jìn)一步的篩選锡移。
在SELECT語句的子句中:WHERE子句選擇所需要的行呕童;GROUP BY子句進(jìn)行了必要的分組整理;而HAVING子句對最后的分組結(jié)果進(jìn)行了重新篩選淆珊。