數(shù)據(jù)庫介紹
數(shù)據(jù)庫的分類
- 層次數(shù)據(jù)庫
類似xml的文本結構。 - 網(wǎng)狀數(shù)據(jù)庫
- 關系數(shù)據(jù)庫
MySQL,SQL server,oracle等,下面主要介紹它
關系數(shù)據(jù)庫
SQL: Struct Query Language(結構化查詢語言),它是一個"國際化標準"。各種關系數(shù)據(jù)庫都是實現(xiàn)該標準的一種產(chǎn)品。
數(shù)據(jù)庫本質和表現(xiàn)
本質:將大量的"數(shù)據(jù)值"通過數(shù)據(jù)庫管理系統(tǒng)進行復雜但邏輯結構清晰有序的存儲,效率高的驚人。
表現(xiàn):存儲在指定文件夾中。
關系數(shù)據(jù)庫常見術語
數(shù)據(jù)data,數(shù)據(jù)庫database,數(shù)據(jù)庫管理系統(tǒng)dbms,表(數(shù)據(jù)表)table,字段field,行row,列column,記錄record
數(shù)據(jù)庫系統(tǒng)基本結構
MySQL系統(tǒng)級操作
注意:如果使用MAMP集成環(huán)境,并希望在終端操作數(shù)據(jù)庫,請先配置靜態(tài)環(huán)境變量,在根目錄下找到.profile(沒有時創(chuàng)建),之后打開文件復制這句話
export PATH=/opt/local/bin:/opt/local/sbin:/Applications/MAMP/Library/bin:$PATH
保存,重啟服務
登錄命令:mysql -h服務器地址 -u登錄名 -P端口號 -p密碼
備份數(shù)據(jù)庫:mysqldump -h服務器地址 -u登錄名 -p密碼 要保存的數(shù)據(jù)庫名>路徑+要保存為的文件名
恢復數(shù)據(jù)庫:mysql -h服務器地址 -u登錄名 -p密碼 要恢復的數(shù)據(jù)庫名<數(shù)據(jù)庫路徑+文件名
基礎語法規(guī)定
注釋:
- 單行注釋:#注釋內容
- 單行注釋: -- 注釋內容
- 多行注釋:/注釋內容/
大小寫問題
MySQL語言本身不區(qū)分大小寫,但在某些區(qū)分大小寫的操作系統(tǒng)中,數(shù)據(jù)庫名和表名會區(qū)分大小寫。推薦使用"下劃線命名法":單詞都用小寫字母,單詞之間用"_"分開。
php中操作數(shù)據(jù)庫的基本代碼和流程
基本流程
- 連接數(shù)據(jù)庫:
$mylink = mysqli_connect("localhost",'root','root',"tempdb3");
坑:mysql_connect在 PHP 5.5.0 起已廢棄,并在將來會被移除。應使用 MySQLi 或 PDO_MySQL 擴展來替換之。 - 執(zhí)行sql命令:
$result = $mylink->query("幾乎任何sql語句")
返回的結果通常分兩種情況進行處理
2.1 如果無返回數(shù)據(jù)的語句
2.1.1 如果$result為true,表示執(zhí)行成功
2.1.2 如果$result為false,表示執(zhí)行失敗
2.2 如果是有返回數(shù)據(jù)的語句
2.2.1 如果$result為false,表示執(zhí)行失敗
2.2.2 否則,執(zhí)行成功,需要繼續(xù)從結果中取出數(shù)據(jù)并顯示出來
數(shù)據(jù)定義語句
創(chuàng)建數(shù)據(jù)庫
creat database [if not exists] 數(shù)據(jù)庫名 [charset 字符集] [collate 字符排序規(guī)則];
說明:
- if not exists:用于判斷是否存在該數(shù)據(jù)庫名,如果存在則不執(zhí)行該語句。
- 字符集:數(shù)據(jù)存儲到數(shù)據(jù)庫中時用的編碼名稱
- 字符排序規(guī)則通常不設置,即使用默認排序規(guī)則
修改數(shù)據(jù)庫
alter database 數(shù)據(jù)庫名 character set =新字符集 collate=新校對集;
刪除數(shù)據(jù)庫
drop database 數(shù)據(jù)庫名;
其他數(shù)據(jù)庫相關語句
選擇進入某數(shù)據(jù)庫:use 數(shù)據(jù)庫名;
顯示所有數(shù)據(jù)庫: show datebases;
顯示某個數(shù)據(jù)庫的"創(chuàng)建語句":show create database 數(shù)據(jù)庫名
字段類型
通用定義形式
定義一個字段的時候的類型的寫法,比如:
creat table tab1 (f1 數(shù)據(jù)類型);
數(shù)據(jù)類型:類型名 [(長度)][unsigned][zerofill]
zerofill:填充0,是指如果一個數(shù)字的長度不夠指定長度的時候可以在左邊補充0,如果用zerofill則是無符號類型(表示范圍正數(shù)*2,無負數(shù))
整數(shù)類型
小數(shù)類型
float:非精確
double:非精確
decimal:定點型,精確數(shù),需要設定長度,形式為:decimal(總長,小數(shù)位數(shù))
時間日期類型
date:年月日
time:時分秒
datetime:年月日時分秒
year:可以是4位數(shù)字或4位純數(shù)字字符串,也可以是2位整數(shù)或2位純數(shù)字字符串
timetamp:時間戳
寫入數(shù)據(jù)庫時,直接的時間日期數(shù)據(jù),應該用單引號引起來
字符串類型
varchar:可變長度字符串類型,最多能存儲2^16個字節(jié),設定長度為最長長度,不足不用補空格
char:定長字符串類型,最多存儲256個字符,不足補空格,溢出的無法存儲
2個二進制文本
binary:類似char,存文本的二進制數(shù)據(jù)
varbinary:類似varchar,存文本的二進制數(shù)據(jù)
2個大文本
text:存儲超大文本,varchar不夠用它,與char和varchar效率低
blob:可以存儲超大二進制數(shù)據(jù),用于存儲圖片這種二進制數(shù)據(jù)
2個有關"選項"的文本存儲形式
enum:枚舉,類似于OC的枚舉.名稱 enum('選項1','選項2','選項3','選項4')
,本質存儲的其實是數(shù)字
set:專門用于存儲類型表單中的"多選項"的值,名稱 set('選項1','選項2','選項3','選項4')
,本質存儲的數(shù)字是1,2,4,8,16···這樣的數(shù)字,即每個選項代表二進制中對應的哪一位1,如果插入非2次方的數(shù)據(jù),例如7,則為1+2+4,選項1,選項2,選項3。
表定義語句
創(chuàng)建表
基本形式:
create table [if not exists] 表名(字段列表,[約束或索引列表]) [表選項列表]
字段列表如果是多個,中間用逗號隔開
字段基本形式:字段名 類型[字段修飾屬性]
表選項:
表選項就是對一個表的有關屬性的設定,通常都不需要。如果不設定,有默認值。
有以下幾個可用:
comment = '表的注釋';
charset = 字符編碼名稱;//跟數(shù)據(jù)的字段編碼設定一個意思。
字符編碼設定的范圍及繼承關系:
- 系統(tǒng)級設定:安裝時確定了
- 庫級設定:建庫時設定
- 表級設定:charset就是表級設定
- 字段級設定:作為字段屬性出現(xiàn)
auto_increment = 起始整數(shù);//自增長類型值初值,默認是1
engine = "表的存儲引擎名";
-
存儲引擎就是將數(shù)據(jù)存入硬盤的方式方法
存儲引擎對比
字段屬性:
not null:不為空,表示不能為null,不寫默認為空
auto_increment:int類型字段的值可以"自增長",即其值無須"寫入",而會自動獲得并添加
primary key:主鍵,一個表只能有一個主鍵,是唯一鍵的強化,不能重復,并且不能使用null,并且可以作為任意一行數(shù)據(jù)的"關鍵值",大多數(shù)表使用id并自增長類型作為主鍵
unique key:唯一鍵,該字段所有行行的值不可以重復
default:一個字段在沒有插入數(shù)據(jù)的時候自動使用值
comment:字段注釋
//范例
create table tab1(
id int auto_increment primary key not null,
f1 float unique,
f2 decimal(20,5) default 12.3,
f4 varchar(20) comment'這是一個注釋'
);
索引:
索引是一個"內置表",該表的數(shù)據(jù)是對某個真是表的某個字段的數(shù)據(jù)做了"排序"之后的存儲形式。
作用:極大提高表查找速度,效率類似二分查找,但會降低增刪改的速度,對創(chuàng)建表來說,建立索引非常簡單:key(字段1,字段2····)
,unique key(字段1,字段2····)
,primary key(字段1,字段2····)
,fulltext(字段1,字段2····)
//范例
create table tab2(
id int auto_increment not null,
f1 float,
f2 decimal(20,5) default 12.3,
f4 varchar(20) comment'這是一個注釋',
primary key(id),/*其實和寫在字段上作為屬性意義一樣,但是出現(xiàn)在這里叫做主鍵索引,出現(xiàn)的場合不同叫法不同而已*/
unique key(f1),/*同上*/
key(f2)
);
約束:
約束是一種限定數(shù)據(jù)以符合某種要求的形式(機制)
約束主要有:
primary key:主鍵索引,主鍵屬性,主鍵約束其實作用一樣
unique key:唯一索引,唯一屬性,唯一索引其實作用一樣
foreign key:外鍵約束,此值其實是其他表的主鍵,所以不能修改。foreign key (字段名1,字段名2,···)references 表名2(字段名1,字段名2,···)
修改表
通常創(chuàng)建表做的事,修改表也能做到,大體來說可以做到:
- 增刪改字段
- 增刪索引
- 增刪約束
- 修改表選項
詳細操作看手冊
修改表的基本形式
alter table 表名 修改語句;
刪除表
刪除表的基本形式
drop table [if exists] 表名;
標的其他操作
顯示所有表:show tables
顯示表結構:desc 表名
顯示表的創(chuàng)建語句:show create table 表名
從已有表復制表結構:create table [if no exist] 新表名 like 原表名
視圖
視圖可以看做是一個"臨時存儲的數(shù)據(jù)所構成的表"(非真實表),其實本質上只是一個select語句,只是將該select語句(通常比較復雜)進行一個"包裝",并設定了一個名字,之后把這個名字當做一個表來使用。如果一個select 語句比較復雜,又在多個頁面需要使用它,則可以將它做成一個視圖,方便使用。如果某個數(shù)據(jù)表中的某些字段不想給別人看(不同公司之間的數(shù)據(jù)業(yè)務交換的時候),但有需要給別人看的時候,則可以將它做成一個視圖。
視圖創(chuàng)建形式
/**創(chuàng)建*/
create view 視圖名[(列名1,列名2,···)] as 一條復雜的select語句;
/*修改*/
alter view 視圖名 [(列名1,列名2,···)] as select 語句;
/*刪除*/
drop view [if exists] 視圖名;
視圖的使用
其實就是當做一個查詢表來用(通常只用于select)
select * from 視圖名 where 條件 order by···