一、數據庫:mysql 數據庫

一、SQL,不區分大小寫

在數據庫中進行操作的腳本,稱爲sql,結構化查詢語言,當前關係型數據庫都支持使用sql語言進行操作,也就是說可以通過 sql 操作 oracle,sql server,mysql,sqlite 等等所有的關係型的數據庫。

sql語句主要分爲:

    1 DQL:數據查詢語言,用於對數據進行查詢,如 select

    2 DML:數據操作語言,對數據進行增、刪、查、改,如 insert 、update 、delete

    3 TPL:事物處理語言,對事物進行處理,包括 begin transaction 、commit 、rollback

    4 DCL:數據控制語言,進行授權與權限回收,如 grant 、revoke

    5 DDL:數據定義語言,進行數據庫、表的管理,如 creat 、drop

    6 CCL:指針控制語言,通過控制指針完成表的操作,如 declare cursor

對於web程序員來說,重點是數據的增刪查改,必須熟練掌握DQL 、DML 、DDL

SQL是一門特殊的語言,專門用來操作關係數據庫,且不區分大小寫

 

二、mysql 對數據庫的相關操作

1、mysql -u root -p  進入mysql操作界面

      mysql  -h  192.168.126.128 -u root -p 訪問該主機地址的mysql

2、查看數據庫:    show  databases;

2、創建數據庫:    create  database  數據庫   charset=utf8;    ( 默認使用拉丁文字符串,不重置的話使用中文會報錯)

3、查看創建出來的數據庫:    show  create  database  數據庫;

4、刪除數據庫:    drop  database  數據庫;

5、選擇數據庫:   use  數據庫;

6、查看正在使用的數據庫:   select  database( );

7、查看默認存儲引擎:   show  variables  like"%storage_engine%";

 

8、查看 mysql 數據庫系統支持的儲存引擎的類型

9、強調說明

數據庫中,名字中帶有中橫線的,會當成特殊意義,需要使用 `  ` 將其括起來 ( Esc鍵下面, Tab鍵上面)

 

 

三、mysql 對數據庫表的相關操作

1、創建數據庫表:  create  table   表名( 字段1  約束 ,字段2  約束 . . . . . );

① 表名不能爲 sql 語言的關鍵字,一個表中可以有多個字段,定義時,字母大小寫均可,各字段之間使用逗號分隔開,最後一個字段後不需要加逗號,字段後面可以加上完整性約束條件

②完整性約束條件:完整性約束條件是對字段進行限制,要求用戶對該屬性進行的操作符合特定的要求,如果不滿足完整性約束條件,數據庫系統將不執行用戶的操作,其目的是爲了保證數據庫中數據的完整性

主鍵  primary  key:物理上存儲的順序

非空  not  null:此字段不允許填寫空值

唯一  unique:此字段的值不允許重複

默認  default:當不填寫值時,會使用默認着,填寫時,以填寫內容爲準

外鍵  foreign  key:對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢此值是否存在,如果存在則填寫成功,如果不存在則填寫失敗並拋出異常(雖然外鍵約束可以保證數據的有效性,但是在進行數據的增加、修改、刪除、查詢時,都會降低數據庫的性能,所以不推薦使用,那麼如何保證數據的有效性呢:在邏輯層進行控制)

auto_increment :標識該屬性的值自動增加

③常用數據類型:使用char定義長度時,即使沒有寫入數據,也會佔用字節,使用varchar時,則根據寫入的數據佔用字節,所以通常使用varchar來定義

2、查看當前數據庫中的數據庫表:  show  tables;

 

 

3、修改表名:   alter  table  原表名  rename  新表名;   或    alter  table  原表名  rename  to  新表名;

4、刪除沒有被關聯的普通數據表:  drop  table  表名;

5、查看數據表的基本結構 (字段):desc(describe)   表名; 或   show  create  table  表名;  或    show  create  table  表名  \G

6、查看錶的所有字段數據信息:  select  *  from  表名;

圖上,表示當前表的字段中沒有任何數據

 

7、向表中添加新字段:

    ①向表的末尾添加字段: alter  table  表名  add   字段名  數據類型  約束;

    ②向表的首位添加字段: alter  table  表名  add   字段名  數據類型  約束  first;

    ③向表的指定位置添加字段: alter  table  表名  add   字段名  數據類型  約束   after  某一個已存在的字段名;

    ④一次性添加多個字段:alter  table  表名  add   (字段名1  數據類型1  約束1,字段名2  數據類型2  約束2  ......)

8、刪除字段:  alter  table  表名  drop  字段名;

9、修改字段

  ①修改字段(不重命名):   alter  table  表名  modify  字段名  數據類型  約束  ;

  ②修改字段並移到首位    :   alter  table  表名  modify  字段名  數據類型  約束  first ;

  ③修改字段並移到指定位置:   alter  table  表名  modify   字段名   數據類型  約束  after  某個已存在的字段名;

  ③修改字段(重命名)    :   alter  table  表名  change  原字段名   新字段名   數據類型  約束  ;

10、向表中插入數據

  表的字段如下: 其中 sex 字段爲枚舉類型

   ①全列插入數據:  insert  into  表名  values( 數據內容1 ,數據內容2 ) ;

  插入數據時,數據的類型需要與對應字段的數據類型一致,字符串需要加上引號,

  可以使用 0 、null 、default 三種方法,爲主鍵以及自動增加的 id 字段的值進行佔位(不佔位的話不符合格式要求,會報錯)

當字段爲枚舉類型時,也可以這樣插入內容:

  ②部分插入數據:  insert  into  表名( 字段1,字段2,字段3 ......)  values( 值1,值2,值3 ),values( 值1 ',值2 ',值3 ' ) ......

  沒有賦值的字段,數據庫系統會爲其插入默認值,如果某個字段沒有設置默認值,而且是非空屬性,那麼就必須爲其賦值,否則會報錯,通過這種方式也可以隨意的設置字段的內容,不一定非要按照定義時的字段順序,一 一對應的爲其賦值

 

11、更改數據內容:  update  列表名  set  字段=值   where  條件;(如果不加上條件,默認全部修改)

12、刪除數據 ( 物理刪除 ):  delete  from  表名  where  條件;(刪除時需要小心,不加上條件,默認全部刪除)(truncate  表名 ; 刪除表的全部內容,後面不能加條件,如where)

13、邏輯刪除:向表中添加 is_delete 字段,數據類型爲 bit ,默認值爲 0 ,當默認值修改爲1時,表示邏輯刪除,可恢復

14、重置表:例如,當表中存在一個自增長的id字段時,若將某一個id=6的記錄刪除,再次添加數據時,id不會重複,也就是說不會再出現id=6這種情況了,需要使用重置功能,將表重置即可。需要注意的是,重置表會刪除表的全部信息。

語法:truncate  table  表名;

 

 

四、mysql 數據查詢

1、基礎查詢: 

①select  *  from  列表名;                                查詢列表的全部數據內容

   select  列表名.*  from  列表名;                    查詢列表的全部數據內容

   select  數據庫名.列表名.*  from  列表名;   查詢列表的全部數據內容

 

②查詢列表的字段1和字段2數據內容

    select  列表名.字段1,,列表名.字段2   from  列表名;         

 

③ 去重查詢(去重時只看一個字段條件)

     select  distinct  字段    from  列表名; 

 

④條件查詢 (比較運算符,邏輯運算符)

    select  *  from  列表名   where  條件;     

 

⑤模糊查詢(kile     %表示任意字符,  _表示一位字符)

    select  *  from  列表名   where  模糊條件;     

 

⑥範圍查詢     in表示非連續範圍, between  ...  and  ... 表示連續範圍

    select  *  from  列表名   where  字段 in (範圍)  ;   

  

 

⑦null 查詢,使用 is  或 is  not  來進行判斷,這裏需要注意的是 null 與 " " 並不相等

    select  *  from  列表名   where  字段  is  null ;    查詢某個字段爲 null 的信息

    select  *  from  列表名   where  字段  is  not  null ;    查詢某個字段不爲 null 的信息

 

⑧排序查詢  order  by  ( asc 升序,desc 降序)

   select  *  from  列表名   order   by   height    desc;    按照身高,降序查詢所有信息

 select  *  from  列表名   order   by   height    desc,age  desc;    先按照身高,降序查詢所有信息,若身高相同,再按照年齡降序查詢

 

⑨聚合函數

⑴  count ( * )  查詢總數量

      select   count( * )   from  表名;

 

⑵  min(字段) 求此字段的最小值  ,  max(字段) 求此字段的最大值

 

⑶  sum( 字段 )  求此字段的和,  avg( 字段 )  求此字段的平均值

 

⑷ 分組:  group  by  字段       

Ⅰ 分組:字段相同的數據放到一個組中( 執行效果與去重相同 ),分組後,分組依據顯示在結果集中,其他字段不會顯示,且分組時會升序排列 

Ⅱ  分組 與 group_concat( )  配合使用,可以依據分組,顯示出指定內容

Ⅲ  分組 與 聚合函數配合使用:

Ⅳ   having  條件 

 配合分組使用,having 後面跟的是篩選條件,與 where類似,where 是對 from 後面的表進行篩選,而 having 是對 group  by的結果進行篩選

 

⑸  limit   限制查詢結果數:    limit  x   限制查詢 x 個數據       limit  x,y    限制從第 x 處查詢( 從第0個開始),且限制查詢 y 個數據

 

拓展:通過 limit 來顯示分頁的查詢結果

pageSize=3 表示每頁顯示3個數據,  pageNow 表示當前處於第幾頁,allSum 表示所有符合查詢結果的數據

if  allSum%pageSize  == 0:

      pageNow  = allSum / pageSize

else:

      pageNow = allSum / pageSize + 1

select  *  from  students  limit  ( pageNow - 1 ) * pageSize,pageSize

 

 

2、高級查詢

①鏈接查詢     內連接:  inner join  ... on....        左連接: left  join  ... on....       右連接:   right   join  ... on....

首先,看一個兩個表的數據:

 

⑴內連接:查詢結果爲匹配到的共同數據

⑵左連接:查詢結果爲匹配到的共同數據,左表的全部數據,右表沒有的使用 null 填充

⑶右連接:查詢結果爲匹配到的共同數據,右表的全部數據,左表沒有的使用 null 填充

使用時,也可以改個名(只針對此次操作)

 

②自關聯查詢

查詢全國的省份:

查詢廣東省的城市:

查詢廣州市的市區:

 

③子查詢:在一個 select 語句中,嵌入了另一個 select 語句 ,這個嵌入的 select 語句,被稱爲子查詢語句

   子查詢嵌入到主查詢中,作用是輔助主查詢( 充當條件或數據源 ),子查詢是一條完整的 select 語句

         查詢所有大於平均身高的學生的信息:

子查詢中出現的關鍵字:

any / some              主查詢  where  字段 = any( 子查詢);       查詢結果中匹配到任意一個即可,等價於 in   

all        主查詢  where  字段 =   all( 子查詢);        等於裏面所有的條件

             主查詢  where  字段 <>   all( 子查詢);       不等於裏面所有的條件

in          主查詢  where  字段 = in ( 子查詢);       查詢結果中匹配到任意一個即可,    

             主查詢  where  字段 = not  in ( 子查詢);       查詢結果中不能匹配到其中任何一個, 

 

 

五、視圖、事務、索引

1、視圖:本質就是對一個查詢的 sql 語句的封裝

  ①  創建一個視圖:      create  view  視圖名  as   select  *   from   表名;

  ②  刪除一個視圖:       drop  view  視圖名

 

2、事務:事務是併發控制的基本單位,是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。  例如: 銀行的轉賬工作,從一個賬戶扣錢並將錢轉到另一個賬戶,只有兩個操作都完成,轉賬工作才完成

  ①事務的四大特性( ACID ):

      原子性:事務中的全部操作在數據庫中都是不可分割的,要麼全部完成,要麼均不執行

      一致性:幾個並行執行的事務,其執行結果必須與按某一順序串執行的結果一致

      隔離性:事務的執行不受其他事務的干擾,事務執行的中間結果對其他事物必須是透明的

      持久性:對於任意已提交的事物,系統必須保證該事物對數據庫的改變不被丟失,即使數據庫出現故障

  ②開啓事務後,對數據庫的更新操作不會立即影響到數據庫,只有在成功之後,執行提交操作,纔會將變化提交給源數據庫

  ③使用事務時,需要注意的是:表的引擎類型必須是 innodb 類型,纔可以使用事務,(innodb 是 mysql 的默認引擎)

      修改表的存儲引擎爲 innodb引擎: alter  table  表名  engine = innodb;

  ④ begin 開啓事務, commit  提交事務 ,  rollback  回滾事務

從圖上,我們可以看出,當 begin 開啓事務後,對錶進行了更新操作,雖然再次查詢表數據時顯示出來剛剛更新的數據,但實際上,在數據庫中並沒有對剛剛更新的數據進行更新,它僅僅是緩存了起來,

只有我們 commit 提交數據之後,數據庫纔會更新緩存中變更的數據

同理,使用 rollback 則放棄緩存中變更的數據

 

3、索引:索引是一種特殊的文件,它包含着對數據表所有記錄的引用指針

   創建索引: 如果指定字段類型是字符串,需要指定長度;如果字段類型不是字符串,則不需要指定長度

      create   index   索引名   on    表名(  字段名( 長度 )  );

   刪除索引:  drop   index   索引名  on   表名;

   使用索引需要注意的是:只有當表的數據結構夠複雜,數據量較大時,才能體現出索引的優勢所在,當表的結構簡單,使用索引反而效果不佳

 

 

六、數據備份與還原

1、備份: mysqldump   -u   username   -p   dbname   table1   table2   > backupname.sql

   其中,dbname參數表示數據庫名稱,  table1、table2參數表示表的名稱,沒有該參數時將備份整個數據庫,backupname.sql 參數備份文件的名稱,通常後綴爲 .sql ,文件名前面可以加上一個絕對路徑

下面是備份 192.168.242.150 主機的 mysql 數據庫中,一個叫做 python1807A 的數據庫,

2、還原:  mysql   -u   root   -p    dbname   <  backupname.sql

 

 

七、python 與 mysql 交互

1、流程圖( python3 使用前需要先導入 pymysql包 )

2、Connection對象

①用於建立與數據庫的連接,創建對象調用 connect 方法

  格式: connect( 參數列表 )

  ⑴參數 host:連接的 mysql 主機,如果是本機,則爲 " localhost "     ⑵參數 port:連接的 mysql 主機的端口號,默認是3306

  ⑶參數 database:數據庫的名稱                                                                  ⑷ 參數 user:連接的用戶名

  ⑸ password:連接的密碼                                                                             ⑸ 參數 charset:通信採用的編碼方式,推薦使用utf8

②Connection對象的方法:     

  close( )  關閉連接     

  commit( )   提交    

  rollback( )  回滾     

  cursor( )   返回Cursor對象,用於執行sql 語句,並獲得結果

 

3、Cursor對象:通過調用 Connection 對象的 cursor 方法獲取,用於執行 sql 語句,如:select、insert、update、delete

①對象的屬性:

   connection  獲得當前連接對象  

   rowcount   只讀屬性,表示最近一次 execute( ) 執行後受影響的行數

Cursor對象的方法:

   close( )  關閉

   execute( )   執行語句

   fetchone( )   執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組

   fetchall( )   執行查詢語句時,獲取查詢結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回

 

4、實例

 

需要注意的是,佔位時如果字段類型是字符串,需要使用引號引住,且傳參時,需要使用列表傳參,

還有一點值得注意的是,雙引號內不允許再次出現雙引號,

 

 

 

 

 

 

 

 

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