1. 程式人生 > >資料庫增刪改查梳理

資料庫增刪改查梳理

約束條件 作用: 保證資料的完整性和一致性
PRIMARY KEY (PK) 主鍵 >>>>(唯一且不能為空)
FOREIGN KEY (FK) 外來鍵
UNIQUE KEY (UK) 唯一鍵
NOT NULL 設定欄位不能為空 預設的欄位可以為空
AUTO_INCREMENT 欄位的值自動增長(要求:int 且為主鍵)
DEFAULT 設定預設值

UNSIGNED 無符號(資料不能為負)
ZEROFILL 使用0填充

 

常見例子
create table panzhenwei (id int primary key auto_increment ,name char(4),sex enum('male','female') not null default 'male' ,age int unsigned)

定義主鍵
新表定義主鍵
1.使用not null +unique
2.直接在欄位後新增primary key
3.在最後單獨定義
create table panzhenwei (id int constraint 鍵的名稱 primary key(欄位名...) )
新增主鍵
alter table 表名 add primary key(欄位)
alter talbe 表名 modify 欄位 資料型別 primary key


定義外來鍵
外來鍵使用要注意的幾個點;
1.兩張表都必須是InnoDB表 (show create table 表名)
2.對應列必須具有相似的內部資料型別。
3.建立外來鍵關係的對應列必須建立了索引(eg: primary key)

簡單的說就是建立外來鍵的時候的資料型別要與主鍵的資料型別保持一致
首先設定被關聯表,在設定關聯表 ,然後在關聯表上指定被通過某一與被關聯表上的相同項進行關聯

1.新表定義外來鍵,都是在最後新增
create table 表1(欄位1 資料型別 ,dep_id int ,
foreign key(dep_id) references dep(id))
create table 表1(欄位1 資料型別 ,dep_id int ,
constranint panhzenwei_pk foreign key(dep_id) references dep(id))

這條指令中本表的的dep_id 的項關聯dep表中的id的項
dep 的id項必須是主鍵

並且在插入資料的時候,先插如被關聯表的資料在插入關聯表的資料
在刪除資料的時候,如果被關聯表的某些資料被關聯之後,是不能做出刪除或更改的操作的,只能在關聯的表上進行操作
要先將關聯資料刪除,才能刪除被關聯的表的資料。


資料庫的增刪改查

create database panzhenwei charset utf8

drop database panzhenwei

alter database panzhenwei charset utf8; 只能更改資料庫的編碼方式

show database database panzhenwei 檢視建立的資料庫的編碼型別
setect database() 檢視當前使用的資料庫

use panzhenwei 切換到使用的資料庫


表的建立
create table 表名(欄位名 資料型別[寬度] [約束條件]);所謂的約束條件是設定唯一鍵,主鍵或者是外來鍵

將查詢的內容新增到一張新的表中(只能複製表的結構和內容,不會複製表的 約束條件)
create table 新表 select * from 要複製的表

如果只是想要複製表的結構但是不需要表的內容(只需要將查詢到內容為空複製到新的表中就可以了)

create table 新表 select * from 要複製的表 where 1=2;
或者
create table 新表 like 要複製的表 (使用這個可以將表的主鍵也複製來)


alter table 表名 drop 欄位名
alter table 表名 drop 約束條件
drop table 表名



alter table 表名 rename 新的表名
alter table 表名 panzhenwei engine = innodb 修改表的儲存引擎

alter table 表名 add 欄位名 資料型別 [約束條件]
alter table 表名 add 欄位名 資料型別 after 欄位2 ;表示的是在欄位2的後面新增一個新的欄位

新增欄位的位置預設是直接新增到所有欄位的後面,可以通過使用before/after 設定在某個欄位的前後面,直接使用first 將新增的欄位新增到最前面的位置

一般用於更改資料型別,如果存在主鍵的話,可以通過modify 新增自增 auto_increment
alter table 表名 modify 欄位名 資料型別 [約束條件] #修改欄位的資料型別 可以通過這種方式新增主鍵等,但是不能通過這種方式對鍵進行刪除

更改欄位名,同時也可以更改資料型別
alter table 表名 change 舊欄位名 新欄位名 資料型別(新欄位的資料型別) [約束條件]

 


show tables 檢視存在的表
show create table panzhenwei 檢視建立表的語句和表的型別>>> 可以使用\G 在顯示內容的時候豎行顯示結果
desc panzhenwei 查看錶的結構

 

 

 

行記錄(資料的增刪改查)

增 insert into

insert into 表名 vaules(1,'panzhenwei',25) 按照欄位的順序插入資料
insert into 表名(欄位名) values(插入對應欄位的值) 按照指定的欄位插入資料,如果剩餘的欄位如果有設定了自增的功能的話,就會按照自增自行新增資料
如果沒有設定自增,預設設定對應欄位的值為null ,如果欄位設定了不能為null 的話,就會報錯
如果想要一次性插入多條內容的話,內容之間通過逗號進行分隔

將查詢出來的內容新增到已經存在的表中
insert into 表名(欄位1,欄位2...) select 欄位1,欄位2.... from 表2 ;後面還可以新增條件

刪 delete from
delete from 表名 where 條件 刪除表中符合條件的資料 (即使是清空資料id也不會從0開始)
trunkcate 表名 直接清空表的資料 >>>> id也重新從0開始新增


改:update
update 表名 set 欄位1=新值,欄位2 where 條件 對符合條件的行的某個欄位的值進行更改

 

單表查詢的基本結構
select distinct 欄位名 .... from 表名 where 條件 group by 欄位 having 篩選(函式條件) order by 欄位1.. ase limit 顯示的條數


各個關鍵字執行的優先順序
from >where > group by > having > select > distinct >order by > limit
如果沒有使用group by 則整體作為一組
having 的作用是將分組的結果篩選
order by 將選擇的結果按照欄位升序(ase)或者是倒序(dese)進行排序,
limit 顯示的起始位置 包括起始位置在內顯示多少條

 

多表查詢

select 欄位 from 表1 inner /left/right join 表2 on 表1.欄位 = 表2.欄位


使用inner join與join 的結果是一樣的


所謂的左連線/右連線指的是以哪邊的欄位為優先,如果進行的是左連線,就是
按照左邊的資料為優先,通過某個欄位關聯起來之後,如果右邊在左邊的資料中
沒有對應的項的話,就使用null

全外連線(my sql中使用左連線和右連線進行合併)

selec * from 表1 left join 表2 on 表1.欄位 = 表2.欄位
union
selec * from 表1 right join 表2 on 表1.欄位 = 表2.欄位

使用union 與all_union 的區別是union 會去除相同的記錄

子查詢
將一個查詢的結果作為另一個查詢的查詢條件
子查詢中可以包含:in/not in /any /all /exists 和no exists 等關鍵字
還可以包含比較運算子= != > <

 

 

索引原理與優化
索引的目的>>>> 提高查詢的效率
目的是通過不斷地縮小想要獲取資料的範圍來篩選出最終想要的結果,
同時把隨機的事件變成順序的事件

建立索引的時候要注意的問題
1.索引欄位要儘量的小(注意為什麼,目的是什麼)
2.索引的最左匹配特性(按照表欄位從左往右建立搜尋樹,
搜尋的時候按照從左往右,由左邊的一個欄位確定下一步的搜尋方向)


聚集索引與輔助索引
兩者相同的是都是通過B+樹構建的(二叉樹形式)搜尋樹
葉子節點是否存放一整行的資訊

InnoDB儲存引擎表示索引組織表,即表中資料按照主鍵順序存放。
而聚集索引(clustered index)
就是按照每張表的主鍵構造一棵B+樹
聚集索引中的葉子節點包含整行的資訊,
子節點的資料就是使用者所要查詢的資料


輔助索引的葉子節點不包含行記錄的全部資料
葉子節點除了包含鍵值以外,還包含一個書籤,記錄在哪裡可以找到與索引對應的
整行資訊

 

建立的索引有
普通索引
index

唯一索引
primary key
unique

聯合索引(上面的三個索引方式應用在多個欄位中)
index(id name)
primary key (id name )
unique(id name )

 


建立索引的幾種方式
1.新表很建立索引
create table 表名(欄位 資料型別 primary key )>>>>聚集索引
create table 表名(欄位 資料型別 index/unique 索引名稱 (建立索引的欄位名))>>>> 輔助索引
2.存在的表新增索引
1.直接建立
create table 表名(欄位名 資料型別 index/unique 索引名稱 (建立索引的欄位名))
2.通過修改的方式新增
alter table 表名 add primary key
alter table 表名 modify 欄位 資料型別 primary key >>>>聚集索引
alter table 表名 add unique/index 索引名稱 (建立索引的欄位名)

刪除索引
drop index 索引名稱 on 表名;

檢視索引
show index from 表名
show keys from 表名

 

 

 

 

授權表
user表 可以設定所有的庫,庫下所有的表,表下所有的進行許可權的 設定

db 表 對某一資料庫中的所有的表和所有的欄位進行許可權的設定

tables_priv 對一張表和該表的所有欄位進行許可權的設定

columns_prive 只能對一張表的某一欄位進行許可權的設定

 


建立使用者的格式
grant 許可權 on 資料庫.* to 使用者名稱@登入主機 identified by “密碼”

例如增加一個使用者,增加一個test1使用者,密碼為123456,
可以在任何主機上登入,並對所有資料庫有查詢,增加,修改和刪除的功能
grant select,insert,update,delete on *.* to [email protected]”%” identified by “123456″;


增加一個test2使用者,密碼為123456,只能在192.168.2.12上登入,
並對資料庫student有查詢,增加,修改和刪除的功能
grant select,insert update,delete on student.* to test2#192.168.2.12 identified by “123456″

flush privileges; 對許可權進行重新整理
放開所有的許可權 grant all privileges on ......

修改使用者密碼
update mysql.user set password=password(’123456′) where User=’test1′ and Host=’localhost’;

刪除使用者
delete from user where user=’test2′ and host=’localhost

刪除使用者及許可權
drop user 使用者名稱@’%’


show grants 常用當前使用者的許可權