MySQL(後篇)

本結目錄python

  • 數據庫操做
  • 數據表操做
  • 外鍵約束
  • 多表查詢
  • 索引
  • 事務
  • python鏈接Mysql

數據庫操做

此操做針對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(字段) -- 最小
複製代碼
WHERE子句中的條件

以上都只是單表性的查詢,例如模擬在實際生活中,會有一張員工表,而員工會有其歸屬的部門,那麼相應的也會有一張部門表.在其中相應的倆者之間會有一種相應的關聯,那麼這裏引伸了外鍵及多表查詢

外鍵約束

  外鍵能夠理解爲一種約束,它有如下限制(FOREIGN KEY爲建立外鍵的關鍵詞)

  注意:做爲外鍵必定要和關聯主鍵的數據類型保持一致

  • FOREIGN KEY 約束用於預防破壞表之間鏈接的行爲。
  • FOREIGN KEY 約束也能防止非法數據插入外鍵列,由於它必須是它指向的那個表中的值之一。

  建立外鍵

複製代碼
-- 一、創建從表的時候就和主表創建外鍵

CREATE TABLE TABLE_NAME(
    '字段' 類型, '字段' 類型, ... ... FOREIGN KEY (從表字段) REFERENCES 主表(字段) ); -- 二、建表完成以後,也能夠經過sql語句和主表創建聯繫 ALTER TABLE 從表 ADD CONSTRAINT 外鍵名稱(形如:FK_從表_主表) FOREIGN KEY (從表字段) REFERENCES 主表(字段);
複製代碼

  刪除外鍵

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱
DEMO

  INOODB下支持的ON語句

複製代碼
--外鍵約束對子表的含義:   若是在父表中找不到候選鍵,則不容許在子表上進行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 類型:

  • INNER JOIN:若是表中有至少一個匹配,則返回行
  • LEFT JOIN:即便右表中沒有匹配,也從左表返回全部的行
  • RIGHT JOIN:即便左表中沒有匹配,也從右表返回全部的行
  • FULL JOIN:只要其中一個表中存在匹配,則返回行(mysql不支持全外鏈接,而是使用unionunion all)
複製代碼
無對應關係則不顯示
    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不只要保存數據,還要保存一下索引文件。

創建索引會佔用磁盤空間的索引文件。

二、分類

  • 普通索引:僅加速查詢
  • 惟一索引:加速查詢 + 列值惟一(能夠有null)
  • 主鍵索引:加速查詢 + 列值惟一 + 表中只有一個(不能夠有null)
  • 組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併
  • 全文索引:對文本的內容進行分詞,進行搜索 

索引合併:使用多個單列索引組合查詢搜索
覆蓋索引: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);
複製代碼

如上建立組合索引以後,查詢必定要注意:

  • name and email  -- >使用索引,name必定要放前面
  • name                 -- >使用索引
  • email                 -- >不使用索引

注意:同時搜索多個條件時,組合索引的性能效率好過於多個單一索引合併。

e、全文索引

複製代碼
# 建立全文索引
CREATE TABLE emp3 (
        id INT,
        name VARCHAR(30) , resume VARCHAR(50), FULLTEXT INDEX index_resume (resume) );
複製代碼

三、相關

# 顯示索引信息
SHOW INDEX FROM table_name;

事務

一、概述

MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務,可是一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性。!

  • 在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務
  • 事務處理能夠用來維護數據庫的完整性,保證成批的SQL語句要麼所有執行,要麼所有不執行
  • 事務用來管理insert,update,delete語句

通常來講,事務是必須知足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)

  • 一、事務的原子性:一組事務,要麼成功;要麼撤回。
  • 二、穩定性 : 有非法數據(外鍵約束之類),事務撤回。
  • 三、隔離性:事務獨立運行。一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回。事務的100%隔離,須要犧牲速度。
  • 四、可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定何時吧事務保存到日誌裏。

二、事務操做

  • 開啓事務 start transaction
  • 回滾事務 rollback
  • 提交事務 commit
  • 保留點    savepoint
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)
事務示例

py鏈接MySQL

  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)來移動遊標位置,如:

  • cursor.scroll(1,mode='relative')  # 相對當前位置移動
  • cursor.scroll(2,mode='absolute') # 相對絕對位置移動

  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()
相關文章
相關標籤/搜索