此文將以MYSQL數(shù)據(jù)庫做為例子,pymysql庫作為驅(qū)動(dòng)進(jìn)行學(xué)習(xí)
安裝MYSQL數(shù)據(jù)庫與pymysql第三方庫
安裝MYSQL數(shù)據(jù)庫,請(qǐng)點(diǎn)擊https://dev.mysql.com/downloads/installer/安裝MYSQL的社區(qū)版本
安裝pymysql庫不多做敘述
-
安裝navicat for mysql,此程序用來管理MYSQL數(shù)據(jù)庫
注意: 連接過程中可能會(huì)出現(xiàn)1251錯(cuò)誤
-
解決辦法,在cmd命令下登錄mysql后輸入:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql的密碼';
注意:引號(hào)中的為你自己設(shè)置的sql數(shù)據(jù)庫的密碼FLUSH PRIVILEGES;
pymysql 連接mysql數(shù)據(jù)庫的驅(qū)動(dòng)庫
-
Connection(host = None庭惜,user = None刁标,password =''敏弃,database = None,port = 0齿椅,unix_socket = None,charset =''在刺,sql_mode = None贷岸,read_default_file = None,conv = None嵌削,use_unicode = None毛好,client_flag = 0,cursorclass = <class'pymysql.cursors.Cursor'>苛秕,init_command = None肌访,connect_timeout = 10,ssl = None艇劫,read_default_group = None吼驶,compress = None,named_pipe = None,自動(dòng)提交=假蟹演,分貝=無风钻,passwd的=無,local_infile =假酒请,max_allowed_pa??cket個(gè)= 16777216骡技,defer_connect =假,auth_plugin_map =無羞反,read_timeout =無布朦,write_timeout =無,bind_address =無昼窗,binary_prefix =假是趴,程序名=無,server_public_key =無)
類- read_timeout - 以秒為單位讀取連接的超時(shí)(默認(rèn)值:無 - 無超時(shí))
- write_timeout - 以秒為單位寫入連接的超時(shí)(默認(rèn)值:無 - 無超時(shí))
- charset - 你要使用的Charset澄惊。
- sql_mode - 要使用的默認(rèn)SQL_MODE右遭。
- read_default_file - 指定my.cnf文件以從[client]部分下讀取這些參數(shù)。
- conv - 使用轉(zhuǎn)換字典而不是默認(rèn)字典缤削。這用于提供類型的自定義編組和解組窘哈。見轉(zhuǎn)換器。
- use_unicode - 是否默認(rèn)為unicode字符串亭敢。對(duì)于Py3k滚婉,此選項(xiàng)默認(rèn)為true。
- client_flag - 要發(fā)送給MySQL的自定義標(biāo)志帅刀。在constants.CLIENT中查找潛在值让腹。
- cursorclass - 要使用的自定義游標(biāo)類。
- init_command - 建立連接時(shí)要運(yùn)行的初始SQL語句扣溺。
- connect_timeout - 連接時(shí)拋出異常之前的超時(shí)骇窍。(默認(rèn)值:10,最小值:1锥余,最大值:31536000)
- ssl - 類似于mysql_ssl_set()參數(shù)的參數(shù)的dict腹纳。目前,不支持capath和cipher參數(shù)驱犹。
- read_default_group - 要在配置文件中讀取的組嘲恍。
- compress - 不支持
- named_pipe - 不支持
- autocommit - 自動(dòng)提交模式。無表示使用服務(wù)器默認(rèn)值雄驹。(默認(rèn)值:False)
- local_infile - 允許使用LOAD DATA LOCAL命令的布爾值佃牛。(默認(rèn)值:False)
- max_allowed_pa??cket - 發(fā)送到服務(wù)器的最大數(shù)據(jù)包大小(以字節(jié)為單位)医舆。(默認(rèn)值:16MB)僅用于限制小于默認(rèn)值(16KB)的“LOAD LOCAL INFILE”數(shù)據(jù)包的大小俘侠。
- defer_connect - 不要明確連接contruction - 等待連接調(diào)用象缀。(默認(rèn)值:False)
- auth_plugin_map - 插件名稱的一個(gè)字典,用于處理該插件的類爷速。該類將Connection對(duì)象作為構(gòu)造函數(shù)的參數(shù)央星。該類需要一個(gè)認(rèn)證方法,將認(rèn)證包作為參數(shù)遍希。對(duì)于對(duì)話框插件等曼,可以使用提示(echo里烦,prompt)方法(如果沒有authenticate方法)從用戶返回字符串凿蒜。(實(shí)驗(yàn))
- server_public_key - SHA256 authenticnticaiton插件公鑰值。(默認(rèn):無)
- db - 數(shù)據(jù)庫的別名胁黑。(與MySQLdb兼容)
- passwd - 密碼的別名废封。(與MySQLdb兼容)
- binary_prefix - 在字節(jié)和bytearray上添加_binary前綴。(默認(rèn)值:False)
-
常用方法
select_db(db)
設(shè)置db為當(dāng)前數(shù)據(jù)庫-
cursor()
創(chuàng)建一個(gè)游標(biāo)對(duì)象,繼而對(duì)數(shù)據(jù)進(jìn)行操作游標(biāo)對(duì)象方法:
execute(query丧蘸,args = None )
執(zhí)行sql語句executemany(query漂洋,args )
運(yùn)行多個(gè)sql語句fetchall()
獲取所有行fetchmany(size = None )
獲取指定行數(shù)fetchone()
獲取下一行close()
關(guān)閉游標(biāo),將緩存的數(shù)據(jù)全部釋放到數(shù)據(jù)庫中
commit()
提交對(duì)數(shù)據(jù)庫中數(shù)據(jù)的修改,使之持久化到數(shù)據(jù)庫中close()
關(guān)閉套接字連接退出
SQL語句
SQL 是一門 ANSI 的標(biāo)準(zhǔn)計(jì)算機(jī)語言,用來訪問和操作數(shù)據(jù)庫系統(tǒng)
-
MySQL 數(shù)據(jù)類型
- Text 類型
image- Number 類型
image- Date 類型
image
SQL的語句分為兩大類,一類是DML,另一類是DDL
數(shù)據(jù)定義語言 (DDL) 用于創(chuàng)建或刪除表格
-
CREATE DATABASE 創(chuàng)建新數(shù)據(jù)庫
- 語句:
CREATE DATABASE database_name
import pymysql con = pymysql.connect('localhost','root','123456') sql = '''CREATE DATABASE test ''' with con.cursor()as cursor: cursor.execute(sql) con.close()
- 語句:
-
CREATE TABLE 創(chuàng)建新表
- 語句為以下形式,其中約束可以沒有
CREATE TABLE 表名稱 ( 列名稱1 數(shù)據(jù)類型 約束, 列名稱2 數(shù)據(jù)類型 約束, 列名稱3 數(shù)據(jù)類型 約束, .... )
-
約束條件
NOT NULL 值不能為空
-
UNIQUE 設(shè)置索引,一個(gè)表中可以有多個(gè)索引
- 在創(chuàng)建表時(shí),末尾加上該語句
UNIQUE(列名稱)
- 表創(chuàng)建以后添加索引
ALTER TABLE 表名稱 ADD UNIQUE (列名稱)
- 撤銷索引
ALTER TABLE 表名稱 DROP INDEX 列名稱
-
PRIMARY KEY 設(shè)置主鍵,一個(gè)表中只能有一個(gè)主鍵
- 在創(chuàng)建表時(shí),末尾加上該語句
PRIMARY KEY (列名稱)
- 表創(chuàng)建后添加主鍵
ALTER TABLE表名稱 ADD PRIMARY KEY (列名稱)
- 撤銷表中的主鍵
ALTER TABLE 表名稱 DROP PRIMARY KEY
-
FOREIGN KEY 一個(gè)表中的 FOREIGN KEY 指向另一個(gè)表中的 PRIMARY KEY
- 在創(chuàng)建表時(shí),末尾加上該語句
FOREIGN KEY (列名稱) REFERENCES 表名稱(列名稱)
- 表創(chuàng)建后添加FOREIGN KEY
ALTER TABLE 表名稱1 ADD FOREIGN KEY (列名稱) REFERENCES 表名稱2(列名稱)
- 刪除表中的PRIMARY KEY
ALTER TABLE 表名稱 DROP FOREIGN KEY 約束名稱
-
CHECK 限制列中的值的范圍
- 在創(chuàng)建表時(shí),末尾加上該語句
CHECK (列名稱 范圍限制)
- 表創(chuàng)建后添加限制范圍
ALTER TABLE 表名稱 ADD CHECK (列名稱 范圍限制)
- 撤銷范圍限制
ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱
-
DEFAULT 向列中插入默認(rèn)值
- 在創(chuàng)建表時(shí),向數(shù)據(jù)后添加默認(rèn)值
列名稱 數(shù)據(jù)類型 DEFALUT 默認(rèn)值
表創(chuàng)建后添加默認(rèn)值
ALTER TABLE 表名稱 ALTER 列名稱 SET DEFAULT 默認(rèn)值
- 刪除默認(rèn)值
ALTER TABLE 表名稱 ALTER 列名稱 DROP DEFAULT
-
AUTO_INCREMENT 新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字
- 在創(chuàng)建表時(shí),在后面添加該字段即可
列名稱 int NOT NULL AUTO_INCREMENT
- 默認(rèn)以1開始遞增,但也可以通過賦值來改變初始值
ALTER TABLE 表名稱 AUTO_INCREMENT=100
- 創(chuàng)建新數(shù)據(jù)是不必向該數(shù)據(jù)進(jìn)行賦值,但應(yīng)加上NULL,代替該數(shù)據(jù),會(huì)自動(dòng)進(jìn)行賦值
# 新建一個(gè)名為person的表,定義有id,name,age,address 其中id設(shè)置為主鍵,并采取自增形式
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = '''CREATE TABLE person
(
id INT(255) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
age INT(100),
address VARCHAR(255)
)
'''
with con.cursor()as cursor:
cursor.execute(sql)
con.close()
-
CREATE INDEX 創(chuàng)建表中的引索
用于加速搜索數(shù)據(jù),用戶無法看見,只需設(shè)置常用的列
使用以下語句
CREATE INDEX 引索名稱 ON 表名稱 (列名稱)
-
DROP 刪除索引力喷、表和數(shù)據(jù)庫
- 刪除表
DROP TABLE 表名稱
- 刪除數(shù)據(jù)庫
DROP DATABASE 數(shù)據(jù)庫名稱
- 刪除表中數(shù)據(jù),但保留表
TRUNCATE TABLE 表名稱
-
ALTER TABLE 在已有的表中添加刽漂、修改或刪除列
- 向表中添加列
ALTER TABLE 表名稱 ADD 列名稱 列類型
- 向表中刪除列
ALTER TABLE 表名稱 DROP COLUMN 列名稱
- 更改表中某一列的數(shù)據(jù)類型
ALTER TABLE 表名稱 ALTER COLUMN 列名稱 列類型
數(shù)據(jù)操作語言 (DML) 包含用于更新、插入和刪除記錄的語法
-
SELECT 選取數(shù)據(jù)
SELECT 列名稱 FROM 表名稱
-
SELECT DISTINCT 去掉重復(fù)數(shù)據(jù)
SELECT DISTINCT 列名稱 FROM 表名稱
-
WHERE 有條件的選取數(shù)據(jù)
SELECT 列名稱 FROM 表名稱 WHERE 列 運(yùn)算符 值
- 運(yùn)算符
= 等于 <> 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于
-
操作符
- IN 允許在 WHERE 子句中規(guī)定多個(gè)值,返回包含這些值的集合
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
- BETWEEN 選取介于兩個(gè)值之間的數(shù)據(jù)范圍 左包右閉
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
AND 和 OR 對(duì)一個(gè)以上的條件對(duì)記錄進(jìn)行過濾
SELECT * FROM 表名稱 WHERE 列名稱 運(yùn)算符 值 AND 列名稱 運(yùn)算符 值
總結(jié): 可以將AND OR WHERE 組合起來使用,用于查找精確的數(shù)據(jù)
-
LIKE 于在 WHERE 子句中搜索列中的指定模式,類似于正則表達(dá)式
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
- 通配符
image-
ORDER BY 語句用于對(duì)結(jié)果集進(jìn)行排序
- 默認(rèn)順序排序,字母以ABC形式,數(shù)字從大到小
SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱
- 添加DESC可變?yōu)槟嫘蚺判?/li>
SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱 DESC
LIMIT 規(guī)定返回?cái)?shù)據(jù)集合的最大值
"SELECT column_name(s) FROM table_name LIMIT number"
-
INTO 從一個(gè)表中選取輸出并復(fù)制到另一個(gè)表中,用于備份數(shù)據(jù)庫
- 備份到另一個(gè)數(shù)據(jù)庫中
SELECT * INTO new_table_name IN externaldatabase FROM old_tablename
- 備份到另一個(gè)表中
"SELECT * INTO Persons_backup FROM Persons
-
INSERT INTO 項(xiàng)數(shù)據(jù)庫添加新行
- 向一行中添加數(shù)據(jù)
INSERT INTO 表名稱 VALUES (值1, 值2,....) 添加所有值
- 向一行中選取的列中添加數(shù)據(jù)
INSERT INTO 表名稱 (列1, 列2,...) VALUES (值1, 值2,....)
-
UPDATE 修改表中的數(shù)據(jù)
- 修改某列數(shù)據(jù)為某值的數(shù)據(jù)為新值
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
- 向某行中的多列修改數(shù)據(jù)
UPDATE 表名稱 SET 列名稱1 = 新值1,列名稱2 = 新值2,…. WHERE 列名稱 = 某值
-
DELETE 刪除表中的行
- 刪除列名稱為某值的所有行
DELETE FROM 表名稱 WHERE 列名稱 = 值
- 刪除所有行,即清空所有數(shù)據(jù)
DELETE * FROM table_name
向數(shù)據(jù)庫的person表中寫入一行數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = ''' INSERT INTO person VALUES(NULL,'jack',18,'Beijing')
'''
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()
寫入多行數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
list = [(None,'jack',18,'beijing'),(None,'bob',20,'shanghai'),(None,'alice',10,'beijing'),(None,'luna',18,'shengzheng')]
with con.cursor()as cursor:
cursor.executemany('INSERT INTO person VALUES(%s,%s,%s,%s)',list)
con.commit()
con.close()
查找所有數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = 'SELECT * FROM person'
with con.cursor()as cursor:
cursor.execute(sql)
data = cursor.fetchall()
for i in data:
print(i)
con.close()
查找所有地址為beijing的數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "SELECT * FROM person where address = 'beijing'"
with con.cursor()as cursor:
cursor.execute(sql)
data = cursor.fetchall()
for i in data:
print(i)
con.close()
查找所有age大于10的數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "SELECT * FROM person where age > 10"
with con.cursor()as cursor:
cursor.execute(sql)
data = cursor.fetchall()
for i in data:
print(i)
con.close()
查找age大于10并且address等于bejing的數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "SELECT * FROM person where age > 10 AND address = 'beijing'"
with con.cursor()as cursor:
cursor.execute(sql)
data = cursor.fetchall()
for i in data:
print(i)
con.close()
將所有數(shù)據(jù)按年齡大小進(jìn)行逆序排序
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "SELECT * FROM person ORDER BY age DESC"
with con.cursor()as cursor:
cursor.execute(sql)
data = cursor.fetchall()
for i in data:
print(i)
con.close()
修改表中jack的age為16
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "UPDATE person set age = 16 WHERE name = 'jack'"
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()
刪除數(shù)據(jù)庫中jack的數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "DELETE FROM person WHERE name = 'jack'"
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()
刪除表中所有數(shù)據(jù)
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = "DELETE FROM person"
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()
向表中添加sex列,類型為varchar
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = '''ALTER TABLE person
ADD sex VARCHAR(255)
'''
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()
刪除表
import pymysql
con = pymysql.connect('localhost','root','123456')
con.select_db('test')
sql = '''DROP TABLE person
'''
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()
刪除數(shù)據(jù)庫
import pymysql
con = pymysql.connect('localhost','root','123456')
sql = '''DROP DATABASE test
'''
with con.cursor()as cursor:
cursor.execute(sql)
con.commit()
con.close()