今晚是圣誕節,大家收到禮物或送出嗎?反正小編是沒(méi)有的~!
數據庫
1 定義
數據庫,可以簡(jiǎn)單的解釋為:高效的存儲和處理數據的介質(zhì)(主要分為磁盤(pán)和內存兩種)。
關(guān)系型數據庫
1 定義
關(guān)系型數據庫,是一種建立在關(guān)系模型(數學(xué)模型)上的數據庫。
至于關(guān)系模型,則是一種所謂建立在關(guān)系上的模型,其包含三個(gè)方面,分別為:
數據結構:數據存儲的形式,二維表(行和列);
操作指令集合:所有的 SQL 語(yǔ)句;
完整性約束:表內數據約束(字段與字段)和表與表之間的約束(外鍵)。小編推薦大家加一下這個(gè)群:103456743這個(gè)群里好幾千人了!大家遇到啥問(wèn)題都會(huì )在里面交流!而且免費分享零基礎入門(mén)料資料web開(kāi)發(fā) 爬蟲(chóng)資料一整套!是個(gè)非常好的學(xué)習交流地方!也有程序員大神給大家熱心解答各種問(wèn)題!很快滿(mǎn)員了。欲進(jìn)從速哦!各種PDF等你來(lái)下載!全部都是免費的哦!只為幫助大家快速入門(mén),所以小編在群里等你們過(guò)來(lái)一起交流學(xué)習呢!
4 SQL
SQL:Structured Query Language,結構化查詢(xún)語(yǔ)言(數據以查詢(xún)?yōu)橹鳎?9% 都是在進(jìn)行查詢(xún)操作)。
SQL 主要分為三種:
DDL:Data Definition Language,數據定義語(yǔ)言,用來(lái)維護存儲數據的結構(數據庫、表),代表指令為create、drop和alter等。
DML:Data Manipulation Language,數據操作語(yǔ)言,用來(lái)對數據進(jìn)行操作(表中的內容)代表指令為insert、delete和update等,不過(guò)在 DML 內部又單獨進(jìn)行了一個(gè)分類(lèi),即 DQL(Data Query Language),數據查詢(xún)語(yǔ)言,代表指令為select.
DCL:Data Control Language,數據控制語(yǔ)言,主要是負責(用戶(hù))權限管理,代表指令為grant和revoke等。
SQL 是關(guān)系型數據庫的操作指令,是一種約束,但不強制,類(lèi)似于 W3C,因此這意味著(zhù):不同的數據庫產(chǎn)品(如 Oracle 和 MySQL)內部可能會(huì )有一些細微的區別。
服務(wù)器對象
由于沒(méi)辦法完全了解服務(wù)器內部的結構,因此只能粗略的分析數據庫服務(wù)器的內部結構。
一般來(lái)說(shuō),將 MySQL 數據庫服務(wù)器的內部對象分為四層,分別為:數據管理系統(DBMS)–> 數據庫(DB)–> 表(Table)–> 字段(Filed).

2 查詢(xún)數據庫
查看全部 –> 基本語(yǔ)法:show databases;
查看部分(模糊查詢(xún))–> 基本語(yǔ)法:show databases like 'pattern';
其中,pattern是匹配模式,有兩種,分別為:
%:表示匹配多個(gè)字符;
_:表示匹配單個(gè)字符。
此外,在匹配含有下劃線(xiàn)_的數據庫名稱(chēng)的時(shí)候,需要在下劃線(xiàn)前面加上反斜線(xiàn)\_進(jìn)行轉義操作。
示例:show databases like 'TBL%';表示匹配所有TBL開(kāi)頭的數據庫。
查看數據庫的創(chuàng )建語(yǔ)句 –> 基本語(yǔ)法:show create database + 數據庫名稱(chēng);
在這里,查看的結果有可能與咱們書(shū)寫(xiě)的 SQL 語(yǔ)句不同,這是因為數據庫在執行 SQL 語(yǔ)句之前會(huì )優(yōu)化 SQL,系統保存的是優(yōu)化后的結果。
3 更新數據庫
在這里,需要注意:數據庫的名字不可以修改。
數據庫的修改僅限庫選項,即字符集和校對集(校對集依賴(lài)字符集)。
基本語(yǔ)法:alter database + 數據庫名稱(chēng) + [庫選項];
charset/character set[=] 字符集;
collate[=] 校對集;
示例:alter database TBL_ERROR_CODE charset gbk;表示修改此數據庫的字符集為gbk.
4 刪除數據庫
基本語(yǔ)法:drop database + 數據庫名稱(chēng);
在這里,需要注意:在刪除數據庫之前,應該先進(jìn)行備份操作,因為刪除為不可逆操作,所以不要隨意刪除數據庫。
表操作
1 新增表
基本語(yǔ)法:
create table [if not exists] + 表名( 字段名稱(chēng) 數據類(lèi)型, …… 字段名稱(chēng) 數據類(lèi)型 /* 最后后一行,不需要加逗號 */)[表選項];
其中,if not exists表示
如果表名不存在,就執行創(chuàng )建代碼;如果表名存在,則不執行創(chuàng )建代碼。
表選項則是用來(lái)控制表的表現形式的,共有三種,分別為:
字符集設定:charset/ character set+ 具體字符集,用來(lái)表示數據存儲的編碼格式,常用的字符集包括GBK和UTF8等。
校對集設定:collate+ 具體校對集,表示數據比較的規則,其依賴(lài)字符集。
存儲引擎:engine+具體存儲引擎,默認為InnoDB,常用的還有MyISAM.
由于任何表都歸屬于某個(gè)數據庫,因此在創(chuàng )建表的時(shí)候,都必須先指定具體的數據庫。在這里,指定數據庫的方式有兩種,分別為:
第 1 種:顯式的指定表所屬的數據庫,示例
create table if not exists test.student( name varchar(10), age int, /* 整型不需要指定具體的長(cháng)度 */ grade varchar(10) /* 最后后一行,不需要加逗號 */)charset utf8;
第 2 種:隱式的指定表所屬的數據庫,示例
use test; /* use + 數據庫名稱(chēng),表示切換到指定的數據庫,這句命令其實(shí)不加分號也可以,但不建議這么做 */create table if not exists student( name varchar(10), age int, /* 整型不需要指定具體的長(cháng)度 */ grade varchar(10) /* 最后后一行,不需要加逗號 */)charset utf8;
2 查詢(xún)表
查看全部 –> 基本語(yǔ)法:show tables;
查看部分(模糊查詢(xún))–> 基本語(yǔ)法:show tables like 'pattern';
其中,pattern是匹配模式,有兩種,分別為:
%:表示匹配多個(gè)字符;
_:表示匹配單個(gè)字符。
此外,在匹配含有下劃線(xiàn)_的表名的時(shí)候,需要在下劃線(xiàn)前面加上反斜線(xiàn)\_進(jìn)行轉義操作。
示例:show tables like '%t';表示匹配所有以t結尾的表。
查看表的創(chuàng )建語(yǔ)句 –> 基本語(yǔ)法:show create table + 表名;
在這里,咱們也可以用\g和\G代替上述語(yǔ)句中的;分號,其中\g等價(jià)于分號,\G則在等價(jià)于分號的同時(shí),將查的表結構旋轉90度,變成縱向結構。
查看表中的字段信息 –> 基本語(yǔ)法:desc/describe/show columns from + 表名;
3 更新表
在這里,需要注意:表的修改,分為修改表本身和修改表中的字段。
第 1 類(lèi):修改表本身
修改表名,基本語(yǔ)法:rename table 舊表名 to 新表名;
修改表選項,基本語(yǔ)法:alter table + 表名 + 表選項[=] + 值;
第 2 類(lèi):修改表中的字段,新增、修改、重命名和刪除
新增字段,基本語(yǔ)法:alter table + 表名 + add + [column] + 字段名 + 數據類(lèi)型 + [列屬性][位置];
其中,位置表示此字段存儲的位置,分為first(第一個(gè)位置)和after + 字段名(指定的字段后,默認為最后一個(gè)位置).
示例:alter table student add column id int first;
修改字段,基本語(yǔ)法:alter table + 表名 + modify + 字段名 + 數據類(lèi)型 + [列屬性][位置];
其中,位置表示此字段存儲的位置,分為first(第一個(gè)位置)和after + 字段名(指定的字段后,默認為最后一個(gè)位置).
示例:alter table student modify name char(10) after id;

4 刪除表
基本語(yǔ)法:
/** 可以一次刪除多張表 */drop table + 表1, 表2 ... ;
在這里,需要注意:此刪除為不可逆操作,希望大家謹慎使用。
數據操作
1 新增數據
對于數據的新增操作,有兩種方法。
第 1 種:給全表字段插入數據,不需要指定字段列表,但要求數據的值出現的順序必須與表中的字段出現的順序一致,并且凡是非數值數據,都需要用引號(建議使用單引號)括起來(lái)。
基本語(yǔ)法:insert into + 表名 + values(值列表)[,(值列表)];
示例:insert into test valus('charies',18,'3.1');
第 2 種:給部分字段插入數據,需要選定字段列表,字段列表中字段出現的順序與表中字段的順序無(wú)關(guān),但值列表中字段值的順序必須與字段列表中的順序保持一致。
基本語(yǔ)法:insert into + 表名(字段列表) + values(值列表)[,(值列表)];
示例:insert into test(age,name) valus(18,'guo');
2 查詢(xún)數據
查看全部 –> 基本語(yǔ)法:select * from + 表名 + [where 條件];
示例:select * from test;
查看部分 –> 基本語(yǔ)法:select + 字段名稱(chēng)[,字段名稱(chēng)] + from + 表名 + [where 條件];
示例:select name,age,grade from test where age = '18';
3 更新數據
基本語(yǔ)法:update + 表名 + set + 字段 = 值 + [where 條件];
示例:update test set age = 20 where name = 'guo';
在這里,建議盡量加上where條件,否則的話(huà),操作的就是全表數據。
此外,判斷更新操作是否成功,并不是看 SQL 語(yǔ)句是否執行成功,而是看是否有記錄受到影響,即affected的數量大于1時(shí),才是真正的更新成功。
4 刪除數據
基本語(yǔ)法:drop from + 表名 + [where 條件];
示例:drop from test where grade = '3.1';
在這里,需要注意:此刪除為不可逆操作,希望大家謹慎使用。
中文數據問(wèn)題
中文數據問(wèn)題的本質(zhì)就是字符集的問(wèn)題。
由于計算機僅識別二進(jìn)制數據,而且人類(lèi)則更傾向于識別字符(符號),因此就需要一個(gè)二進(jìn)制與字符的對應關(guān)系,也就是字符集。
在咱們通過(guò) MySQL 數據庫的客戶(hù)端向服務(wù)器插入中文數據的時(shí)候,有可能失敗,原因則可能是客戶(hù)端和服務(wù)器的字符集設置不同導致的,例如:
客戶(hù)端的字符集為gbk,則一個(gè)中文字符,對應兩個(gè)字節;
服務(wù)器的字符集為utf8,則一個(gè)中文字符,對應三個(gè)字節。
這樣顯然會(huì )在編碼轉換的過(guò)程中出現問(wèn)題,從而導致插入中文數據失敗。
由于所有的數據庫服務(wù)器表現的一些特性都是通過(guò)服務(wù)器端的變量來(lái)保持的,因此系統會(huì )先讀取自己的變量,看看具體的表現形式。這樣的話(huà),咱們就可以通過(guò)以下語(yǔ)句查看服務(wù)器到底識別哪些字符集:
-- 查看服務(wù)器識別的全部字符集show character set;

通過(guò)以上查詢(xún),咱們會(huì )發(fā)現:服務(wù)器是萬(wàn)能的,其支持所有字符集。
既然服務(wù)器支持這么多字符集,總會(huì )有一種是服務(wù)器默認的和客戶(hù)端打交道的字符集。因此,咱們可以通過(guò)以下語(yǔ)句查看服務(wù)器默認的對外處理的字符集:
-- 查看服務(wù)器默認的對外處理的字符集show variables like 'character_set%';

標注1:服務(wù)器默認的客戶(hù)端傳來(lái)的數據字符集為utf8;
標注2:連接層字符集為utf8;
標注3:當前數據庫的字符集為utf8;
標注4:服務(wù)器默認的對外處理的字符集utf8.
通過(guò)以上查詢(xún),咱們會(huì )發(fā)現:服務(wù)器默認的對外處理的字符集是utf8.
那么反過(guò)來(lái),咱們在通過(guò)客戶(hù)端的屬性查看客戶(hù)端支持的字符集:

顯然,咱們已經(jīng)找到了問(wèn)題的根源,確實(shí)是:客戶(hù)端支持的字符集為gbk,而服務(wù)器默認的對外處理的字符集為utf8,因此產(chǎn)生矛盾。
既然問(wèn)題已經(jīng)找到了,那么解決方案就是:修改服務(wù)器默認接收的字符集為gbk.
-- 修改服務(wù)器默認接收的字符集為 GBK(不區分大小寫(xiě))set character_set_client = gbk;
這樣的話(huà),咱們再插入中文數據的時(shí)候,就會(huì )插入成功啦!But,在咱們查看數據的時(shí)候,又發(fā)現了一個(gè)問(wèn)題,就是之前咱們插入的中文數據顯示亂碼啦!不過(guò)這也正常,因為查詢(xún)的時(shí)候,數據的來(lái)源是服務(wù)器(utf8),解析數據的是客戶(hù)端,而客戶(hù)端僅識別gbk格式的數據,顯示亂碼也就在意料之中啦!
因此,解決方案就是:修改服務(wù)器給客戶(hù)端的數據字符集為gbk.
-- 修改服務(wù)器給客戶(hù)端的數據字符集為 GBK(不區分大小寫(xiě))set character_set_results = gbk;

如上圖所示,向服務(wù)器插入中文數據的問(wèn)題已經(jīng)解決啦!
此外,咱們之前使用的 SQL 語(yǔ)句:
-- 修改的只是會(huì )話(huà)級別,即當前客戶(hù)端當次連接有效,關(guān)閉后失效set 變量 = 值;
這樣的話(huà),每當咱們重啟客戶(hù)端的時(shí)候,都要依次重新進(jìn)行設置,比較麻煩,因此咱們可以使用快捷的設置方式,即:
set names 字符集;
例如,
/*** 恒等于 set character_set_client = gbk;* 恒等于 set character_set_results = gbk;* 恒等于 set character_set_connection = gbk;*/set names gbk;
表示上述一條語(yǔ)句,將同時(shí)改變三個(gè)變量的值。其中,connection為連接層,是字符集轉換的中間者,如果其和client和results的字符集一致,則效率更高,不一致也沒(méi)有關(guān)系。
校對集問(wèn)題
校對集,其實(shí)就是數據的比較方式。
校對集,共有三種,分別為:
_bin:binary,二進(jìn)制比較,區分大小寫(xiě);
_cs:case sensitive,大小寫(xiě)敏感,區分大小寫(xiě);
_ci:case insensitive,大小寫(xiě)不敏感,不區分大小寫(xiě)。
查看(全部)校對集 –> 基本語(yǔ)法:show collation;

如上圖所示,MySQL 數據庫支持百多種校對集。
接下來(lái),咱們在一起看看校對集的應用,因為只有當數據進(jìn)行比較的時(shí)候,校對集才會(huì )生效。在這里,咱們用utf8的_bin和_ci兩種校對集進(jìn)行比較:
-- 創(chuàng )建兩張使用不同校對集的表create table my_collate_bin( name char(10))charset utf8 collate utf8_bin;create table my_collate_ci( name char(10))charset utf8 collate utf8_general_ci;

如上圖所示,咱們創(chuàng )建了兩張表,分別為my_collate_bin和my_collate_ci,其校對集分別為_(kāi)bin和_ci. 然后,分別向這兩張表中添加數據:
-- 向表中添加數據insert into my_collate_bin values ('a'),('A'),('B'),('b');insert into my_collate_ci values ('a'),('A'),('B'),('b');
再分別查看兩張表中的數據:
-- 查看表中的數據select * from my_collate_bin;select * from my_collate_ci;

下面,咱們根據表中的某個(gè)字段(在這里my_collate_bin和my_collate_ci都僅有一個(gè)字段)進(jìn)行排序,其基本語(yǔ)法為:
order by + 字段名 + [asc/desc];
其中,asc表示升序,desc表示降序,默認為升序。執行如下 SQL 語(yǔ)句:
-- 排序比較select * from my_collate_bin order by name;select * from my_collate_ci order by name;

如上圖所示,顯然校對集生效啦!
此外,咱們需要特別注意的是: 校對集必須在沒(méi)有數據之前聲明好,如果有了數據之后,再進(jìn)行校對集的修改,則修改無(wú)效。

如有侵權請聯(lián)系小編刪除哦!
聯(lián)系客服