一、引言:
這本來是我自己做的筆記,然后發現還不錯,于是就直接發到博客了,由于筆記做的實在太多,省的自己每次查看筆記還要去尋找檔案夾,這樣對于復習就太不高效了,發到博客直接看博客就行了!
二,資料庫的基本概念
英文單詞:database 簡稱DB
是一個用于存盤和管理資料的倉庫
長期存盤在計算機內的,有組織的,有共享的,統一管理的資料集合
特點:
1,持久化存盤資料,起始資料庫就是一個檔案系統
2,方便存盤和管理資料 //重在于管理
3,使用了統一的操作資料庫 --SQL
三.常見資料庫
Orancle資料庫:Orancle收購sum公司
MySql資料庫:
SQL Sever資料庫:微軟公司
SQLite:主要用于手機端,嵌入式的小型資料庫
3.常用資料庫:Orancle,MySQL
四.配置
1,MySql服務啟動
1,手動
2,cmd-> services.msc 打開服務的視窗
3,使用管理員打開cmd
net start mysql:啟動
net stop mysql:關閉
2,mysql登錄
1,mysql -u root -p 密碼
2,mysql -hip -u root -p//連接別人的資料庫
3,mysql退出
1,exit
2,quit
4,mysql目錄結構
1.mysql安裝目錄:組態檔 my.ini
2.mysql資料目錄:
幾個概念:
1,資料庫:就是檔案夾
2,表:就是檔案
3,資料:資料
五,
1,什么是SQL:就是結構化查詢語言
其實就是定義了操作所有關系資料庫的原則
每一種資料庫操作的方式存在不一樣的地方,稱為“方言”
2,sql陳述句的通用方法
1,sql陳述句可以單行或多行書寫,以分號結尾
2,可以使用空格和縮進來增強陳述句的可讀性
3,mysql的sql陳述句不區分大小寫,關鍵字建議使用大寫
4,單行注釋:-- 或 #(#為mysql特有的注釋)
多行注釋:/* */
3,sql分類
1,DDL:資料庫定義語言
用來定義資料庫物件:資料庫,表,列等;關鍵字:create,drop,alter
2,DML:資料操作語言
用來對資料庫表中的資料進行增刪改;關鍵字:insert,delete,update等
3,DQL:資料查詢語言
用來查詢資料表中的資料和記錄;關鍵字:select,where
4,DCL:資料控制語言
用來定義資料庫的訪問權限和安全級別,及創建用戶;關鍵字:grant,remove
六、關系型資料模型
以關系模型為基礎的資料庫,是根據表,元組,欄位之間的關系進行組織和訪問資料的一種資料庫
關系資料庫是目前應用最為廣泛的資料庫
關系(relation):一個二維表就是一個關系3
元組(Tuple):二維表中的一行就是一個元組
屬性(Attribute):二維表中的一列就是一個屬性,給每一個屬性名稱取個名就位屬性名
域(Domain):屬性的取值范圍
資料庫系統有三部分組成:
資料庫:用與存盤資料的地方
資料庫管理系統:用于管理資料庫的軟體
資料庫應用程式:為了提高資料庫系統的處理能力所使用的管理資料庫的軟體補充
mysql服務器端的實用工具
mysqlid:SQL后臺程式(即MYSQL行程),只有該程式運行后客戶端才能進行連接
mysqlid_safe:服務器啟動腳本
mysql.server:服務器啟動腳本
mysqlid_mulit:服務器啟動腳本,可以啟動或停止系統上安裝的多個服務器
myisamchk:用來描述,檢查,優化和維護NyISAM表的使用工具
mysqlbug:MYSQL血線報告腳本
mysql_install_db:該腳本用默認的權限創建MySQl授權表,通常只在系統上首次安裝MySql時執行一次
七,操作資料庫和表
1,操作資料庫:CRUD
creare:創建
retrieve:查詢
update :修改
delete:洗掉
命令列模式:
SHOW DATABASES; :查詢所有的資料庫
CREATE DATABASE 資料庫名稱; :創建資料庫
SHOW CREATE DATABASE 資料庫名稱; :查看指定的資料庫
USE 資料庫名稱;:選擇資料庫
DROP DATABASE 資料庫名稱;:洗掉資料庫
提示:在洗掉資料庫后會將資料庫中的所有資訊洗掉,并且在洗掉資料庫后查詢指定的資料庫會報錯
2,操作表:
use 資料庫:用來選擇資料庫,如果沒有選擇資料庫,則會出現“No database selected”
創建表:
create table <表名> (欄位1 資料型別 等等)
查看表:
DESCRIBE(DESC) <表名>; 查詢表欄位資訊,欄位名,欄位資料型別,是否為主鍵,是否有默認值等,用于查看標的基本結構
SHOW CREATE TABLE <表名\G>; :用于查看標的詳細資訊
修改資料表:
常見的修改表操作有:
1,修改表名
ALTER table 舊表名 rename 新表名;
2,修改欄位型別(通過欄位名修改資料型別)
alter table 表名 modify 欄位名 資料型別;
2.1,修改欄位名
alter table 表名 change 舊欄位名 新欄位名 新欄位資料型別
3,添加欄位
alter table 表名 ADD 欄位名 資料型別
4,洗掉欄位
alter table 表名 drop 欄位名
5,修改欄位排序
根據作業的實際需求修改欄位的排序順序
alter table 表名 modify 欄位1 資料型別 first|after <欄位2>
6,更改表的引擎
先查看當前引擎 desc 表名;(show create table 表名\g)
alter table 表名 engine = (要修改的引擎)
7,洗掉表的外鍵約束
如果不在需要,可以洗掉,一旦洗掉,就會失去主表與外表之間的聯系
查看當前外鍵約束 :show create table 表名\g
` alter table 表名 drop primary key 外鍵名稱
洗掉資料表
drop table 表的名稱
命令列模式:
show tables;:查詢該資料庫中所有的表
DESCRIBE(DESC) <表名>; 查詢表欄位資訊,欄位名,欄位資料型別,是否為主鍵,是否有默認值等,用于查看標的基本結構
SHOW CREATE TABLE <表名\G>; :用于查看標的詳細資訊
注意事項:
1,不區分大小寫,不能使用SQL中的關鍵字
2, 資料表中如果有多列,則需要用逗號隔開
3,約束
主鍵約束:又稱為主碼,是表中一列或多列的組合
該約束要求主鍵列的資料唯一,并且不允許為空,能夠唯一識別表中的一條記錄,加快資料庫中查詢的資訊
單欄位主鍵:可以在屬性后面直接加primary key,也可以在所有陳述句后面直接加primary key(屬性名)
多欄位主鍵:可以在屬性后面直接加primary key,也可以在所有陳述句后面直接加primary key(屬性名,屬性名)
外鍵約束:在兩個表建立連接,外鍵可以為空值,如果不為空值,則外鍵值必須等于另一個表中的主鍵值、
在定義外鍵后不允許洗掉與另一個表中具有關聯的行
語法:constraint 外鍵約束 foreign key(屬性名) references 關聯表(主鍵)
非空約束:not null constraint
對于使用了非空約束的欄位,如果用戶再添加資料時沒有指定值,則會報錯
唯一約束:unique constraint
要求某列唯一,允許為空,但只能出現一個空值,可以保證一列或者幾列都不會出現重復的值
默認約束:default constraint
如果插入的值為空,系統則會將該值為默認值
自增屬性:auto_increment
八,視圖
被稱為虛擬表,類似于窗戶,因此視圖也被稱為虛擬的表,程式員可以通過視圖查看資料表中的資料
保障了資料的安全性,又大大的提高了資料查詢的效率
1,視圖的概念
視圖是一個由查詢陳述句定義定義資料內容的表,表中的資料內容就是SQL查詢陳述句的結果集
視圖并不在資料庫中真是存在,而在參考視圖是動態生成的,不占空間
視圖一經定義就被存盤在資料庫中,對應的資料并沒有像表那樣在資料庫中再存盤一份
2,使用視圖和查詢資料表優勢:
(1)使用視圖簡單,操作視圖和操作資料表完全是兩個不同的概念,用戶不用再清理資料表之間的復雜的邏輯關系,
而且將經常使用的SQL查詢陳述句定義為視圖,可以有效的避免代碼重復,從而減少作業量
(2)使用視圖安全,用戶只訪問到視圖給定的內容集合,這些都是資料表中的某些列和行,避免用戶直接操作資料表引發的一系列錯誤
(3)使用視圖相對獨立,應用程式訪問是通過視圖訪問資料表,從而程式和視圖之間分離,如果資料表有變化,
完全不用修改SQL陳述句,只需要調整視圖定義的內容,不用調整應用程式代碼
(4)復雜的查詢需求:可以進行問題分解,如何創建多個視圖獲取資料,將視圖聯合起來就能得到想要的結果了
視圖的作業機制:在呼叫視圖的時候才會執行視圖中的SQL進行取資料操作,
視圖這樣設計的好處就是比較節省空間,當資料內容總是一樣時,就不需要維護視圖中的內容
3,視圖中的基本操作.
1,創建視圖
創建視圖基本語法: create view 視圖的名稱 as select 查詢的欄位(列名) from 表名
查看創建的視圖:desc 視圖的名稱
查看視圖中的內容:select * from 視圖的名稱
注意事項:視圖必須具有唯一的列名,不能有重復,就想基表那樣
也可以在兩個或多個表中建立視圖:
示例 :> my3_view (name,bumen)
-> as select employee.name , office.depatment
-> from employee , office
-> where employee.id = office.id;
查看:select * from my3_view;
2,查看視圖的基本資訊
show table status like '視圖的名稱'(一定要加單引號) \g;
3,查看視圖詳細資訊
show create view 視圖名稱
4,修改視圖(結構)
與創建視圖幾乎一致,唯一不同點為如果視圖不存在,則進行視圖的創建,如果視圖存在,則進行視圖的修改
create or replace view 視圖的名稱 as select 查詢的欄位(列名) from 表名
還可以以alter來修改視圖 view 視圖的名稱 as select 查詢的欄位(列名) from 表名
alter只能修改已經存在的視圖
5,更新視圖
即對視圖的內容進行修改
update 視圖的名稱 set name=“新名字” where id=1;
insert into 表的名稱 values(id,'name'); //表的修改視圖也回隨著修改
delete from 視圖的名稱 where id=1(條件);
6,洗掉視圖
視圖本身是一個虛擬表,沒有物理檔案存在,所以洗掉視圖并不會洗掉資料,只是洗掉視圖的結構定義
drop view if exists 視圖的名稱
最后可以使用create show view 視圖的名稱 查看操作結果
九,資料的型別和運算子
浮點數和定點數
都可以用(M,D)來表示,M表示精度,即總位數,D表示標度,即小數的位數
浮點數(單精度和雙精度)標度長度超出取值范圍時不會出現警告,而定點數出現警告
日期和時間型別
YEAR:日期范圍:1901~2155
如果以兩位字符表示YEAR,則在'00'(0)~69和70到99之間分別進行轉換,前者為2000到2069,后者為1970到1999
以數字表示時,0表示0000,而不是2000
TIME:日期范圍:-838:59:59~838:59:59
允許小時大于24,用來表示一段時間間隔
存在格式:'D HH:MM:SS' , 'D HH:MM' , 'D HH' ,'SS' , 'HH:MM:SS'
也可以直接一竄數字表示,如果存在超出合理范圍,比如分鐘等,則會在存盤時變成00:00:00
查看當前時間:CURRENT_TIME , NOW();
DATE:日期范圍:1000-01-01~9999-12-31
以'yyyy-mm-dd'或者'yy-mm-dd'表示,也可以不用單引號直接用數字表示
如果直接用數字表示yymmdd時,yy由于不確定年份,則00~69為2000~2069,70~99表示1970~1999
DATETIME:包含日期和時間資訊,范圍1000-01-01 00:00:00' ~ 9999-12-31 23:59:59'
以'yyyy-mm-dd hh:mm:ss'或者'yyyymmddhhmmss'
也可以使用'yy-mm-dd hh:mm:ss'或者'yymmddhhmmss'表示
也可以使用數字yymmddhhmmss表示,遵循00~69以及70~99的原則
mysql允許用不嚴格的語法插入日期
字串型別
char和varchar區別
char為固定字串長度,varchar為可變的字串長度
char不過存入字串的長度為多少,長度最終都為固定長度的大小,而varchar實際的字串長度為最終字串的長度加1
char實際長度小于固定時,會將存盤的字串后面多余的空格洗掉
text:保存非二進制字串
titytext:最大長度為2的8次方-1 text:最大長度為2的16次方-1
mediumtext:最大長度為2的24次方-1 longtext:最大長度為2的32次方-1
set:沒有重復值
set(值1,值2....)
邏輯運算子
NOT或者! :操作0回傳1,1回傳0,null為null;
AND或者&&:非0非null為1,有0為0,其余為空
OR或者||:00為0,0空為空,空空為空,其余為1
位運算子
位或運算子:有1為1,其余為0
位與運算子: 11為1,其余為0
位異或運算子:01為1,其余為0
左移運算子(<<):轉化為二進制高位拋棄,低位補0,例如6<<2,6左移兩位,6的二進制位00000110,左移后為00011000,等于24
右移運算子 (>>):與左移運算子相反
取反運算子(~):將二進制0變1,1變0
十,MySQL函式
數學函式
abs();求絕對值 pi();:求圓周率 MOD(a,b);:求余 sort(a);:求平方根 ceil(a);:回傳不小于a的最小整數
floor(a);:回傳不大于a的最大整數 rand(a);:亂數 round(a,b);:四舍五入,b表示小數點后幾位
pow(x,y);:x的y次冪 sign(x);:符號函式,-,0,+一次回傳-1,0,1
log(x);:x的對數
字串函式
char_length();:計算字串字符數的函式 length();:計算字串的長度函式
concat(s1,s2...);:合并字串的函式 concat_ws(a,s1,s2...);:a作為其他字符之間的分隔符
insert(s1,x,len,s2);:回傳字串s1,s1中起始于x位置,長度為len的子字串將被s2給替換,如果x小于0,則直接回傳原字串
lower(str)或者lcase(str):將字母轉化為小寫字母
upper(str)或者ucase(str):將字母轉化為大寫字母
left(str,len);:回傳字串中左邊len個字符
right(str,len);:回傳字串中右邊len個字符
lpad(s1,len,s2);:在s1左邊填充字串s2,使得s1的最終長度為len;
trim(s);:洗掉字串s兩邊的空格
ltrim(s);:洗掉字串左邊的空格 rtrim(s);:洗掉字串右邊的空格
十一.MySQL資料庫查詢陳述句詳解
1,基本查詢陳述句
select *(欄位名) from 表名 where 運算式 group by 指定查詢的屬性 order by 以某種順序顯示(有升序和降序)
2,查詢表中所有的欄位
select 所有欄位一一列出 from table表名 或者 select * from table表名
3,查詢經過計算的值
在int屬性值中可以在查詢欄位中直接加整數值
4,查詢表中若干記錄
使用where字句對資料進行過濾;條件判斷符有:= !=(<>) < > <= => between and(介于兩值之間)
select a,b from table where c=x(int);
5,多條件查詢資料
select a,b from table where c>x(int) and d>y(int)
select a,b from table where c in ('x','y') in運算子用來查詢滿足指定條件范圍內的記錄,只需滿足其中一條記錄即可
使用distinct關鍵字可以消除重復元素: select distinct (屬性值) from table
6,統計函式和分組資料記錄查詢
count(*):用于統計欄位中指定條件的數目
as : 在查詢結果中作為屬性名顯示 select count(*) as x from table where ... 以x作為屬性名顯示出
分組查詢指的是對資料按照某個或多個欄位進行查詢,使用group by關鍵字進行分組
1,創建分組
select a,count(*) as c from table group by a; 使用group by對每個欄位a的總數進行了分組
2,使用having過濾分組
group by和having一起限定顯示記錄所滿足的條件,只有滿足條件分組才能被顯示出
3,在group by字句中使用with rollup
可以在查詢分組記錄之后增加一條記錄,用來計算查詢出所有記錄的總和
select a,count(*) as c from table group by a with rollup;.
4,多欄位分組
可以在group by后面添加添加屬型可以查詢所有值
7,排序查詢結果
在正常查詢的資料中并沒有以一種特定的順序顯示,因此可以通過select使用order by字句對查詢結果進行排序
1,單欄位排序
select * from table order by x;
order by排序方式是根據字母表的順序進行排序
2,多欄位排序
select a,b from table order by a,b; 先按a的欄位排序,再按b的欄位排序
8,使用limit限制查詢結果的數量
limit 位移偏移量(可選),行數:位移偏移量為可選引數,并且默認0為起始數(對應的第一行),行數為限制的行數
9,連接查詢
連接查詢是關系資料庫中最主要的查詢,包括內連接,外連接等
1,內連接查詢(inner join)
使用比較運算子進行表間的資料操作,并且列出表中與連接條件相匹配的資料行
select table1.a,table1.b,table2.c,table2.d... from table1,table2 where table.a = table.c;
select table1.a,table1.b,table2.c,table2.d... from table1 inner join table2 on table.a = table.c; //使用on關鍵字,而不是用where關鍵字
使用where字句作為過濾條件,只有兩個表符合連接查詢這個條件,才能將結果回傳
2,左外連接查詢(left outer join)
將左邊的連接行與右邊的連接行進行比較,如果右邊的表行中不存在與左邊值相等的值,則為空值
select table1.a,table1.b,table2.c,table2.d... from table1 left outer join table2 on table.a = table.c;
3.右外連接查詢(right outer join)
將右邊的連接行與左邊的連接行進行比較,如果右邊的表行中不存在與左邊值相等的值,則為空值
select table1.a,table1.b,table2.c,table2.d... from table1 left outer join table2 on table.a = table.c;
4,復合條件連接查詢
指的是在連接查詢的程序中通過添加過濾條件限制查詢的結果
select table1.a,table1.b,table2.c,table2.d... from table1 left outer join table2 on table.a = table.c and table1.a = 1;
10,子查詢
指的是一個查詢陳述句嵌套在另一個查詢陳述句的內部的查詢
在select中先計算子查詢,子查詢作為外查詢中的一個過濾條件,查詢可以基于一個表或者多個表
1,帶any和some關鍵字的子查詢
表示滿足其中任意一條件,他們允許創建一個運算式對子查詢的回傳值串列進行比較,只要滿足內層子查詢的任何一個條件就回傳一個結果作為外層查詢條件
any或some關鍵字跟在比較運算子后面
select * from coustomer where age > any (select age from coustomer where name = '鄭輝盛');
2,帶all關鍵字的子查詢
表示需要同時滿足所有條件,他們允許創建一個運算式對子查詢的回傳值串列進行比較,只要同時滿足內層子查詢的全部條件就回傳一個結果作為外層查詢條件
all關鍵字跟在比較運算子后面
select * from coustomer where age >= all (select age from coustomer where name = '鄭輝盛');
3,exists關鍵字查詢
該關鍵字后面為任意的一個子查詢,對子查詢進行運算判斷是否回傳行
即該關鍵字作為查詢條件,如果后面的子查詢為true,即存在,則執行前面的查詢陳述句,否則不執行
select * from coustomer where exists (select age from coustomer where name = 'zhangqiang');
4,帶比較運算子的子查詢
除了以上3個關鍵字查詢,還有<,>,!=,<>,=,>=,<=比較運算子查詢
11,合并查詢
使用關鍵字union可以給出多條select陳述句,并將他們的結果合并組成單個結果集
如果在union后面添加all,則回傳所有的行,如果不加,則回傳一個不重復的結果集
對應的列數以及資料型別應該相同
select * from table_1 union(all) select * from table_2;
12,使用正則運算式查詢
正則運算式通常用來檢索或替換那些符合某個模式的文本內容
使用regexp關鍵字指定正則運算式的字符匹配模式
^ : 匹配文本的開始字符 $ : 匹配文本的結束字符(符號放后面)
. : 匹配任何單個字符(用.代替單個字符) * : 匹配0個或多個在他前面的字符(符號放后面)
+ : 匹配前面的字符一次或多次
<字串> : 匹配包含指定的字串文本,如果要匹配多個字串,則需要使用 | 分開
[字符集合] : 匹配字符集合的任意一個字符 [^字符集合] :與前面相反
字串{n,} : 匹配前面的字串至少n次 ...regexp 'o{2,}'
字串{n,m}: 匹配前面的字串至少n次,至多m次 ...regexp '{2,4}'
十二,資料庫的資料操作
1,插入資料記錄
在使用資料庫之前,資料庫中必須要有資料,使用insert陳述句向資料庫中插入新的資料內容
插入的方式有插入完整的記錄,插入部分的記錄,插入多條記錄,以及插入另一個查詢的結果
為表的指定欄位插入資料
如果在沒有設定自增條件下,如果在對表中插入部分資料的值時,未插入的值在創建表時需要設定默認值
2,修改資料記錄
使用update關鍵字,可以修改特定的行,也可以修改全部的行
update 表名 set 屬性 = 修改的內容 where 屬性 = ''(已知條件)
3,洗掉資料記錄
使用關鍵字delete
delete from 表名 where ... (已知條件) 如: ...where id = 1;、
delete from 表名 where ... between .. and; //洗掉多條記錄(范圍記錄)
delete from 表名 ; //洗掉所有的記錄
十三,索引操作
1,索引的概述
索引對資料庫中一列或多列的值進行排序的一種結構,使用索引可以提高資料庫中特定資料的查詢速度
索引是一個單獨的,存盤在磁盤上的資料庫結構,他包含著對資料表中所有資料的參考指標
2 ,索引的優點
1,通過創建唯一索引可以保證資料庫表中每一行資料的唯一性
2,可以大大加快資料的查詢速度這也是創建索引的最主要原因
3,在實作資料參考性方面可以加快表與表之間的連接
4,在使用分組和排序字句進行資料查詢的同時也可以顯著的減少查詢中分組和排序的時間
3,索引的不利
1,創建索引和威武索引要耗費時間,并且隨著資料量的增加所耗費的時間也會增加
2,索引需要占用磁盤時間,除了資料表堆疊大量空間外,每一個物理索引也要占用一定的物理空間
如果有大量的索引,索引檔案可能比資料檔案更快的達到最大檔案尺寸
3,當對表中的資料進行增加,洗掉和修改的時候索引也要動態維護,這就降低了資料的維護速度
4,索引的分類
1,普通索引和唯一索引:
普通索引:允許在定義索引的列中插入重復值和控制
唯一索引:列值必須唯一,但允許存在空值
2,單列索引和組合索引
單列索引:即一個索引只包含單個列,一個表中有多個單列索引
組合索引:在表的欄位組合上創建的索引
3,全文索引
全文索引的型別為fulltext,在定義索引的列上支持值的全文查找,允許這些列中插入重復值和空值
4,空間索引
對空間資料型別的欄位建立的索引,分別是geometry,point,linestring,polygon
創建空間索引的列必須將其宣告為not null,空間索引必須只存在引擎為myisam的表中創建
5,創建和查看索引
unique:唯一索引 fulltext:全文索引 spatial:空間索引
index 和 key為同義詞,兩者的作用相同,用來指定創建索引
和創建主鍵一樣,將primary key(屬性) 改成 index (屬性)
創建普通索引:index(屬性)
創建唯一索引:unique index(屬性)
創建和查看多列索引:index(屬性1,屬性2...)
創建和查看全文索引:fulltext index(屬性),只有在nyisam存盤引擎支持,并且只適應char,varchar,text
explain:查看索引是否正在使用 explain select * from sy_fruit where子句;
查看表結構:show create table 表名 \G;
6,洗掉索引
drop index index名稱 on 表名
alter table 表名 drop index index的名稱
十四,存盤程序與存盤函式
存盤程序的目的是將常用或復雜的作業預先用sql陳述句寫好并用一個指定的名稱存盤起來
這個程序經過編譯和優化后存盤在資料庫服務器中,因此成為存盤程序
創建存盤程序并不是一件簡單的事,可能在存盤程序中需要復雜的sql陳述句,并且要有創建存盤程序的權限
但是使用存盤程序將簡化操作,減少冗余的操作步驟,同時還減少操作程序的失誤,提高效率
1.1,創建存盤程序
create procedure p_student() begin select * from student; end;
命令列操作模式:
delimiter //
create procedure p_student()
begin
selelt * from table(表名)
end //
1.2,呼叫存盤程序
使用call sp_name(引數)陳述句來呼叫一個使用create procedure創建好的存盤程序
1.3,查看存盤程序
1,show procedure status [like 'paramter'] \G //:回傳存盤程序的特征
該查詢只能查詢存盤程序操作在哪一個資料庫,存盤程序的名稱,型別,誰定義的等資訊,不能查看存盤程序的具體定義
2,show create procedure 存盤程序的名稱 \G //
執行該陳述句可以存盤程序的具體定義陳述句以及存盤程序的模型,資料庫設定的一些資訊
3,information-schema:資訊資料庫,保存著服務器維護其他資料庫的相關資訊,該資料庫中的routines表
提供存盤資訊,通過該表可以查詢相關的存盤資訊合作
select * from information-schema.Routines where routines_name(屬性) = 存盤程序名稱
1.4,修改存盤程序
alter 修改存盤程序
alter procedure 存盤程序名稱
1.5,洗掉存盤程序
drop procedure 存盤程序名稱
并可以使用select * from information-schema.Routinaes where routines_name = 存盤程序名稱
2.1,創建存盤函式
create function fun_name(存盤函式名稱) [func_paramter] returns type roution_body
func_paramter:引數串列:in | out | inout
十五,變數
變數的定義使用declare關鍵字,變數的作用域為begin…end之中
1,定義變數
declare 變數名 type 型別 default “默認值”
2,變數的賦值
set 變數 = ‘變數值’;
select 屬性值 = into 變數值; //將查詢的值賦值
3,流程控制陳述句
構造流程控制陳述句有if,case,loop,leave,iterate,reprat,while陳述句
1,if陳述句:
if 判斷條件 then 執行sql陳述句 else sql陳述句 end if(結束陳述句)
if price > 30 then select '價格太高' else select '價格太低' end if;
2,case陳述句:
可現實比if更為復雜的判斷條件
1, case 判斷引數 when 與判斷引數相符 then select '屬性值'(...)
case name when '1001' then select '一年級'
2,case when 判斷引數 = '與判斷引數相符' then select '屬性值'
case when name='1001' then select '一年級'(...)
3,loop陳述句
可以重復執行的特定陳述句,實作簡單的特定回圈,需要使用leave陳述句停止回圈,跳出回圈程序
4,leave陳述句
主要用來跳出任何被標注的流程控制陳述句
5,iterate
相當于continue,用來跳出當前回圈,但只出現在loop,repate,while陳述句內
6,repeat
創建的是帶條件判斷的回圈程序,每次執行完都會對運算式進行判斷
7,while
有條件控制的回圈條件,以while標簽開始,end while標簽結束
4,游標的使用
在存盤程序或自定義函式中的查詢可能會回傳多條記錄,可使用游標來逐條讀取查詢結果集中的記錄
1,宣告游標:declare cursor_name CURSOR for 查詢陳述句
2,打開游標:open cursor_name
3,使用游標:fetch陳述句來操作和使用游標
fetch cursor_name into var_name...該引數必須在宣告游標中宣告好
4,關閉游標:close cursor_name
5,定義條件和處理程式
15,觸發器(相當于java中事件)
一個特殊的存盤程序,不同的是執行存盤程序要使用call陳述句來呼叫,而觸發器執行不需要啥用call陳述句呼叫
當對資料表進行插入,更新,洗掉等操作時可以激活觸發器并執行觸發器
觸發程式的優點
1,觸發程式的執行是自動的,當對觸發程式的相關的資料做出相應的修改后立即執行
2,觸發程式可以通過資料庫中的相關疊層表修改另外的表
3,觸發器可以實施比primary key 和check約束更為復雜的檢查和操作
1,創建觸發器
1,創建單條執行陳述句觸發器
create trigger 觸發器名稱 時間(before/after) 事件(insert,update,delete)
on table(表名) for each row 觸發器程式體
create trigger in_chufaqi before insert on chufaqi for each row set @ss = new.id + 1
2,創建多條執行陳述句觸發器
即通過一個觸發器對多個屬性進行操作,可以是不同表中的屬性
create trigger 觸發器名稱 時間(before/after) 事件(insert,update,delete)
on table(表名) for each row
begin 多條觸發器程式體 end //
2,查看觸發器
1,通過執行陳述句查看
show triggers;(show triggers \G)加\G往往會使資訊更加有條理,不會那么混亂
2,通過查看系統表查看觸發器
select * from infomation_schema.triggers where trigger_name = '觸發器名稱' \G
3,洗掉觸發器
drop trigger 觸發器的名稱;
十六,資料庫的權限管理與恢復
root用戶,該用戶是超級管理員,擁有所有權限,包括創建用戶,洗掉用戶和修改用戶的密碼等管理權限
權限表存放在mysql資料庫里,存盤賬戶權限資訊表主要有user,db,host,tables_priv,columns_priv和procs_priv
1,user表:
記錄允許連接到服務器的賬號資訊,
用戶列:其包括host,user,password,其中user和host為user表的聯合主鍵,只有3個值匹配的時候才允許連接的建立
權限列:權限列欄位決定用戶的權限,描述了全域范圍內允許對資料和資料庫進行操作,普通權限用于操作資料庫,高級權限用于管理資料庫
權限列欄位默認為N,可以通過update來更改user表中欄位對應的權限
安全列:ssl用于加密,x509用于識別用戶,plugin用于驗證用戶的身份插件
資源控制列:用來限制用戶使用的資源,如每小時查詢的次數,更新的次數等
2,db表和host表
db表中存盤了用戶對某個資料的操作權限,決定用戶能從哪個主機存取哪個資料庫
host中存盤了某個主機對資料庫的權限操作
db表中3個欄位,分別是host,db,user,
host表中兩個欄位,分別是host,db
3,mysql資料庫賬戶管理
通過mysql-help可以查看mysql命令的幫助資訊
-h:主機名,可以使用該引數指定主機名和ip
-u:用戶名,只有該引數名可以指定指定用戶
-p:密碼,可以使用該引數指定密碼
-P:埠號,該引數后面接mysql埠號,默認為3306
-e:執行sql陳述句
打開某個指定的資料庫:mysql -u -h localhost(使用本地主機) root 資料庫名稱 -p(password)
關閉資料庫:quit
4,創建普通用戶
1,使用create user陳述句創建新用戶
create user 用戶的名稱@host(主機的名稱) identified by password(用來設定密碼) str identified with auth_plugin(插件的名稱)
create user 'myuser'@'localhost' identified by '123456';
為了避免指定的明文密碼,密碼的哈希值可以使用password()函式獲取
2,使用grant陳述句創建新用戶
5,洗掉用戶賬戶
1,使用drop洗掉用戶
drop user '用戶的名稱'@'localhost' //洗掉指定的用戶
drop user ; //洗掉所有的用戶
查詢陳述句select host,user from mysql.user;
2,使用delete洗掉用戶
delete from mysql.user where host = 'localhost' and user = '用戶的名稱'
6,修改root用戶賬戶密碼
mysqladmin -u username(用戶的名稱) -h localhost -p password (str);
修改普通賬戶的密碼
1,使用set陳述句修改用戶的密碼
set password for 'user'@'localhost' = password(str);
set password = password(str); //for陳述句可省略
2,使用update陳述句修改普通賬戶的密碼
update mysql.user set password = password(str) where host = 'localhost' and user = '用戶的名稱'
7,資料庫的備份
1,為什么要資料庫備份
大到自然災害,小到病毒,電源故障乃至操作人員的失誤,多會影響系統的正常運行,針甚至造成整個系統完全癱瘓
資料備份的意義就相當于災難發生過后通過資料的完整,快速,簡捷,可靠的恢復原有系統
完整的備份包括自動化的資料管理與系統的全面恢復,因此從這個意義上說備份=復制+管理
2,資料庫的備份的意義
提高系統的風險修復能力,在資料庫奔潰時能及時找到備份資料
沒有用戶資料的應用沒有任何意義,資料庫的備份是一種防患未然的強力有效手段
資料庫中的備份和還原始資料庫中應急方案中代價最小的,是企業中保護資料的最佳選擇
3,資料庫管理員需要考慮做的事情
1,定期備份,在面對重要資料時,保證低端情況下的損失可以正常恢復
2,備份后同樣需要做定期恢復測驗,了解備份的正確性,可靠性,確保備份是有意義的,可恢復的
3,可以采取增量備份,異地備份等
4,使用mysqldump備份
使用該命令時,可以將資料庫本備份成一個文本檔案
命令:mysqldump -u user(root) -h host -p password 資料庫名稱 【也可以有表名】> filename(.sql的備份檔案的名稱)
1,使用mysqldump備份單個資料庫中所有的表
mysqldump -u root -p 資料庫 > 絕對路徑 + name.sql
mysqldump -u root -p login > d:databasedump/test.sql;
2,使用mysqldump備份資料庫中的某個表
mysqldump -u root -p 資料庫 某個表 > 絕對路徑 + name.sql
--:字符開頭的是行注釋陳述句
/*!開頭,*/結尾的陳述句是可執行mysql注釋,這些陳述句可以被mysql執行,但是在其他資料庫會當做注釋被忽略
5,使用mysqlhotcopy快速備份
在unix中運行
6,資料的還原與恢復
即將檔案夾的資料匯入到資料庫中
1,使用mysql還原
mysql -u username -p daname(新建的資料庫名稱) < filename.sql
2,使用source匯入sql陳述句
use 資料庫名稱
source 絕對路徑;
4,6結合
mysqldump -u root -p login > d:databasedump/test.sql;
mysql -u username -p daname(新建的資料庫名稱) < filename.sql
將備份的test.sql匯入到新的資料庫中
十八,事務
可以參考:https://blog.csdn.net/zhenghuishengq/article/details/113749995
事務的四大特征
1,原子性:是不可分割的最小的操作單位,要么同時成功,要么同時失敗
2,持久性:當事務提交或回滾后,資料庫會持久化的保存資料
3,隔離性:當多個事務之間,相互獨立
4,一致性:事務操作前后,資料總量不變
十九,面試技巧與決議
如何查看當前的存盤引擎?
SHOW ENGINES查看,用戶還可以以一種直接的方法查看默認的存盤引擎,就是使用陳述句“SHOW VARIABLES LIKE'storage_engine'”
如何更改當前的存盤引擎?
在Windows平臺中修改資料庫默認存盤引擎需要修改組態檔my.ini,
mysql中如何輸入特殊字符
使用轉義字符反斜杠('\')
mysql中如何執行區分大小寫的字串比較
在Windows平臺下不區分大小寫,如果非要進行大小寫比較,可以在字串前面添加BINARY關鍵字
為什么使用通配符格式正確,卻沒有找出符合條件的記錄
在使用mysql存盤字串是可能會不小心將兩端帶有空格的字符保存到記錄中,而在查看表中的記錄是不能明確的顯示空格,
操作資料庫的作者不能直觀的確定字串兩端是否有空格,因此解決方法是使用trim(str)函式將字串兩端的空格洗掉,在進行匹配
like與regexp的區別
like匹配整個列,如果被匹配的文本僅在列值中出現,like并不會找到他,相應的行也不會回傳
regexp在列值內進行匹配,如果被匹配的文本在列值中出現,regexp就會找到他,相應的行也會被回傳
在插入欄位時一定要指定欄位名稱嗎
不管使用哪種insert語法,都必須給出values的正確數目,如果不提供欄位名,則必須給美個欄位提供一個值,
如果提供欄位名,必須對每個欄位給出一個值,否則將產生一條錯誤資訊,如果省略欄位的話,即在某些欄位
中需要滿足一些條件,即定義為允許空值,或者給出默認值,當這些值為空時,將使用默認值
在修改或洗掉表時必須指定where子句嗎
要的,如果省略了where子句,則update和delete將被應用到表中的所行,因此除非必須要更新或者洗掉
所有記錄,否則絕對要使用帶where子句的修改或者洗掉陳述句,建議在表進行這兩個操作之前,先選用select確認記錄
使用存盤程序的好處
1,運行效率高,存盤程序在創建時已經對他進行了語法分析和優化作業,并且存盤程序一旦執行,在記憶體中就會保留該存盤程序,
當資料庫再次呼叫該存盤程序時可以直接從記憶體中讀取,所以執行速度快
2,降低了網路通信:使用存盤程序可以實作客戶機只需要網路向服務器發出存盤程序的名字和引數就可以執行sql陳述句
3,業務實作可以封裝在存盤程序中,方便實施企業規則:容易維護,簡化復雜的操作
存盤程序的引數可以使用中文嗎
在一般情況下可能會出現中文,例如存盤程序使用用戶名查找客戶資訊,傳入的引數值可能為中文,這需要在定義存盤程序的時候加上gbk,否則會報錯
create procedure aqa(in u_name varchar(50) character set gbk, out u_age int)
存盤程序的引數有幾種
in out inout通過out inout將存盤程序的執行結果輸出,而且存盤程序中可以有多個out,inout型別的變數,可以輸出多個值
在存盤程序中定義區域變數和會話變數相同嗎
不同,在會話變數前面需要添加@符號,且會話變數的作用域是整個會話,存盤程序體使用declare來宣告變數,不需要加@
一次存盤程序中的引數被認為區域變數
在觸發程式中能不能對本表進行操作?
為了避免觸發器無限回圈的執行,不能對本表進行更新操作
使用觸發器需要注意什么問題?
在使用觸發器時需要注意對相同的表,相同的事件只能創建一個觸發器,比如在一個表中如果出現兩個 before insert的觸發器,
將會報錯,不過可以創建after insert或者before update或者before delete
備份mysql資料庫可以直接賦值整個資料庫目錄嗎
因為mysql表保存為檔案方式,所以可以直接復制mysql資料庫的存盤目錄及檔案進行備份
這是一種簡單快速有效的備份方式,如果要保持備份的一致性,備份前需要對相關表執行lock tables操作,如何對表執行flush tables操作
二十:提示:
在主鍵列上不能出現兩個相同的值,也不能出現空值,如果出現則會提示報錯
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/261448.html
標籤:其他
