數據庫概述
數據存儲階段
- 人工管理階段
缺點:數據無法共享,不能單獨保持,數據存儲量有限
- 文件管理階段
優點:數據可以長期保存,可以存儲大量的數據,使用簡單
缺點:數據一致性差,數據查找修改不方便,數據冗余度可能比較大
- 數據庫管理階段
優點:數據阻止結構化降低了冗余度,提高了增刪改查的效率,容易擴展,方便程序調用,做自動化處理
缺點:需要使用sql 或者 其他特定的語句,相對比較復雜
數據庫應用
融機構,游戲網站,購物網站,論壇網站......
基礎感念
數據:能夠輸入到計算機中並被識別處理的信息集合
數據結構:研究一個數據集合中數據之間關系的
數據庫:按照數據結構,存儲管理數據的倉庫.數據庫是在數據庫管理系統管理和控制下,在一定介質上的數據集合
數據庫管理系統:管理數據庫的軟件,用於建立和維護數據庫
數據庫系統:由數據庫和數據庫管理系統,開發工具等組成的集合
數據庫分類和常見數據庫
- 關系型數據庫和非關系型數據庫
關系型:采用關系模型(二維表)來組織數據結構的數據庫
非關系型:不采用關系模型組織數據結構的數據庫
- 開源數據庫和非開源數據庫
開源:MySQL,SQLite,MongoDB
非開源:Oracle,DB2,SQL_Server
- 常見的關系型數據庫
MySQL,Oracle,SQL_Server,DB2,SQLite
認識關系型數據庫和MySQL
- 數據庫結構(圖形結構)
數據元素--->記錄--->數據表--->數據庫
- 數據庫概念解析
數據表:存放數據的表格
字段:每個列,用來表示該列數據的含義
記錄:每個行,表示一組完整的數據
- MySQL特點
- 是開源數據庫,使用C和C++編寫
- 能夠工作在眾多不同的平台上
- 提供了用於C,C++,Python,Java,Perl,PHP,Ruby眾多語言的API
- 存儲結構優良,運行速度快
- 功能全面豐富
- MySQL安裝
create database stu character set utf8;
另一種方法如下:
create database stu charset=utf8;
查看創建庫的語句(字符集)
show create database 庫名;
查看stu創建方法:
show create database stu;
查看當前所在庫
select database();
切換庫
use 庫名;
使用stu數據庫:
use stu;
刪除庫
drop database 庫名;
刪除test數據庫:
drop database test;
庫名的命名規則
- 數字,字母,下划線,但不能使用純數字
- 庫名區分字母大小寫
- 不能使用特殊字符和mysql關鍵字
數據表的管理
表結構設計初步
- 分析存儲內容
- 確定字段構成
- 設計字段類型
數據類型支持
數字類型:
整數類型(精確值)--->INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT
定點類型(精確值)--->DECIMAL
浮點類型(近似值)--->FLOAT,DOUBLE
比特值類型--->BIT
對於精度比較高的東西,比如money,用decimal類型提高精度減少誤差.列的聲明語法是DECIMAL(M,D).
M是數字的最大位數(精度).其范圍為1~65,M的默認值是10.D是小數點右側數字的數目(標度).其范圍是0~30.但不得超過M.
比如DECIMAL(6,2)最多存6位數字,小數點后占兩位,取值范圍-9999.99到9999.99
比特類型指0,1值表達2兩情況,如真,假
字符串類型:
CHAR和VARCHAR類型
BLOB和TEXT類型
ENUM類型和SET類型
- char 和 varchar
char:定長,效率高,一般用於固定長度的表單提交數據存儲,默認1字符
varchar: 不定長,效率偏低,但是節省空間.
- text 和 blob
text: 存儲非二進制文本
blob: 存儲二進制字節串
- enum 和 set
enum: 存儲給出的一個值
set: 存儲給出的值中一個或多個
表的基本操作
創建表(指定字符集)
create table 表名( 字段名 數據類型, 字段名 數據類型, ...... 字段名 數據類型 );
創建班級表,代碼如下:
create table class_1 (id int primary key auto_increment,name varchar(32)not null,age int unsigned not null,sex enum('w','m'),score float default 0.0);
創建興趣班表,代碼如下:

create table interest(id int primary key auto_increment,name varchar(32) not null,hobby set('sing','dance','draw'),level char not null,price decimal(6,2),comment text);
查看數據表
show tables;
查看已有表的字符集
show create table 表名;
查看表結構
desc 表名;
刪除表
drop table 表名;
數據基本操作
插入(insert)
insert into 表名 values(值1),(值2),......;
insert into class_1(2,'Baron',10,'m',91),(3,'Jame',9,'m',90);
查詢(select)
查詢表名內所有字段的信息
select * from 表名 [where 條件];
只查詢 選定字段名信息
select 字段名1,字段名2 from 表名 [where 條件];
實例如下:
select * from class_1;
select name,age from class_1;
where子句
where子句在sql語句中扮演了重要角色,主要通過一定的運算條件進行數據的篩選
MySQL主要有一下幾種運算符:
算數運算符
比較運算符
邏輯運算符
位運算符
算數運算符
實例如下:
select * from class_1 where age % 2 = 0;
比較運算符
實例如下:
select * from class_1 where age > 8;
select * from class_1 where between 8 and 10;
select * from class_1 where age in(8,9);
邏輯運算符
select * from class_1 where sex='m' and age > 9;
位運算符
運算符優先級順序 ! ... > ... :=
更新記錄表(update)
update 表名 set 字段1=值1,字段2=值2,... where 條件;
實例如下:
update class_1 set age=11 where name='Abby';
delete from 表名 where 條件;
注意:delete語句后如果不加where條件,所有記錄全部清空
實例如下:
delete from class_1 where name='Abby';
- 添加字段(add)
alter table 表名 add 字段名 數據類型;
alter table 表名 add 字段名 數據類型 first;
alter table 表名 add 字段名 數據類型 after 字段名;
- 刪除字段(drop)
alter table 表名 drop 字段名;
- 修改數據類型(modify)
alter table 表名 modify 字段名 新數據類型;
- 修改字段名(change)
alter table 表名 change 舊字段名 新字段名 新數據類型;
- 表重命名(raname)
alter table 表名 rename 新表名;
使用(after)添加字段:
alter table interest add tel char(11) after name;
時間和日期類型:
DATE,DATETIME和TIMESTAMP類型
TIME類型
年份類型YEAR
時間格式
date :"YYYY-MM-DD"
time:"HH:MM:SS"
datetime:"YYYY-MM-DD HH:MM:SS"
timestamp:"YYYY-MM-DD HH:MM:SS"
注意:
- datetime:以系統時間存儲
- timestamp:以標准時間存儲但是查看時轉換為系統市區,所以表現形式和datetime相同
實例如下:
create table marathon (id int primary key auto_increment,athlete varchar(32),birthday
date,registration_time datetime,performance time);
日期時間函數
- now()返回服務器當前時間,格式對應datetime類型
- curdate()返回當前日期,格式對應date類型
- curtime()返回當前時間,格式對應time類型
時間操作
- 查找操作
select * from marathon where birthday>='2000-01-01'; select * from marathon where birthday>="2000-07-01" and performance<="2:30:00";
日期時間運算
語法格式:
select * from 表名 where 字段名 運算符 (時間-interval 時間間隔單位);
時間間隔單位: 2 hour | 1 minute | 2 second | 2 year | 3 month | 1 day
實例如下:
select * from marathon where registration_time > (now()-interval 7 day);
得到指定的時間
time('2:30:00')
得到指定日期
date('2019-11-11')
主要用於時間運算
select * from marathon where performance < (time('2:30:00') + interval 10 minute);
LIKE用於在where子句中進行模糊查詢,SQL LIKE 子句中使用百分號 %來表示任意0個或多個字符,下划線_表示任意一個字符。
使用 LIKE 子句從數據表中讀取數據的通用語法:
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1
實例如下:
mysql> select * from class_1 where name like 'A%';
mysql中對正則表達式的支持有限,只支持部分正則元字符
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 REGEXP condition1
實例如下:
select * from class_1 where name regexp '^B.+';
ORDER BY 子句來設定你想按哪個字段哪種方式來進行排序,再返回搜索結果。
使用 ORDER BY 子句將查詢數據排序后再返回數據:
SELECT field1, field2,...fieldN from table_name1 where field1 ORDER BY field1 [ASC [DESC]]
默認情況ASC表示升序,DESC表示降序
select * from class_1 where sex='m' order by age;
LIMIT 子句用於限制由 SELECT 語句返回的數據數量 或者 UPDATE,DELETE語句的操作數量
帶有 LIMIT 子句的 SELECT 語句的基本語法如下:
SELECT column1, column2, columnN
FROM table_name
WHERE field LIMIT [num]
UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數據。
UNION 操作符語法格式:
SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions] UNION [ALL | DISTINCT] SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];
- expression1, expression2, ... expression_n: 要檢索的列。
實例如下:
select * from class_1 where sex='m' UNION ALL select * from class_1 where age > 9;
恢復命令格式
mysql -uroot -p 目標庫名 < stu.sql
從所有庫備份中恢復某一個庫(--one-database)
mysql -uroot -p --one-database 目標庫名 < all.sql
-
-
創建游標對象(cur = db.cursor())
-
游標方法: cur.execute("insert ....")
-
提交到數據庫或者獲取數據 : db.commit()/db.fetchall()
-
關閉游標對象 :cur.close()
-
斷開數據庫連接 :db.close()
db = pymysql.connect(參數列表)
host :主機地址,本地 localhost
port :端口號,默認3306
user :用戶名
password :密碼
database :庫
charset :編碼方式,推薦使用 utf8
數據庫連接對象(db)的方法
cur = db.cursor() 返回游標對象,用於執行具體SQL命令
db.commit() 提交到數據庫執行
db.rollback() 回滾,用於當commit()出錯是回復到原來的數據形態
db.close() 關閉連接
pymysql 數據庫操作流程實現
import pymysql # 連接數據庫 db = pymysql.connect(host='localhost', port=3306, user='root', password = '123456', database = 'stu', charset='utf8') # 創建游標 (操作數據庫語句,獲取查詢結果) cur = db.cursor() # 數據庫操作 cur.execute("insert into class_1 \ values (6,'Levi',11,'m',98);") # 向數據庫提交 (可以多次execute一次提交,只有寫操作需要) db.commit() # 關閉游標和數據庫 cur.close() db.close()
游標對象(cur)的方法
cur.execute(sql命令,[列表]) 執行SQL命令
cur.fetchone() 獲取查詢結果集的第一條數據,查找到返回一個元組否則返回None
cur.fetchmany(n) 獲取前n條查找到的記錄,返回結果為元組嵌套元組, ((記錄1),(記錄2))。
cur.fetchall() 獲取所有查找到的記錄,返回結果形式同上。
cur.close() 關閉游標對象
數據庫讀操作示例
import pymysql # 連接數據庫 db = pymysql.connect(host='localhost', port=3306, user='root', password = '123456', database = 'stu', charset='utf8') # 創建游標 (操作數據庫語句,獲取查詢結果) cur = db.cursor() # 數據庫操作 sql="select name,age from class_1 where sex='m';" cur.execute(sql) # 獲取查詢結果 one_row = cur.fetchone() print(one_row) # 元組 many_row = cur.fetchmany(3) print(many_row) # 元組套元組 all_row = cur.fetchall() print(all_row) # 元組套元組 # 關閉游標和數據庫 cur.close() db.close()
數據庫寫操作示例
import pymysql # 連接數據庫 db = pymysql.connect(host='localhost', port=3306, user='root', password = '123456', database = 'stu', charset='utf8') # 創建游標 (操作數據庫語句,獲取查詢結果) cur = db.cursor() # 數據庫操作 try: # 具體寫操作 # name = input("Name:") # age = input("Age:") # sex = input("Sex:") # score = input("Score:") # 直接構建sql語句 # sql="insert into class_1 (name,age,sex,score) \ # values ('%s',%s,'%s',%s)"%(name,age,sex,score) # cur.execute(sql) # 通過execute第二個參數列表構建sql語句 # sql = "insert into class_1 (name,age,sex,score) \ # values (%s,%s,%s,%s)" # cur.execute(sql,[name,age,sex,score]) # 修改操作 # sql = "update interest set price=12800 " \ # "where name='Tom'" # cur.execute(sql) # 刪除操作 sql = "delete from class_1 where score < 80" cur.execute(sql) db.commit() except Exception as e: db.rollback() # 如果提交異常則回到提交前的狀態 print(e) # 關閉游標和數據庫 cur.close() db.close()
二進制文件存儲到數據庫
- 存儲文件的所在路徑 "/home/tarena/......"
- 存儲文件本身
圖片存儲以及提取代碼實現:
import pymysql # 連接數據庫 db = pymysql.connect(host='localhost', port=3306, user='root', password = '123456', database = 'stu', charset='utf8') # 創建游標 (操作數據庫語句,獲取查詢結果) cur = db.cursor() # 存儲圖片 # with open('timg.jpeg','rb') as f: # data = f.read() # # try: # sql = "insert into images values (1,'jd',%s)" # cur.execute(sql,[data]) # db.commit() # except: # db.rollback() # 提取圖片 sql = "select image from images where filename='jd'" cur.execute(sql) data = cur.fetchone() with open('jd.jpeg','wb') as f: f.write(data[0]) # 關閉游標和數據庫 cur.close() db.close()