软件: mysql 社区版
安装
补丁下载
在微软官网下载 vc redist.x64与dxwebsetup软件并安装。如果vc软件安装失败,并提示已经有另一版本的软件已安装,可不安装
mysql安装
- 将mysql解压到纯英文文件夹中,创建my.ini文件(见附件)
- 初始化mysql
已管理员身份运行cmd,输入下列内容运行即可
"C:\mysql-8.2.0-winx64\bin\mysqld.exe" --initialize-insecure
成功会在mysql文件夹中创建data文件夹。
mysql的启动
将Mysql制作成windows服务
cmd已管理员运行下列内容来制作服务
"C:\mysql-8.2.0-winx64\bin\mysqld.exe" --install mysql11 #(后面的mysql11可以自己随意写)
启动服务
cmd已管理员运行下列内
net start mysql11
关闭服务
net stop mysql11z
用任务管理器打开或关闭服务
mysql连接
用cmd 方式将mysql与电脑连接
C:\mysql-8.2.0-winx64\bin\mysql.exe
安装文件夹下的mysql.exe
cmd管理员运行
"C:\mysql-8.2.0-winx64\bin\mysql.exe" -h 127.0.0.1(连接本地电脑) -p 3306 (在my.ini配置文件夹中定义的端口) -u root(用户) -p (密码)
"C:\mysql-8.2.0-winx64\bin\mysql.exe" -h 127.0.0.1 -p 3306 -u root -p
用环境变量快速启动Mysql
将路径添加到环境变量
"C:\mysql-8.2.0-winx64\bin\mysql.exe"
将路径添加到环境变量,就会简化为
mysql -u root -p
设置密码
set password = password("root123")
查看现在已有文件夹(数据库)
连接mysql后输入show databases; (注意分号是必须的)
退出/关闭连接
输入exit;
忘记muysql密码
- 关闭Mysql服务
- 修改配置文件(安装目录下的main.ini),添加一句
- 重新启动Mysql 服务
- 在cmd中重新登录mysql(无需密码)
- 重新设置密码
分别在cmd中运行下列两行命令
use mysql;
update user set authentication_string = password('新密码‘), password_last_changed = now() where user = 'root;
- 重修修改配置文件(以需密码的形式登录)
首先在任务管理器关闭mysql服务,之后在mysql安装目录下的配置文件,直接删掉刚添加的最后一行,并保存。
- 重新启动mysql服务
MySQL指令
数据库的管理
创建数据库
create database 数据库名字 DEFAULT CHARSET utf8 COLLATE
utf8_general_ci;
删除数据库
drop databse 数据库名字;
进入数据库(进入文件夹)
use xxx; (xxx:数据库名称)
查看数据库下的所有数据表(文件)
show tables;
数据表的管理
创建表
create table 表名称(
列名称 类型,
列名称 类型,
列名称 类型,
...
)default charset = utf-8;
案例: 在数据库下创建一个数据表
create table b1(id int, name varchar(16), age int) default
charset=utf8;
表格中设定默认值
create table b1(
id int,
name varchar(16),
age int default 3 // 设定默认值是3
) default charset=utf8;
加入主键
create table b1(
id int primary key, //主键(不允许为空,不允许重复)
name varchar(16),
age int default 3 // 设定默认值是3
) default charset=utf8;
主键一般表示当前行的数据编号
让主键自增
create table b1(
id int auto_increment primary key, //主键(不允许为空,不允许重复)
name varchar(16),
age int default 3 // 设定默认值是3
) default charset=utf8;
// 下面为纯代码
create table b1(
id int auto_increment primary key,
name varchar(16),
age int default 3
) default charset=utf8;
删除表
drop table 表名称,
展示表的具体内容
desc 表名称;
数据库常见数据类型
-
tinyint
有符号,取值范围:-128~127(有正有负)【默认】
无符号,取值范围:0~255 (只有正)【默认】
create table b1(
id int auto_increment primary key,
name varchar(16),
age tinyint -- 有符号,取值范围:-128~127
) default charset=utf8;
create table b1(
id int auto_increment primary key,
name varchar(16),
age tinyint unsigned -- 无符号:取值范围: 0~255
) default charset=utf8;
-
int
int 有符号,取值范围:-2147483648 ~ 2147483647
int unsigned 无符号,取值范围:0~ 4294967295
-
bigint
bigint 有符号,取值范围:-922337203654775808 ~ 922337203654775808
bigint unsigned 无符号,取值范围:0~ 18446744073709551615
案例:简历表格并插入数据
create table tb2(
id bigint not null auto_increment primary key,
salary int, age tinyint
) default charset=utf8;
插入数据
insert into tb2(salary,age) values(10000,18);
insert into tb2(salary,age) values(10000,18), (20000,30); //表示插入了两行数据
查看表中的数据
select * from tb2;
-
float
-
double
-
decimal
decimal表示准确的小数值,m是数字总个数(负号不算),d是小数点后个数。m最大值为65,d最大值为30.
create table tb2(
id bigint not null auto_increment primary key,
salary decimal (8,2) //这就表示总共有8个数字,小数点后有两位数字
) default charset=utf8;
-
char
定长字符串, 最多可以容纳255个字符
create table tb3(
id bigint not null auto_increment primary key,
mobile char(11) //固定使用11个字符存储,哪怕没有用11个字符,也会按照11个字符存储
) default charset=utf8;
-
varchar
变长字符串, 最大‘65535个字节
create table tb4(
id bigint not null auto_increment primary key,
mobile varchar(11) //按真实数据的长度进行存储。
) default charset=utf8;
-
text
变长字符串, 最大65535(2的16次方减1)个字符。一般情况下,长文本会用text类型,例如:文章,新闻等
create table tb5(
id int not null auto_increment primary key,
title varchar(128),
content text
) default charset=utf8;
- mediumtext
- longtext
- data
YYYY-MM-DD (1000-01-01/9999-12-31)
练习:创建用户表
create table tb6(
id int not null auto_increment primary key,
name varchar(64) not null,
password char(64) not null,
email varchar(64) not null,
age tinyint,
salary decimal(10,2),
ctime datetime
) default charset=utf8;
插入数据:
insert into tb6(name,password,email,age,salary,ctime) value("bruce","123","bruce@qq.com",20,10000.10,"2024-1-15 19:51:00");
数据行操作
新增数据
insert into 表名(列名,列名) value (值,值);
删除数据
delete from 表名; //删掉整张表
delete form 表名 where 条件;
Notes: mysql数据表的增删查改建议买一本工具书粗略看看,可以再去牛客网的在线练习实操一段时间,就能有一定进步。
修改数据
update 表明 set 列=值;
案例:员工管理(结合python)
利用Python实现查看,更改,查删。
创建管理员表
create table admin(
id int not null auto_increment primary key,
username varchar(64) not null,
password varchar(64) not null,
mobile varchar(64) not null
) default charset=utf8;
用python操作数据表
import pymysql
# 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 发送指令
cursor.execute("insert into admin(username,password,mobile) values ('bruce','bruce123','123456780')")
conn.commit()
# 3. 关闭链接
cursor.close()
conn.close()
让用户输入值来传递到数据库中
注意点:为什么最后面的q会替换上一行的用户名
这一整个代码是while循环语句,所有在while后面的代码都要首行缩进。
import pymysql
while True:
user = input("用户名:")
if user.upper() == 'Q':
break
pwd = input("password:")
mobile = input("手机号:")
# 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 发送指令 (千万不能用字符串格式化去做SQL的拼接,有安全隐患,SQL的注入风险),可用下面的两种方法方法
# 第一种
# sql = "insert into admin(username,password,mobile) values (%s,%s,%s)"
# cursor.execute(sql, ["bru","bruce123","124353245"])
# 第二种
sql = "insert into admin(username,password,mobile) values (%s,%s,%s)"
cursor.execute(sql, [user,pwd,mobile])
conn.commit()
# 3. 关闭链接
cursor.close()
conn.close()
错误示例(输入的用户名会被Q替代)
import pymysql
while True:
user = input("用户名:")
if user.upper() == 'Q':
break
pwd = input("password:")
mobile = input("手机号:")
# 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 发送指令 (千万不能用字符串格式化去做SQL的拼接,有安全隐患,SQL的注入风险),可用下面的两种方法方法
# 第一种
# sql = "insert into admin(username,password,mobile) values (%s,%s,%s)"
# cursor.execute(sql, ["bru","bruce123","124353245"])
# 第二种
sql = "insert into admin(username,password,mobile) values (%s,%s,%s)"
cursor.execute(sql, [user,pwd,mobile])
conn.commit()
# 3. 关闭链接
cursor.close()
conn.close()
注意点, (2003, "Can't connect to MySQL server on 'locost'
如果出现报错,比如:OperationalError.(1049,"Unkonwm databases 'unicom'"),或者pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'locost' ([Errno 11001] getaddrinfo failed)")或者是IP地址,“127.0.0.1”之类,可以尝试改成上面的代码。
查询数据
import pymysql
# 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 发送指令 (千万不能用字符串格式化去做SQL的拼接,有安全隐患,SQL的注入风险),可用下面的两种方法方法
# 第二种
cursor.execute("select * from admin where id > 2")
data_list = cursor.fetchall()
for row_dict in data_list:
print(row_dict)
删除数据
import pymysql
# 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 发送指令 (千万不能用字符串格式化去做SQL的拼接,有安全隐患,SQL的注入风险),可用下面的两种方法方法
# 第二种
cursor.execute("delete from admin where id=%s or id=%s", [4,9])
conn.commit()
# 3. 关闭链接
cursor.close()
conn.close()
修改数据
import pymysql
# 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 发送指令 (千万不能用字符串格式化去做SQL的拼接,有安全隐患,SQL的注入风险),可用下面的两种方法方法
# 第二种
cursor.execute("update admin set mobile=%s where id=%s",["1888883737383",5])
conn.commit()
# 3. 关闭链接
cursor.close()
conn.close()
案例: web页面与用户数据交互
1. 用flask搭建web页面
需要在项目文件夹中,建立templates文件夹,html文件放在该文件夹下
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/add/user")
def add_user():
return render_template("add_user.html")
if __name__ == '__main__':
app.run()
<body>
<h1>添加用户</h1>
<from>
<input type="text" name="user" placeholder="用户名">
<input type="text" name="pwd" placeholder="密码">
<input type="text" name="mobile" placeholder="手机号">
<input type="submit" value="提交">
</from>
</body>
</html>
2. 获取用户输入的信息
这时用户输入在网页中的信息会被抓取
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/add/user", methods=["GET", "POST"])
def add_user():
if request.method == "GET":
return render_template("add_user.html")
username = request.form.get("user")
password = request.form.get("pwd")
mobile = request.form.get("mobile ")
return "添加成功"
if __name__ == '__main__':
app.run()
<body>
<h1>添加用户</h1>
<form method="POST" action="/add/user">
<input type="text" name="user" placeholder="用户名">
<input type="text" name="pwd" placeholder="密码">
<input type="text" name="mobile" placeholder="手机号">
<input type="submit" value="提交">
</form>
</body>
3. 将用户输入的信息写道mysql中
from flask import Flask, render_template, request
import pymysql
app = Flask(__name__)
@app.route("/add/user", methods=["GET", "POST"])
def add_user():
if request.method == "GET":
return render_template("add_user.html")
username = request.form.get("user")
password = request.form.get("pwd")
mobile = request.form.get("mobile")
# 1. 链接mysql
conn = pymysql.connect(host="localhost", port=3306, user="root", password="", charset='utf8', db='bruce')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2. 执行sql
sql = "insert into admin(username,password,mobile) values(%s,%s,%s)"
cursor.execute(sql, [username, password, mobile])
conn.commit()
# 3. 关闭连接
cursor.close()
conn.close()
return "添加成功"
if __name__ == '__main__':
app.run()
Notes: 在实操中,提交后页面反馈服务器错误
username = request.form.get("user") password = request.form.get("pwd") mobile = request.form.get("mobile ")
上面的代码时源程序中的一段,因为在mobile后面多了一个空格,程序会从网页中获取“mobile带空格”这个输入框的值,但实际没有这个输入框,就会产生一个null值给到mobile变量。之后的程序将mobile变量的null值写道sql的mobile列中,但是这个列不允许错误,就会报错。
加上程序并没有错误异常处理的功能,就会报这个错误。下面是改善的程序
from flask import Flask, render_template, request
import pymysql
app = Flask(__name__)
@app.route("/add/user", methods=["GET", "POST"])
def add_user():
if request.method == "GET":
return render_template("add_user.html")
username = request.form.get("user")
password = request.form.get("pwd")
mobile = request.form.get("mobile")
try:
# 1. 链接mysql
conn = pymysql.connect(host="localhost",port=3306, user="root", password="", charset='utf8', db='bruce')
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
# 2. 执行sql
sql = "insert into admin(username,password,mobile) values(%s,%s,%s)"
cursor.execute(sql, [username, password, mobile])
conn.commit()
return "添加成功"
except Exception as e:
return str(e), 500 # 返回错误信息和500内部服务器错误状态码
finally:
conn.close() # 确保连接被关闭,无论是否发生异常
if __name__ == '__main__':
app.run()
3. 写入与查询所有数据
from flask import Flask, render_template, request
import pymysql
app = Flask(__name__)
@app.route("/add/user", methods=["GET", "POST"])
def add_user():
if request.method == "GET":
return render_template("add_user.html")
username = request.form.get("user")
password = request.form.get("pwd")
mobile = request.form.get("mobile")
try:
# 1. 链接mysql
conn = pymysql.connect(host="localhost",port=3306, user="root", password="", charset='utf8', db='bruce')
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
# 2. 执行sql
sql = "insert into admin(username,password,mobile) values(%s,%s,%s)"
cursor.execute(sql, [username, password, mobile])
conn.commit()
return "添加成功"
except Exception as e:
return str(e), 500 # 返回错误信息和500内部服务器错误状态码
finally:
conn.close() # 确保连接被关闭,无论是否发生异常
@app.route("/show/user")
def show_user():
try:
# 1. 链接mysql
conn = pymysql.connect(host="localhost",port=3306, user="root", password="", charset='utf8', db='bruce')
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
# 2. 执行sql
sql = "select * from admin"
cursor.execute(sql)
data_list = cursor.fetchall()
print(data_list)
return render_template('show_user.html', data_list = data_list)
except Exception as e:
return str(e), 500 # 返回错误信息和500内部服务器错误状态码
finally:
conn.close() # 确保连接被关闭,无论是否发生异常
if __name__ == '__main__':
app.run()
新建名为show_user.html文件
<body>
<h1>用户列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>密码</th>
<th>手机号</th>
</tr>
</thead>
<tbody>
{% for item in data_list %}
<tr>
<td>{{item.id}}</td>
<td>{{item.username}}</td>
<td>{{item.password}}</td>
<td>{{item.mobile}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>