MYSQL

概念

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

Web工作原理

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

PHPstudy
image.png
image.png
環(huán)境變量
  • win 鍵搜索編輯系統(tǒng)環(huán)境變量 點擊進(jìn)入


    image.png
  • 依次如圖航揉,將 MYSQL 加入環(huán)境變量中去


    image.png
命令行連接
  • win + R 鍵 輸入cmd 呼出命令行窗口
    image.png
  • 測試 MYSQL 是否能正確運行 輸入 mysql -V
    image.png
  • 連接數(shù)據(jù)庫 輸入 mysql -uroot -p 回車并輸入密碼
mysql –h 服務(wù)器主機(jī)地址 –u 用戶名 –p 用戶密碼
image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夺饲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌往声,老刑警劉巖擂找,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浩销,居然都是意外死亡贯涎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門慢洋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柬采,“玉大人,你說我怎么就攤上這事且警》勰恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵斑芜,是天一觀的道長肩刃。 經(jīng)常有香客問我,道長杏头,這世上最難降的妖魔是什么盈包? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮醇王,結(jié)果婚禮上呢燥,老公的妹妹穿的比我還像新娘。我一直安慰自己寓娩,他們只是感情好叛氨,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棘伴,像睡著了一般寞埠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焊夸,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天仁连,我揣著相機(jī)與錄音,去河邊找鬼阱穗。 笑死饭冬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揪阶。 我是一名探鬼主播昌抠,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遣钳!你這毒婦竟也來了扰魂?” 一聲冷哼從身側(cè)響起麦乞,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劝评,沒想到半個月后姐直,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蒋畜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年声畏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻成。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡插龄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出科展,到底是詐尸還是另有隱情均牢,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布才睹,位于F島的核電站徘跪,受9級特大地震影響读恃,放射性物質(zhì)發(fā)生泄漏百框。R本人自食惡果不足惜忙菠,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一挡鞍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧继蜡,春花似錦究驴、人聲如沸弦疮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浙于,卻和暖如春护盈,著一層夾襖步出監(jiān)牢的瞬間挟纱,已是汗流浹背羞酗。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留紊服,地道東北人檀轨。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像欺嗤,于是被迫代替她去往敵國和親参萄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容