一、基礎概念
關系型數據庫:由二維表及其之間的聯(lián)系所組成的一個數據組織。
非關系型數據庫:以鍵值對存儲抒线,且結構不固定,每一個元組可以有不一樣的字段夕冲,每個元組可以根據需要增加一些自己的鍵值對氮兵,這樣就不會局限于固定的結構,可以減少一些時間和空間的開銷歹鱼。
實體:現實世界中客觀存在并可以被區(qū)別的事物泣栈。比如“一個學生”、“一本書”弥姻、“一門課”等等南片。值得強調的是這里所說的“事物”不僅僅是看得見摸得著的“東西”,它也可以是虛擬的庭敦,比如說“老師與學校的關系”疼进。
屬性:教科書上解釋為:“實體所具有的某一特性”,由此可見秧廉,屬性一開始是個邏輯概念伞广,比如說,“性別”是“人”的一個屬性疼电。在關系數據庫中嚼锄,屬性又是個物理概念,屬性可以看作是“表的一列”澜沟。
元組:表中的一行就是一個元組灾票。
分量:元組的某個屬性值。在一個關系數據庫中茫虽,它是一個操作原子刊苍,即關系數據庫在做任何操作的時候,屬性是“不可分的”濒析。否則就不是關系數據庫了正什。
碼:表中可以唯一確定一個元組的某個屬性(或者屬性組),如果這樣的碼有不止一個号杏,那么大家都叫候選碼婴氮,我們從候選碼中挑一個出來做老大,它就叫主碼盾致。
全碼:如果一個碼包含了所有的屬性主经,這個碼就是全碼。
主屬性:一個屬性只要在任何一個候選碼中出現過庭惜,這個屬性就是主屬性罩驻。
非主屬性:與上面相反,沒有在任何候選碼中出現過护赊,這個屬性就是非主屬性惠遏。
外碼:一個屬性(或屬性組)砾跃,它不是碼,但是它別的表的碼节吮,它就是外碼抽高。
二、3范式
第一范式:列不可分
第二范式:完全依賴透绩,對于由屬性(A翘骂,B)聯(lián)合構成的主鍵,存在屬性C由A或B一個屬性就能確定渺贤,這就是部分依賴雏胃,C必須由聯(lián)合主鍵確定,才是完全依賴
第三范式:無傳遞依賴志鞍,屬性C依賴屬性B,屬性B依賴與主鍵A方仿,這種傳遞依賴不能存在固棚。
這三個范式都是為了減少數據庫數據冗余,使表結構更加合理仙蚜。
三此洲、SQL
1、顯示數據庫委粉、創(chuàng)建數據庫呜师、打開數據庫
SHOW DATABASES;
CREATE DATABASE 數據庫名稱 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
USE db_name;
2、用戶管理贾节、權限設置
創(chuàng)建用戶
create user '用戶名'@'IP地址' identified by '密碼';
刪除用戶
drop user '用戶名'@'IP地址';
修改用戶
rename user '用戶名'@'IP地址'; to '新用戶名'@'IP地址';;
修改密碼
set password for '用戶名'@'IP地址' = Password('新密碼')
PS:用戶權限相關數據保存在mysql數據庫的user表中汁汗,所以也可以直接對其進行操作(不建議)
show grants for '用戶'@'IP地址' -- 查看權限
grant 權限 on 數據庫.表 to '用戶'@'IP地址' -- 授權
revoke 權限 on 數據庫.表 from '用戶'@'IP地址' -- 取消權限
對于目標數據庫以及內部其他:
數據庫名.* 數據庫中的所有
數據庫名.表 指定數據庫中的某張表
數據庫名.存儲過程 指定數據庫中的存儲過程
*.* 所有數據庫
'用戶名'@'IP地址' 用戶只能在改IP下才能訪問
'用戶名'@'192.168.1.%' 用戶只能在改IP段下才能訪問(通配符%表示任意)
'用戶名'@'%' 用戶可以再任意IP下訪問(默認IP地址為%)
3、顯示表栗涂、創(chuàng)建表知牌、修改表
show tables;
create table tb_name(
id int not null auto_increment,
value int(2) not null default 0,
name char(10) default 'aa',
area char(20) default null,
primary key(id,value),
unique key(area),
constraint fk_name foreign key (name) references tb_other(name)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ps:
外鍵的好處:可以使得兩張表關聯(lián),保證數據的一致性和實現一些級聯(lián)操作斤程;
唯一鍵作用:一是約束作用(constraint)角寸,規(guī)范數據的唯一性,但同時也在這個key上建立了一個唯一索引忿墅;
unique key 與 primary key 區(qū)別:unique key 可為null扁藕;
添加列:
alter table 表名 add 列名 類型
刪除列:
alter table 表名 drop column 列名
修改列:
alter table 表名 modify column 列名 類型; -- 類型
alter table 表名 change 原列名 新列名 類型; -- 列名,類型
添加主鍵:
alter table 表名 add primary key(列名);
刪除主鍵:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
添加外鍵:
alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段);
刪除外鍵:
alter table 表名 drop foreign key 外鍵名稱
修改默認值:
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
刪除默認值:
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
清空表:
delete from tb_name;
刪除表:
drop table tb_name;
4疚脐、索引
create index index_birthday on user_info(birthday);
create index index_birthday_and_user_name on user_info(birthday, user_name);
首先亿柑,通過非聚集索引index_birthday查找birthday等于1991-11-1的所有記錄的主鍵ID值。
然后亮曹,通過得到的主鍵ID值執(zhí)行聚集索引查找橄杨,找到主鍵ID值對就的真實數據(數據行)存儲的位置
5秘症、增、刪式矫、改乡摹、查
增:
insert into test(name, age) values('name', 18);
insert into test(name, age) values('name1', 18),('name2', 18); #一次性插入多個值
insert into test(name, age) select name,age from test1; #把某張表中的數據插入
刪:
delete from test;
delete from test where id>2 and name='name1';
改:
updata test set name='name2',age=19 where id>12 and name='name1';
查:
select * from test;
select id,name from test where id>2;
select name,age,123 from test;
select name as rname from test;
select * from test where id in (1,3,5,7);
select * from test where id in (select id from test1);
select * from test where id between 5 and 9; #閉區(qū)間,左右都可以取到
通配符
select * from test where name like 'name%'; %匹配無數字符采转;_匹配一個字符
分頁
select * from test limit 10; 取前十條
select * from test limit 0,10; 表示從0開始聪廉,取0后面的10條
select * from test limit 10 offset 20; 表示從20開始,取20后的前10條
排序
select * from test order by id desc; id從大到小排列
select * from test order by id asc; id從小到大排列
select * from test order by age desc, id asc; 多個不同排序
select * from test order by desc limit 10; 取后十條
分組(聚合函數:count,max,min,sum,avg求平均值)
select max(id),id from test group by sex; 如果遇到相同的sex故慈,只會取最大id的
select count(id),id from test group by sex; 計數
select count(id) as count,id form test group by sex;
select count(id),id from test group by sex having count(id)>2; 對于聚合函數結果進行二次篩選時板熊,必須使用having
select
from
where
group by
order by
6、三大數據類型
數值型
int
float(m,d)
double(m,d)
m表示總長察绷,d表示小數點后的位數
時間型
datetime
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)
字符型
char varchar text
7干签、InnoDB與MyISAM區(qū)別
MyISAM:默認表類型,它是基于傳統(tǒng)的ISAM類型拆撼,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫容劳,它是存儲記錄和文件的標準方法。不是事務安全的闸度,而且不支持外鍵竭贩,如果執(zhí)行大量的select,insert MyISAM比較適合莺禁。
InnoDB:支持事務安全的引擎留量,支持外鍵、行鎖哟冬、事務是他的最大特點楼熄。如果有大量的update和insert,建議使用InnoDB柒傻,特別是針對多個并發(fā)和QPS較高的情況孝赫。
8、視圖红符、游標青柄、連接、函數预侯、事務致开、存儲過程
有空再寫。萎馅。双戳。