據說微信搜索《Java魚仔》會變動強哦!java
本文收錄於JavaStarter ,裏面有我完整的Java系列文章,學習或面試均可以看看哦git
(一)概述
在考研的時候,我有一門專業課是數據庫,所以當時我對數據庫的基礎知識掌握的還算比較紮實,上週我再翻開當時考研時翻了無數遍的數據庫書籍的時候,發現好多內容都忘掉了。恰好也決定開始寫數據庫相關的文章,就有了下面的內容。github
(二)基本概念
DB:數據庫DB是長期存儲在計算機內、有組織的、統一管理的相關數據的集合。面試
DBMS:數據庫管理系統是位於用戶與OS之間的一層數據管理軟件,它爲用戶或應用程序提供了訪問DB的方法。sql
DBS:數據庫系統DBS是實現有組織動態地存儲大量關聯數據,方便多用戶訪問的計算機硬件、軟件和數據資源組成的系統,即採用數據庫技術的計算機系統。數據庫
聯繫的元數:與一個聯繫有關的實體集的個數稱爲聯繫的元數。服務器
概念模型:表達用戶需求觀點的DB全局邏輯結構的模型。微信
邏輯模型:表達計算機實現觀點的DB全局邏輯結構的模型。邏輯模型主要有層次、網狀、關係和對象模型4種。ide
外部模型:表達用戶使用觀點的DB局部邏輯結構的模型。模塊化
內部模型:表達DB物理結構的模型。
DDL:定義DB三級結構的語言
DML:對數據庫進行查詢操做的語言
DD:數據字典,存放三級結構定義的DB,對數據庫的操做都要經過DD才能實現
主鍵:數據庫表中對儲存數據對象予以惟一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失。
外鍵:一個表中存在的另一個表的主鍵稱爲此表的外鍵。
觸發器:一個經過事件來觸發而被執行的特殊的存儲過程,好比對一個表數據的操做會觸發另外一個表的數據操做。
存儲過程:是一個預編譯的SQL語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。
視圖:是一種虛擬的表,能夠有選擇性地展現部分數據,試圖一般是有一個表或者多個表的行或列的子集。對視圖的修改會影響基本表
臨時表: 只在當前鏈接可見的表,關閉鏈接後會自動清除表空間。
create TEMPORARY table test222( id int(40) not null primary KEY );
內鏈接: 只鏈接匹配的行
左外鏈接: 包含左邊表的所有行(無論右邊的表中是否存在與它們匹配的行),以及右邊表中所有匹配的行
右外鏈接: 包含右邊表的所有行(無論左邊的表中是否存在與它們匹配的行),以及左邊表中所有匹配的行
全外鏈接: 包含左、右兩個表的所有行,無論另一邊的表中是否存在與它們匹配的行。
交叉鏈接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每一個行與另外一個數據源的每一個行都一一匹配。
(三)數據庫的範式
設計關係數據庫時,聽從不一樣的規範要求,設計出合理的關係型數據庫,這些不一樣的規範要求被稱爲不一樣的範式,越高的範式數據冗餘度越低。
實際開發中涉及到的範式有三種:第一範式、第二範式、第三範式
3.1 第一範式
若是數據庫中的每一列屬性都是不可分解的原子值,那麼說明這個數據庫知足第一範式。
3.2 第二範式
第二範式在第一範式的基礎上,消除了非主屬性對主屬性的部分函數依賴。簡單來說,就是表中的每一列都要和主鍵有關。而不能只與主鍵的某一部分相關
以這樣一個數據爲例,同一個訂單會有多個商品,因此主鍵是訂單id和商品id,可是商品名稱僅依賴於商品id,不知足表中的每一列都要和主鍵有關,而不能只與主鍵的某一部分相關,所以只是第一範式。
修改爲下表這樣就知足了第二範式。
3.3 第三範式
第三範式在第二範式的基礎上,消除了非主屬性對主屬性的傳遞函數依賴,簡單來說,就是每一列數據都和主鍵直接相關,而不能間接相關。
好比一張學生表:
上面的全部屬性均依賴於學號,知足第二範式,簡單來說就是經過學號能肯定後面的全部屬性,可是班主任性別是經過班主任姓名帶出來的,就存在了學號->班主任姓名->班主任性別的傳遞依賴,所以不知足第三範式。
要想知足第三範式,就要消除傳遞依賴。
能夠改爲:
(四)sql的基本操做
4.1 數據庫基本操做
#查看數據庫 show databases #建立數據庫 create database db DEFAULT CHARSET utf8 COLLATE utf8_general_ci; #使用數據庫 use db;
4.2 用戶
#建立用戶 create user '用戶名'@'IP地址' identified by '密碼'; #刪除用戶 drop user '用戶名'@'IP地址'; #修改用戶 rename user '用戶名'@'IP地址'; to '新用戶名'@'IP地址';; #修改密碼 set password for '用戶名'@'IP地址' = Password('新密碼')
建立用戶時:
用戶名:建立的用戶名稱
IP地址:指定用戶能夠從哪一個服務器登錄,本地用戶localhost,任意遠程機用「%」
密碼:該用戶登錄的密碼
4.3 權限
#查看權限: show grants for '用戶'@'IP地址' #受權: grant 權限 on 數據庫.表 to '用戶'@'IP地址' #取消受權: revoke 權限 on 數據庫.表 from '用戶'@'IP地址'
權限:用戶的操做權限,如SELECT,INSERT,UPDATE等,若是要授予所的權限則使用ALL 例如:
GRANT SELECT, INSERT ON student.user TO 'javayz'@'%';
經過下面的命令讓指定用戶能夠給其餘用戶受權
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
4.4 對錶的操做
#查詢全部的表 show tables; #建立表 CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, # not null表示不能爲空,auto_increment表示自增 `name` varchar(255) DEFAULT 'javayz', # default 表示默認值 PRIMARY KEY (`id`) # 把id列設置成主鍵 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; #清空表 truncate table 表名 #刪除表 drop table 表名 #添加列 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 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段); #刪除外鍵 alter table 表名 drop foreign key 外鍵名稱 #修改默認值 ALTER TABLE user ALTER name SET DEFAULT 'javayz2'; #刪除默認值 ALTER TABLE user ALTER name DROP DEFAULT;
4.5 對數據的操做
基礎增刪改查:
#增 insert into 表 (列名,列名...) values (值,值,...) #刪 delete from 表 where 條件 #改 update 表 set 字段='值' where 條件 #查 select 值 from 表 where 條件
其餘條件:
#通配符like %匹配多個字符,_匹配單個字符 select * from 表 where name like '%java_' #limit 限制輸出行數 select * from 表 limit 3 #前3行 select * from 表 limit 3,5; #從第3行開始的5行 #order by 排序 select * from 表 order by 列 asc #asc正序,desc逆序 #group by分組(group by 必須在where以後,order by以前) select name from 表 group by name