1. 程式人生 > >十五、python學習之MySQL資料庫(二):資料庫的操作

十五、python學習之MySQL資料庫(二):資料庫的操作

 一、資料庫的操作:

1.資料庫操作的概述:

在資料庫操作中,基本操作都是圍繞增刪改查來操作。簡稱CRUD

  • C Create 建立
  • R Read/Retrieve 查詢
  • U Update 修改
  • D Delete 刪除

2.資料庫操作

在數操作資料庫時,所有的資料庫語句都要以分號結束

資料庫操作不區分大小寫

  • 建立資料庫
  • create database 資料庫名
     create database testdb;
    
  • create database 資料庫名 character set utf8
     create database testdb2 character set utf8;
    
  • 顯示資料庫建立資訊 show create database 資料庫名

      show create database testdb;
    
  • 修改資料庫編碼 alter database 資料庫名 character set utf8

      alter database testdb charset=utf8;
  • 顯示所有資料庫

    show databases;

刪除資料庫 drop database 資料庫名

drop database testdb2;

二、資料表的操作: 

1.建立資料表:

create table 表名(屬性1 資料型別1[...] [,...])

--建立一個學生資訊表,屬性有學號(sid),姓名(sname),年齡(sage),性別(sgender)
create table student(sid int(11), sname varchar(30), sage smallint, sgender char(2));

2. 檢視當前資料庫所有擁有的資料表:

use 資料庫名;        # 指定資料庫

show tables;          # 顯示所有資料表

3.顯示建立資訊:

show create table 表名;

或者:

show create table 表名 \G        # 結構化輸出,以記錄條目形式顯示 .\G後不用加分號

或者:查看錶結構

desc 表名;

4.使用alter table修改表結構:

4.1  增加欄位: 為已存在的表新增一個新的欄位:

語法: alter table 表名 add 列名 資料型別;

4.2 刪除欄位:在變種刪除一個已經存在的欄位:

語法: alter table 表名 drop 列名; 

4.3 修改資料型別:修改表中現有欄位的資料型別:

語法: alter table 表名 modify 列名 新資料型別;

4.4 修改列的名及資料型別:修改表中現有欄位的列名和資料型別

語法:alter table 表名 change 原列名 新類名 新資料型別;

三、Mysql常用的資料資料型別:

資料表是由若干個欄位組成的,每個欄位表示不同型別的資料。所以在建立表的時候,需要為每個欄位指定相應的資料型別。

  • 整數型別:

 

  •  小數型別:

  •  字串型別:

  • 列舉類型別(派生自整型):

enum('男', '女')

  • 時間型別:

 四、增刪改查:

1.查詢資料:

作用:查詢資料就是客戶端通過DBMS從資料庫中取出滿足條件的資料。

語法:select 欄位名列表 from 表名;

 2.插入資料:

作用:向資料庫中插入資料。

語法:insert into 表明[(欄位名,...)] values (值列表, ...);

 2.1 插入所有欄位資料:

不指定插入的欄位,直接寫插入的資料。

insert into tstudent values(1001, "小明", 18, "男");

2.2 插入指定欄位,指定欄位順序和列中順序可以不同,值順序要和指定的列表准許相同。

insert into tstudent(sid, sname, sage) values(1001, "小明", 18);

2.3 插入多條資料:

insert into tstudent(sid, sname, sage) values(1001, "小明", 18), (1002, "小剛", 19);

3.修改資料:

作用:可以根據指定的條件,修改更新滿足條件的資料。

語法:updata 表明 set 欄位 = 值 [條件]

3.1更新所有資料:

update 表名 set 欄位名=值;

update stu set sage = 25;

3.2 更新滿足條件的資料

updata 表名 set 欄位 = 值 where 條件;

update stu set sname = 'alice' where sname = "tony"; 

 4. 刪除資料:

作用:將資料從資料表中刪除

語法1: truncate 表名

語法2: delete from 表名 [條件]

4.1 刪除全部的資料:

/*方法一:*/
truncate stu;    --truncate 表名; -> 刪除表中全部資料

/*方法二:*/
delete from stu;    --不需要加條件,也不能加條件,刪除全部資料,重置自動編號到預設值,沒有事務,速度快。
/* 相當於 truncate stu,但是delete操作有事務操作,所以速度慢,而且不會重置自動編號。 */

4.2 刪除滿足條件的資料

/* 刪除stu表中snumber=1的資料 */
delete from stu where snumber= 1;

 五、新增約束:

約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的準確性,完整性、唯一性,可靠性、聯動性。

1.沒有約束時的問題:

  • 資料冗餘;
  • 失去資料完整性;
  • 資料缺少唯一標識;
  • 失去實體完整性;
  • 失去域完整性;
  • 失去引用完整性;

2. 資料常用約束:

2.1 主鍵約束:

作用:讓資料具有唯一標識

語法: primary key

  • 在建立是設定主鍵約束:
create table t_student(sid int primary key, sname verchar(30));
  • 建立後修改欄位:
/* 使用 alter table 表名 add constraint 約束名 primary key (ID) 新增主鍵約束*/
alter table student add constraint primary key(sid);

欄位被設定了主鍵約束,同時也具有了唯一性約束和非空約束。 在欄位中插入重複資料時,或不給資料時會報錯。

2.2 自增長:

作用:讓數字值自動累加

語法:auto_increment

自增長設定在數值型別欄位上,需要配合主鍵約束一起使用。如果沒有設定逐漸約束,是不允許設定自動增長的

/* 將主鍵sid設定成自動增長 */
create table t_student(sid int primary key auto_increment, sname varchar(30));

2.3 唯一性約束:

作用:保證資料的準確性,不會出現重複資料

語法:unique

create table t_student(sid int primary key auto_increment, sname varchar(30) unique);

一個表中可以給多個欄位設定唯一性,如果有需要的話。

2.4 非空約束:

作用:

不允許欄位為空,新增資料時必須給值

語法:not null

/*設定sname欄位為非空欄位*/
create table t_student(sid int, sname varchar(20) not null);

2.5 預設值:

作用:在新增資料是,如果沒有給定有預設約束欄位的資料,該欄位使用預設值填充語法:default

/* 給sname設定預設值NoName */
create table t_student(id int, name varchar(20) default "NoName");

2.6 外來鍵約束:

作用:讓兩表之間產生聯動關係。

語法:foreign key (欄位名) references 表名(欄位名)

--表1
create table t_class(cid int primary key, cname varchar(20));

--表2
create table t_student(sid int primary key, sname varchar(20), cid int, foreign key(cid) references)

設定外來鍵約束欄位所關聯的欄位,必須是主鍵約束欄位。

想要刪除有設定外來鍵的表,必須先刪除外來鍵所關聯的表或者解除外來鍵(如何解除外來鍵,請謹慎的往下看)

2.7 檢查約束(在Mysql中):

作用:設定欄位的域範圍,也就是有效值範圍

語法:check(值範圍條件)

create table t_student(sid int primary key, sname varchar(20), sage int check(sage>0 and sage < 150), sgender char(10) check("boy" and "girl"));

3. 增加、刪除約束:

新增約束前應該保證該欄位上沒有新新增的約束,刪除約束前應保證該欄位上存在該約束.

3.1新增主鍵約束:

語法: alter table 表名 add constraint 約束名 primary key(欄位)

alter table t_student add constraint pk_id primary key(sid);

3.2 刪除主鍵約束:

語法:alter table 表名 drop primary key

alter table t_student drop primary key;

3.3 新增外來鍵:

語法: alter table 表名 add constraint 外來鍵約束名 foreign key(外來鍵欄位名) references 關聯表(關聯欄位)

/* t_student表的cid與t_class表的cid關聯 */
alter table t_student add constraint FK_id foreign key (cid) referances t_class(cid);

3.4 刪除外來鍵約束:

語法: alter table 表名 drop foreign key 外來鍵約束名

alter table t_student drop foreign key FK_id;

4.資料庫匯入匯出:

作用:使用資料庫匯入河道處功能,可以完成對資料庫的備份和遷移等操作.

4.1匯出資料庫:匯出資料庫使用mysqldump命令完成(在bash下操作)

語法: mysqldump -u root -p (注意不要輸入密碼) 要匯出的資料庫[(要匯出的資料表,..)] > 目標檔名.sql

4.1.1匯出整個資料庫:

# 匯出school資料庫並命名為school_bak.sql
mysqldump -u root -p school > school_bak.sql

4.1.2 匯出庫中的指定表

# 匯出school資料庫中的t_student表並命名為student_bak.sql
mysqldump -u root -p school t_student > student_bak.sql

4.2 匯入資料庫:

4.2.1 匯入資料庫前需要先建立一個空資料庫

4.2.2 語法:mysql -uroot -p 資料庫名 < 要匯入的檔案.sql

# 匯入school_bak.sql到資料庫school
mysql -u root -p school < school_bak.sql

也可以在mysql客戶端中使用:

-- 匯入./路徑下schoole.sql到當前資料庫
sources ./school.sql

5.資料表設計思想:

  • 需求分析:根據使用者的需求,分析出需要記錄的資料
  • 需求設計:根據分析出的資料,設計E-R模型圖
  • 詳細設計:將E-R模型圖轉換成資料表
  • 三大正規化:使用資料庫三大正規化的設計思想對資料表進行稽核

5.1 E-R模型圖:

概念:Entity-Relationship,實體關係圖 組成元素

E-R圖應用案例:將下邊的專案需求,通過ER圖形表示出來:

表示關係:

 

 5.2 三大正規化:

資料庫在設計時,需要滿足三大正規化的設計思想。

三大正規化的理論非常抽象,有興趣可以查閱資料進行了解,

下面以簡單的形式描述三大正規化,方便大家有一個簡單的概念上的理解。

  • 第一正規化 : 每一列都具有原子性,也就是不能再分割 

  • 第二正規化 : 每個表只描述一件事情 

  • 三正規化 : 表中不能存在冗餘欄位