一、数据库介绍
1.1 概述
数据库就是存储和管理数据的仓库,数据会按照一定的格式进行存储,用户可以对数据库中的数据进行增加、删除、修改、查询等操作。
1.2 分类
-
关系型数据库
- 指采用了关系模型来组织数据的数据库,简单来说,关系模型指的就是二维表格模型,好比 Excel 文件中的表格,强调使用表格的方式存储数据。
- 核心元素【数据行、数据列、数据表、数据库(数据表的集合)】
- 常用的数据库【Oracle、Microsoft SQL Sever、MySQL、SQLite】
-
非关系型数据库
- 又被称为 NoSQL(Not Only SQL),意思是不仅仅是 SQL,对 NoSQL 最普遍的定义是"非关联型的",强调 Key-Value 的方式存储数据。
- 常用的非关系型数据库【MongoDB、Redis】
1.3 作用
- 数据库的作用就是存储和管理数据,比如:我们在淘宝、京东等购物网站浏览的商品,这些数据都会存储在数据库。
1.4 特点
二、关系型数据库管理系统
2.1 介绍
数据库管理系统(英语全拼: Relational Database Management System,简称 RDBMS) 是为管理关系型数据库而设计的软件系统,也可以理解为它是一个应用软件。
2.2 分类
-
关系型数据库服务端软件
- 主要负责管理不同的数据库,而每个数据库里面会有一系列数据文件,数据文件是用来存储数据的,其实数据库就是一系列数据文件的集合。
-
关系型数据库客户端软件、
- 主要负责和关系型数据库服务端软件进行通信,向服务端传输数据或者从服务端获取数据。
三、SQL的介绍
3.1 概述
SQL(英语全拼:Structured Query Language) 是结构化查询语言,是一种用来操作RDBMS的数据库的语言,也就是说 SQL 可以操作 Oracle、Microsoft SQL Sever、MySQL、SQLite 等关系型的数据库。
3.2 作用
SQL 的作用是实现数据库客户端和数据库服务端之间的通信,也就是说 SQL 是通信的桥梁。
3.3 分类
- DQL:数据查询语言,用于对数据进行查询,如:select
- DML:数据操作语言,对数据进行增加、删除、修改,如:insert、update、delete
- TPL:事务处理语言,对事务进行处理,如:begin、transaction、commit、rollback
- DCL:数据控制语言,进行授权与权限回收,如:grant、revoke
- DDL:数据定义语言,进行数据库、表的管理等,如:create、drop
3.4 说明
- SQL 语言不区分大小写
- 对于程序员来说,重点是数据的增、删、改、查,必须熟练编写 DQL、DML,还能够编写 DDL 完成数据库、表的操作,其它操作如 TPL、DCL了解即可。
MySQL 数据库
一、介绍
1.1 概述
MySQL 是一个关系型数据库管理系统,在 Web 应用方面,MySQL 是最好的 RDBMS(英语全拼: Relational Database Management System,关系型数据库管理系统)应用软件,它是由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下产品,MySQL 是最流行的关系型数据库管理系统中的一个。
1.2 特点
- 开源,不需要支付额外的费用。
- 支持大型的数据库,可以处理拥有上千万条记录的大型数据库。
- 使用标准的 SQL 数据语言形式。
- 可以安装在不同的操作系统,并且提供多种编程语言的操作接口,包括 C、C++、Python、Java等等。
二、数据类型&约束
众所周知,数据库中的数据保存在数据表中,为了在表中更加准确的存储数据,保证数据的正确有效,开发者为表添加了一些强制性的验证,比如:数据类型、约束。
2.1 数据类型
数据类型是指在创建表的时候为表中字段指定数据类型,只有数据符合类型要求才能存储起来,使用数据类型的原则:够用就行,尽量使用取值范围小的,这样可以节省更多的存储空间。
-
常用数据类型
- 整数:int,bit
- 小数:decimal
- 字符串:varchar,char
- 日期时间:date,time,datetime
- 枚举类型:enum
-
说明
- decimal 表示浮点数,如:decimal(5,2) 表示共存5位数,小数占2位。
- char 表示固定长度的字符串,如 char(3),如果填充 ‘ab’ 时会补一个空格为 'ab ',3 表示字符数。
- varchar 表示可变长度的字符串,如 varchar(3),填充 ‘ab’ 时就会存储 ‘ab’,3 表示字符数。
- 字符串 text 表示存储大文本,当字符大于 4000 时推荐使用,比如技术博客。
- 对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径。
附录表
类型 | 字节大小 | 有符号范围(signed) | 无符号范围(Unsigned) |
---|
TINYINT(tinyint) | 1 | -128 ~ 127 | 0 ~ 255 | SMALLINT(smallint) | 2 | -32768 ~ 32767 | 0 ~ 65535 | MEDIUMINT(mediumint) | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | INT/INTEGER(int/integer) | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | BIGINT(bigint) | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
类型 | 说明 | 使用场景 |
---|
CHAR(char) | 固定长度,小型数据 | 身份证号、手机号、电话、密码 | VARCHAR(varchar) | 可变长度,小型数据 | 姓名、地址、品牌、型号 | TEXT(text) | 可变长度,字符个数大于 4000 | 存储小型文章或新闻 | LONGTEXT(longtext) | 可变长度,极大型文本数据 | 存储极大型文本数据 |
类型 | 字节大小 | 示例 |
---|
DATE(date) | 4 | ‘2021-01-01’ | TIME(time) | 3 | ‘12:29:59’ | DATETIME(datetime) | 8 | ‘2021-01-01 12:29:59’ | YEAR(year) | 1 | ‘2021’ | TIMESTAMP(timestamp) | 4 | ‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-01 00:00:01’ UTC |
2.2 数据约束
约束是指数据在数据类型限定的基础上额外增加的要求。
- 常见的约束
- 主键
primary key :物理上存储的顺序,MySQL 建议所有表的主键字段都叫 id ,类型为 int unsigned。 - 自动增加
auto_increment :必须先定义了键,如:foreign key、primary key,才能使用自动增加,使用时该字段的数据类型必须是整数类型,一个表中只能由一个自动增长字段。 - 非空
not null :此字段不允许填写空值。 - 唯一
unique :此字段的值不允许重复。 - 默认
default :当不填写字段对应的值会使用默认值,如果填写时以填写为准。 - 外键
foreign key :对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,不存在则填写失败并抛出异常。
三、命令行客户端 MySQL
3.1 登录&退出
mysql -u root -p;
-u 后面是登录的用户名
-p 后面时登录密码,如果不填写,回车之后会提示输入密码
quit 或 exit 或 ctrl + d
3.2 数据库操作的 SQL 语句
show databases;
create database 数据库名 charset=utf8;
例:
create database python charset=utf8;
use 数据库名;
select database();
drop database 数据库名;
3.3 表结构操作的 SQL 语句
show tables;
create table 表名(
字段名称 数据类型 可选的约束条件,
字段名称 数据类型 可选的约束条件,
...
);
例: 创建一个学生表,添加学号(id),姓名(name),性别(gender)字段
create table student(
id int primary key auto_increment,
name varchar(20),
gender enum('男','女','保密')
);
add: 增加
alter table 表名 add 字段名 类型 约束;
modify: 只能修改字段类型或约束,不能修改字段名
alter table 表名 modify 字段名 类型 约束;.
change: 既能修改字段名还能修改字段类型和约束
alter table 表名 change 字段原名 字段新名 类型 约束;
drop: 可以删除字段名
alter table 表名 drop 字段名;
show create table 表名;
show create database 数据库名;
alter table 旧表名 rename to 新表名;
drop table 表名;
3.4 表数据操作的SQL语句
1. 查询所有字段
select * from 表名;
2. 查询指定字段
select 字段名1,字段名2... from 表名;
1. 为表中所有字段添加数据,值的顺序需要与结构字段的顺序完全一一对应
insert into 表名 values(值1,值2...);
2. 为表中所有字段添加多个数据,值的顺序需要与结构字段的顺序完全一一对应
insert into 表名 values(值1,值2...),(值1,值2...),(值1,值2...)...;
3. 对表中指定的字段添加数据,值的顺序需要与指定的字段名顺序完全一一对应
insert into 表名(字段名1,字段名2) values(值1,值2);
4. 对表中指定的字段添加多条数据,值的顺序需要与指定的字段名顺序完全一一对应
insert into 表名(字段名1,字段名2) values(值1,值2),(值1,值2)....;
说明:
1. 如果有字段是主键自动增长类型,那么在为表中所有字段添加数据时需要占位,通常使用空值(0 或者 null 或者 default)来进行占位。
2. 为所有字段添加数据时,如果其中一个字段列有默认值可以使用 default 来占位。
update 表名 set 字段名1=值1,字段名2=值2... where 条件;
delete from 表名 where 条件
四、基本查询
4.1 as 和 distinct 关键字
使用 SQL 语句显示结果时,显示的字段名不具备良好的可读性,这时,我们可以使用 as 给字段起一个别名
1. 使用 as 给字段起别名
select id as 序号,name as 名字,gender as 性别 from 表名;
2. 使用 as 给表起别名
1) 如果是单表查询,可以省略表名
select 字段名1,字段名2... from 表名;
2) 表名.字段名 示例:
select 表名.字段名1,表名.字段名2... from 表名;
2) 使用 as 给表起别名 示例:
select 别名.字段名1,别名.字段名2... from 表名 as 别名;
distinct : 去除重复数据行
select distinct 字段名1,字段名2... from 表名;
4.2 where 条件查询
使用 where 条件查询主要作用于对表中的数据进行筛选,获取到想要的结果。
select * from 表名 where 条件;
where 语句支持的运算符【比较运算符、逻辑运算符、模糊查询、范围查询、空判断】
比较运算符分别有【=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、!=(不等于)、<>(不等于)】
举例
1. 查询 编号字段 大于等于 5 的数据;
select * from 表名 where 编号字段名 >= 5;
2. 查询 编号字段 不等于 2 的数据;
select * from 表名 where 编号字段名 != 2;
比较好理解就不过多介绍了
逻辑运算符包括【and、or、not】
举例
1. 查询 编号字段大于5 并且 性别字段为女 的数据;
select * from 表名 where 编号字段名 >= 5 and 性别字段名 = '女';
- 模糊查询
- like:模糊查询关键字
- %:表示任意多个任意字符
- _: 表示一个任意字符
举例
1. 查询 姓名字段 姓为张 的数据;
select * from 表名 where 姓名字段名 like '张%';
2. 查询 姓名字段 姓为张 名是一个字 的数据;
select * from 表名 where 姓名字段名 like '张_';
- 范围查询
- between … and … 表示在一个连续的范围内查询
- in 表示在一个非连续的范围内查询
1. 查询 编号字段 3 到 6 的数据;
select * from 表名 where 编号字段名 between 3 and 6;
2. 查询 编号字段 3 和 6 的数据;
select * from 表名 where 编号字段名 in (3,6);
- 空判断查询
- 判断为空使用:is null
- 判断非空使用:is not null
1. 查询 年龄字段 内容为空 的数据;
select * from 表名 where 年龄字段名 is null;
2. 查询 年龄字段 内容不为空 的数据;
select * from 表名 where 年龄字段名 is not null;
注意:
> 不能使用 where 字段名 = null 判断为空
> 不能使用 where 字段名 != null 判断非空
> null 不等于 '' 空字符串
4.3 排序
select * from 表名 order by 字段名1 desc [字段名2 desc];
说明:
1. 先按照 字段名1 进行排序,如果 字段名1 的值相同时,则按照 字段名2 排序,以此类推
2. asc 从小到大排序,即升序
3. desc 从大刀小排序,即降序
4. 默认按照 字段名值 从小到大排序 (即 asc 关键字)
1. 查询 所有信息,按 年龄字段 升序排序;
select * from 表名 order by 年龄字段名;
2. 查询 所有信息,按 年龄字段 降序排序;
select * from 表名 order by 年龄字段名 desc;
4.4 分页
select * from 表名 limit start,count
说明:
1. limit 是分页查询关键字
2. start 表示开始行索引,默认为0
3. count 表示查询条数
1. 查询 表中前3条 数据;
select * from 表名 limit 0,3;
也可以这样写
select * from 表名 limit 3;
已知每页显示 m 条数据,求第 n 页显示的数据 分析:需要求每页的开始行索引
select * from 表名 limit (n-1)*m,m;
4.5 分组
select 字段名 from 表名 group by 字段名 having 条件;
说明:
1. group by 是分组查询的关键字
2. having 也是关键字,都是和 group by 一起使用,主要用于筛选,后面也可以是聚合函数
1. 对 学生表 中的 性别字段 进行分组,并统计各组有多少人
select 性别字段名,count(*) from 学生表 group by 性别字段名
2. 对 学生表 中的 成绩字段 进行分组,筛选出大于60分的组,并统计各组有多少条数据
select 成绩字段名,count(*) from 学生表 group by 成绩字段名 having 成绩字段名 > 60;
注意: 使用 group by 分组查询关键字后,查询列表建议只出现分组字段和聚合函数
五、聚合函数
5.1 介绍
聚合函数又叫组函数,通常是对表中的数据进行统计结果计算,一般结合分组 (group by) 来使用,用于统计和计算分组数据。
-
常用的聚合函数
- count(col):表示求指定 字段 的总条数
- max(col):表示求指定 字段 的最大值
- min(col):表示求指定 字段 的最小值
- sum(col):表示求指定 字段 的和
- avg(col):表示求指定 字段 的平均值
-
举例
1. 求 姓名字段 总条数
select count(姓名字段名) from 表名;
2. 求 年龄字段 最大值
select max(年龄字段名) from 表名;
3. 求 年龄字段 最小值
select min(年龄字段名) from 表名;
4. 求 身高字段 的和
select sum(身高字段名) from 表名;
5. 求 身高字段 的平均值
select avg(身高字段名) from 表名;
如果 身高字段 中的值有 null 时,需要这样写
select avg(ifnull(身高字段名,新的值)) from 表名;
说明:
> ifnull 函数: 表示判断指定字段的值是否为 null,如果为空使用自己提供的值
> 聚合函数默认忽略字段为 null 的记录,要想 指定字段的值为 null 的记录也参与计算,必须使用 ifull 函数对 null 值做替换。
六、连接查询
连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成。
连接查询包括【内连接查询、左连接查询、右连接查询、自连接查询】
6.1 内连接查询
查询两个表中符合条件的共有记录
select 字段名 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2;
说明:
1. inner join 就是内连接查询关键字
2. on 就是连接查询条件
使用 内连接 查询学生表与班级表
select * from 学生表 inner join 班级表 on 学生表.字段名 = 班级表.字段名;
6.2 左连接查询
以左表为主,根据条件查询右表中的数据,如果根据条件查询右表的数据不存在时使用 null 填充
select 字段名 from 表1 left join 表2 on 表1.字段1 = 表2.字段2
说明:
1. left join 就是左连接查询关键字
2. on 就是连接查询条件
3. 表1 是左表
4. 表2 是右表
使用 左连接 查询学生表与班级表
select * from 学生表 left join 班级表 on 学生表.字段名 = 班级表.字段名;
6.3 右连接查询
以右表为主,根据条件查询左表中的数据,如果根据条件查询左表的数据不存在时使用 null 填充
select 字段名 from 表1 right join 表2 on 表1.字段1 = 表2.字段2;
说明:
1. right join 就是右连接查询关键字
2. on 就是连接查询条件
3. 表1 是左表
4. 表2 是右表
使用 右连接 查询学生表与班级表
select * from 学生表 right join 班级表 on 学生表.字段名 = 班级表.字段名;
6.4 自连接查询
左表和右表是同一个表,根据连接查询条件查询两个表中的数据
select 表1别名.字段名,表2别名.字段名... from 表1 as 表1别名 right join 表2 as 表2别名 on 表1别名.字段1 = 表2别名.字段2;
说明:
> 自连接查询必须对表起别名
6.5 子查询
在一个 select 语句中,嵌入了另外一个 select 语句,那么被嵌入的 select 语句称之为子查询语句,外部那个 select 语句则称为主查询。
-
主查询和子查询的关系
- 子查询是嵌入到主查询中
- 子查询是辅助主查询的,要么充当条件,要么充当数据源
- 子查询是可以独立存在的语句,是一条完整的 select 语句
-
语法格式
select * from 表名 where 字段名 条件 (select * from 表名);
查询 大于平均年龄 的 学生表
select * from 学生表 where 年龄字段 > (select avg(年龄字段) from 学生表);
能不能续更就看你们啦 🤣
|