MYSQL

概念

數(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工作原理:

Web工作原理

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

PHPstudy
image.png
image.png
環(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 用戶密碼
image.png

認(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后面可以接一列或多列用于排序的字段,并且使用DESCASC關(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)行了重新篩選。

最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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