接觸越多,越發覺數據庫的博大精深,可以和php結合,oracle也有重要地位,需要學習的還有很多路還很長。
一 數據庫基礎
oracle,mysql,sqlserver是三大關係型數據庫;
基本元素:數據庫,表,列和數據類型(數值,字符,日期,文本),行,主鍵(必須有一個主鍵,每行主鍵值不相同,主鍵值不能爲空),外鍵(是另一個表的主鍵,表示這是那個表的從鍵,數值要保持一致)
mysql是C/S架構:客戶端起到服務端與用戶之間的橋樑作用,將用戶操作的請求給服務端,將服務端的處理結果返回給用戶;
開關mysql服務:控制面板的服務中進行開關,或者cmd中net start mysql;net stop mysql;//windwos, service mysql start; service mysql stop//linux;
連接數據庫:workbench--database--connect to database, cmd--切換安裝bin目錄--mysql -uroot -p123;
二 數據庫語言
數據庫定義和操作語言:
show databases; //查看有哪些數據庫;
create database 數據庫名; //創建數據庫
use 數據庫名;//使用數據庫
drop database 數據庫名;//刪除數據庫
show tables; #查看數據庫所有的表
create table 表名 #創建一個表
(
列名 數據類型 約束;
...
);
show create table 表名;#查看創建此表的腳本語句
desc 表名;#查看錶結構
rename table 舊錶名 to 新表名;#修改表名
列操作:
alter table 表名 add 列名 類型 參數;#增加表中列
alter table 表名 modify 列名 新類型 新參數; #修改列類型或參數;
alter table 表名 change 舊列名 新列名 新類型 新參數;#修改列名或類型或參數;
alter table 表名 drop 列名; #刪除列;
alter table 表名 add index 索引名 列名:#爲一個或多個列創建索引
alter table 表名 add constraint 約束名 Foreign Key(列名)references 主表名(主表列名);#創建某列爲外鍵
行操作:
select 列名,。。from 表名 where 條件; #按條件查詢
insert into 表名(列名1,..)values(列值); #插入一條記錄,指定列名賦值
upate 表名 set 列=列值 where 條件 #按條件修改行的某列對應值
delete from 表名 where 條件;#按條件刪表記錄
truncate table 表名;#刪除表後重建表架構
drop table 表名;#刪除表
數據庫控制語言:
show status; #查看mysql數據庫狀態
show grants; #查看用戶權限,show grants for 用戶名
show errors; #查看錯誤信息
show warnings;#查看報警信息
三、注意點:
1.select distinct 列1,列運算或函數 as 別名 from 表名 where 運算或函數 group by 條件 having 條件 order by 列1,列2 desc/asc limit(n,m); # group by與having配套是按組查詢,where是按行查詢,order默認是升序asc,最大值除max()外還可以 order by desc limit 1降序取1條即爲最大值的一條記錄,最小值除min()外還可以order by asc limit 1 升序取1條即爲最小的一條記錄;
2.如果一個查詢的結果作爲另一個查詢的條件,可以用子查詢嵌套。一般是主從表之間的關聯查詢,視圖,索引,自連接比多表查詢效率高
3.where條件支持的操作符:=,>,<,>=,<=,<>,!=,between and ,and,or,(),is null,in,not between and,is not null,not in,like,regexp;#in比between and的效率高
4,通配符:
like:%指代0個或多個字符,_指代1個字符;
5.regexp:
'200|100',200和100任取一個串
[],中括號內任匹配一個字符,
[^]不匹配中括號內任一字符,
[0-9],[a-z]匹配一個範圍,
\\,特殊字符轉義符,如小數點,\\.
字符集:[:alnum:][:alpha:][:blank:][:digit:][:xdigit:][:upper:][:lower:],
[:xdigit:]代表任意16進制數;
*,0個或多個,+,1個或多個,?,0或1個,{n},n個,{n,}n個或以上,{n,m},n個到m個;
^,文本開始如^a以開始的文本,^放中括號裏面就是取反外面就是文本開始,
$,文本結束如5$以5結束,
[[:<:]]詞的開始,[[:>:]]詞的結尾,
6.like與regexp的區別:
like是對整個字符串的匹配,regexp只需要匹配包含的部分;
like匹配內容來自於表,regexp的匹配內容可以不來自表可以是其他指定文本內容;
7.group by主要是用來做集合統計,別名的作用是簡化查詢或進行列運算;
8.函數:concat(列1,列2,列3,...)字符拼接,=,-,*,/
聚集函數:max(),min(),avg(),sum(),count();
流程函數:if(value條件,ture值,false值),value條件爲真取真值,爲假取假值;
ifnull(value1,value2);
case when then else end;
文本函數:right(),left(),返回右邊或左邊幾個字符,
length(),返回字符串長度;
Rtrim(),Ltrim(),去掉右邊或左邊的空格
upper(),lower(),轉成大寫或小寫字母;
locate(),返回子串位置
日期與時間函數: adddate(),addtime(),year(),month(),day(),hour(),minute(),second(),date(),time(),dayofweek () ,curdate(),curtime(),datediff(),日期之差,date_format(),以yyyy-mm-dd格式返回日期,
算術函數:ads()取絕對值,sqrt()平方根,mod()取餘數,exp()取指數,sin()cos()取 角sin/cos值,rand()隨機數,pi()取圓周率,
substring_index(string,'分隔符',n),n爲正數則截取從左邊起碰到第n個分隔符的字符串,n爲負數則截取從右邊起碰到第n個分隔符的字符串;
9.表連接:是有外鍵關聯的兩個表的連接,沒有外鍵關聯的將做笛卡爾乘積次匹配連接;
內連接(等值連接)inner join on:值相等匹配才連接,
外左連接:左表全顯示,表a left join 表b on 條件
外右連接:右表全顯示,right join on
自連接:用別名在同一個表中做連接;將兩條查詢語句用自連接效率高於子查詢嵌套
聯合查詢:union,選擇的是同樣的列,是結果的合併;
10.視圖:是虛擬表,沒有數據,只是一個存儲方式,視圖名字唯一,來源可以是一個或過個表,也可 以是一個或多個視圖,可以和表一起用,可以order by,必須要先開視圖權限,不能索引,不能觸發 器,不能默認值;
create view 視圖名 as 條件;
show create view 視圖名,#查看創建視圖的腳本語句
show table status where comment='view',查詢視圖信息,或show tables的結果中也包含視圖,
無更新視圖,需先刪視圖再創建視圖來達到修改的目的;
drop view 視圖名,刪除視圖
視圖的增刪改時同時也對基表進行了修改;如不能識別基表對應的值則不能修改基表,如用了分組、算術運算、函數等的視圖的加工後的列值,無法找到對應基表數據進行修改;
11.存儲過程:讓用戶自定義函數完成特定功能,模塊化調用,簡單,安全,高效,相當於批處理;
delimiter // 臨時將分界符:轉義爲//
create procedure(in 變量名 類型,out 變量名 類型,inout 變量名 類型) #in,out參數不用@
begin
end;
delimiter ; 恢復分界符定義
調用: call 存儲名()
刪除:drop procedure 存儲名()
查看存儲:show procedure status where db ='數據庫名';
mysql裏面變量要用@,定義變量 declare 變量名 類型,設置變量 set @變量名 = 值,顯示變量 select @變量名;
12.遊標:存儲過程中使用的一個查詢結果集,應用程序可以根據需要滾動或瀏覽其中數據,用於交互式應用中;存儲過程結束遊標消失
申明 declear cursor for select from where
打開 open 遊標名
使用 fetch 遊標名 into 變量名 # 每fetch一次取得一個數據,多個數據需要多次fetch, read_loop:loop #此處沒有分號
end loop;
關閉 close 遊標名
13.觸發器:用來監控insert,update,delete三個操作的響應器,before和after都可以設置觸發器,故共6種觸發器;
創建,前或後觸發器,所在表,每行插入/更新/刪除:create trigger tg1 before insert on 表名 for each row 三種語句 ;
觸發器只針對表不針對視圖,不返回記錄必須賦值給變量:
select into @result;#查詢的返回值賦給result變量
insert NEW.列名 into @result,select @result;#插入的值賦給result變量
delete OLD.列名 into @result;select @result;#刪除的值賦給result變量
insert into s valuse(@result); select * from s; #將結果記錄生成一個新表s,顯示插入記錄;
查看觸發器:show triggers;
14.事務:原子性,一致性,持久性,隔離性;要麼成功要麼失敗不允許插入其他事務和異常結果;
只支持innoDB,不支持ISAM數據庫引擎;
(innoDB比ISAM的查詢速度慢,但是支持事務、外鍵、鎖比ISAM功能強大)
申明事務開始:start transaction;
自動提交設置:set_autocommit =0禁止自動提交, set _autocommit=1;開啓自動提交
回滾:rollback; rollback to savepoint1;
提交:commit;
保留點:savepoint 保留點;
15.索引:用於快速按照條件定位到查詢記錄,用在where子句;分普通索引,唯一索引,主鍵索引,單列或多列索引;經常用來被查詢的放在where子句裏面的列適合做索引,不經常被查的不適合做索引,like ‘%abc’太泛泛了不適合做索引,like 'abc%'適合做索引
普通索引:create index 索引名 on 表名;alter table 表名 add index 索引名,在創建表時申明index(列名1,..)
唯一索引:所有值只能出現一次不能重複,unique index,其他語句語法與普通索引一樣;
主鍵:是一種唯一索引,alter table 表名 add primary key(列名);創建表時申明主鍵;
單列索引:申明一列索引,多列索引:申明多列組合爲一個索引;
16.用戶管理:
創建用戶:create user jack@localhost identified by ‘123’;'jack'@'%'表示任何IP地址訪問
重命名用戶:rename user jack@localhost to peter@localhost;
修改用戶密碼:(1)update user set password=password('') where user='jack';
(2) set password for jack@localhost=password(‘’);
刪除用戶:drop user ‘Jack’@‘%’;
查看用戶及權限:show grants for 'jack'@'%';
授予權限:grant select on crashcourse.* to jack@localhost;
撤銷權限:revoke select on crashcourse.* from jack@localhost;
grant all on to ; revoke all on from;
權限層次:可對數據庫、表,列,存儲過程授權,
17、數據庫維護:
備份:mysqldump -uroot -p 數據庫名>備份文名;
恢復:use 數據庫;source 備份文名;
檢查表鍵是否正常:analyze table 表名;
優化表空間收回被清空的空間:optimize table 表名;
windows下my.ini文件中設置日誌的位置和開關,linux下/etc/my.cnf文件中配置日誌路徑和開關;