MySQL-->上篇
创始人
2025-05-29 02:40:37

一、引言


1.1 现有的数据存储方式有哪些?

  • Java程序存储数据(变量、对象、数组、集合),数据保存在内存中,属于瞬时状态存储。

  • 文件(File)存储数据,保存在硬盘上,属于持久状态存储。

1.2 以上存储方式存在哪些缺点?

  • 没有数据类型的区分。

  • 存储数据量级较小。

  • 没有访问安全限制。

  • 没有备份、恢复机制。

二、数据库


2.1 概念

​ 数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。

2.2 数据库的分类

  • 网状结构数据库:美国通用电气公司IDS(Integrated Data Store),以节点形式存储和访问。
  • 层次结构数据库:IBM公司IMS(Information Management System)定向有序的树状结构实现存储和访问。
  • 关系结构数据库:Oracle、DB2、MySQL、SQL Server,以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。
  • 非关系型数据库:ElastecSearch、MongoDB、Redis,多数使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。

三、数据库管理系统


3.1 概念

​ 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

RDBMS,关系型数据库管理系统

3.2 常见数据库管理系统

  • Oracle:被认为是业界目前比较成功的关系型数据库管理系统。Oracle数据库可以运行在UNIX、Windows等主流操作系统平台,完全支持所有的工业标准,并获得最高级别的ISO标准安全性认证。
  • DB2:IBM公司的产品,DB2数据库系统采用多进程多线索体系结构,其功能足以满足大中公司的需要,并可灵活地服务于中小型电子商务解决方案。
  • SQL Server:Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。
  • SQLLite:应用在手机端的数据库。

四、MySQL


4.1 简介

​ MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。

4.2 访问与下载

官方网站:https://www.mysql.com/

下载地址:https://dev.mysql.com/downloads/mysql/

版本选择
image-20230314192923095
下载页面
image-20230314192930024

4.3 安装

两种安装方案,详见安装文档

4.4 使用

  • 启动mysql
    • 命令net start mysql
    • 任务管理器启动
  • 登录mysql
    • mysql -uroot -pxxxxx
  • 退出mysql
    • exit

五、SQL语言

​ SQL(Structured Query Language)结构化查询语言,用于存取数据、更新、查询和管理关系数据库系统的程序设计语言。

  • 经验:通常执行对数据库的“增删改查”,简称C(Create)R(Read)U(Update)D(Delete)。
  • DDL(Data Definition Language) 数据定义语言,定义数据库,表,列等
  • DML(Data Manipulation Language) 数据操作语言,操作内部数据(增,删除,修改)
  • DQL(Data Query Language) 数据查询语言,对数据的查询
  • DCL(Data Control Language) 数据控制语言,定义数据的访问控制和安全

六、DDL

6.1 数据库操作

查看MySQL中所有数据库

mysql> SHOW DATABASES; #显示当前MySQL中包含的所有数据库
数据库名称描述
information_schema信息数据库,其中保存着关于所有数据库的信息(元数据)。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
mysql核心数据库,主要负责存储数据库的用户、权限设置、关键字等,
以及需要使用的控制和管理信息,不可以删除。
performance_schema性能优化的数据库,MySQL 5.5版本中新增的一个性能优化的引擎。
sys系统数据库,MySQL5.7版本中新增的可以快速的了解元数据信息的系统库
便于发现数据库的多样信息,解决性能瓶颈问题。

创建自定义数据库

mysql> CREATE DATABASE mydb1; #创建mydb数据库
mysql> CREATE DATABASE mydb2 CHARACTER SET gbk; #创建数据库并设置编码格式为gbk
mysql> CREATE DATABASE IF NOT EXISTS mydb4; #如果mydb4数据库不存在,则创建;如果存在,则不创建。

查看数据库创建信息

mysql> SHOW CREATE DATABASE mydb2; #查看创建数据库时的基本信息

修改数据库

mysql> ALTER DATABASE mydb2 CHARACTER SET gbk; #修改数据库的字符集

删除数据库

mysql> DROP DATABASE mydb1; #删除数据库mydb1

查看当前所使用的数据库

mysql> select database(); #查看当前使用的数据库

使用数据库

mysql> USE mydb1; #使用mydb1数据库

6.2 数据表操作

查询当前库下的所有表

mysql> show tables;

创建数据表


CREATE TABLE 表名(

​ 列名 数据类型 [约束],

​ 列名 数据类型 [约束],

​ …

​ 列名 数据类型 [约束] //最后一列的末尾不加逗号

)[charset=utf8] //可根据需要指定表的字符编码集

列名数据类型说明
subjectIdINT课程编号
subjectNameVARCHAR(20)课程名称
subjectHoursINT课程时长
#依据上述表格创建数据表,并向表中插入 3 条测试语句
CREATE TABLE subject(subjectId INT,subjectName VARCHAR(20),subjectHours INT
)charset=utf8;
数据类型解释长度
int整形11,固定,可以省略
double浮点型(x,y) 总长x位,其中包含y位小数
char定长字符0-255,声明(10)的字符,即使字符不够,也会占用10位
varchar可变长字符0-255,声明(10)的字符,会根据实际存储缩放
date日期没有长度
datatime日期时间没有长度
timestamp时间戳没有长度

向现有表中添加列

#在课程表基础上添加gradeId 列
ALTER TABLE subject ADD gradeId int;

删除表中的列

#删除课程表中 gradeId 列
ALTER TABLE subject DROP gradeId;
  • 注意:删除列时,每次只能删除一列

修改列名

#修改课程表中 subjectHours 列为 classHours
ALTER TABLE subject CHANGE subjectHours classHours int ;
  • 注意:修改列名时,在给定列新名称时,要指定列的类型和约束

修改表名

#修改课程表的subject 为 sub
ALTER TABLE subject rename sub;

删除学生表

#删除学生表
DROP TABLE subject;

七、客户端工具

SQLyog

MySQL可能是世界上最流行的开源数据库引擎,但是使用基于文本的工具和配置文件可能很难进行管理。SQLyog提供了完整的图形界面,即使初学者也可以轻松使用MySQL的强大功能。其拥有广泛的预定义工具和查询、友好的视觉界面、类似 Excel 的查询结果编辑界面等优点。

这里推荐使用DataGrip 很人性化的一个工具,需要的可以私我。

八、DML

DML 数据操作语言,其实对表中的数据进行

8.1 插入

插入,就是向数据库表中插入数据,语法

insert into 表名 (字段1,字段2,...) values (值1,值2,...);insert into 表名 values (值1,值2,...);
-- 注释
# 注释
/*
* 多行注释
*/
CREATE TABLE `stu` (`sid` int(11) DEFAULT NULL,`sname` varchar(10) DEFAULT NULL,`age` int(11) DEFAULT NULL,`score` double(5,2) DEFAULT NULL,`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ================= 插入 =================
/*insert into 表名 (字段1,字段2,...) values (值1,值2,...);
注意事项:
1) 数字直接写
2) 字符串用单引号
3) 日期用单引号,格式yyyy-MM-dd
4) 可以单独向部分字段插入数据
5) 插入的字段顺序和原表没有关系,但是值顺序要和插入字段顺序一致
6) 当插入表中全部字段时,可以省略字段,直接写值此时字段顺序和原表一模一样
7) 可以同时插入多行数据
*/
-- 向表的全部字段插入数据
insert into stu (sid,sname,age,score,birthday)
values (1,'彩云',20,98.2,'2020-01-01');
-- 插入部分字段
insert into stu (sid,sname,age)
values (2,'贝贝',20);
-- 字段顺序和原表没关系
insert into stu (age,sname,sid)
values (18,'老邢',3);
-- 给全部列插入值,省略字段
insert into stu values (4,"骚磊",20,99.9,'2020-01-01');
-- 同时插入多行
insert into stu (age,sname,sid) values 
(18,'博哥',5),
(19,'阳哥',6),
(20,'万哥',7),
(21,'邱哥',8)

8.2 更新

语法

update 表名 set 字段 = 值 [, 字段2 = 值2, ... ] [where 字段 = 值];
-- [, 字段2 = 值2, ... ] 是指,可选的,可以同时修改多个列的值
-- [where 字段 = 值] 是指,可选的,加上是指过滤,只更新符合条件的数据
--                            不加,就是更新全表数据, 不推荐!!
/*update 表名 set 字段 = 值;update 表名 set 字段 = 值 , 字段2 = 值2 ;update 表名 set 字段 = 值 , 字段2 = 值2 where 字段 = 值;推荐使用带条件的.条件有很多 = > < >= 等等
*/
-- 更新学生的id为2的成绩为100
update stu set score = 100 where sid = 2;
-- 同时更新多个字段
update stu set score = 100, birthday = '1970-01-01' where sid = 3;-- 同时更新多条数据
update stu set score = 100 where sid >= 5;
-- 不加条件,更新全部数据
-- 不推荐使用,将来工作中数据表中的数据100w以上
update stu set score = 0;-- 字段是可以做运算
-- 更新贝贝的年龄+2岁
update stu set age = age + 2 where sname = '贝贝';
update stu set age = age + 100;

8.3 删除

语法

delete from 表名;  -- 删除全表数据
delete from 表名 where 字段 = 值; -- 只删除符合条件的数据
-- 删除id为8的学生数据
delete from stu where sid = 8;delete from stu where sid >= 5;
-- 删除全部[慎用]
delete from stu;
/*一般实际开发中,都是逻辑删除,其实是没有进行物理删除
执行都是更新.在设计表时,会设计一个状态字段,例如statusstatus = 1 活跃status = 2 不活跃status = 3 僵尸号status = 1 用户 2 vip用户 3 注销用户
*/

8.4 delete和truncate的区别[面试问]

-- 删除全部[慎用]
delete from stu;
-- 删除全表
truncate table stu;
deletetruncate
语句类型DMLDDL
原理逐条删除数据删除表结构和数据,重建表
空间删除数据在内存中有删除后碎片很干净,没有空间碎片
效率
恢复可以恢复数据不能恢复
自增不影响自增顺序影响,从1开始

九、约束

约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新


约束设置的语法,大部分是

create table 表名(
字段 数据类型(长度) 约束,
字段 数据类型(长度) 约束
);

9.1 数据类型

其实数据类型也是一种约束,例如设置id列为int类型,那就不能乱给id设置字符串或者日期等数据

9.2 主键约束

主键(primary key)约束非常重要,以后开发中基本上每张表都要有主键约束,作用是设置了主键约束的列,有以下效果

  • 不能为空
  • 不能重复

一般主键是给id设置的

设置主键方式有三种:

  • 在建表时给列直接指定
  • 在建表语句的最后指定某一列是主键
  • 给以建好的表修改设置主键
-- ================= 主键 ================
-- 方案1,在建表时指定
create table t1 (id int(11) primary key, -- 主键name varchar (20)
);
-- 主键不能为空,报错 Field 'id' doesn't have a default value
insert into t1 (name) values('aaa');
-- 主键不能重复,报错Duplicate entry '1' for key 'PRIMARY' 
insert into t1 (id,name) values(1,'aaa');
insert into t1 (id,name) values(1,'aaa');
-- 方案2,在建表语句的最后指定主键
create table t2 (id int(11),name varchar(20),age int,primary key(id)  -- 指定主键
);
insert into t2(name,age) values ('cc',18);
insert into t2(id,name,age) values (1,'cc',18);
insert into t2(id,name,age) values (1,'cc',18);-- 方案3,对已建成的表设置主键
create table t3(id int,name varchar(20)
);
insert into t3(name) values ('cc');
-- 修改表,设置主键
alter table t3 add primary key (id);

9.3 自增约束

自增(auto_increment)约束,主要是配合主键使用,防止主键为空,重复

-- ================= 自增约束 ================
create table t4(id int(11) primary key auto_increment,name varchar(20)
);
insert into t4(id,name) values (1,'aaa');
-- 当没有给主键设置值是,自增会自动赋值
insert into t4(name) values ('bbb');
-- 还可以主动赋值
insert into t4(id,name) values (4,'ddd');
-- 当没有给主键设置值是,自增会自动赋值,自动根据上个id自增1
insert into t4(name) values ('eee');
delete from t4 where id = 5;
-- 删除数据不影响自增的顺序
insert into t4(name) values ('fff');

9.4 唯一约束

唯一(unique)约束,设置了唯一约束的列,的值不能重复

-- ================= 唯一约束 ================
create table t5(id int,name varchar(20) unique -- 唯一约束
);
insert into t5(name) values('aa');
-- 报错,name列的值重复, Duplicate entry 'aa' for key 'name'
insert into t5(name) values('aa');

9.5 非空约束

非空(not null)约束,设置了非空约束的列的值不能为空

-- ================= 非空约束 ================
create table t6(id int,name varchar(20) not null -- 非空约束
);
-- name不能没有值
insert into t6 (id) values (1);
-- 给name赋值
insert into t6 (id,name) values (1,'aaa');
-- 只是不能为空,可以重复
insert into t6 (id,name) values (2,'aaa');

9.6 默认值

默认值(default),给列设置默认值约束后,如果该列在插入数据时没有给值,就自动赋值默认值

-- ================= 默认值约束 ================
create table t7 (id int,sex char(1) default '男' -- 默认值
);
insert into t7 (id) values (1); -- 不给值时,默认填充男
insert into t7 (id,sex) values (2,'女');

9.7 外键约束

外键,是多表之间接的一种关联关系的一种限制.

总结:子表不能乱是插入和更新,父表不能乱删除和更新。

语法

constraint 外键名 foreign key (当前表中的列名) references 表(主键);

设计订单表和商品表,订单表的数据要关联商品表数据

-- 商品表
create table tb_goods(gid int primary key,gname varchar(20),descr varchar(20)
);-- 订单表 (订单表关联了商品表)
create table tb_order(oid int primary key,order_time datetime,gid int,-- 设置外键constraint fk_order_goods foreign key(gid) references tb_goods(gid)
);
/*被引用的表称为父表 parent , tb_goods引用别人的表称为子表 child , tb_order
*/
-- 给父表随便插入数据
insert into tb_goods values (2,'键盘','敲代码没有bug');
-- 给子表随便插入数据不行!! 这个数据得是父表中有的才行
insert into tb_order values (1,'2022-11-11',1);
-- 子表可以删除数据
delete from tb_order where oid = 1;-- 父表被引用的数据不能删除
delete from tb_goods where gid = 2;
delete from tb_goods where gid = 1;

image-20221117150248420

  • RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录, 则不允许删除父表中的记录;
  • NO ACTION:同 RESTRICT,也是首先先检查外键;
  • CASCADE:父表 delete、update 的时候,子表会 delete、update 掉关联记录;
  • SET NULL:父表 delete、update 的时候,子表会将关联记录的外键字段所在 列设为 null,所以注意在设计子表时外键不能设为 not null;

9.8 练习

自己创建表,设计字段,把所有约束都试一遍

;

相关内容

热门资讯

python:DIY字符画的程... 目录开发环境要求运行方法具体的操作步骤如下:代码示例源码及运行程序下载地址 开发环境要...
特朗普被判后,上诉!他还觉得冤... 三名法官中,除了一名是奥巴马时期由民主党政府任命以外,另两位法官都是共和党政府时期任命。而就这样的搭...
增程已老、纯电难料,理想的现实... 理想汽车于北京时间 5 月 29 日晚间港股盘后、美股盘前发布了 2024 年第一季度财报。一句话,...
Launching nodes... 文章目录背景介绍运行一个启动文件(可选)控制Turtlesim节点 参考...
金融测试项目 最近测试项目很多很忙,已经多到了996的地步,但我依然认为阶段性的整理永...
特朗普2019年来首次约见鲍威... 周四,美联储在一份声明中表示,美联储主席鲍威尔5月29日周四应美国总统特朗普的邀请,在白宫与其会面。...
DOGE效应显现?华盛顿等“深... 特朗普政策给美国劳动力市场带来不确信行,上周美国失业救济续领人数大幅增加。美国劳工部周四发布的最新数...
贷款利率太高惹的祸!美国4月成... 周四,根据美国房地产经纪人协会(NAR)的数据,美国4月成屋签约销售指数环比大跌6.3%,为自202...
巨子生物胶原蛋白“缺量罗生门”... 重组胶原蛋白龙头企业巨子生物(2367.HK)正卷入成分添加“缺斤短两”的争议中。5月24日,美妆行...
黄金投资崩塌!大案,涉数亿资金... 5月15日,林明像往常一样,熟练地打开永坤黄金的线上平台,点击“黄金提现”按钮。按以往三年的操作,资...
CentOS jdk-8u36... 系统自带JDK卸载: java路径查询: whereis java查找 ...
马斯克“副将”据称届满离任政府... 财联社5月30日讯(编辑 赵昊)综合多家媒体报道,知情人士透露,曾经是埃隆·马斯克“政府效率部”中实...
一度涨超6%,市值重回全球第一... 科技股“遇冷”之际,英伟达这份财报来得可谓及时。当地时间5月28日,英伟达披露了2026财年一季度财...
特朗普与哈佛的冲突:3亿美国人... 特朗普与哈佛的冲突反映了当下美国社会意识形态的严重分裂。哈佛作为美国顶尖学府,代表着传统的精英教育和...
宇树科技回应更名:是公司运营方... 【宇树科技回应更名:是公司运营方面的常规变更】29日,宇树科技向合作伙伴表示,因公司发展需要,杭州宇...
前端资源共享方案对比-笔记:i... 前端页面资源如何分享,常见的有iframe,其次是js-sdk。这两类的在地图类工具经...
PTA:L1-040 最佳情侣... L1-040 最佳情侣身高差 问题描述:         专家通过多组情侣研究数据发现...
LeetCode 热题 HOT... 介绍 对于算法题,按题型类别刷题才会更有成效,因此我这里在网上搜索并参考...
会过日子的人都在用,超八成人能... “618”进程过半。近日,新浪金融研究院的一份《分期消费习惯调研》显示,“能赚会算”、“能花会省”的...
股市必读:奥特维(688516... 截至2025年5月29日收盘,奥特维(688516)报收于33.41元,上涨2.14%,换手率0.9...
丧钟已敲响,新能源汽车金融泡沫... 某宇宙第一大车企是谁?大家心里都有数,名字我就不说了。 这家车企, 2020年负债1366亿,到 2...
指针进阶(上) 内容小复习🐱: 字符指针:存放字符的数组 char arr1[10];...
基于OpenCv的传统视觉应用... 图像生成 OpenCv是计算机视觉中经典的专用库,具备支持多语言、跨平台的优点...
经纬早班车|美国一季度经济环比...   【隔夜重磅】  美股收高,英伟达涨逾3%  美东时间周四,美股三大指数集体收涨。道指比前一交易日...
深入剖析Linux——进程信号 致前行的人:                 要努力,但不着急ÿ...
未来超额收益仍在于规模化扩张的...   当前,地缘博弈加剧、技术封锁频现,全球宏观环境正经历深度重构,而AI(人工智能)引发的“算力革命...
玄戒芯片亮相,雷军离超越乔布斯... 近日,小米玄戒O1芯片引发全球科技界关注。雷军在接受央视《面对面》节目专访中曾提到:他创业的源头是在...
【CSS 知识总结】第二篇 -... 一,前言 上一篇,简单介绍了 html 标签和使用语义化的好处ÿ...
学习28个案例总结 学习前         对于之前遇到的问题没有及时总结,导致做什么事情都是新的一样。没...
美股震荡收高,美上诉法院恢复特... *英伟达财报提振科技股*美国上诉法院恢复实施特朗普政府关税政策*美国一季度经济环比萎缩0.2%当地时...