MySQL
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
安装
- 安装教程查看链接Windows 上安装 MySQL
MySQL常用命令
以管理员身份打开cmd命令行工具,切换到你安装的mysql目录,这里是:
1 | D:\Mysql\mysql-8.0.15-winx64\bin |
启动:
1
net start mysql
登录
1
mysql -h 主机名 -u 用户名 -p
如果是登录本机MySQL数据库,只需要输入以下命令:1
mysql -u root -p
接下来会让你输入登录密码:输入即可,如图所示:
参数说明·:
- -h : 指定客户端所要登录的 MySQL 主机名(IP), 登录本机(localhost 或 127.0.0.1)该参数可以省略;
- -u : 登录的用户名;
- -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
- 退出和停止
1 | quit;//或者 exit |
- 修改密码
1 | mysqladmin -u用户名 -p旧密码 password 新密码 |
- 创建数据库
1 | create database <数据库名>; |
- 显示数据库
1 | show databases; |
注意:最后有个s
- 删除数据库
1 | drop database <数据库名> |
如图所示:
mysql-connector
使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。
安装
我们可以使用 pip 命令来安装 mysql-connector:1
python -m pip install mysql-connector
或者直接在pycharm的setting里面安装mysql-connect包
操作
创建数据库连接
1 | import mysql.connector |
创建数据库
创建数据库使用 “CREATE DATABASE” 语句,我们创建一个名为 first_db 的数据库:
1 | import mysql.connector |
查看数据库
输出所有数据库列表:1
2
3
4
5
6
7
8
9
10
11
12
13
14import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456"
)
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES")
for x in mycursor:
print(x)
我们可以直接连接数据库,如果数据库不存在,会输出错误信息:
1 | import mysql.connector |
创建数据表
1 | import mysql.connector |
查看数据表是否已存在:
1 | import mysql.connector |
主键设置
创建表的时候我们一般都会设置一个主键(PRIMARY KEY),主键起始值为 1,逐步递增。
- 如果我们的表已经创建,我们需要使用 ALTER TABLE 来给表添加主键:
1 | 给 sites 表添加主键。 |
- 如果你还未创建 sites 表,可以直接使用以下代码创建。
给表创建主键。1
2
3
4
5
6
7
8
9
10
11
12
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")
插入数据
- 向 sites 表插入一条记录。
1 | import mysql.connector |
执行代码,输出结果为:1
1 记录插入成功
- 批量插入
批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:
向 sites 表插入多条记录。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="first_db"
)
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
('Google', 'https://www.google.com'),
('Github', 'https://www.github.com'),
('Taobao', 'https://www.taobao.com'),
('stackoverflow', 'https://www.stackoverflow.com/')
]
mycursor.executemany(sql, val)
mydb.commit() # 数据表内容有更新,必须使用到该语句
print(mycursor.rowcount, "记录插入成功。")
执行代码,输出结果为:1
24 记录插入成功。
`
如果我们想在数据记录插入后,获取该记录的 ID ,可以使用以下代码:1
2
3
4
5
6
7
8
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("Zhihu", "https://www.zhihu.com")
mycursor.execute(sql, val)
mydb.commit()
print("1 条记录已插入, ID:", mycursor.lastrowid)
执行代码,输出结果为:1
1 条记录已插入, ID: 6
查询数据
- 查询所有数据
1
2
3
4
5
6mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchall() # fetchall() 获取所有记录
for x in myresult:
print(x)
执行代码,输出结果为:1
2
3
4
5
6(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')
- 也可以读取指定的字段数据:
1
2
3
4
5
6mycursor.execute("SELECT name, url FROM sites")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
执行代码,输出结果为:1
2
3
4
5
6('RUNOOB', 'https://www.runoob.com')
('Google', 'https://www.google.com')
('Github', 'https://www.github.com')
('Taobao', 'https://www.taobao.com')
('stackoverflow', 'https://www.stackoverflow.com/')
('Zhihu', 'https://www.zhihu.com')
- 如果我们只想读取一条数据,可以使用 fetchone() 方法:
1
2
3
4
5mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchone()
print(myresult)
执行代码,输出结果为:1
(1, 'RUNOOB', 'https://www.runoob.com')
- 如果我们要读取指定条件的数据,可以使用 where 语句:
1
2
3
4
5
6
7
8sql = "SELECT * FROM sites WHERE name ='RUNOOB'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
执行代码,输出结果为:1
(1, 'RUNOOB', 'https://www.runoob.com')
- 也可以使用通配符 %:
1
2
3
4
5
6
7
8sql = "SELECT * FROM sites WHERE url LIKE '%oo%'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
执行代码,输出结果为:1
2(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
- 为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义查询的条件:
1 | sql = "SELECT * FROM sites WHERE name = %s" |
排序
查询结果排序可以使用 ORDER BY 语句,默认的排序方式为升序,关键字为 ASC,如果要设置降序排序,可以设置关键字 DESC。
- 按 name 字段字母的升序排序:
1
2
3
4
5
6
7
8sql = "SELECT * FROM sites ORDER BY name"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
执行代码,输出结果为:1
2
3
4
5
6(3, 'Github', 'https://www.github.com')
(2, 'Google', 'https://www.google.com')
(1, 'RUNOOB', 'https://www.runoob.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(4, 'Taobao', 'https://www.taobao.com')
(6, 'Zhihu', 'https://www.zhihu.com')
- 降序排序实例:
1
2
3
4
5
6
7
8sql = "SELECT * FROM sites ORDER BY name DESC"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
执行代码,输出结果为:
1 | (6, 'Zhihu', 'https://www.zhihu.com') |
限制查询的数据量
指定起始位置,读取前 3 条记录.
例如,从第二条开始读取前 3 条记录:1
2
3
4
5
6mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1") # 0 为 第一条,1 为第二条,以此类推
myresult = mycursor.fetchall()
for x in myresult:
print(x)
执行代码,输出结果为:1
2
3(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
删除记录
1 | sql = "DELETE FROM sites WHERE name = 'stackoverflow'" |
执行代码,输出结果为:1
1 条记录删除
注意:要慎重使用删除语句,删除语句要确保指定了 WHERE 条件语句,否则会导致整表数据被删除。
为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义删除语句的条件:
1 | sql = "DELETE FROM sites WHERE name = %s" |
更新表数据
1 | sql = "UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu'" |
使用 %s 占位符来转义更新语句的条件:1
2sql = "UPDATE sites SET name = %s WHERE name = %s"
val = ("Zhihu", "ZH")
删除表
1 | sql = "DROP TABLE IF EXISTS sites" # 删除数据表 sites |
PyMySQL 驱动
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。
安装
- 命令:
1 | pip install PyMySQL |
- pycharm 的setting里面安装pymysql包
操作
在操作之前确保:
1.您已经创建了数据库 TESTDB.
2.在TESTDB数据库中您已经创建了表 EMPLOYEE
3.EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
数据库连接
1 | import pymysql |
创建数据库表
1 | import pymysql |
插入操作
1 | # 部分代码省略 |
也可以写成如下形式:1
2
3
4
5# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', %s, '%s', %s)" % \
('Mac', 'Mohan', 20, 'M', 2000)
查询操作
Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall(): 接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:
1 | # SQL 查询语句 |
更新操作
将 TESTDB 表中 SEX 为 ‘M’ 的 AGE 字段递增 1:
1 | sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') |
删除操作
删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:1
2# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)