MySQL筆記

接觸越多,越發覺數據庫的博大精深,可以和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文件中配置日誌路徑和開關;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章