MySQL 數據庫操作
數據庫操作
1.查看已有庫
show databases;
2.創建庫(指定字符集)
create database 庫名 character set utf8;
create database 庫名 charset=utf8;
create database 庫名 default charset utf8 collate utf8_general_ci;
案例:創建stu數據庫,編碼為utf8
create database stu character set utf8;
create database stu charset=utf8;
3.查看創建庫的語句(字符集)
show create database 庫名;
案例:查看stu創建方法 show create database stu;
4.查看當前所在庫
select database();
5.切換庫
use 庫名;
案例:使用stu數據庫 use stu;
6.刪除庫
drop database 庫名;
案例:刪除test數據庫 drop database test;
7.庫名的命名規則
- 數字、字母、下划線,但不能使用純數字
- 庫名區分字母大小寫
- 不能使用特殊字符和mysql關鍵字
庫管理 |
代碼 |
服務器狀態 |
status; |
查看整個數據庫的編碼集 |
show variables like 'charavter%'; |
創建庫(制定字符集) |
create database 庫名 character set utf8; create database 庫名 charset=utf8; create database 庫名 default charset utf8 collate utf8_general_ci; |
查看已有庫 |
show databases; |
切換庫 |
use 庫名; |
查看創建庫的語句 |
show create database 庫名; |
刪除庫 |
drop database 庫名; |
數據表的管理
1.表結構設計初步
【1】 分析存儲內容
【2】 確定字段構成
【3】 設計字段類型
2.數據類型支持
數字類型:
整數類型(精確值) - 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位數字,小數點后占2位,取值范圍-9999.99到9999.99。
比特值類型指0,1值表達2種情況,如真,假
字符串類型:
- char和varchar類型
- binary和varbinary類型
- blob和text類型
- enum類型和set類型
- char 和 varchar
char:定長,效率高,一般用於固定長度的表單提交數據存儲,默認1字符
varchar:不定長,效率偏低
- text 和blob
text用來存儲非二進制文本
blob用來存儲二進制字節串
- enum 和 set
enum用來存儲給出的一個值
set用來存儲給出的值中一個或多個值
表的基本操作:
創建表(指定字符集)
create table 表名(
字段名 數據類型,
字段名 數據類型,
...
字段名 數據類型
);
- 如果你想設置數字為無符號則加上 unsigned
- 如果你不想字段為 NULL 可以設置字段的屬性為 NOT NULL, 在操作數據庫時如果輸入該字段的數據為NULL ,就會報錯。
- DEFAULT 表示設置一個字段的默認值
- AUTO_INCREMENT定義列為自增的屬性,一般用於主鍵,數值會自動加1。
- PRIMARY KEY關鍵字用於定義列為主鍵。主鍵的值不能重復。
案例:創建班級表
create table class_1 (id int primary key auto_increment,name varchar(32) not null,age int 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'),course 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 表名(字段1,...) values(值1),...;
案例:insert into class_1 values (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)
delete from 表名 where 條件;
注意:delete語句后如果不加where條件,所有記錄全部清空
案例:delete from class_1 where name='Abby';
表字段的操作(alter)
語法 :alter table 表名 執行動作;
* 添加字段(add)
alter table 表名 add 字段名 數據類型;
alter table 表名 add 字段名 數據類型 first;
alter table 表名 add 字段名 數據類型 after 字段名; * 刪除字段(drop) alter table 表名 drop 字段名; * 修改數據類型(modify) alter table 表名 modify 字段名 新數據類型; * 修改字段名(change) alter table 表名 change 舊字段名 新字段名 新數據類型; * 表重命名(rename) alter table 表名 rename 新表名;
案例:alter table interest add date Date after course;
表管理 |
代碼 |
創建表 |
create table 表名( |
查看數據表 |
show tables; |
查看已有表的字符集 |
show create table 表名; |
查看表結構 |
desc 表名; |
插入(insert into) |
insert into 表名 values(值1,值2,...),(值1,值2,...); |
|
insert into 表名 (字段1,...) values(值1,...); |
查詢(select) |
select 字段1,... from 表名 where 條件; |
|
select 字段,字段2,... from 表名;(千萬別用*) |
更新表記錄(update)修改 |
update set 字段1=值1,... where 條件; |
刪除表記錄(delete) |
delete from 表名 where 條件; |
刪除表(drop) |
drop table 表名; |
表字段的操作(alter) |
|
添加字段(add) 默認末尾添加 |
alter table 表名 add 字段名 數據類型; |
第一處添加first |
alter table 表名 add 字段名 數據類型 first; |
在哪個字段名后面添加after |
alter table 表名 add 字段名 數據類型 after 字段名; |
刪除字段(drop) |
alter table 表名 drop 字段名; |
修改數據類型(modify) |
alter table 表名 modify 字段名 新數據類型; |
修改字段名(change) |
alter table 表名 change 舊字段名 新字段名 新數據類型 (新舊字段名相同也可以修改數據類型) |
表重命名(rename) |
alter table 表名 rename 新表名; |
時間類型數據
時間和日期類型:
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"
注意
1、datetime :不給值默認返回NULL值
2、timestamp :不給值默認返回系統當前時間
日期時間函數
- now() 返回服務器當前時間
- curdate() 返回當前日期
- curtime() 返回當前時間
- date(date) 返回指定時間的日期
- time(date) 返回指定時間的時間
時間操作
- 查找操作
select * from timelog where Date = "2018-07-02";
select * from timelog where Date>="2018-07-01" and Date<="2018-07-31";
-
日期時間運算
-
語法格式
select * from 表名 where 字段名 運算符 (時間-interval 時間間隔單位);
-
時間間隔單位: 1 day | 2 hour | 1 minute | 2 year | 3 month
-
案例:select * from timelog where shijian > (now()-interval 1 day);
高級查詢語句
模糊查詢和正則查詢
LIKE用於在where子句中進行模糊查詢,SQL LIKE 子句中使用百分號 %字符來表示任意字符。
使用 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: 要檢索的列。
tables: 要檢索的數據表。
WHERE conditions: 可選, 檢索條件。
DISTINCT: 可選,刪除結果集中重復的數據。默認情況下 UNION 操作符已經刪除了重復數據,所以 DISTINCT 修飾符對結果沒啥影響。
ALL: 可選,返回所有結果集,包含重復數據。
要求查詢的字段必須相同
案例:select * from class_1 where sex='m' UNION ALL select * from class_1 where age > 9;
多表查詢
多個表數據可以聯合查詢,語法格式如下
select 字段1,字段2... from 表1,表2... [where 條件]
案例:
select class_1.name,class_1.age,class_1.sex,interest.hobby from class_1,interest where class_1.name = interest.name;
功能 |
代碼 |
模糊查詢 (like 'a%','_') |
select * from 表名 where 字段名 like 'a%'; 例句:select * from class_1 where name like 'A%';(查找class_1表中名字A開頭的名字) 例句:select * from class_1 where name like '__';(一個'_'代表一個字符,查找class_1表中兩個字符的名字) |
正則查詢(regexp) |
例句:select * from class_1 where name regexp 'B.+';(regexp正則查詢) |
排序 (升序order by) (降序order by desc) |
select * from 表名 where 條件 order by 字段名; 例句:select * from class_1 where sex='男' order by age;(查找class_1表中男性按年齡升序排序) 例句:select * from class_1 where sex='男' order by age desc;(查找class_1表中男性按年齡降序排序) |
分頁(limit) |
select 字段名 from 表名 where 條件 order by 字段 limit offset,num; 條件:1.當前要看第多少頁set @current=2(多少頁) 2.每頁顯示多少條數據,@pageSize=2(頁的條數) select id,name,age,email from users limit (@current-1)*@pageSize,@pageSize;等於第二頁第二條 select id,name,age,email from users limit 2,2; 例句:select * from class_1 where sex='男' order by age desc limit 1; (查找class_1表中男性按年齡降序排列 **顯示一行**) 例句:select * from class_1 where sex='男' order by age desc limit 1; (查找class_1表中男性按年齡降序排列 **顯示兩行**) |
聯合查詢 (union) (union all) |
例句:select * from student where sex='女' union select * from student where score >85; (默認是或的意思 查找女生或85分以上的學生,默認去掉重復的數據) 例句:select * from student where sex='女' union all select * from student where score >85; (查找女生和85分以上的學生,兩次查找無關聯,第二次會重新查找) |
多表查詢 |
select 表名.字段1,表名.字段2,... from 表1,表2,... where 條件; select class_1.name,class_1.age,class_1.sex,interest.hobby from class_1,interest where class_1.name=interest.name; (查找class_1表中的姓名,年齡,性別,interest表中的愛好 姓名相同的數據) |
數據備份
1.備份命令格式
mysqldump -u用戶名 -p 源庫名 > ~/***.sql (要備份的庫名 ***.sql 備份起的名 )
--all-databases 備份所有庫
庫名 備份單個庫
-B 庫1 庫2 庫3 備份多個庫
庫名 表1 表2 表3 備份指定庫的多張表
2.恢復命令格式
mysql -uroot -p 目標庫名 < ***.sql (目標庫名是恢復到的庫 ***.sql 備份的庫 )
從所有庫備份中恢復某一個庫(--one-database)
mysql -uroot -p --one-database 目標庫名 < all.sql
Python操作MySQL數據庫
pymysql安裝
sudo pip3 install pymysql
pymysql使用流程
- 建立數據庫連接(db = pymysql.connect(...))
- 創建游標對象(c = db.cursor())
- 游標方法: c.execute("insert ....")
- 提交到數據庫 : db.commit()
- 關閉游標對象 :c.close()
- 斷開數據庫連接 :db.close()
常用函數
db = pymysql.connect(參數列表)
host :主機地址,本地 localhost
port :端口號,默認3306
user :用戶名
password :密碼
database :庫
charset :編碼方式,推薦使用 utf8
數據庫連接對象(db)的方法
db.commit() 提交到數據庫執行
db.rollback() 回滾
cur = db.cursor() 返回游標對象,用於執行具體SQL命令
db.close() 關閉連接
游標對象(cur)的方法
cur.execute(sql命令,[列表]) 執行SQL命令
cur.close() 關閉游標對象
cur.fetchone() 獲取查詢結果集的第一條數據 (1,100001,"河北省")
cur.fetchmany(n) 獲取n條 ((記錄1),(記錄2))
cur.fetchall() 獲取所有記錄

1 import pymysql 2 3 # 連接數據庫 4 db = pymysql.connect(host='localhost', 5 port=3306, 6 user='root', 7 passwd='123456', 8 database='stu', 9 charset='utf8') 10 11 # 獲取游標(用於進行數據操作的對象,承載操作結果) 12 cur = db.cursor() 13 14 # 執行sql語句 15 sql = "insert into student \ 16 (name,age,gender,score) values \ 17 ('Lily',14,'w',79.5);" 18 cur.execute(sql) 19 20 db.commit() # 將寫操作提交到數據庫 21 22 # 關閉數據庫 23 cur.close() 24 db.close()

1 import pymysql 2 3 # 連接數據庫 4 db = pymysql.connect(host='localhost', 5 port=3306, 6 user='root', 7 passwd='123456', 8 database='stu', 9 charset='utf8') 10 11 # 獲取游標(用於進行數據操作的對象,承載操作結果) 12 cur = db.cursor() 13 14 # 存儲文件 15 # with open('boy.jpg','rb') as fd: 16 # data = fd.read() 17 # 18 # try: 19 # sql="insert into Image values (1,'boy.jpg',%s)" 20 # cur.execute(sql,[data]) 21 # db.commit() 22 # except Exception as e: 23 # print(e) 24 # db.rollback() 25 26 # 獲取圖片 27 sql = "select * from Image \ 28 where filename='boy.jpg'" 29 cur.execute(sql) 30 31 # (1,name,xxxxx) 32 img = cur.fetchone() 33 with open(img[1],'wb') as f: 34 f.write(img[2]) 35 36 # 關閉數據庫 37 cur.close() 38 db.close()

1 """ 2 select語句 3 """ 4 5 import pymysql 6 7 # 連接數據庫 8 db = pymysql.connect(host='localhost', 9 port=3306, 10 user='root', 11 passwd='123456', 12 database='stu', 13 charset='utf8') 14 15 # 獲取游標(用於進行數據操作的對象,承載操作結果) 16 cur = db.cursor() 17 18 # 執行sql語句 19 sql = "select * from student where gender='m'" 20 cur.execute(sql) #執行查詢后cur便會擁有查詢結果 21 22 # 獲取一個查詢結果 23 one_row = cur.fetchone() 24 print(one_row) 25 26 # 獲取多個查詢結果 27 many_row = cur.fetchmany(2) 28 print(many_row) 29 30 # 獲取全部查詢結果 31 all_row = cur.fetchall() 32 print(all_row) 33 34 # 關閉數據庫 35 cur.close() 36 db.close()

1 """ 2 增刪改為寫操作 3 """ 4 5 import pymysql 6 7 # 連接數據庫 8 db = pymysql.connect(host='localhost', 9 port=3306, 10 user='root', 11 passwd='123456', 12 database='stu', 13 charset='utf8') 14 15 # 獲取游標(用於進行數據操作的對象,承載操作結果) 16 cur = db.cursor() 17 18 # 執行sql語句 19 try: 20 # 插入數據 21 # name = input("name:") 22 # age = int(input('age:')) 23 # gender = input('gender:') 24 # score = float(input('score:')) 25 26 # sql = "insert into student (name,age,gender,score) \ 27 # values ('%s',%d,'%s',%f)"%(name,age,gender,score) 28 29 # sql = "insert into student (name,age,gender,score) \ 30 # values (%s,%s,%s,%s)" 31 32 # sql = "insert into interest values \ 33 # (3,'Joy','draw','B',5488.0,'畫的雞蛋還行')" 34 # cur.execute(sql,[name,age,gender,score]) 35 36 # 修改操作 37 # sql = "update student set age=22 \ 38 # where name = 'Lily'" 39 # cur.execute(sql) 40 41 # 刪除操作 42 sql = "delete from student where score<60" 43 cur.execute(sql) 44 45 db.commit() # 可以執行多個sql語句一同提交 46 except Exception as e: 47 db.rollback() # 退回到commit之前的狀態 48 print(e) 49 50 # 關閉數據庫 51 cur.close() 52 db.close()