MySQL看这一篇就够了--从入门到高级

MySQL看这一篇就够了--从入门到高级,第1张

🙋作者:爱编程的小贤
⛳知识点:MySQL
🥇:每天学一点,早日成大佬

💗文章目录 👊前言☀️一、数据库介绍(一)数据库简介(二)数据库特点(三)能解决的问题(四)数据库分类(五)数据库设计1.E-R模型2.三个范式3.数据完整性4.字段类型5.约束6.使用命令连接 ☀️二、数据库 *** 作1.创建数据库2.查看数据库3.删除数据库4.切换数据库5.注释(1)单行注释(2)多行注释 ☀️三、表 *** 作1.查看当前数据库中所有表2.创建表3.查询表4.删除表5.更改表名称 ☀️四、数据 *** 作(增删改查)1.新增 *** 作2.查询 *** 作3.修改 *** 作4.删除 *** 作 ☀️五、表关系1.一对一2.一对多3.多对多 ☀️六、MySQL查询1.条件查询(1)比较运算符(2)逻辑运算符(3)模糊查询(4)范围查询(5)空判断(6)优先级 2.聚合查询3.分组查询->分组后的数据筛选->对比where与having 4.分页查询5.总结 ☀️七、MySQL高级1.数据类型2.关系3.外键外键的级联 *** 作 4.自关联5.视图6.事务 ☀️总结

👊前言

💎 💎 💎
①首先要先下载MySQL然后进行环境变量配置
②可以私信我获取链接(有安装包和安装详细步骤及环境变量配置)
③也可以去官网下载
https://downloads.mysql.com/archives/installer/
🚀 🚀 🚀 如果你看完感觉对你有帮助,,,欢迎给个三连哦💗!!!您的支持是我创作的动力。🌹 🌹 🌹 🌹 🌹 🌹 感谢感谢!!!😘😘😘

☀️一、数据库介绍 (一)数据库简介

数据库 : 数据库是按照数据结构来组织、存储和管理数据的仓库。简单来说是本身可视为电子化的文件柜–存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等 *** 作。

(二)数据库特点

特点 : 以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度的特点、是与应用程序彼此独立的数据集合。

实现数据共享;减少数据的冗余度;数据的独立性;数据实现集中控制;数据一致性和可维护性,以确保数据的安全性和可靠性;故障恢复; (三)能解决的问题

数据库系统解决的问题:持久化存储,优化读写,保证数据的有效性

(四)数据库分类

当前使用的数据库,主要分为两类

关系型数据库:类似于表格有字段和字段对应的值 易于维护:格式一致使用方便:sql语言通用 非关系型数据库:数据结构化存储方法的集合,可以是文档或者键值对 格式灵活:存储数据的格式可以是key,value形式、文档形式速度快:可以使用内存 (五)数据库设计 1.E-R模型 当前物理的数据库都是按照E-R模型进行设计的E表示entry,实体R表示relationship,关系一个实体转换为数据库中的一个表关系描述两个实体之间的对应规则,包括 一对一一对多多对多 关系转换为数据库表中的一个列 *在关系型数据库中一行就是一个对象 2.三个范式 经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式第一范式(1NF):列不可拆分第二范式(2NF):唯一标识第三范式(3NF):引用主键说明:后一个范式,都是在前一个范式的基础上建立的 3.数据完整性 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证, 包括数据字段的类型、约束 4.字段类型 在mysql中包含的数据类型很多,这里主要列出来常用的几种 数字:int,decimal字符串:varchar,text日期:datetime布尔:bit 5.约束 主键primary key非空not null唯一unique默认default外键foreign key 6.使用命令连接 命令 *** 作方式,在工作中使用的更多一些,所以要达到熟练的程度打开终端,运行命令

命令:mysql -uroot -p 回车后输入密码,当前设置的密码为mysql

连接成功后如下图

退出登录

quit或exit

退出成功后如下图

登录成功后,输入如下命令查看效果:

查看版本:select version();
显示当前时间:select now();

注意:在每个语句结尾要使用分号; ☀️二、数据库 *** 作

对数据库的 *** 作 : 主要分为 创建数据库 ,查看数据库 , 删除数据库

1.创建数据库

create database 数据库名 charset=utf8;
create database Cara;

2.查看数据库

show databases;

查看当前选择的数据库

select database();

3.删除数据库

drop database 数据库名;
drop database Cara;

注意 : MySQL没有提供数据库名称的修改 *** 作 , 通常在数据库里面存放着大量的数据表,而数据表的命名通常都是一个数据库名称的部分字母作为表的前缀 , 一旦修改数据库的名称那么表名称有需要修改,这个会非常麻烦。而数据库的删除 *** 作也不要随意 *** 作 , 因为删除是不可逆的。mysql不区分大小写

4.切换数据库

use 数据库名;

5.注释 (1)单行注释 单行注释可以使用 # 注释符, # 注释符后直接加注释内容。格式如下:

#注释内容

单行注释可以使用 – (两个杠)注释符, – 注释符后需要加一个空格,注释才能生效。格式如下:

–(两个杠)(空格) 注释内容

#和 -- 的区别就是: #后面直接加注释内容,而 --的第 2 个破折号后需要跟一个空格符在加注释内容。
(2)多行注释

多行注释使用 /* */ 注释符。 /*用于注释内容的开头, */ 用于注释内容的结尾。多行注释格式如下:

/*
第一行注释内容
第二行注释内容
*/

注释内容写在 /* 和 */ 之间,可以跨多行。快捷注释:ctrl + /  取消注释 ctrl+shift
☀️三、表 *** 作

提示:在创建表之前 , 一定要确定是对哪个数据库的 *** 作。

使用数据库:use 数据库名; – 每行代码结束后要写分号

1.查看当前数据库中所有表

show tables;

2.创建表

auto_increment表示自动增长

create table 表名(列及类型);


Create table 表名(
字段名称 数据类型 列属性,
字段名称 数据类型 列属性 -- 最后一个字段 不需要加逗号
)[表选项]; //charset = utf8;

如:
create table students(
id int auto_increment primary key,
sname varchar(10) not null
);

常用数据类型


3.查询表
show tables; -- 查询所有的表 
desc 表名; -- 查看创建的表的字段(查看表结构)
show create table 表名; -- 查看表的创建(创建表的语句)

代码如下:

show tables;
desc student;
show create table student;
4.删除表
drop table 表名; 
drop table if exists 表名; -- 如果存在则删除

代码如下:

drop table student; 
drop table if exists student;
5.更改表名称
rename table 原表名 to 新表名;

代码如下:

rename table student to user;
☀️四、数据 *** 作(增删改查) 1.新增 *** 作
全列插入:insert into 表名 values(...)
缺省插入:insert into 表名(字段1,...) values(值1,...)
同时插入多条数据:insert into 表名 values(...),(...)...;
或insert into 表名(字段1,...) values(值1,...),(值1,...)...;

注意:当表有自增长时,如果不手动插入数据,就需要把要插入的列名都写出来。。主键列是自动增长,但是在全列插入时需要占位,通常使用0,插入成功后以实际数据为准

代码如下:

insert into user values(2,'lisa',12,'2021-8-3') 
insert into user(name,age) values('lisa',12)

注意 : 添加数据的时候 , 后面的值要和前面的字段一一对应。

2.查询 *** 作
select */字段列表 from 表名 [where条件];

代码如下:

select * from user; -- 查询所有数据 
select * from user where name='lisa' -- 查询名字为lisa的所有信息 
select age from user where name='lisa' -- 查询名字为lisade 年龄
3.修改 *** 作
update 表名 set 字段 = 值 [where条件] ; -- 如果没有where条件会修改所有的行

代码如下:

update user set age=16 where name='lisa';

注意 : 要在后面加上 where 限定修改的条件 , 否则修改的就是全部的数据。

4.删除 *** 作
delete from 表名 [where条件]; -- where后不加条件默认删除的也是所有内容

代码如下:

delete from user where id=1; -- 根据条件删除 
delete from user; -- 删除表里面的所有内容

逻辑删除, 用一个字段来表示 这条信息是否已经不能再使用了

alter table students add isdelete bit default 0;
如果需要删除则
update students set isdelete=1 where …;

☀️五、表关系

将表与表的关系 , 反应到最终数据库表的设计上来可以将关系分成三种:一对一 , 一对多(多对一)和多对多

1.一对一
一对一 : 一张表的一条记录一定只能与另外一张表的一条记录进行对应; 反之亦然。

例 : 学员与坐位的关系 :

一个学员的坐位只有一个(张三的座位是一排一列 , 而李四的则是一排二列)。

2.一对多

一对多 : 一张表中有一条记录可以对应另外一张表中的多条记录; 但是返回过 , 另外一张表的一条记录只能对应第一张表的一条记录 , 这种关系就是一对多或者多对一。
例 : 地区和人员的关系 :

多个学员可能存在于同一个地区。

3.多对多
多对多 : 一张表中(A)的一条记录能够对应另外一张表(B)中的多条记录; 同时B表中的一条记录也能对应A表中的多条记录 , 这种关系就是多对多的关系。

例 : 学员和老师的关系 :

一个老师有多个学员 , 一个学员也会存在多个老师。

☀️六、MySQL查询 1.条件查询

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中

select * from 表名 where 条件;
(1)比较运算符 等于=大于>大于等于>=小于<小于等于<=不等于!=或<>

查询编号大于3的学生

select * from students where id>3;

查询编号不大于4的科目

select * from subjects where id<=4;

查询姓名不是“黄蓉”的学生

select * from students where sname!='黄蓉';

查询没被删除的学生

select * from students where isdelete=0;
(2)逻辑运算符 andornot

查询编号大于3的女同学

select * from students where id>3 and gender=0;

查询编号小于4或没被删除的学生

select * from students where id<4 or isdelete=0;
(3)模糊查询 like%表示任意多个任意字符_表示一个任意字符
查询姓黄的学生
select * from students where sname like '黄%';

查询姓黄的学生

select * from students where sname like '黄_';

查询姓黄的学生

select * from students where sname like '黄%' or sname like '%靖%';
(4)范围查询 in表示在一个非连续的范围内

查询编号是1或3或8的学生

select * from students where id in(1,3,8);
between … and …表示在一个连续的范围内

查询学生是3至8的学生

select * from students where id between 3 and 8;

查询学生是3至8的男生

select * from students where id between 3 and 8 and gender=1;

查询学生是3至8的学生

(5)空判断 注意:null与" "是不同的判空is null

查询没有填写地址的学生

select * from students where hometown is null;
判非空is not null

查询填写了地址的学生

select * from students where hometown is not null;

查询填写了地址的女生

select * from students where hometown is not null and gender=0;
(6)优先级 小括号>not>比较运算符>逻辑运算符and比or先运算,如果同时出现并希望先算or,需要结合()使用 2.聚合查询 为了快速得到统计数据,提供了5个聚合函数count(*)表示计算总行数,括号中写星与列名,结果是相同的

查询学生总数

select count(*) from students;
max(列)表示求此列的最大值

查询女生的编号最大值

select max(id) from students where gender=0;
min(列)表示求此列的最小值

查询未删除的学生最小编号

select min(id) from students where isdelete=0;
sum(列)表示求此列的和

查询男生的编号之后

select sum(id) from students where gender=1;
avg(列)表示求此列的平均值

查询未删除女生的编号平均值

select avg(id) from students where isdelete=0 and gender=0;
3.分组查询 按照字段分组,表示此字段相同的数据会被放到一个组中分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中可以对分组后的数据进行统计,做聚合运算
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

查询男女生总数

select gender as 性别,count(*)
from students
group by gender;

查询各城市人数

select hometown as 家乡,count(*)
from students
group by hometown;
->分组后的数据筛选
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...
having后面的条件运算符与where的相同

查询男生总人数

方案一
select count(*)
from students
where gender=1;
-----------------------------------
方案二:
select gender as 性别,count(*)
from students
group by gender
having gender=1;
->对比where与having where是对from后面指定的表进行数据筛选,属于对原始数据的筛选having是对group by的结果进行筛选 4.分页查询 当数据量过大时,在一页中查看数据是一件非常麻烦的事情
select * from 表名
limit start,count
从start开始,获取count条数据start索引从0开始 5.总结 完整的select语句
select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit star,count
执行顺序为:
from 表名
where ....
group by ...
select distinct *
having ...
order by ...
limit star,count
☀️七、MySQL高级 1.数据类型

2.关系 创建成绩表scores,结构如下id学生科目成绩思考:学生列应该存什么信息呢?答:学生列的数据不是在这里新建的,而应该从学生表引用过来,关系也是一条数据;根据范式要求应该存储学生的编号,而不是学生的姓名等其它信息
同理,科目表也是关系列,引用科目表中的数据

创建表的语句如下
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2)
);
3.外键 思考:怎么保证关系列数据的有效性呢?任何整数都可以吗?答:必须是学生表中id列存在的数据,可以通过外键约束进行数据的有效性验证为stuid添加外键约束
alter table scores add constraint stu_sco foreign key(stuid) references students(id);
此时插入或者修改数据时,如果stuid的值在students表中不存在则会报错在创建表时可以直接创建约束
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);
外键的级联 *** 作 在删除students表的数据时,如果这个id值在scores中已经存在,则会抛异常推荐使用逻辑删除,还可以解决这个问题可以创建表时指定级联 *** 作,也可以在创建表后再修改外键的级联 *** 作
alter table scores add constraint stu_sco foreign key(stuid) references students(id) on
delete cascade;
级联 *** 作的类型包括:
restrict(限制):默认值,抛异常
cascade(级联):如果主表的记录删掉,则从表中相关联的记录都将被删除
set null:将外键设置为空
no action:什么都不做
4.自关联 设计省信息的表结构 provincesidptitle 设计市信息的表结构citys idctitleproid citys表的proid表示城市所属的省,对应着provinces表的id值问题:能不能将两个表合成一张表呢?思考:观察两张表发现,citys表比provinces表多一个列proid,其它列的类型都是一样的意义:存储的都是地区信息,而且每种信息的数据量有限,没必要增加一个新表,或者将来还要存储区、乡镇 信息,都增加新表的开销太大答案:定义表areas,结构如下 idatitlepid 因为省没有所属的省份,所以可以填写为null城市所属的省份pid,填写省所对应的编号id这就是自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的,城市信息 的pid引用的是省信息的id在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息创建areas表的语句如下:
create table areas(
id int primary key,
atitle varchar(20),
pid int,
foreign key(pid) references areas(id)
);
从sql文件中导入数据
source areas.sql;
查询一共有多少个省查询省的名称为“山西省”的所有城市
select city.* from areas as city
inner join areas as province on city.pid=province.id
where province.atitle='山西省';
查询市的名称为“广州市”的所有区县
select dis.*,dis2.* from areas as dis
inner join areas as city on city.id=dis.pid
left join areas as dis2 on dis.id=dis2.pid
where city.atitle='广州市';
5.视图 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情解决:定义视图视图本质就是对查询的一个封装定义视图
create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;
视图的用途就是查询
select * from stuscore;
6.事务 当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个 *** 作都退回使用事务可以完成退回的功能,保证业务逻辑的正确性事务四大特性(简称ACID) 原子性(Atomicity):事务中的全部 *** 作在数据库中是不可分割的,要么全部完成,要么均不执行一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出 现故障 要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务查看表的创建语句
show create table students;
修改表的类型
alter table '表名' engine=innodb;
事务语句
开启begin;
提交commit;
回滚rollback;
☀️总结

本文经过自己所学加上参考一些资料整理而来,希望能帮助到大家,让各位兄弟姐妹们对数据库有一个深入的认识并能够熟练掌握,如果有哪个地方写得不好的欢迎指正呀!!!最后希望大家给个支持谢谢啦!!!❤️ 🌹 🌹 🌹

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/991034.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存