MySQL数据库存储

MySQL数据库存储

  • MySQL数据库简介
  • MySQL开发环境
  • 表的操作
    • 表的概念
      • [3.2 创建表](#3.2 创建表)
      • [3.3 修改表](#3.3 修改表)
  • 数据的操作-增删改查
    • [4.1 增加数据](#4.1 增加数据)
    • [4.2 删除数据](#4.2 删除数据)
    • [4.3 修改数据](#4.3 修改数据)
    • [4.4 查询数据](#4.4 查询数据)
      • [4.4.1 基础查询](#4.4.1 基础查询)
      • [4.4.2 分组查询和聚合函数](#4.4.2 分组查询和聚合函数)
      • [4.4.4 having语句](#4.4.4 having语句)
      • [4.4.5 排序](#4.4.5 排序)
      • [4.5 多表联合查询](#4.5 多表联合查询)
      • [4.5.1 子查询](#4.5.1 子查询)
      • [4.5.2 关联查询](#4.5.2 关联查询)
        • [4.5.2.1 inner jion](#4.5.2.1 inner jion)
        • [4.5.2.2 left join](#4.5.2.2 left join)
  • Python连接MySQL
    • [5.1 pymysql执行增删改操作](#5.1 pymysql执行增删改操作)
      • [5.1.1 添加数据](#5.1.1 添加数据)
      • [5.1.2 修改数据](#5.1.2 修改数据)
      • [5.1.3 删除数据](#5.1.3 删除数据)
      • [5.2 查询操作](#5.2 查询操作)
    • [5.3 封装一个简单的DBHelper](#5.3 封装一个简单的DBHelper)

MySQL数据库简介

  • 数据持久化
  • MySQL是关系型数据库,MSSQL, Oracle,等等...

MySQL开发环境

MySQL安装

图形化界面工具Navicat使用

表的操作

表的概念

  • 关系型数据库中, 数据都是以表格的形式进行存储。
    例表,学生:学号(唯一标识),姓名,生日,家庭住址,电话号等信息

OK. 按照这个规则来看. 每一条数据对应的就是一个人的信息.

3.2 创建表

创建表有两种方案:

  1. 用SQL语句创建表格

    sql 复制代码
    create table table_student(
    	sno int(10) primary key auto_increment,
        sname varchar(50) not null, 
        sbirthday date not null,
        saddress varchar(255),
        sphone varchar(12),
        class_name varchar(50),
    )
  • 数据类型:
数据类型 说明
int 整数
double 小数
varchar 字符串
date 时间(年月日)
datetime 时间(年月日时分秒)
text 文本
  • 约束条件:
数据类型 说明
primary key 主键, 全表唯一值
auto_increment 主键自增.
not null 不可以为空.
null 可以为空
default 设置默认值
  1. 用Navicat图形化工具建表

3.3 修改表

  1. SQL方式
  • 添加一列
sql 复制代码
    ALTER TABLE table_name ADD COLUMN column_name datatype
  • 删除一列
sql 复制代码
    ALTER TABLE table_name DROP COLUMN column_name
  • 修改一列的数据类型
sql 复制代码
    ALTER TABLE table_name
    MODIFY COLUMN column_name datatype
  • 表格重命名
sql 复制代码
ALTER TABLE table_name RENAME TO new_name
  1. Navicat方式
    在表上右键,点:Design Table,然后根据说明更改

数据的操作-增删改查

4.1 增加数据

sql 复制代码
INSERT INTO table_name(col1, col2, ccol3...) values (val1,val2,val3)
  • 添加学生信息
sql 复制代码
INSERT INTO STUDENT(sname, sbirthday, saddress, sage, class_name) values ('周杰伦', '2020-01-02', "北京市昌平区", 18, "二班");
  • 如果主键设置自增, 就不用处理主键了. mysql会自动照自然顺序进行逐一自增.

4.2 删除数据

sql 复制代码
DELETE FROM table_name where 条件语句
  • 删除sno = 1的学生信息
sql 复制代码
DELETE FROM STUDENT where sno = 1 ; 

4.3 修改数据

sql 复制代码
UPDATE table_name SET col1 = val1, col2 = val2... where 条件语句
  • 修改sno = 1的学生的名字信息
sql 复制代码
UPDATE STUDENT SET SNAME = '王力宏' where sno = 1;
  • 修改和删除数据的时候一定要带上where条件
  • 不带条件的修改和删除,就是对全表更新、删除

4.4 查询数据

4.4.1 基础查询

sql 复制代码
SELECT *|col1, col2, col3 FROM table_name where_条件
  • 全表查询
sql 复制代码
SELECT * FROM STUDENT;
  • 查询学生表的某一字段,姓名、年龄
sql 复制代码
SELECT sname, sage FROM STUDENT;
  • 根据学号查询学生信息
sql 复制代码
select * from student where sno = 1;
  • 查询年龄大于20的学生信息
sql 复制代码
select * from student where sage > 20;
  • and查询学生年龄大于20 小于40的信息(包含)
sql 复制代码
select * from student where sage >= 20 and sage <= 40;
select * from student where sage between 20 and 40 ;
  • 查询姓张的学生信息
  • _:一位字符串
  • %:多位字符串
sql 复制代码
select * from student where sname like '张%';

4.4.2 分组查询和聚合函数

  • 分组group by
  • 不能单独使用,会报错,需配合聚合函数
sql 复制代码
select * from table_name group by col_name
  • 5种聚合函数, 分别是: avg(), sum(), min(), max(), count()
  • avg()查询每一个组的平均年龄
sql 复制代码
select avg(sage), class_name from STUDENT group by class_name;
  • min()查询每个组最小的年龄
sql 复制代码
select min(sage), class_name from STUDENT group by class_name;
  • max()查询每个组的最大年龄
sql 复制代码
select max(sage), class_name from STUDENT group by class_name;
  • count()查询每个组的学生数量
sql 复制代码
select count(*), class_name from STUDENT group by class_name;
  • sum()查询每个组的年龄和
sql 复制代码
select sum(sage), class_name from STUDENT group by class_name;
  • ****不要把没有放在group by的内容直接放在select中。先分组,按分组信息进行查询,原来的字段未分组,放进select中组表显示,就显得混乱。

4.4.4 having语句

  • having语句对聚合函数计算的结果进一步的筛选
  • 查询平均年龄在15岁以上的组信息
sql 复制代码
select avg(sage), class_name from student group by class_name having avg(sage) > 15;
  • having和where的区别:where是在原始数据上进行的数据筛选。而having是在聚合函数计算后的结果进行筛选。

4.4.5 排序

  • order by语句对查询结果进行排序.
  • asc按照年龄从小到大查询学生信息
sql 复制代码
select * from student order by sage asc
  • desc按照年龄从大到小查询学生信息
sql 复制代码
select * from student order by sage desc

4.5 多表联合查询

  • 数据库表结构设计范式, 第三范式,每个表的结构相对明确. 不存在歧义. 数据保存完整, 没有冗余,按此建表:
  1. 学生表: 学号, 姓名, 性别, 住址等...
  2. 课程表: 课程编号, 课程名称, 授课教师等...
  3. 学生课程-成绩表: 成绩表编号, 学号, 课程编号, 成绩
  • 在该模型表结构中. 成绩表是非常重要的. 在成绩表中, 明确的说明了哪个学生的哪一门课程得了多少分. 它将两个原来毫不相关的表关联了起来. 建立了主外键关系.
  • 主外键关系: 把A表中的主键放在另一张表里作为普通字段使用, 但数据要求必须来自于A.
    建表语句:
sql 复制代码
-- 创建学生表, 课程表, 成绩表
-- 1. 学生表: 学号, 姓名, 性别, 住址等...
-- 2. 课程表: 课程编号, 课程名称, 授课教师等...
-- 3. 学生课程-成绩表:  成绩表编号, 学号, 课程编号, 成绩
create table stu(
	sid int primary key auto_increment,
	sname varchar(50) not null, 
	gender int(1),
	address varchar(255)
);

create table course(
	cid int primary key auto_increment,
	cname varchar(50) not null, 
	teacher varchar(50)
);

create table sc(
	sc_id int primary key auto_increment,
	s_id int, 
	c_id int,
	score int,
	CONSTRAINT FK_SC_STU_S_ID FOREIGN key(s_id) REFERENCES stu(sid),
	CONSTRAINT FK_SC_COURSE_C_ID FOREIGN key(c_id) REFERENCES course(cid)
);

4.5.1 子查询

​ 在where语句中可以进行另外的一个查询.

​ 例如, 查询选择了"编程"这门课的学生

sql 复制代码
-- 查询选择了"编程"这门课的学生
-- 先查询编程课程的编号
select cid from course where cname = '编程';
-- 根据cid可以去sc表查询出学生的id
select s_id from sc where c_id = 2;
-- 根据学生ID查询学生信息
select * from stu where sid in (1,2,3,4,5,6);

-- 把上面的sql穿起来 
select * from stu where sid in (
    select s_id from sc where c_id in (
        select cid from course where cname = '编程'
    )
);

-- 查询课程名称为"编程",且分数低于60的学生姓名和分数
select stu.sname, sc.score from stu, sc where stu.sid = sc.s_id and sc.score < 60 and sc.c_id in (
	select cid from course where cname = '编程'
)

4.5.2 关联查询

  • 把多个表格通过join的方式合并在一起进行条件检索。

  • A表和B表连接. 通过A表的字段1和b表的字段2进行连接。

  • on后面的都是主外键关系

sql 复制代码
select ... from A xxx join B on A.字段1 = b.字段2
4.5.2.1 inner jion
sql 复制代码
-- 查询每门课程被选修的学生数
-- count(*)
-- group by cid

select c.cid,c.cname, count(*) from sc inner join course c on sc.c_id = c.cid group by c.cid, c.cname
4.5.2.2 left join
sql 复制代码
-- 查询所有学生的选课情况
select s.sname, c.cname from stu s left join sc on s.sid= sc.s_id left join course c on sc.c_id = c.cid

-- 查询任何一门课程成绩在70分以上的姓名、课程名称和分数
-- score > 70 sc
-- sname student
-- cname course
select s.sname, c.cname, sc.score from stu s inner join sc on s.sid = sc.s_id inner join course c on sc.c_id = c.cid
where sc.score > 70

Python连接MySQL

  • python用pymysql模块连接mysql
  • 安装pymysql
python 复制代码
pip install pymysql
  • pymysql基本使用:
python 复制代码
import pymysql

# 链接数据库
conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='test123456',
    database='spider_back'
)
# 创建游标,游标执行增删改查
cursor = conn.cursor()

5.1 pymysql执行增删改操作

5.1.1 添加数据

python 复制代码
try:
    cursor = conn.cursor()
    result = cursor.execute("insert into stu(sname, address, gender) values ('张三', '恒大别野', 1)")
    print(cursor.lastrowid)  # 获取自增的ID值
    print(result)  # result是该sql会影响多少条数据
    conn.commit()  # 提交
except:
    conn.rollback()  # 回滚

5.1.2 修改数据

python 复制代码
try:
    cursor = conn.cursor()
    result = cursor.execute("update stu set gender = 2 where sid = 12")
    print(result)  # result是该sql会影响多少条数据
    conn.commit()  # 提交
except:
    conn.rollback()  # 回滚

5.1.3 删除数据

python 复制代码
try:
    cursor = conn.cursor()
    result = cursor.execute("delete from stu where sid = 12")
    print(result)  # result是该sql会影响多少条数据
    conn.commit()  # 提交
except:
    conn.rollback()  # 回滚

5.2 查询操作

python 复制代码
# 查询
from pymysql.cursors import DictCursor
# cursor = conn.cursor(DictCursor)  # 使用字典游标. 查询出的结果自动保存在字典中
cursor = conn.cursor()  # 默认游标. 查询出的结果自动保存在元组中

sql = """
    select * from stu
"""
ret_num = cursor.execute(sql)
# result = cursor.fetchall()  # 获取全部结果
# result = cursor.fetchmany(5)  # 获取部分结果
result = cursor.fetchone()  # 获取单个结果
print(result)
# 一个游标如果被拿空了. 则不能再次获取内容. 
result = cursor.fetchone()  # 获取单个结果, 可以连续获取
print(result)

5.3 封装一个简单的DBHelper

python 复制代码
import pymysql
from pymysql.cursors import DictCursor
class NoDataBaseException(Exception):
    pass
class DBHelper:
    def __init__(self, database=None, host="localhost", port=3306, username="root", password="123456"):
        if database:
            self.conn = pymysql.connect(
                host=host,
                port=port,
                user=username,
                password=password,
                database=database
            )
        else:
            raise NoDataBaseException("没有提供正确的数据库")

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        return self.conn.close()

    def _change(self, sql,  *args, isInsert=False):
        cursor = self.conn.cursor()
        try:
            rownum = cursor.execute(sql, args)
            self.conn.commit()
            if isInsert:
                return cursor.lastrowid
            else:
                return rownum
        except Exception as e:
            print("报错了", e)
            self.conn.rollback()
        finally:
            cursor.close()

    def insert(self, sql, *args):
        return self._change(sql, *args, isInsert=True)

    def update(self, sql, *args):
        return self._change(sql, *args)

    def delete(self, sql, *args):
        return self._change(sql, *args)

    def query_list(self, sql, *args):
        cursor = self.conn.cursor()
        try:
            cursor.execute(sql, args)
            result = cursor.fetchall()
            return result
        finally:
            cursor.close()

    def query_one(self, sql, *args):
        cursor = self.conn.cursor()
        try:
            cursor.execute(sql, args)
            result = cursor.fetchone()
            return result
        finally:
            cursor.close()


if __name__ == '__main__':
    with DBHelper("spider_back") as db:
        # result = db.query_list("select * from stu where gender=%s and address like %s", 1, "%北京%")
        # print(result)
        result = db.delete("delete from stu where sid = %s", 10)
        print(result)
  • MySQL远程连接时, 必须对数据库做一个简短的配置

1, 打开mysql命令行.

2, 输入以下内容

mysql 复制代码
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
FLUSH PRIVILEGES;
相关推荐
陌夏微秋3 分钟前
STM32单片机芯片与内部47 STM32 CAN内部架构 介绍
数据库·stm32·单片机·嵌入式硬件·架构·信息与通信
计算机学无涯1 小时前
Spring事务回滚
数据库·sql·spring
web130933203981 小时前
flume对kafka中数据的导入导出、datax对mysql数据库数据的抽取
数据库·kafka·flume
张声录11 小时前
【ETCD】【实操篇(二十)】浅谈etcd集群管理的艺术:从两阶段配置到灾难恢复的设计原则
数据库·etcd
qq_254674411 小时前
数据仓库和数据湖 数据仓库和数据库
数据库·数据仓库
--FGC--2 小时前
【第2篇】 Python与数据库基础
数据库·python·oracle
web135085886352 小时前
9. 大数据集群(PySpark)+Hive+MySQL+PyEcharts+Flask:信用贷款风险分析与预测
大数据·hive·mysql
Y.O.U..2 小时前
Mysq学习-Mysql查询(4)
数据库·学习·mysql
安晴晚风3 小时前
从0开始在linux服务器上部署SpringBoot和Vue
linux·运维·前端·数据库·后端·运维开发
play_big_knife5 小时前
鸿蒙项目云捐助第二十八讲云捐助项目首页组件云数据库加载轮播图
数据库·华为·harmonyos·鸿蒙·云开发·鸿蒙开发·鸿蒙技术