重蔚自留地php學習第三十五天——mysql基礎

文件操作:目錄操作,文件操作

目錄操作步驟:

準備一個目錄(路徑)
判斷一個路徑是否是一個目錄
打開目錄opendir,返回一個目錄資源,包含當前目錄下所有的文件
遍歷目錄資源,循環+readdir,每次獲得一個文件名,將資源指針下移一位
關閉資源closedir

文件操作步驟:

準備一個文件路徑
判斷一個路徑是否是一個文件
打開文件,獲得其中內容
a) PHP5:file_get_contents,file將文件按照行進行獲取返回一個數組
b) PHP4:打開資源fopen(文件名,Mode),fgetc獲取一個字符,fgets獲取指定長度或者一行,fread獲取指定長度
寫入內容
a) PHP5:file_put_contents(文件名,字符串,Mode),Mode:追加,起始位置插入
b) PHP4:fwrite,fputs,往文件中插入數據(數據插入位置默認由fopen決定)
c) Fseek:將文件的指針指向指定的位置。
關閉文件,fclose

文件操作相關函數

Scandir:獲取指定目錄下所有的文件,以數組形式返回

如果自定義遍歷目錄?(筆試的時候經常出現)

寫一個函數遍歷一個文件夾下的所有文件
Function myScandir($dir = “.”){

//定義一個數組,接收遍歷的所有結果

$arr = array();

//循環遍歷當前文件夾下所有文件

o=opendir( dir);

While(filename=readdir( o)){

//每次得到一個文件

arr[]= filename;

}

//返回

Return $arr;

}

如果當前文件夾內,還有子文件夾,需要進入子文件夾再次進行遍歷
//可以採用遍歷當前文件夾的內容的形式來判斷,但是很難做到全部遍歷

Foreach(arras value){

//拼湊一個路徑

dir.=/. value;

//判斷路徑

If(is_dir($dir)){

//是一個路徑

subarr=myScandir( dir);

}

}

遞歸調用函數本身

Function myScandir($dir = “.”){

//定義一個數組,接收遍歷的所有結果

Static $arr = array();

//循環遍歷當前文件夾下所有文件

o=opendir( dir);

While(filename=readdir( o)){

//將.和..必須去除

If(filename==.|| filename == ‘..’)

{

arr[]= filename;

}else{

//每次得到一個文件

arr[]= filename;

//也許當前文件是一個文件夾,那麼需要更深層次的遍歷

If(is_dir(dir./. filename)){

//子文件夾與當前文件夾有同樣的結構,只需要調用當前函數本身即可

myScandir(dir./. filename);

}

}

}

//返回

Return $arr;

}

遞歸:函數內部調用自己

遞歸有兩個要素:遞歸出口,遞歸點

遞歸出口:當條件達到指定要求時,函數不在進行遞歸調用

遞歸點:子問題與父問題結構一樣

1.Mysql基礎知識和應用
Mysql課程體系

Mysql基礎知識和應用

這部分最重要,主要了解數據的操作和基本原理

大型數據庫優化

主要是講如何提高數據庫的效率,索引,分表(垂直分表,水平分表)

數據庫部署

如何對大型數據庫進行服務器部署,服務器集羣,負載均衡

有幾個概念需要了解:

數據庫:Database存放數據的倉庫,高效率存儲和處理數據的軟件(狹義的理解)

廣義的講,凡是能夠存儲數據的介質都稱之爲數據庫

數據庫管理系統:Database Management System,DBMS,管理數據庫的系統

數據庫系統:Database System = DBMS + DB

系統管理員:Database Administrator DBA,負責日常數據庫的維護(部署)

數據庫有兩大陣營:關係型數據和非關係型數據庫

關係型數據庫:建立在關係模型上的數據庫

關係模型:通過數據結構,數據關係,數據約束三部分構成

關係模型可以理解爲是一張二維表,關係指的是二維表(實體)內部的數據聯繫,以及(實體)表與表之間的聯繫

實體:人類世界中,所能看到的各種單位

設計一個教學系統

實體:老師,學生,教室,科目。。。

設計一個學生表

學號 姓名 性別 年齡
PHP1001 李商隱 男 28
PHP1002 屈原 男 34

注意:一個實體創建一張數據表保存,數據表保存的都是一個實體的相關屬性,與實體無關的不放到一起

設計一個班級表

班級名字 教室名字 開班時間 結束時間
PHP1405 B2302M 20140510 20140925
PHP1402 D306 20140320 20140805

班級表裏面維護與班級相關的信息

實體與實體間的聯繫

如何將學生和班級進行關聯?

學號 姓名 性別 年齡 班級名字
PHP1001 李商隱 男 28 PHP1405
PHP1002 屈原 男 34 PHP1402
PHP1003 李清照 PHP1403

實體與實體之間,通過某一個關係進行管理。

對應數據表,如果進行關聯呢?怎麼表示實體與實體之間是有關係的?

在一個實體中,維護一個信息,該信息指向另外一個實體。

世面上有哪些關係型數據庫?

幾乎所有看到數據庫都是關係型數據,Mysql,Oracle,SQLServer,Access。。。

關係型數據庫特點:

都是保存在硬盤
都是使用二維表保存數據
關係型數據庫即便表中的某個字段數據不存在,但是數據庫也會爲該字段保留空間,關係型數據庫比較浪費硬盤空間。

非關係型數據庫:不是關係型數據庫的都叫非關係型數據

NOSQL:NOT ONLY SQL

非關係型數據庫中數據的存在形式

數據運行在內存中,有一個同步機制,將內存中的內容保存硬盤
存在形式:以鍵值對形式存在,學號=>PHP1001

非關係型數據:memcache,mongodb,redis

關係型與非關係型數據比較:

非關係型數據庫效率高
關係型數據庫更安全

2.關係型數據庫的幾個典型概念
行(row):指的是數據表中的橫向結構,行也稱之爲記錄(record),表示一條數據(代表一個實體信息)

行和記錄沒有本質區別,行是從結構的角度出發,記錄從數據(內容)角度出發

列(col):指的數據表中的縱向結構,列也稱之爲字段(field),表示一列數據

列和字段也沒有本質區別,一個從結構出發,一個從數據出發

SQL:Structured Query language,結構化查詢語言。

指的是關係型數據庫中對數據庫進行管理的語言。SQL雖然是關係型數據庫,但是在不同的關係型數據庫中有那麼一點點微小的區別。

SQL:DDL,DML,DCL

DDL:Data Definition Language,數據定義語言,定義結構,通常指的是結構的操作,如數據庫的創建和刪除,數據表的創建、刪除和修改,create,drop

DML:Data Manipulation Language:數據操作語言,對數據的增刪改查,查詢是一門專門的語言:DQL,Data query Language,數據查詢語言,select,insert,update,delete

DCL:Data Control Language:數據控制語言,主要是實現對系統用戶的權限管理,grant,revoke,flush

Mysql

Mysql是一種關係型數據庫,是一種管理數據的軟件。

軟件結構:b/s和c/s

b/s:browser/server,瀏覽器服務器,指的是隻要服務器運行,在客戶端(PC)通過瀏覽器就可以實現訪問

c/s:client/server,客戶端服務器,如果用戶(PC)希望訪問服務器,必須要安裝對應的客戶端,還要保證客戶端和服務端同時運行。

飛秋是c/s結構,飛秋已經扁平化了,沒有嚴格的客戶端和服務端。

Mysql是一種c/s結構

安裝必須要有客戶端和服務端,mysql.exe是客戶端,mysqld.exe是服務端
進行通信,必須保證兩個端都同時在運行

Mysql是如何實現mysql.exe與mysqld.exe進行通信的呢?

連接認證,客戶端發送連接請求,同時服務端對客戶端進行身份認證
a) 保證找到對應的服務端:-h host,服務器所在的地址 –hlocalhost,-h192.160.3.1
b) 指定端口,找到對應的應用軟件:-P port,端口 –P3306,3306是數據庫的默認端口
c) 還要提供身份:用戶名和密碼,-u username,-p password
d) exe –h192.168.3.1 –P3306 –uroot –proot

登錄成功

客戶端準備和發送SQL語句,發給服務端
服務端執行SQL語句,將執行結果返回給客戶端
客戶端要解析結果,並負責顯示
以上三個步驟,是沒有辦法分離顯示,因爲操作太快

退出客戶端
a) Quit
b) Exit
c) q

Mysql操作原理

如何維護mysql服務?

安裝的過程中加入到系統服務,系統在啓動的時候自動加載mysql服務,在控制檯運行
在windows下,服務的管理,使用命令:net [stop,start,restart] [服務名]

關閉mysql服務:net stop mysql

開啓mysql服務:net start mysql

進入服務列表進行操作
3.Mysqld.exe的啓動

Mysql服務端,用戶沒有辦法直接查看裏面到底有哪些東西。

Mysql服務端有四層對象

服務端:最終管理數據,數據最終是落到字段上進行管理

3.SQL基本操作
基本操作指的是增刪改查:C(create新增)R(read/retrieve,查詢)U(update修改)D(delete刪除)

3.1.庫操作

創建數據庫

語法:create Database 數據庫名字 [庫選項]

庫選項

字符集:charset/character set,指定數據庫內容的編碼

校對集:collate,指的是數據庫數據的比較方式

這條語句執行後,mysql服務端做了哪些工作?

在服務器端的數據文件夾內創建一個名爲shop的文件夾

如何找到該路徑呢?

My.ini文件中的datadir配置項

創建一個庫選項文件,在對應的數據庫文件夾裏,有一個db.opt文件,保存數據庫的庫選項

內容就是保存的庫選項

數據庫命名規則

1.使用字母,下劃線和數字來命名,通常,以字母開頭(數據庫名字命名並沒有非常嚴格的要求)

2.如果出現關鍵字或者保留字當做數據庫名字,應當使用反引號對庫名進行包裹,反引號是esc下面的那個鍵,在英文輸入狀態下輸出的內容

Syntax錯誤:語法錯誤,提示錯誤的範圍

正確使用

數據可以使用中文做名字,但是需要使用反引號

但是中文數據庫下創建的數據庫文件夾名字,會以額外的編碼形式存在

規範:

通常數據庫的命名,要做到見名之意
不使用中文
通常,數據庫會有前綴ecs_
查看數據庫

語法1:show databases,顯示所有數據庫

語法2:show databases like [‘pattern’],模糊查詢,指定查詢條件

%:通配符,匹配所有字符,所有數量

_:匹配所有字符,一次

Show databases like “my%”; – 查找以my開頭的所有的數據庫

Show databases like “my_”; – 查找以my開頭,後面跟一個字符的數據庫

原因:下劃線匹配一個字符,%匹配所有字符 ==》以information開始的所有數據

如果要得到下劃線,必須對下劃線進行轉義

查看數據庫創建語句

語法:show create database 數據庫名字

修改數據庫

數據庫名字不可以修改。

修改的是數據庫庫選項

語法:alter database 數據庫名字 [庫選項]

效果

刪除數據庫

結構的刪除都是使用drop關鍵字,而數據庫是一種結構

語法:drop Database 數據庫名字

效果

注意:不能輕易的刪除任何數據,數據庫也不能隨意刪除,因爲數據的刪除是不可逆的。如果非要刪除數據庫,那麼請先對數據庫進行備份

3.2.表操作

對數據庫內的數據表進行CRUD操作,該操作仍然是結構上的。

表應該對應結構才能稱之爲表。

表操作包含自身操作以及字段的操作。表跟字段是密不可分的。

創建表

語法:create table 表名(

–字段列表

字段1 字段類型,

字段2 字段類型,

字段N 字段類型

)[表選項];

表選項:字符集和存儲引擎

字符集:該表存儲數據所採用的字符集

存儲引擎:當前表按照上面數據格式來存儲數據

字段爲什麼需要字段類型?

SQL是一門強類型語言,對於數據必需要指定其數據類型,不是同一個數據類型的內容不能存放。

創建數據表

錯誤:沒有選擇數據庫

原因:數據表是依賴數據庫存在的,是數據庫的子對象,所以創建的數據表必須指定數據庫

顯示指定數據庫,指的是在創建表的時候,明確指定該表應該放到哪個數據庫下
語法:數據庫.數據表

默認使用數據庫,前提是當前環境已經進入到某個指定的數據庫。
進入數據庫語法:use 數據庫名字

所有創建語法,都可以先對要創建的對象進行是否存在判斷。

如不能創建已經存在的數據庫

防止衝突的辦法:

If not exists:如果不存在

If exists:如果存在

If not exists使用

If exists使用

數據表的命名規則:跟數據庫基本一致

一般數據表的命名採用下劃線方式。

R:查詢表

語法:show tables;查詢當前數據庫中所有的表

語法:show tables like “c%”;模糊查詢

語法:show create table 數據表名,查看錶的創建語句

語法:desc 表名;查看錶中的字段信息,describe 表名;show columns from 表名

U:更新表結構

語法:alter table 表名 add/modify/change/drop [column] 字段名 [字段類型] [位置]

Add:添加一個字段:add 字段名字 字段類型 [位置]

指定位置

Modify:修改一個字段類型:modify 字段名 字段類型 [位置]

Change:修改一個字段名字:change 舊字段名 新字段名 字段類型 [位置]

Drop:刪除一個字段:drop 字段名

位置:有兩個選項的

First:表示放到表的第一個位置,語法:first

After:表示放到哪個字段的後面,語法:after 字段名

修改表的名字

語法:rename table 舊錶名 to 新表名

D:刪除數據表

語法:drop table 表名

注意:刪除要慎用,表的刪除會將整個表中的數據全部幹掉,而這種操作不可逆。

3.3.數據操作

對數據表裏保存的數據進行增刪改查操作

C:新增數據

語句:insert into 表名 [(字段列表)] values (值列表)

如果沒有字段列表,值列表的數量必須跟表字段數目完全一致,順序要完全對應

如果有字段列表,那麼字段列表與值列表的字段數據必須完全一致,順序要完全對應

如果使用字段列表,該字段列表可以不與數據表的字段列表順序一致

錯誤1:字段類型與值類型不匹配

錯誤2:待插入的字段列表與當前插入的值列表的數量不匹配

R:查詢數據

語法:select [字段列表] from 表名 [where條件]

查詢所有數據

查詢指定字段

查詢指定條件數據

U:更新數據

語法:update 表名 set 字段 = 值 [where條件]

多字段修改

D:刪除數據

語法:delete from 表名 [where條件]

注意:通常update和delete都必須匹配where條件,否則不允許操作,因爲更新和刪除都是永久性的,不可逆的。

中文數據插入

Windows下,命令行模式裏,只識別gbk編碼,而且該編碼不可以改變

要保證mysql.exe在控制檯可以輸入中文並且讓服務端識別的話,有一個快捷方式

Set names gbk; //告訴服務器,客戶端給服務器傳遞數據是gbk編碼的

查看mysql支持的字符集

語法:show character set;

一共支持39種字符集,除了這39種之外,其他的字符集就不能支持。

查看mysql服務器對外設置的默認的字符集

語法:show variables like ‘character_set%’;

保證服務器端能夠識別客戶端的數據,只需要修改character_set_client = gbk;

Set character_set_client = gbk;

就可以使用gbk編碼的數據傳輸給服務器

修改結果集的字符集

Mysql.exe就可以解析數據

客戶端與服務端進行不同字符集編碼數據通信的原理

Set names gbk做了什麼事情?

數據庫數據存儲的最終編碼?

DBMS:安裝數據庫時指定編碼
DB:創建數據庫時指定
Table:創建表時指定
Field:創建字段的時候指定
最終數據的存儲編碼,受最近的字符集影響,如果沒有強制指定,那麼順序依次是:字段à表à數據庫àDBMS

注意:

1 只要用戶設定好了,客戶端的編碼(character_set_client,character_set_results),不管數據庫最終存儲數據是按照什麼字符集,都不會出現亂碼。

2 字符集的最終設定受當前代碼所在的環境影響,代碼在控制檯,就只能是gbk,代碼在文件裏,跟文件的編碼是一致的。
本文轉載自《重蔚自留地重蔚自留地php學習第三十五天——mysql基礎1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章