本結目錄python
此操做針對windows環境下mysql
該操做再Mysql服務器啓動以及客戶端鏈接以後sql
對數據庫操做以前,引伸一些較爲聽的懂的白話數據庫
概念
數據庫(文件夾)
數據庫表(文件)
數據行(文件中的一行數據)
一個數據庫就是一個文件夾
一、顯示數據庫windows
show databases; -- 後面記得跟英文字符的分號 show create database 數據庫名稱; -- 查看數據庫建立信息
默認數據庫:
mysql - 用戶權限相關數據
test - 用於用戶測試數據
information_schema - MySQL自己架構相關數據服務器
二、建立數據庫架構
show databases; --查看當前Mysql都有那些數據,根目錄都有那些文件夾
create database 數據庫名; --建立文件夾
use 數據庫名; --使用選中數據庫,進入目錄
show tables; --查看當前數據庫下都有那些表
create table 表名(nidint, namevarchar(20), pwdvarchar(64)); --建立數據庫表
/*闡釋
至關於建立一個tb1的表 有nid,name,pwd三列
nid int 爲int類型 varchar(20) 爲字符類型最多20*/
select * from 表名; --查看錶中的全部數據
insert into 表名(nid, name, pwd) values(1, 'alex', '123'); --插入數據
三、修改數據庫ide
alter databases 數據庫名稱 character set utf8; -- 修改數據庫編碼格式
四、刪除數據庫函數
drop database [if exists] db_name;
五、用戶管理性能
顯示當前使用的數據庫中全部表:show tables;
PS:用戶權限相關數據保存在mysql數據庫的user表中,因此也能夠直接對其進行操做(不建議)
show databases;
use mysql; show tables; 能夠看到mysql下有多少張表 user表是用戶表 desc user; 查看user表有多少列 select host,user from user; 能夠看到用戶
建立用戶
create user '用戶名'@'IP地址' identified by '密碼'; 刪除用戶 drop user '用戶名'@'IP地址'; 修改用戶 rename user '用戶名'@'IP地址'; to '新用戶名'@'IP地址';; 修改密碼 set password for '用戶名'@'IP地址' = Password('新密碼')
一、建立數據表
create table 表名(
列名 類型 是否能夠爲空,
列名 類型 是否能夠爲空
)ENGINE=InnoDB DEFAULT CHARSET=utf8 -- ENGINE=InnoDB 表示引擎 後爲默認編碼格式爲utf
二、查看數據表
show tables; -- 顯示當前數據庫全部表
desc 表名; -- 查看錶結構
show create table 表名 -- 查看完整表建立信息
三、修改表結構
--增長列(字段)
--添加多字段用逗號隔開進行
alter table 表名 add 列名 類型 [約束條件];
--刪除列(字段)
--多字段刪除也用逗號隔開,無需加數據類型
alter table 代表 drop 列名1,列名2...; --修改列(字段) --列類型修改 alter table 表名 modify 列名 類型 [約束條件][first|after 列名]; --列名稱修改 alter table 表名 change 原列名 新列名 類型 [約束條件][first|after 列名];
四、修改表名
rename table 原表名 to 新表名;
五、刪除表
drop table 表名;
一、增
insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表 set 列名=值,列名=值...; -- insert into 表 (列名,列名...) select (列名,列名...) from 表
二、刪
delete from 表名 where 字段鍵值對; -- 可多條多慮
delete from 表名;
truncate table 表名; -- 如不進行篩選,則刪除表的全部記錄(表依舊存在) -- delete 逐條刪除,留下空表 -- truncate 先刪除表,然後copy一個與以前相同的空表
三、改
update 表 set name = 'Tony' where id>1 -- 多條能夠用逗號隔開進行修改 -- 進行篩選則單獨對篩選的那部分進行修改 -- 不進行篩選,則修改全部符合的部分
四、查(*****)
select * from 表 -- 查看錶中的全部數據 select * from 表 where id > 1 -- 篩選id大於1的全部數據 select nid,name,gender as gg from 表 where id > 1 -- 查看id大於1的nid,name,gender的三個字段 as ... 表示進行別名設置
A、條件
select * from 表 where id > 1 and name != 'alex' and num = 12; -- 篩選id>1且name不爲alex且num爲12的數據
select * from 表 where id between 5 and 16; -- 篩選id值在5到16範圍內的數據
select * from 表 where id in (11,22,33) -- 篩選id值爲11或22或33的數據
select * from 表 where id not in (11,22,33) -- 反之
select * from 表 where id in (select nid from 表) B、SQL通配符 select * from 表 where name like '%le%' -- 選取name包含有le的全部數據 select * from 表 where name like 'ale_' -- ale開頭的全部(一個字符) select * from 表 where name regexp "^[awv]"; -- 選取name以'a'、'w'或'v'開始的全部數據 select * from tb where name regexp "^[a-c]"; -- 選取name以a到c開頭範圍內的全部的數據 select * from tb where name regexp "^[^a-c]";-- 選取name非以a到c開頭的全部數據 C、限制 select * from tb limit 2; -- 前2行 select * from tb limit 2,2; -- 從第2行開始的後2行 select * from tb limit 2 offset 2; -- 從第2行開始的後2行 D、排序 select * from tb order by name asc; -- 按照name升序排列 select * from tb order by name desc; -- 按照name降序排列 E、分組 select * from tb group by name; -- 根據名字分組 select * from tb group by 2; -- 根據第2個字段分組 select * from employee_tbl group by name having id>4; -- 根據名字分組且id大於4的數據 -- where做用於分組前,having做用於分組後且能夠用聚合函數,在where中就不行 F、聚合函數(常常做用於分組查詢配合使用) SUM(字段) -- 求和 COUNT(字段) -- 次數統計 AVG(字段) -- 平均值 MAX(字段) -- 最大 MIN(字段) -- 最小
以上都只是單表性的查詢,例如模擬在實際生活中,會有一張員工表,而員工會有其歸屬的部門,那麼相應的也會有一張部門表.在其中相應的倆者之間會有一種相應的關聯,那麼這裏引伸了外鍵及多表查詢
外鍵能夠理解爲一種約束,它有如下限制(FOREIGN KEY爲建立外鍵的關鍵詞)
注意:做爲外鍵必定要和關聯主鍵的數據類型保持一致
-- 一、創建從表的時候就和主表創建外鍵
CREATE TABLE TABLE_NAME(
'字段' 類型, '字段' 類型, ... ... FOREIGN KEY (從表字段) REFERENCES 主表(字段) ); -- 二、建表完成以後,也能夠經過sql語句和主表創建聯繫 ALTER TABLE 從表 ADD CONSTRAINT 外鍵名稱(形如:FK_從表_主表) FOREIGN KEY (從表字段) REFERENCES 主表(字段);
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱
--外鍵約束對子表的含義: 若是在父表中找不到候選鍵,則不容許在子表上進行insert/update
--外鍵約束對父表的含義: 在父表上進行update/delete以更新或刪除在子表中有一條或多條對
-- 應匹配行的候選鍵時,父表的行爲取決於:在定義子表的外鍵時指定的
-- on update/on delete子句
-----------------innodb支持的四種方式---------------------------------------
-----cascade方式 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄
-----外鍵的級聯刪除:若是父表中的記錄被刪除,則子表中對應的記錄自動被刪除--------
FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
ON DELETE CASCADE
------set null方式 在父表上update/delete記錄時,將子表上匹配記錄的列設爲null
-- 要注意子表的外鍵列不能爲not null
FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ON DELETE SET NULL ------Restrict方式 :拒絕對父表進行刪除更新操做(瞭解) ------No action方式 在mysql中同Restrict,若是子表中有匹配的記錄,則不容許對父表對應候選鍵 -- 進行update/delete操做(瞭解)
join 用於把來自兩個或多個表的行結合起來。
不一樣的 SQL JOIN 類型:
無對應關係則不顯示
select A.num, A.name, B.name from A,B Where A.nid = B.nid 無對應關係則不顯示 select A.num, A.name, B.name from A inner join B on A.nid = B.nid A表全部顯示,若是B中無對應關係,則值爲null select A.num, A.name, B.name from A left join B on A.nid = B.nid B表全部顯示,若是B中無對應關係,則值爲null select A.num, A.name, B.name from A right join B on A.nid = B.nid
一、概述
MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。
雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行INSERT、UPDATE和DELETE。由於更新表時,MySQL不只要保存數據,還要保存一下索引文件。
創建索引會佔用磁盤空間的索引文件。
二、分類
索引合併:使用多個單列索引組合查詢搜索
覆蓋索引:select的數據列只用從索引中就可以取得,沒必要讀取數據行,換句話說查詢列要被所建的索引覆蓋
a、普通索引
# 建立表直接指定索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL, INDEX ix_name (username(length)) );
# 表外建立索引
CREATE INDEX indexName ON mytable(username(length));
# 修改表結構
ALTER mytable ADD INDEX indexName ON (username(length));
# 刪除索引 DROP INDEX indexname ON tablename;
b、惟一索引
# 建立表直接指定惟一索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
# 建立惟一索引 CREATE UNIQUE INDEX indexName ON mytable(username(length))
# 刪除索引 DROP UNIQUE INDEX 索引名 ON 表名
c、主鍵索引
# 建立主鍵索引
CREATE TABLE t1(
id INT PRIMARY KEY,
name VARCHAR(16) ); OR CREATE TABLE t1( id INT NOT NULL, name VARCHAR(16), PRIMARY KEY(id) );
# 添加主鍵 ALTER TABLE 表名 DROP PRIMARY KEY;
# 刪除主鍵
ALTER TABLE 表名 DROP PRIMARY KEY;
ALTER TABLE 表名 MODIFY 列名 類型,DROP PRIMARY KEY;
d、組合索引
組合索引是多個列組合成一個索引來查詢
應用場景:頻繁的同時使用多列來進行查詢,如:where name = 'Tony' and age = 18。
# 建立表
CREATE TABLE demo(
nid INT NOT NULL auto_increment PRIMARY KEY ,
name VARCHAR(32) NOT NULL, age INT NOT NULL ) # 建立組合索引 CREATE INDEX ix_name_age ON demo(name,age);
如上建立組合索引以後,查詢必定要注意:
注意:同時搜索多個條件時,組合索引的性能效率好過於多個單一索引合併。
e、全文索引
# 建立全文索引
CREATE TABLE emp3 (
id INT,
name VARCHAR(30) , resume VARCHAR(50), FULLTEXT INDEX index_resume (resume) );
三、相關
# 顯示索引信息 SHOW INDEX FROM table_name;
一、概述
MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務,可是一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性。!
通常來講,事務是必須知足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
二、事務操做
create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); #原子操做 start transaction; update user set balance=900 where name='wsb'; #買支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #賣家拿到90元 commit; #出現異常,回滾到初始狀態 start transaction; update user set balance=900 where name='wsb'; #買支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 uppdate user set balance=1090 where name='ysb'; #賣家拿到90元,出現異常沒有拿到 rollback; commit; mysql> select * from user; +----+------+---------+ | id | name | balance | +----+------+---------+ | 1 | wsb | 1000 | | 2 | egon | 1000 | | 3 | ysb | 1000 | +----+------+---------+ 3 rows in set (0.00 sec)
pymsql是Python中操做MySQL的模塊,其使用方法和MySQLdb幾乎相同
一、下載安裝
pip3 install pymysql
二、操做使用
執行SQL
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
# 建立鏈接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') # 建立遊標 cursor = conn.cursor() # 執行SQL,並返回收影響行數 effect_row = cursor.execute("update hosts set host = '1.1.1.2'") # 執行SQL,並返回受影響行數 #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,)) # 執行SQL,並返回受影響行數 #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) # 提交,否則沒法保存新建或者修改的數據 conn.commit() # 關閉遊標 cursor.close() # 關閉鏈接 conn.close()
獲取查詢數據
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') cursor = conn.cursor() cursor.execute("select * from hosts") # 獲取第一行數據 row_1 = cursor.fetchone() # 獲取前n行數據 # row_2 = cursor.fetchmany(3) # 獲取全部數據 # row_3 = cursor.fetchall() conn.commit() cursor.close() conn.close()
注:在fetch數據時按照順序進行,可使用cursor.scroll(num,mode)來移動遊標位置,如:
fetch數據類型
關於默認獲取的數據是元祖類型,若是想要或者字典類型的數據,即:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') # 遊標設置爲字典類型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) r = cursor.execute("call p1()") result = cursor.fetchone() conn.commit() cursor.close() conn.close()