1. 程式人生 > >Python之路-python(mysql介紹和安裝、pymysql、ORM sqlachemy)

Python之路-python(mysql介紹和安裝、pymysql、ORM sqlachemy)

轉載至:北極之光部落格



本節內容

1、資料庫介紹

2、mysql管理

3、mysql資料型別

4、常用mysql命令

  建立資料庫

  外來鍵

  增刪改查表

5、事務

6、索引

7、python 操作mysql 

8、ORM sqlachemy學習

 

1、資料庫介紹

什麼是資料庫?

資料庫(Database)是按照資料結構來組織、儲存和管理資料的倉庫,
每個資料庫都有一個或多個不同的API用於建立,訪問,管理,搜尋和複製所儲存的資料。
我們也可以將資料儲存在檔案中,但是在檔案中讀寫資料速度相對較慢。
所以,現在我們使用關係型資料庫管理系統(RDBMS)來儲存和管理的大資料量。所謂的關係型資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。
RDBMS即關係資料庫管理系統(Relational Database Management System)的特點:
1.資料以表格的形式出現
2.每行為各種記錄名稱
3.每列為記錄名稱所對應的資料域
4.許多的行和列組成一張表單
5.若干的表單組成database

 

RDBMS 術語 

在我們開始學習MySQL 資料庫前,讓我們先了解下RDBMS的一些術語:

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

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系統。

 

2、mysql管理

MySQL 使用者設定

如果你需要新增 MySQL 使用者,你只需要在 mysql 資料庫中的 user 表新增新使用者即可。

以下為新增使用者的的例項,使用者名稱為lisi,密碼為12345678,並授權使用者可進行 SELECT, INSERT 和 UPDATE操作許可權:

 

1  insert into user(host,user,password,select_priv,insert_priv,update_priv) values ('localhost','lisi',password('12345678'),'y','y','y');
1 flush privileges;

管理MySQL的命令

以下列出了使用Mysql資料庫過程中常用的命令:

  • USE 資料庫名 :選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫。

  • SHOW DATABASES: 列出 MySQL 資料庫管理系統的資料庫列表。

  • SHOW TABLES: #顯示指定資料庫的所有表,使用該命令前需要使用 use命令來選擇要操作的資料庫。

  • SHOW COLUMNS FROM 資料表: #顯示資料表的屬性,屬性型別,主鍵資訊 ,是否為 NULL,預設值等其他資訊。

  • create database testdb charset "utf8"; #建立一個叫testdb的資料庫,且讓其支援中文 

  • drop database testdb; #刪除資料庫

  • SHOW INDEX FROM 資料表:顯示資料表的詳細索引資訊,包括PRIMARY KEY(主鍵)。

 

3、mysql資料型別

MySQL中定義資料欄位的型別對你資料庫的優化是非常重要的。

MySQL支援多種型別,大致可以分為三類:數值、日期/時間和字串(字元)型別。

數值型別

MySQL支援所有標準SQL數值資料型別。

這些型別包括嚴格數值資料型別(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值資料型別(FLOAT、REAL和DOUBLE PRECISION)。

關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。

BIT資料型別儲存位欄位值,並且支援MyISAM、MEMORY、InnoDB和BDB表。

作為SQL標準的擴充套件,MySQL也支援整數型別TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數型別的儲存和範圍。

 

型別 大小 範圍(有符號) 範圍(無符號) 用途
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的值 小數值

 

日期和時間型別

表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每個時間型別有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。

TIMESTAMP型別有專有的自動更新特性,將在後面描述。

 

 

型別 大小
(位元組)
範圍 格式 用途
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 混合日期和時間值,時間戳

字串型別

字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。

型別 大小 用途
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位元組 極大文字資料

CHAR和VARCHAR型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在儲存或檢索過程中不進行大小寫轉換。

BINARY和VARBINARY類類似於CHAR和VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於列值位元組的數值值。

BLOB是一個二進位制大物件,可以容納可變數量的資料。有4種BLOB型別:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不同。

有4種TEXT型別:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB型別,有相同的最大長度和儲存需求

4、常用mysql命令

  建立資料庫

  語法

  

1 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 插入資料

語法

1 INSERT INTO table_name ( field1, field2,...fieldN )
2                        VALUES
3                        ( value1, value2,...valueN );
複製程式碼
 1 mysql> insert into student (name,age,register_date) values ("zhangsan",22,"2016-10-26");
 2 Query OK, 1 row affected (0.00 sec)
 3 
 4 mysql> select * from student;
 5 +--------+----------+-----+---------------+
 6 | stu_id | name     | age | register_date |
 7 +--------+----------+-----+---------------+
 8 |      1 | zhangsan |  22 | 2016-10-26    |
 9 +--------+----------+-----+---------------+
10 1 row in set (0.00 sec)
複製程式碼

MySQL 查詢資料

語法

1 SELECT column_name,column_name
2 FROM table_name
3 [WHERE Clause]
4 [OFFSET M ][LIMIT N]
複製程式碼
 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11 
12 方法一:
13 mysql> select name from student where name="zhangsan2";
14 +-----------+
15 | name      |
16 +-----------+
17 | zhangsan2 |
18 +-----------+
19 1 row in set (0.00 sec)
20 
21 方法二:
22 mysql> select name,age  from student where name="zhangsan2" and age=24;
23 +-----------+-----+
24 | name      | age |
25 +-----------+-----+
26 | zhangsan2 |  24 |
27 +-----------+-----+
28 1 row in set (0.00 sec)
複製程式碼
  • 查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
  • SELECT 命令可以讀取一條或者多條記錄。
  • 你可以使用星號(*)來代替其他欄位,SELECT語句會返回表的所有欄位資料
  • 你可以使用 WHERE 語句來包含任何條件。
  • 你可以通過OFFSET指定SELECT語句開始查詢的資料偏移量。預設情況下偏移量為0。
  • 你可以使用 LIMIT 屬性來設定返回的記錄數。
複製程式碼
 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
複製程式碼 複製程式碼
 1 #limit相當於從表中的第幾條開始查詢,offset代表從前面第幾條開始計算的第幾條資料。(包含limit那行)
 2 方法一:
 3 mysql> select * from student limit 2 offset 1;
 4 +--------+-----------+-----+---------------+
 5 | stu_id | name      | age | register_date |
 6 +--------+-----------+-----+---------------+
 7 |      2 | zhangsan1 |  23 | 2016-10-27    |
 8 |      3 | zhangsan2 |  24 | 2016-10-28    |
 9 +--------+-----------+-----+---------------+
10 2 rows in set (0.00 sec)
11 
12 
13 #下面這個少了個offset,完全就變了。下面說明是從limit指定條開始讀,後面1代表讀幾行。
14 方法二:
15 mysql> select * from student limit 2,1;
16 +--------+-----------+-----+---------------+
17 | stu_id | name      | age | register_date |
18 +--------+-----------+-----+---------------+
19 |      3 | zhangsan2 |  24 | 2016-10-28    |
20 +--------+-----------+-----+---------------+
21 1 row in set (0.00 sec)
複製程式碼

 

MySQL where 子句

語法

1 SELECT field1, field2,...fieldN FROM table_name1, table_name2...
2 [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 子句的條件查詢是非常快速的。

複製程式碼
1 mysql> select * from student where age > 24;
2 +--------+-----------+-----+---------------+
3 | stu_id | name      | age | register_date |
4 +--------+-----------+-----+---------------+
5 |      4 | zhangsan3 |  25 | 2016-10-29    |
6 +--------+-----------+-----+---------------+
7 1 row in set (0.00 sec)
複製程式碼

MySQL UPDATE 查詢

語法

複製程式碼
 1 mysql> select * from student;
 2 +--------+-----------+-----+---------------+
 3 | stu_id | name      | age | register_date |
 4 +--------+-----------+-----+---------------+
 5 |      1 | zhangsan  |  22 | 2016-10-26    |
 6 |      2 | zhangsan1 |  23 | 2016-10-27    |
 7 |      3 | zhangsan2 |  24 | 2016-10-28    |
 8 |      4 | zhangsan3 |  25 | 2016-10-29    |
 9 +--------+-----------+-----+---------------+
10 4 rows in set (0.00 sec)
11 
12 mysql> update student set age=28 where name="zhangsan3" and age="25";
13 Query OK, 1 row affected (0.00 sec)
14 Rows matched: 1  Changed: 1  Warnings: 0
15 
16 mysql> select * from student;
17 +--------+-----------+-----+---------------+
18 | stu_id | name      | age | register_date |
19 +--------+-----------+-----+---------------+
20 |      1 | zhangsan  |  22 | 2016-10-26    |
21 |      2 | zhangsan1 |  23 | 2016-10-27    |
22 |      3 | zhangsan2 |  24 | 2016-10-28    |
23 |      4 | zhangsan3 |  28 | 2016-10-29    |
24 +--------+-----------+-----+---------------+
25 4 rows in set (0.00 sec)
複製程式碼

 

MySQL DELETE 語句

語法:

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

 

例如:

複製程式碼
 1 mysql> delete from student where name="zhangsan3" and age=28;
 2 Query OK, 1 row affected (0.00 sec)
 3 
 4 mysql> select * from student;
 5 +--------+-----------+-----+---------------+
 6 | stu_id | name      | age | register_date |
 7 +--------+-----------+-----+---------------+
 8 |      1 | zhangsan  |  22 | 2016-10-26    |
 9 |      2 | zhangsan1 |  23 | 2016-10-27    |
10 |      3 | zhangsan2 |  24 | 2016-10-28    |
11 +--------+-----------+-----+---------------+
12 3 rows in set (0.00 sec)
複製程式碼

 

MySQL LIKE 子句

語法: