前言❤️❤️
hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
这部分是对数据库知库基础知识的整理复习,供铁汁们在学习完前面几部分后复习使用,这篇博客中的知识如果掌握不太牢固,数据库专栏的博客中有详细解析,铁汁们可以详细复习下🐵
🎇个人主页:洋不写bug的博客
🎇所属专栏:数据库
🎇mysql8.0和navicate的安装:mysql安装教程
🎇铁汁们对于MySQL数据库的各种常用核心语法,都可以在上面的数据库专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~
1,命令复习
- 查看当前数据库的版本 select version ();
- 显示所有的数据库 show databases;
- 创建数据库 create database [if not exists] 数据库名 character set 字符编码集 collate 排序规则;
- 选择数据库 use 数据库名;
- 查看当前选择的数据库 select database ();
- 修改当前数据库 alter database 数据库名 character set 字符编码集 collate 排序规则;
- 删除数据库 drop database [if exists] 数据库名;
- 查看警告信息 show warnings;
2,表操作
- 查看数据库中包含哪些表 show tables;
- 创建表 create table [if not exists] 表名 (列名 数据类型 约束 注解 [, 列名 数据类型 约束 注解]);
- 查看表结构 desc 表名;
- 查看创建表的语句 show create table 表名;
- 修改表 alter table 表名 {add | modify | drop | rename} 列 [列名 数据类型 约束 注解];
- 删除表 drop table [if exists] 表名;
3,CRUD增删改查
1.新增 - 插入
-
insert into 表名 [(列名 [, 列名...])] values (值 [, 值...]);指定了多少列名,就需要指定多少值,值与列名一 一对应
-
如果不指定列名,值的顺序就要与创建表时列的顺序一 一对应
-
2.删除
-
delete from 表名 where 条件 order by 列名 limit num; // 如果不指定条件会删除表中所有的数据
-
3.更新
-
update 表名 set 列名 = 值 [, 列名 = 值]... where 条件 order by 列名 limit num; // 如果不指定条件会更新表中所有的数据
4.查询
- a. 全列查询 select * from 表名;// 不加限制的查询会把整个表中的数据都查出来
- b. 指定列查询 select 列名 [, 列名...] from 表名;// 推荐指定列查询
- c. 列为表达式 select 列名 | 表达式 from 表名;
- d. 别名查询 select 列名 | 表达式 [as] 别名 from 表名 [as] 别名;// 别名中如果包含空格要用引号
- e. 去重查询 select distinct 列名 from 表名;// 查询结果中所有的列都重复才会去重
- f. 排序 select * from 表名 order by 列名 | 表达式 {ASC | DESC}; // ASC 升序 DESC 降序
- g. 条件查询 select * from 表名 where 列名 | 表达式 比较 | 逻辑运算符;// 多个条件可以用 and 或 or 连接
- h. 区间查询 select * from 表名 where 列名 | 表达式 between 开始条件 and 结束条件;// 开始条件 <= 列名 <= 结束条件
- i. 模糊查询 select * from 表名 where 列名 like ' 值_%'; // % 匹配所有字符,_匹配单个字符
- j. 分页查询 select * from 表名 where 条件 order by 列名 asc|desc limit num; // 查询前 num 条记录
select * from 表名 where 条件 order by 列名 asc|desc limit start, num; // 从 start 条开始向后查 num 条记录
select * from 表名 where 条件 order by 列名 asc|desc limit num offset start; // 从 start 条开始向后查 num 条记录
4,数据库约束
- 非空约束:NOT NULL 标识一个列是否可以为空,指定了非空约束之后,当前列的值就不能为 NULL
- 唯一约束:UNIQUE 标记一个列的内容是否在表中唯一,列的值不能重复但是可以为 NULL
- 主键约束:PRIMARY KEY 在校验的规则与是 NOT NULL + UNIQUE 的组合,建议为每张表设置一个主键
- 主键列的数据类型建议为 BIGINT,可以为主键列设置自增 AUTO_INCREMENT
- 外键约束:FOREIGN KEY 一个表中的列与另一个表中的列有关联关系,当对表中的数据进行增删改的时候数据库会帮我们进行校验
- 默认约束:DEFAULT 当一个列没的指定具体的值时,就会用默认值去填充,当手动指定了 NULL 时默认值不生效
- CHECK 约束:CHECK 对当前列的值的合法性进行校验,8.0 之后才生效,5.0 的版本中允许定义但不生效
5,三大范式
- 第一范式:要求表中的每个列不可再分,不能满足第一范式的数据库不是关系型数据库如果表中的每个列都可以用 SQL 中的简单数据类型描述就天然满足第一范式
- 第二范式:出现在有复合主键的表中,在第一范式的基本上消除了部分函数依赖,
- 第三范式:在第二范式的基本上,消除传递依赖,为不同的实单独建即可
6,关系模型
- 一对一关系:为每个实体创建单独的表,在其中一张表中加一个列与别一张表进行关联
- 一对多关系:为每个实体创建单独的表,在从表中 (多方) 加一个列与主表 (一方) 进行关联
- 多对多关系:为每个实体创建单独的表,另外再创建一张关系表单独维护两张表之间的关系
- 没有关系:单独的表
7,聚合函数,分组查询,having子句
- COUNT (列 /*) 统计结果的条数
- SUM (列) 求和
- AVG (列) 求平均值
- MAX (列) 求最大值
- MAIN (列) 求最小值
- GROUP BY 分组查询
- 对某一个列进行分组,然后对分组结果进行聚合运行select 分组列,聚合函数 (其他列) from 表名 group by 分组列
8,连接查询
1.内连接
sql
select * from table1, table2... where table1.列名 = table2.列名;
sql
select * from table1 [inner] join table2 on table1.列名 = table2.列名;
表连接的执行过程:
- 先计算参与表的笛卡尔积
- 通过连接条件过滤无效数据
- 通过 where 进一步过滤数据
- 精减查询列表得到想要的数据
2. 外连接 分为左外连接和右外连接
以左表为基准表
sql
select * from table1 left join table2 on table1.列名 = table2.列名;
以右表为基准表
sql
select * from table1 right join table2 on table1.列名 = table2.列名;
先确定哪个是基准表,基准表中的数据都会被显示出来,关联表中如果没有与之匹配的数据行则以 NULL 填充
3. 自连接
sql
select * from table1 t1, table1 t2 where t1.列名 = t2.列名;
把行转换为列,在查询的时候可以使用 WHERE 条件进行比较(实现了行与行之间的比较)
9,子查询
- 单行子查询:
sql
select * from 表名 where id = (select id from 表名1 where xxx);
- 多行子查询
sql
select * from 表名 where id IN (select id from 表名1 where xxx);
- 多列子查询
sql
select * from 表名 where (列1,列2 [,列3]) IN (select 列1,列2 [,列3] from 表名1 where xxx);
内层查询的结果是外层查询的条件,把多条 SQL 可以合并为一条
子查询可以无限嵌套,层数过多可能会严重影响效率
10,合并查询
- union过滤掉了重复的行
sql
select * from table1 union select * from table2;
- union all不会过滤掉重复的行
sql
select * from table1 union all select * from table2;
- 把两个查询的结果合并在一起返回给客户端
注意:合并查询的查询列表必须要保持一致,MYSQL 并不会过查询列表进行检测
11,SQL 语句中各部分的执行顺序
sql
select distinct id, name, avg(age)
from student
join class
on student.class_id = class.id
where class.id = 1
group by class.id
having avg(age) > 10
order by student.id asc limit 100;
执行顺序:FROM --> JOIN ON --> WHERE --> GROUP BY --> HAVING --> SELECT --> DISTINCT --> ORDER BY --> LIMIT
- 先找出是在哪些表中查询,并在这些表之间建立关系,from 和join on
- 接着执行where,进一步进行匹配
- 进行分组,分组后执行having子句,进一步筛选
- 进行查询,并且用distinct过滤掉重复项
- 全部查询完成后再进行排序,最后是控制显示几条数据
结语💕💕
数据库的基础知识中没有很难理解的,就是知识比较杂,比较多,铁汁们多敲代码,很快就能掌握💪
以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

