所謂的數據庫就是指存儲和管理數據的倉庫。如今市面上的數據庫分爲兩大陣營:
關係型數據庫和非關係型數據庫。mysql
關係型數據庫最典型的數據結構是表,由二維表及其之間的聯繫所組成的一個數據組織。
優勢:
一、易於維護:都是使用表結構,格式一致;
二、使用方便:SQL語言通用,可用於複雜查詢;
三、複雜操做:支持SQL,可用於一個表以及多個表之間很是複雜的查詢。
缺點:
一、讀寫性能比較差,尤爲是海量數據的高效率讀寫;
二、固定的表結構,靈活度稍欠;
三、高併發讀寫需求,傳統關係型數據庫來講,硬盤I/O是一個很大的瓶頸。
經常使用的幾個:mysql /oracle/sql server/sqliteredis
非關係型數據庫嚴格上不是一加粗樣式種數據庫,應該是一種數據結構化存儲方法的集合,能夠是文檔或者鍵值對等
優勢:
一、格式靈活:存儲數據的格式能夠是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應用場景普遍,而關係型數據庫則只支持基礎類型。
二、速度快:nosql可使用硬盤或者隨機存儲器做爲載體,而關係型數據庫只能使用硬盤;
三、高擴展性;
四、成本低:nosql數據庫部署簡單,基本都是開源軟件。
缺點:
一、不提供sql支持,學習和使用成本較高;
二、無事務處理;
三、數據結構相對複雜,複雜查詢方面稍欠。
經常使用的幾個:redis/hbase/mongoDB/CouchDB/Neo4Jsql
瑞典MySQLAB公司提供,免費開源,適用於一些小型或者中型的項目中,在Java中的使用佔比較高(小巧輕量)數據庫
數據庫服務器就是一個軟件(好比mysql軟件)將數據庫軟件安裝在電腦上,當前電腦就是一個數據庫服務器。就能夠對外提供存取數據的服務,在一個數據庫服務器中能夠建立多個數據庫(dataBases),每個數據庫都是一個單獨的倉庫。express
數據庫就是存儲和管理數據的倉庫,一般狀況下,一個網站的中的全部數據會存放在一個數據庫中。編程
一個數據庫中能夠建立多張表,每張表用於存儲一類信息(數據庫)安全
一張表中能夠包含多行表記錄,每一行表記錄用於存儲某一個具體的數據服務器
日期和時間數據類型
數值數據類型
整型
浮點型
字符串數據類型數據結構
SQL是一門用於操做關係型數據庫的通用的語言(使用SQL能夠操做全部的關係型數據庫)
使用SQL能夠操做數據庫、表、表記錄
(1)建立數據庫、刪除數據庫、修改數據庫、查詢數據庫
(2)建立表、刪除表、修改表、查詢表
(3)新增表記錄、刪除表記錄、修改表記錄、查詢表記錄
提示:SQL是一個標準通用的操做關係型數據庫的語言(普通話),每一個數據庫廠商爲了加強本身數據庫的功能,都提供了支持本身數據庫的語言,稱之爲數據庫的方言。方言不通用!併發
索引就是一個數據結構,咱們把表中的記錄用一個適合高效查找的數據結構來表示,目的就是讓查詢變得更高效。
mysql中使用最普遍的數據引擎實際上是B+樹索引,原理詳解推薦博客:mysql提高查詢效率的神器索引
show index from 表名;
create index 索引名 on 數據表(字段名稱長度)
drop index 索引名稱 on 數據表
常見的表關係分爲如下三種:
一對多(多對一)、一對1、多對多
目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。
而一般咱們用的最多的就是第一範式(1NF)、第二範式(2NF)、第三範式(3NF),也就是通俗的數據庫「三大範式」。
舉例說明:
在上面的表中,「家庭信息」和「學校信息」列均不知足原子性的要求,故不知足第一範式,調整以下:
可見,調整後的每一列都是不可再分的,所以知足第一範式(1NF);
第二範式須要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。
舉例說明:
在上圖所示的狀況中,同一個訂單中可能包含不一樣的產品,所以主鍵必須是「訂單號」和「產品號」聯合組成,
但能夠發現,產品數量、產品折扣、產品價格與「訂單號」和「產品號」都相關,可是訂單金額和訂單時間僅與「訂單號」相關,與「產品號」無關,
這樣就不知足第二範式的要求,調整以下,需分紅兩個表:
第三範式須要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
舉例說明:
上表中,全部屬性都徹底依賴於學號,因此知足第二範式,可是「班主任性別」和「班主任年齡」直接依賴的是「班主任姓名」,
而不是主鍵「學號」,因此需作以下調整:
這樣以來,就知足了第三範式的要求。
ps:若是把上表中的班主任姓名改爲班主任教工號可能更確切,更符合實際狀況,不過只要能理解就行。
SHOW DATABASES; -- 查看當前數據庫服務器中的全部庫 CREATE DATABASE mydb1; -- 建立mydb1庫 show databases; -- 查詢服務器全部的數據庫 show tables; -- 查詢當前庫全部表 use mysql; -- 進入到‘mysql’數據庫 show tables; -- 查詢當前庫中的全部表 select database();-- 查看已進入的庫 -- 先進入某一個庫,再查看當前庫中的全部表 use test; show tables; drop database mydb1; -- 刪除mydb1庫,但若是刪除的庫不存在,則會報錯 drop database if exists mydb1;-- 若是mydb1庫存在則刪除,若是不存在,也就不執行刪除操做! create database mydb1 charset utf8;--從新建立mydb1庫,指定編碼爲utf8 create database if not exists mydb1 charset utf8;-- 若是不存在則建立mydb1; show create database mydb1;--查看建庫時的語句
use mydb1; -- 進入mydb1庫 drop table if exists stu;-- 若是存在stu表,則刪除 desc stu;--查看stu學生表結構 -- 若是存在,則刪除stu表 drop table if exists stu; -- 建立stu學生表 create table stu( id int primary key auto_increment, -- 給id添加主鍵約束,並設置自增 name varchar(50), gender varchar(10) not null, -- 給gender添加非空約束 birthday date, score double );
-- 若是是在cmd中執行插入記錄的語句,先 set names gbk; 再插入記錄! -- 因爲id已經設置了主鍵自增,因此在插入數據,id能夠不用給值 insert into stu(id,name,gender,birthday,score) value (null,'tom','male','2000-3-4',89); insert into stu value(null,'john','male','2002-5-6',78); insert into stu value(null,'andy','female','2004-7-6',91); select * from stu;-- 查詢學生表中的全部記錄 update stu set score=score+10;--修改stu表中全部學生的成績,加10分特長分 update stu set score=83 where id=1;-- 修改stu表中編號爲1的學生成績,將成績改成83分。 update stu set score=99,gender='male' where id=3;-- 修改3號學生的性別爲 'male',成績改成99; delete from stu; -- 刪除stu表中的全部記錄 delete from stu where id>2; -- 刪除stu表中id大於2的記錄
select name,sal,bonus from emp;-- 查詢emp表中的全部員工,顯示姓名,薪資,獎金 select dept,job from emp;-- 查詢emp表中的全部部門和職位 select distinct dept,job from e;--在select以後、列名以前,使用DISTINCT 剔除重複的記錄
WHERE子句查詢語法:SELECT 列名稱 | * FROM 表名稱 WHERE 列 運算符 值
WHERE子句後面跟的是條件,條件能夠有多個,多個條件之間用鏈接詞(or | and)進行鏈接
下面的運算符可在 WHERE 子句中使用:
--查詢emp表中【薪資大於3000】的全部員工,顯示員工姓名、薪資 select name,sal from emp where sal>3000; --查詢emp表中【總薪資(薪資+獎金)大於3500】的全部員工,顯示員工姓名、總薪資 select name,sal+bonus from emp where sal+bonus > 3500; --查詢emp表中【薪資在3000和4500之間】的員工,顯示員工姓名和薪資 select name, sal from emp where sal>=3000 and sal<=4500; --查詢emp表中【薪資爲 1400、1600、1800】的員工,顯示員工姓名和薪資 select name,sal from emp where sal=1400 or sal=1600 or sal=1800;
LIKE 操做符用於在 WHERE 子句中搜索列中的指定模式。
能夠和通配符(%、_)配合使用,其中 "%"表示0或多個任意的字符 , "_"表示一個任意的字符 。
語法:SELECT 列 | * FROM 表名 WHERE 列名 LIKE 值
-- 查詢emp表中姓名中以"劉"字開頭的員工,顯示員工姓名。 select name from emp where name like '劉%'; -- 查詢emp表中姓名中包含"濤"字的員工,顯示員工姓名。 select name from emp where name like '%濤%'; --查詢emp表中姓名以"劉"開頭,而且姓名爲兩個字的員工,顯示員工姓名。 select name from emp where name like '劉_'; select name from emp where name like '劉__';
多行函數也叫作聚合(彙集)函數,根據某一列或全部列進行統計
提示:
(1)多行函數不能用在where子句中
(2)多行函數和是否分組有關,分組與否會直接影響多行函數的執行結果。
(3)多行函數在統計時會對null值進行過濾,直接將null值丟棄,不參與統計。
--統計emp表中薪資大於3000的員工個數 select count(*) from emp where sal>3000; -- 7 select count(id) from emp where sal>3000; -- 7 --求emp表中的最高薪資 select max(sal) from emp; -- 返回最高薪資,5000 --統計emp表中全部員工的薪資總和(不包含獎金) select sum(sal) from emp; -- 薪資總和:39650 select sum(bonus) from emp; -- 獎金總和:5900,多行函數對null會處理,直接丟棄,不參與統計 --統計emp表員工的平均薪資(不包含獎金) select avg(sal) from emp; -- 39650/12 --統計emp表中的人數 select count(*) from emp; -- 12
GROUP BY 語句根據一個或多個列對結果集進行分組。
在分組的列上咱們可使用 COUNT,SUM,AVG,MAX,MIN等函數。
語法:SELECT 列 | * FROM 表名 [WHERE子句] GROUP BY 列;
-- 根據部門對員工進行分組 select name,dept from emp group by dept; -- 統計分組後,每組的人數 select count(*) from emp group by dept; -- 3個組,因此會統計出三個結果 -- 根據job進行分組,統計每一個組的人數(每一個職位的人數) select job,count(*) from emp group by job; -- 若是不分組,直接使用max(sal),這是統計整個emp表中的最高薪資 select max(sal) from emp; -- 5000; -- 若是根據部門分組,能夠分爲三個組,再使用max(sal),就是統計每一個組的最高薪資 select dept, max(sal) from emp group by dept;
提示:
分組查詢中若是有條件判斷須要把關鍵字WHERE換成HAVING
使用 ORDER BY 子句將結果集中記錄根據指定的列排序後再返回
語法:SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC]
--對emp表中全部員工的薪資進行升序(從低到高)排序,顯示員工姓名、薪資。 select name,sal from emp order by sal asc; -- 默認是升序,asc能夠省略 select name,sal from emp order by sal; --對emp表中全部員工的獎金進行降序(從高到低)排序,顯示員工姓名、獎金。 select name,bonus from emp order by bonus desc;
在mysql中,經過limit進行分頁查詢,查詢公式爲:
limit (頁碼-1)*每頁顯示記錄數, 每頁顯示記錄數
-- 每頁顯示3條,查詢第1頁數據 select * from emp limit 0,3; -- 每頁顯示3條,查詢第2頁數據 select * from emp limit 3,3; -- 每頁顯示3條,查詢第3頁數據 select * from emp limit 6,3; -- 每頁顯示3條,查詢第4頁數據 select * from emp limit 9,3; -- 先根據薪資降序(從高到低)排序 select name,sal from emp order by sal desc; -- 在排序的基礎上,分頁查詢,每頁顯示3條,只查詢第1頁 select name,sal from emp order by sal desc limit 0,3;
笛卡爾積查詢:所謂笛卡爾積查詢就是指,查詢兩張表,其中一張表有m條記錄,另外一張表有n條記錄,查詢的結果是m*n條。
雖然笛卡爾積查詢中包含大量錯誤數據,但咱們能夠經過where子句將錯誤數據剔除,保留下來的就是正確數據。
-- 查詢部門和部門對應的員工信息,員工所屬的部門編號,等於部門的編號 select * from dept,emp where emp.dept_id=dept.id;
能夠將左邊表中的全部記錄都查詢出來,右邊表只顯示和左邊相對應的數據,若是左邊表中某些記錄在右邊沒有對應的數據,右邊顯示爲null便可。
--查詢【全部部門】及部門對應的員工,若是某個部門下沒有員工,員工顯示爲null select * from dept left join emp on emp.dept_id=dept.id;
能夠將右邊表中的全部記錄都查詢出來,左邊表只顯示和右邊相對應的數據,若是右邊表中某些記錄在左邊沒有對應的數據,能夠顯示爲null。
--查詢【全部員工】及員工所屬的部門,若是某個員工沒有所屬部門,部門顯示爲null便可 select * from dept right join emp on emp.dept_id=dept.id;
若是想將兩張表中的全部數據都查詢出來(左外+右外並去除重複記錄),可使用全外鏈接查詢,可是mysql又不支持全外鏈接查詢。可使用union將左外鏈接查詢的結果和右外鏈接查詢的結果合併在一塊兒,並去除重複的記錄。
select * from dept left join emp on emp.dept_id=dept.id union select * from dept right join emp on emp.dept_id=dept.id;
內鏈接:inner join
自鏈接:self (本質仍是內鏈接)
視圖是一個虛擬表,其內容由查詢定義。同真實的表同樣,視圖包含一系列帶有名稱的列和行數據。可是,數據庫中只存放了視圖的定義,而並無存放視圖中的數據,這些數據存放在原來的表中。使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。所以,視圖中的數據是依賴於原來的表中的數據的。一旦表中的數據發生改變,顯示在視圖中的數據也會發生改變。一樣對視圖的更新,會影響到原來表的數據。
視圖是存儲在數據庫中的查詢的SQL語句,它主要出於兩種緣由:安全緣由,視圖能夠隱藏一些數據,例如,員工信息表,能夠用視圖只顯示姓名、工齡、地址,而不顯示社會保險號和工資數等;另外一個緣由是可以使複雜的查詢易於理解和使用。這個視圖就像一個「窗口」,從中只能看到你想看的數據列。這意味着你能夠在這個視圖上使用SELECT *,而你看到的將是你在視圖定義裏給出的那些數據列。
視圖是在原有表或者視圖的基礎上從新定義的虛擬表,這能夠從原有的表上選取對用戶有用的信息,忽略次要信息,其做用相似於篩選。視圖的做用概括爲以下幾點:
1. 使操做簡單化
視圖須要達到的目的就是所見即所需。視圖不只能夠簡化用戶對數據的理解,也能夠簡化他們的操做。那些被常用的查詢能夠被定義爲視圖,從而使得用戶沒必要爲之後的操做每次指定所有的條件。
2.增長數據的安全性
經過視圖,用戶只能查詢和修改指定的數據。指定數據以外的信息,用戶根本接觸不到。這樣能夠防止敏感信息被未受權的用戶查看,加強機密信息的安全性。
3.提升表的邏輯獨立性
視圖能夠屏蔽原有表結構變化帶來的影響。例如原有表增長列和刪除未被引用的列,對視圖不會形成影響。一樣,若是修改表中的某些列,可使用修改視圖來解決這些列帶來的影響。
原子性(Atomicity):事務中的全部操做做爲一個總體像原子同樣不可分割,要麼所有成功,要麼所有失敗。
一致性(Consistency):事務的執行結果必須使數據庫從一個一致性狀態到另外一個一致性狀態。一致性狀態是指:1.系統的狀態知足數據的完整性約束(主碼,參照完整性,check約束等) 2.系統的狀態反應數據庫本應描述的現實世界的真實狀態,好比轉帳先後兩個帳戶的金額總和應該保持不變。
隔離性(Isolation):併發執行的事務不會相互影響,其對數據庫的影響和它們串行執行時同樣。好比多個用戶同時往一個帳戶轉帳,最後帳戶的結果應該和他們按前後次序轉帳的結果同樣。
持久性(Durability):事務一旦提交,其對數據庫的更新就是持久的。任何事務或系統故障都不會致使數據丟失。
數據庫中的表與咱們平常生活中使用的表格相似,它也是由行(Row) 和列(Column)組成的。列由同類的信息組成,每列又稱爲一個字段,每列的標題稱爲字段名。行包括了若干列信息項。一行數據稱爲一個或一條記錄,它表達有必定意義的信息組合。一個數據庫表由一條或多條記錄組成,沒有記錄的表稱爲空表。每一個表中一般都有一個主關鍵字,用於惟一地肯定一條記錄。
索引是根據指定的數據庫表列創建起來的順序。它提供了快速訪問數據的途徑,而且可監督表的數據,使其索引所指向的列中的數據不重複。如聚簇索引。
視圖看上去同表彷佛如出一轍,具備一組命名的字段和數據項,但它實際上是一個虛擬的表,在數據庫中並不實際存在。視圖是由查詢數據庫表產生的,它限制了用戶能看到和修改的數據。因而可知,視圖能夠用來控制用戶對數據的訪問,並能簡化數據的顯示,即經過視圖只顯示那些須要的數據信息。
圖表其實就是數據庫表之間的關係示意圖。利用它能夠編輯表與表之間的關係。
缺省值是當在表中建立列或插入數據時,對沒有指定其具體值的列或列數據項賦予事先設定好的值。
規則是對數據庫表中數據信息的限制。它限定的是表的列。
觸發器由事件來觸發,能夠查詢其餘表,並且能夠包含複雜的SQL語句。它們主要用於強制服從複雜的業務規則或要求。也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關係。
所謂用戶就是有權限訪問數據庫的人。
同時須要本身登錄帳號和密碼。用戶分爲:管理員用戶和普通用戶。前者可對數據庫進行修改刪除,後者只能進行閱讀查看等操做。
序列定義存儲在數據字典中,序列經過提供惟一數值的順序表用於簡化程序設計工做。
函數與過程很相似,通常用於計算數據,聲明爲FUNCTION,須要描述返回類型,且PL/SQL塊中至少有一個有效的RETURN語句;函數不能獨立運行,必須做爲表達式的一部分;在DML和DQL中可調用函數。
函數的目標是返回一個值。大多數函數都返回一個標量值(scalar value),標量值表明一個數據單元或一個簡單值。實際上,函數能夠返回任何數據類型,包括表、遊標等可返回完整的多行結果集的類型。
(9) SELECT (10)DISTINCT column,... 選擇,去重 (6) AGG_FUNC(column or expression),... 聚合 (1) FROM [left_table] from後面表 (3) <join_type> JOIN <right_table> join後面表 (2) ON <join_condition> 經過關聯條件 (4) WHERE <where_condition> 過濾數據 (5) GROUP BY <group_by_list> 分組 (7) WITH <CUBE | RollUP> (8) HAVING <having_condition> 分組後的過濾,相似where (11)ORDER BY <order_by_list> 排序 (12)LIMIT count OFFSET count; 分頁
一,什麼是數據庫存儲過程?
存儲過程(Stored Procedure)是一種在數據庫中存儲複雜程序,以便外部程序調用的一種數據庫對象。
存儲過程是爲了完成特定功能的SQL語句集,經編譯建立並保存在數據庫中,用戶可經過指定存儲過程的名字並給定參數(須要時)來調用執行。
存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。
二,爲何要使用存儲過程?
三,存儲過程的分類
(1)數據庫系統存儲過程:數據庫自帶
(2)用戶自定義數據庫存儲過程:由用戶根據須要自定義
四,MySql數據庫存儲過程
建立存儲過程:
create procedure 存儲過程名字() begin SQL語句/邏輯 end;
調用存儲過程:
call 存儲過程名字(); call 存儲過程名字(@參數1,@參數2,@參數3,...);
刪除存儲過程:
drop procedure if exists 存儲過程名字; - -這裏存儲過程名字後面沒有()
1.建立數據庫:
create database test;
2.使用數據庫:
use test;
3.建立數據表student:
create table student( id int not null comment '學生id', name varchar(30) comment '學生姓名', chinese int(3) comment '語文成績', math int(3) comment '數學成績', enginsh int(3) comment '英語成績', count int(3) comment '總成績', primary key(id) )Engine=InnoDB default charset=utf8 comment '學生成績表';
4 數據表的數據爲:
5.建立帶參數的存儲過程:
create procedure mm( out min int, out max int, out avg decimal(8,2) ) begin select MIN(chinese) into min from student; select MAX(math) into max from student; select AVG(count) into avg from student; end;
6.調用存儲過程:
call mm(@min,@max,@avg);
該調用並無任何輸出, 只是把調用的結果賦給了調用時傳入的變量(@min, @avg, @max)。而後便可調用顯示該變量的值。
7.調用顯示存儲過程的值:
select @min,@max,@avg;
8.使用in參數, 輸入一個學生id, 返回該學生的總成績
存儲過程代碼:
create procedure getTotal( in id int, out total decimal(8,2) ) begin select SUM(s.count) from student s where s.id = id into total; end;
9.調用存儲過程:
call getTotal(2, @total); select @total;
至此就是一個簡單的MySql數據庫存儲過程。