数据库连接
大部分情况下,要符合数据库设计规范,数据不可能集中在同一张表里,那样的话会产生数据冗余,但是分成多张表会造成取数比较麻烦,join(连接)就是为解决上述问题的一种语法。
左连接、右连接、内连接、外连接、全连接
- 左连接:
select * from tbl1 Left Join tbl2 where [tbl1.ID]
左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据。左表的全部加上右表满足要求的部分。 - 右连接:
select * from tbl1 Right Join tbl2 where [tbl1.ID]检索结果是tbl2的所有数据和tbl1中满足where 条件的数据。右表的全部加上左表满足要求的部分。
内连接和外连接
内连接:也被称为自然连接,查询两张表的交集。 只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。由于内连接是从结果表中删除与其他连接表中没有匹配的所有行,所以内连接可能会造成信息的丢失。
外连接:外连接查询两张 表的并集,外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行。
- 左(外)连接:
- 右(外)连接:
全连接:FULL JOIN
显示两侧表中所有满足检索条件的行
笛卡尔积
数据库联合查询
数据库设计三大范式
设计数据库目的:能够满足数据的存储和查询需求,帮助减少数据冗余、提高数据的一致性和完整性。
设计流程:业务需求理解建模ER图表结构——>场景存储引擎选择(InnoDB/MyISAM) ——>字段设计——>主键和索引设计——>表关系设计——>分表与分库设计(垂直/水平)——>事物和锁的设计
字段设计注意点:
- 存储空间更小类型:TINYINT/SMALLINT代替INT、VARCHAR代替TEXT。
- 浮点数精度问题:金额使用DECIMAL类型
- 避免定义过长字段长度
- 第一范式
- 添加约束(NOTNULL\UNIQUE)保证数据完整性、添加合理默认值减少空值处理。
主键和索引设计注意点:
- 主键:自增or全局唯一业务字段,避免过长or频繁更新字段
- 索引:优先设置经常查询字段。控制索引数量。
表关系设计:
- 遵循三大范式减少数据冗余。
- 高性能场景下,反范式化、增加冗余字段降低查询复杂度
- 使用中间表实现多对多关系
- 尽量避免物理外键、改用逻辑外键。
三大范式
- 第一范式:所有属性都是原子不可再分
- 第二范式:满足第一范式并且保证每一列依赖主键相关的(如果是联合主键的话,就需要依赖联合主键的所有)
- 第三范式:确保每个列都是直接依赖主键而不存在间接依赖
当出现情形2,3时:拆分表 外键用于与另一张表的关联,是能确定另一张表记录的字段
查询时通过多表联合查询:
原理:
1、先确定数据要用到哪些表。
2、将多个表先通过笛卡尔积变成一个表。
3、然后去除不符合逻辑的数据。(根据两个表的关系去掉)
4、最后当做是一个虚拟表一样来加上条件即可。
场景举例:
临时表
临时表只在当前连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。
手动删除临时表:DROP TEMPORARY TABLE IF EXISTS temp_tb;
创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如:CREATE TEMPORARY TABLE
表与表之间的三种关系
-
一对一:
两个表之间每行与每行有唯一对应的关系。一对一关系是比较少见的关系类型。但在某些情况下,还是会需要使用这种类型。
情况一:一个表包含了太多的数据列
情况二:将数据分离到不同的表,划分不同的安全级别。
情况三:将常用数据列抽取出来组成一个表 -
一对多
有多张表,第一个表中的行可以与第二个表中的一到多个行相关联,但是第二个表中的一行只能与第一个表中的一行相关联。(第二张表与第三张表的关系同一二)最常见关系类型
-
多对多
有两个表,第一个表的一行可以与第二个表中的一到多个行相关联,同时,第二个表中的一行可以与第一个表中的一到多个行相关联。举例:一张唱片包含多首歌,同时一首歌可以属于多张唱片。
通常来说,"多对多关系"需要有一张中间表,记录另外两张表之间的对应关系。比如,单曲Track和歌单Playlist之间,就是多对多关系:一首单曲可以包括在多个歌单,一个歌单可以包括多首单曲。数据库实现的时候,就需要一张playlist_track表来记录单曲和歌单的对应关系。
where、jion、limit、group by、having执行顺序
- from:需要从哪个数据表检索数据
- where:过滤表中数据的条件
- group by:如何将上面过滤出的数据分组
- having:对上面已经分组的数据进行过滤的条件
- select:查看结果集中的哪个列,或列的计算结果
- order by :按照什么样的顺序来查看返回的数据