MySQL数据库存储

MySQL数据库存储

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

MySQL数据库简介

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

MySQL开发环境

MySQL安装

  • 官网下载安装包。
    链接: https://dev.mysql.com/downloads/
  • MySQL的图形化界面工具navicat

图形化界面工具Navicat使用

表的操作

表的概念

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

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

3.2 创建表

创建表有两种方案:

  1. 用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方式
  • 添加一列
    ALTER TABLE table_name ADD COLUMN column_name datatype
  • 删除一列
    ALTER TABLE table_name DROP COLUMN column_name
  • 修改一列的数据类型
    ALTER TABLE table_nameMODIFY COLUMN column_name datatype
  • 表格重命名
ALTER TABLE table_name RENAME TO new_name
  1. Navicat方式
    在表上右键,点:Design Table,然后根据说明更改

数据的操作-增删改查

4.1 增加数据

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

4.2 删除数据

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

4.3 修改数据

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

4.4 查询数据

4.4.1 基础查询

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

4.4.2 分组查询和聚合函数

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

4.4.4 having语句

  • having语句对聚合函数计算的结果进一步的筛选
  • 查询平均年龄在15岁以上的组信息
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按照年龄从小到大查询学生信息
select * from student order by sage asc
  • desc按照年龄从大到小查询学生信息
select * from student order by sage desc

4.5 多表联合查询

  • 数据库表结构设计范式, 第三范式,每个表的结构相对明确. 不存在歧义. 数据保存完整, 没有冗余,按此建表:
  1. 学生表: 学号, 姓名, 性别, 住址等…
  2. 课程表: 课程编号, 课程名称, 授课教师等…
  3. 学生课程-成绩表: 成绩表编号, 学号, 课程编号, 成绩
  • 在该模型表结构中. 成绩表是非常重要的. 在成绩表中, 明确的说明了哪个学生的哪一门课程得了多少分. 它将两个原来毫不相关的表关联了起来. 建立了主外键关系.
  • 主外键关系: 把A表中的主键放在另一张表里作为普通字段使用, 但数据要求必须来自于A.
    建表语句:
-- 创建学生表, 课程表, 成绩表
-- 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语句中可以进行另外的一个查询.

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

-- 查询选择了"编程"这门课的学生
-- 先查询编程课程的编号
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后面的都是主外键关系

select ... from A xxx join B on A.字段1 = b.字段2
4.5.2.1 inner jion
-- 查询每门课程被选修的学生数
-- count(*)
-- group by cidselect 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
-- 查询所有学生的选课情况
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
pip install pymysql
  • pymysql基本使用:
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 添加数据

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 修改数据

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 删除数据

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

5.2 查询操作

# 查询
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

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 selfdef __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.lastrowidelse:return rownumexcept 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 resultfinally:cursor.close()def query_one(self, sql, *args):cursor = self.conn.cursor()try:cursor.execute(sql, args)result = cursor.fetchone()return resultfinally: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, 输入以下内容

GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
FLUSH PRIVILEGES;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来 一、模型介绍 1、模型简介 季节性差分自回归移动平均模型&#xff08;Seasonal Autoregressive Integrated Moving Average Model, SARIMA&#xff09;&#xff0c;又称为周期性…

uniapp的uni-im 即时通信使用教程【用户与商家对话、聊天 / 最新 / 最全 / 带源码 / 教程】

目录 使用场景用户图片商家图片 官方文档官方文档地址插件地址 项目创建uniCloud开发环境申请开发环境申请完后 概括开始使用步骤1App.vue 步骤2找到软件登录图片找到软件登录接口登录源码如下 步骤3找到软件注册图片注册源码如下 步骤4找到index.vue首页图片 index.vue源码如下…

佛山IBM System x3550 M4服务器维修检查

案例背景&#xff1a; 一家位于东莞的制造公司&#xff0c;在其佛山分厂中安装了一台IBM X3550 M4服务器作为其关键业务设备。该服务器负责管理和存储公司的生产数据、ERP系统和供应链数据。在生产过程中&#xff0c;该服务器突然发生了故障&#xff0c;导致佛山分厂的生产中断…

LT7911D是TYPE-C/DP或者EDP转2 PORT MIPI和LVDS加音频

1.概述&#xff1a; T7911D是一款高性能TYPE-C/DP/EDP转2 PORT MIPI或者LVDS的芯片&#xff0c;目前主要在AR/VR或者显示器上应用的很多&#xff0c;对于DP1.2输入&#xff0c;LT7911D可配置为1/2/4车道。自适应均衡化使其适用于长电缆应用&#xff0c;最大带宽可达21.6Gbps。…

编译android的C版本Lua库

本文讲述如何使用android studio 编译最新版本的Lua开源库),请自行下载。 我们提供的Demo,可以自行下载,工程结构如下: 本文编译的是Lua 5.4.6的版本,编译采用cmake的方式,我们支持编译静态库和动态库(我们在这一讲里:“Lua与***C在Android上的互调”是使用静态库)…

管理类联考——数学——真题篇——按知识分类——几何——解析几何

文章目录 解析几何2023真题&#xff08;2023-07&#xff09;-几何-解析几何-最值-画图求最值-两线相减求最大-联想三角形的“两边差小于第三边”&#xff0c;当为第三边为最大真题&#xff08;2023-19&#xff09;-几何-解析几何-最值-画图求最值-圆方程画出圆的形状-两点间距离…

实现两张图片的接缝线拼接

使用ORB算法检测特征点&#xff0c;并通过BFMatcher进行特征点匹配。然后&#xff0c;根据Lowes ratio test选择好的匹配点&#xff0c;并使用findHomography计算单应性矩阵。最后&#xff0c;使用warpPerspective将图像进行透视变换&#xff0c;然后将第二张图像粘贴到变换后的…

如何在PHP中使用WebSocket进行实时通信?

在PHP中使用WebSocket进行实时通信涉及到创建WebSocket服务器和与客户端建立WebSocket连接。以下是一般的步骤&#xff1a; 选择WebSocket库&#xff1a; 首先&#xff0c;您需要选择一个合适的PHP WebSocket库。一些流行的WebSocket库包括 Ratchet、ReactPHP、PHP-Websockets …

自动驾驶学习笔记(十九)——Planning模块

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 Planning作用 Planning内容 Plannin…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

Linux 操作系统 006-操作系统的启动与关闭

Linux 操作系统 006-操作系统的启动与关闭 本节关键字&#xff1a;Linux、操作系统的启动与关闭、运行级别 本节相关指令&#xff1a;shutdown、reboot、sync、init、man、help 关机/重启 命令说明shutdown -h now立即进行关机shutdown -h 11分钟后关机shutdown -r now现在重…

基于JNI 实现 嵌套 List 类型参数解析

基于JNI 实现 嵌套 List 类型参数解析 背景分析解决 背景 在前面两篇文章中&#xff0c;我们总结了Java 调用 C/C SDK 的几种方案&#xff0c;分享了JNI在实践过程中的一些踩坑点&#xff0c;而在这篇文章将继续分享针对Java List类型及其嵌套类型&#xff0c;我们的JNI如何接…

thingsboard mac docker install 安装

本文将介绍单机运行thingsboard的方法 1.安装docker与docker-compose 略 2.新建目录 新建任意一个目录&#xff0c;这将影响之后的docker容器组的命名 3.编辑yml文件 vi docker-compose.yml输入以下内容 version: 2.2 services:mytb:restart: alwaysimage: "things…

MCU中断嵌套风险

单片机中断嵌套是指在处理一个中断时&#xff0c;另一个中断发生&#xff0c;CPU会暂停当前中断的处理&#xff0c;转而去处理新的中断。当新的中断处理完毕后&#xff0c;CPU会回到之前的中断继续处理。这种方式称为中断嵌套。 在单片机中&#xff0c;中断嵌套可以通过以下步…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装&#xff0c;主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

计算机毕业设计 基于SpringBoot的二手物品交易管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

git代码管理学习文档

1.版本控制 每一版本都会发生变化 更新版本&#xff0c;回退版本 版本控制实际就是控制文件的变化 服务器端和每个人的电脑上都会记录版本的变化&#xff0c;也就是说整个团队都记录了版本的变化。 不需要连网&#xff0c;他是分布式的&#xff0c;在自己电脑上也可以操作。 …

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 &#xff0c;操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

[AIGC ~大数据] 深入理解Hadoop、HDFS、Hive和Spark:Java大师的大数据研究之旅

作为一位Java大师&#xff0c;我始终追求着技术的边界&#xff0c;最近我将目光聚焦在大数据领域。在这个充满机遇和挑战的领域中&#xff0c;我深入研究了Hadoop、HDFS、Hive和Spark等关键技术。本篇博客将从"是什么"、"为什么"和"怎么办"三个角…

《PySpark大数据分析实战》-12.Spark on YARN配置Spark运行在YARN上

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…