python(十二)上:mysql安裝使用詳細教程
上節回顧:
RabbitMQ幾種模式:
- 平均分發
- perfetch =1
- durable佇列持久化,deliver_mode = 2 訊息持久化
- 一對多廣播,exchanage
- fanout
- direct
- topic
- RPC
一、資料庫介紹
1、什麼是資料庫?
資料庫(Database)是按照資料結構來組織、儲存和管理資料的倉庫,
每個資料庫都有一個或多個不同的API用於建立,訪問,管理,搜尋和複製所儲存的資料。
現在我們使用關係型資料庫管理系統(RDBMS)來儲存和管理的大資料量。所謂的關係型資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。
RDBMS即關係資料庫管理系統(Relational Database Management System)的特點:
- 資料以表格的形式出現
- 每行為各種記錄名稱
- 每列為記錄名稱所對應的資料域
- 許多的行和列組成一張表單
- 若干的表單組成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]]
使用 ASC 或 DESC 關鍵字來設定查詢結果是按升序或降序排列。 預設情況下,它是按升序排列。
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): 該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER 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()