SQL

156 阅读5分钟

数据库连接

大部分情况下,要符合数据库设计规范,数据不可能集中在同一张表里,那样的话会产生数据冗余,但是分成多张表会造成取数比较麻烦,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、最后当做是一个虚拟表一样来加上条件即可。

场景举例: 无标题艾弗森客户发货佛萨符号.png

临时表

临时表只在当前连接可见,当关闭连接时,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 :按照什么样的顺序来查看返回的数据

分区和分表