1. 程式人生 > >python(十二)上:mysql安裝使用詳細教程

python(十二)上:mysql安裝使用詳細教程

上節回顧:

RabbitMQ幾種模式:

  • 平均分發
  • perfetch =1
  • durable佇列持久化,deliver_mode = 2 訊息持久化
  • 一對多廣播,exchanage
    • fanout
    • direct
    • topic
    • RPC

一、資料庫介紹

1、什麼是資料庫?

資料庫(Database)是按照資料結構來組織、儲存和管理資料的倉庫,
每個資料庫都有一個或多個不同的API用於建立,訪問,管理,搜尋和複製所儲存的資料。

現在我們使用關係型資料庫管理系統(RDBMS)來儲存和管理的大資料量。所謂的關係型資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。
RDBMS即關係資料庫管理系統(Relational Database Management System)的特點:

  1. 資料以表格的形式出現
  2. 每行為各種記錄名稱
  3. 每列為記錄名稱所對應的資料域
  4. 許多的行和列組成一張表單
  5. 若干的表單組成database

關係型資料庫:

  • oracle
  • mysql
  • serserver
  • DB2
  • postgresql
  • Sqlite
  • access

2、RDBMS常用術語

  • 資料庫: 資料庫是一些關聯表的集合。
  • 資料表: 表是資料的矩陣。資料庫中的表像一個簡單的excel。
  • 列: 一列(資料元素) 包含了相同的資料
  • 行:一行(=元組,或記錄)是一組相關的資料
  • 冗餘::儲存兩倍資料,冗餘可以使系統速度更快。(表的規範化程度越高,表與表之間的關係就越多;查詢時可能經常需要在多個表之間進行連線查詢;而進行連線操作會降低查詢速度。例如,可以在student表中增加一個冗餘欄位dept_name,該欄位用來儲存學生所在院系的名稱。這樣就不用每次都進行連線操作了。)
  • 主鍵::主鍵是唯一的。一個數據表中只能包含一個主鍵。
  • 外來鍵:外來鍵用於關聯兩個表,關聯它表的主鍵。
  • 索引:使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
  • 複合鍵::複合鍵(組合鍵)將多個列作為一個索引鍵,一般用於複合索引。
  • 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證資料的一致性。

3、Mysql資料庫

Mysql是最流行的關係型資料庫管理系統,在WEB應用方面MySQL是最好的RDBMS(Relational Database Management System:關係資料庫管理系統)應用軟體之一。由瑞典MySQL AB公司開發,目前屬於Oracle公司。MySQL是一種關聯資料庫管理系統,關聯資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

  • Mysql是開源的,所以你不需要支付額外的費用。
  • Mysql支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
  • MySQL使用標準的SQL資料語言形式。
  • Mysql可以允許於多個系統上,並且支援多種語言。這些程式語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • Mysql對PHP有很好的支援,PHP是目前最流行的Web開發語言。
  • MySQL支援大型資料庫,支援5000萬條記錄的資料倉庫,32位系統表文件最大可支援4GB,64位系統支援最大的表文件為8TB。
  • Mysql是可以定製的,採用了GPL協議,你可以修改原始碼來開發自己的Mysql系統。

二、MYSQ資料庫的安裝使用

1、CentOS7 安裝mariadb-server

yum -y install mariadb-server  # 安裝
systemctl start  mariadb.service  # 啟動
systemctl enable mariadb.service  # 開機啟動

2、基本使用

mysqladmin --version  # 檢視版本
mysqladmin -uroot -p password  # 設密碼
show grants for root  # 檢視使用者許可權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '123456' WITH GRANT OPTION;  # 授權
flush privileges;
mysql -u root -p  # 連線
show databases;  # 檢視所有庫
use mysql       # 進入mysql庫
show tables;     # 檢視庫裡的所有表
desc user;       # 查看錶結構;同SHOW COLUMNS FROM user;
select * from user;  # 檢視所有資料
select * from user\G # 格式化顯示

show create database test;  # 檢視建立
create database testdb charset "utf8";  # 建立支援中文testdb庫
SHOW INDEX FROM 資料表 # 顯示錶的詳細索引資訊,包括PRIMARY KEY(主鍵)

三、MySQL 資料型別

MySQL中定義資料欄位的型別對你資料庫的優化是非常重要的。
MySQL支援多種型別,大致可以分為三類:數值、日期/時間和字串(字元)型別。

1、數值型別

型別 大小 範圍(有符號) 範圍(無符號) 用途
TINYINT 1 位元組 (-128,127) (0,255) 小整數值
SMALLINT 2 位元組 (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 位元組 (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 位元組 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 位元組 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值
FLOAT 4 位元組 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度浮點數值
DOUBLE 8 位元組 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度浮點數值
DECIMAL 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 依賴於M和D的值 依賴於M和D的值 小數值

2、日期和時間型別

型別 大小(位元組) 範圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/’838:59:59’ HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:00/2037 年某時 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

3、字串型別

型別 大小 用途
CHAR 0-255位元組 定長字串
VARCHAR 0-65535 位元組 變長字串
TINYBLOB 0-255位元組 不超過 255 個字元的二進位制字串
TINYTEXT 0-255位元組 短文字字串
BLOB 0-65 535位元組 二進位制形式的長文字資料
TEXT 0-65 535位元組 長文字資料
MEDIUMBLOB 0-16 777 215位元組 二進位制形式的中等長度文字資料
MEDIUMTEXT 0-16 777 215位元組 中等長度文字資料
LONGBLOB 0-4 294 967 295位元組 二進位制形式的極大文字資料
LONGTEXT 0-4 294 967 295位元組 極大文字資料

四、mysql 常用命令

MySQL 建立資料表

語法

CREATE TABLE table_name (column_name column_type);

建立一個student表

create table student(
   stu_id INT NOT NULL AUTO_INCREMENT,
   name CHAR(32) NOT NULL,
   age  INT NOT NULL,
   register_date DATE,
   PRIMARY KEY ( stu_id )
);

例項解析:

  • 如果你不想欄位為 NULL 可以設定欄位的屬性為 NOT NULL, 在操作資料庫時如果輸入該欄位的資料為NULL ,就會報錯。
  • AUTO_INCREMENT定義列為自增的屬性,一般用於主鍵,數值會自動加1。
  • PRIMARY KEY關鍵字用於定義列為主鍵。 您可以使用多列來定義主鍵,列間以逗號分隔。

mysql 插入資料

語法

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

插入資料

mysql> insert into student (name,age,register_date) values ("fgf",22,"2016-03-4");

MySQL 查詢資料

語法

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]

MySQL where 子句

語法

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

以下為操作符列表,可用於 WHERE 子句中。
下表中例項假定 A為10 B為20

操作符 描述 例項
= 等號,檢測兩個值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等於,檢測兩個值是否相等,如果不相等返回true (A != B) 返回 true。
> 大於號,檢測左邊的值是否大於右邊的值, 如果左邊的值大於右邊的值返回true (A > B) 返回false。
< 小於號,檢測左邊的值是否小於右邊的值, 如果左邊的值小於右邊的值返回true (A < B) 返回 true。
>= 大於等於號,檢測左邊的值是否大於或等於右邊的值, 如果左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
<= 小於等於號,檢測左邊的值是否小於於或等於右邊的值, 如果左邊的值小於或等於右邊的值返回true (A <= B) 返回 true。

使用主鍵來作為 WHERE 子句的條件查詢是非常快速的。

MySQL UPDATE 查詢

語法

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

update student set age=22 ,name="fgf" where stu_id>3;

MySQL DELETE 語句

語法

DELETE FROM table_name [WHERE Clause]<br><br>delete from student where stu_id=5; 

MySQL LIKE 子句

語法

SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

select *from student where name binary like "%Li";
select *from student where name binary like  binary "%Li"; #只匹配大寫

* 排序*

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
使用 ASCDESC 關鍵字來設定查詢結果是按升序或降序排列。 預設情況下,它是按升序排列。
select *from student where name like binary "%Li" order by stu_id desc;

MySQL GROUP BY 語句

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

MySQL ALTER命令

刪除,新增或修改表字段

alter table student drop register_date; #從student表刪除register_date欄位
alter table student add phone int(11) not null; #新增phone欄位

修改欄位型別及名稱

ALTER TABLE testalter_tbl MODIFY c CHAR(10);
ALTER TABLE testalter_tbl CHANGE i j BIGINT;

修改表名

mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

關於外來鍵

外來鍵,一個特殊的索引,用於關鍵2個表,只能是指定內容 

mysql> create table class(
    -> id  int not null primary key,
    -> name char(16));
Query OK, 0 rows affected (0.02 sec)

CREATE TABLE `student2` (
  `id` int(11) NOT NULL,
  `name` char(16) NOT NULL,
  `class_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_class_key` (`class_id`),
  CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
)
# 此時如果class表中不存在id 1,student表也插入不了,這就叫外來鍵約束
#如果有student表中跟這個class表有關聯的資料,你是不能刪除class表中與其關聯的紀錄的

MySQL NULL 值處理

我們已經知道MySQL使用 SQL SELECT 命令及 WHERE 子句來讀取資料表中的資料,但是當提供的查詢條件欄位為 NULL 時,該命令可能就無法正常工作。
為了處理這種情況,MySQL提供了三大運算子:

  • IS NULL: 當列的值是NULL,此運算子返回true。
  • IS NOT NULL: 當列的值不為NULL, 運算子返回true。
  • <=>: 比較操作符(不同於=運算子),當比較的的兩個值為NULL時返回true。

關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查詢 NULL 值 。
在MySQL中,NULL值與任何其它值的比較(即使是NULL)永遠返回false,即 NULL = NULL 返回false 。
MySQL中處理NULL使用IS NULL和IS NOT NULL運算子。

多表連線查詢

JOIN 按照功能大致分為如下三類:

  • INNER JOIN(內連線,或等值連線):獲取兩個表中欄位匹配關係的記錄。
  • LEFT JOIN(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
  • RIGHT JOIN(右連線): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。

五、事務

MySQL 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

  • 在MySQL中只有使用了Innodb資料庫引擎的資料庫或表才支援事務
  • 事務處理可以用來維護資料庫的完整性,保證成批的SQL語句要麼全部執行,要麼全部不執行
  • 事務用來管理insert,update,delete語句

一般來說,事務是必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)

  • 1、事務的原子性:一組事務,要麼成功;要麼撤回。
  • 2、穩定性 : 有非法資料(外來鍵約束之類),事務撤回。
  • 3、隔離性:事務獨立執行。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。
  • 4、可靠性:軟、硬體崩潰後,InnoDB資料表驅動會利用日誌檔案重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麼時候吧事務儲存到日誌裡。

在Mysql控制檯使用事務來操作

mysql> begin; #開始一個事務

mysql> insert into a (a) values(555);

mysql>rollback; 回滾 , 這樣資料是不會寫入的

當然如果上面的資料沒問題,就輸入commit提交命令就行;

六、索引

MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。
打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。

建立索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。

實際上,索引也是一張表,該表儲存了主鍵與索引欄位,並指向實體表的記錄。

上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。建立索引會佔用磁碟空間的索引檔案。

普通索引
建立索引

這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

CREATE INDEX indexName ON mytable(username(length));  

如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。

修改表結構

ALTER mytable ADD INDEX [indexName] ON (username(length))

建立表的時候直接指定

CREATE TABLE mytable( 
ID INT NOT NULL,  
username VARCHAR(16) NOT NULL, 
INDEX [indexName] (username(length)) 
); 

刪除索引的語法

DROP INDEX [indexName] ON mytable;

唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:

使用ALTER 命令新增和刪除索引

有四種方式來新增資料表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULLALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 新增普通索引,索引值可出現多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用於全文索引。

以下例項為在表中新增索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你還可以在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試以下例項刪除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);

使用 ALTER 命令新增和刪除主鍵

主鍵只能作用於一個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)。例項如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令刪除主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
刪除指定時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。

顯示索引資訊

mysql> SHOW INDEX FROM table_name\G

七、python 操作mysql

python-mysqldb :
pymysql :
pymsql是Python中操作MySQL的模組,其使用方法和MySQLdb幾乎相同。

下載安裝

pip3 install pymysql

使用操作

1、執行SQL

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

# 建立連線
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 建立遊標
cursor = conn.cursor()

# 執行SQL,並返回收影響行數
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")

# 執行SQL,並返回受影響行數
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))

# 執行SQL,並返回受影響行數
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])


# 提交,不然無法儲存新建或者修改的資料
conn.commit()

# 關閉遊標
cursor.close()
# 關閉連線
conn.close()

2、獲取新建立資料自增ID

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close()

# 獲取最新自增ID
new_id = cursor.lastrowid

3、獲取查詢資料

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts")

# 獲取第一行資料
row_1 = cursor.fetchone()

# 獲取前n行資料
# row_2 = cursor.fetchmany(3)
# 獲取所有資料
# row_3 = cursor.fetchall()

conn.commit()
cursor.close()
conn.close()

注:在fetch資料時按照順序進行,可以使用cursor.scroll(num,mode)來移動遊標位置,如:

  • cursor.scroll(1,mode=’relative’) # 相對當前位置移動
  • cursor.scroll(2,mode=’absolute’) # 相對絕對位置移動

4、fetch資料型別

  關於預設獲取的資料是元祖型別,如果想要或者字典型別的資料,即:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')

# 遊標設定為字典型別
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()")

result = cursor.fetchone()

conn.commit()
cursor.close()
conn.close()