缺點:數據沒法共享,不能單獨保持,數據存儲量有限mysql
優勢:數據能夠長期保存,能夠存儲大量的數據,使用簡單正則表達式
缺點:數據一致性差,數據查找修改不方便,數據冗餘度可能比較大sql
優勢:數據阻止結構化下降了冗餘度,提升了增刪改查的效率,容易擴展,方便程序調用,作自動化處理數據庫
缺點:須要使用sql 或者 其餘特定的語句,相對比較複雜express
融機構,遊戲網站,購物網站,論壇網站......編程
數據:可以輸入到計算機中並被識別處理的信息集合windows
數據結構:研究一個數據集合中數據之間關係的服務器
數據庫:按照數據結構,存儲管理數據的倉庫.數據庫是在數據庫管理系統管理和控制下,在必定介質上的數據集合數據結構
數據庫管理系統:管理數據庫的軟件,用於創建和維護數據庫編程語言
數據庫系統:由數據庫和數據庫管理系統,開發工具等組成的集合
關係型:採用關係模型(二維表)來組織數據結構的數據庫
非關係型:不採用關係模型組織數據結構的數據庫
開源:MySQL,SQLite,MongoDB
非開源:Oracle,DB2,SQL_Server
MySQL,Oracle,SQL_Server,DB2,SQLite
數據元素--->記錄--->數據表--->數據庫
數據表:存放數據的表格
字段:每一個列,用來表示該列數據的含義
記錄:每一個行,表示一組完整的數據
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;
庫名的命名規則
表結構設計初步
數據類型支持
數字類型:
整數類型(精確值)--->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:定長,效率高,通常用於固定長度的表單提交數據存儲,默認1字符
varchar: 不定長,效率偏低,可是節省空間.
text: 存儲非二進制文本
blob: 存儲二進制字節串
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 into 表名 values(值1),(值2),......;
insert into class_1(2,'Baron',10,'m',91),(3,'Jame',9,'m',90);
查詢表名內全部字段的信息
select * from 表名 [where 條件];
只查詢 選定字段名信息
select 字段名1,字段名2 from 表名 [where 條件];
實例以下:
select * from class_1;
select name,age from class_1;
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 表名 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';
alter table 表名 add 字段名 數據類型;
alter table 表名 add 字段名 數據類型 first;
alter table 表名 add 字段名 數據類型 after 字段名;
alter table 表名 drop 字段名;
alter table 表名 modify 字段名 新數據類型;
alter table 表名 change 舊字段名 新字段名 新數據類型;
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"
注意:
實例以下:
create table marathon (id int primary key auto_increment,athlete varchar(32),birthday
date,registration_time datetime,performance 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];
實例以下:
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()
二進制文件存儲到數據庫
圖片存儲以及提取代碼實現:
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()