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 子句
語法: