• 数据库开发-MySQL基础DQL和多表设计


    1. 数据库操作-DQL

    DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。

    1.1 介绍

    查询关键字:SELECT

    查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP所看到的展示信息,都是通过从数据库中查询得到的,而在这个查询过程中,还会涉及到条件、排序、分页等操作。

     

    1.2 语法

    1. SELECT
    2. 字段列表
    3. FROM
    4. 表名列表
    5. WHERE
    6. 条件列表
    7. GROUP BY
    8. 分组字段列表
    9. HAVING
    10. 分组后条件列表
    11. ORDER BY
    12. 排序字段列表
    13. LIMIT
    14. 分页参数

    1.3 基本查询

    1. -- 查询多个字段
    2. select 字段1, 字段2, 字段3 from 表名;
    3. -- 查询所有字段(通配符)
    4. select * from 表名;
    5. -- 设置别名
    6. select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;
    7. -- 去除重复记录
    8. select distinct 字段列表 from 表名;

    1.4 条件查询

    select  字段列表  from   表名   where   条件列表 ; -- 条件列表:意味着可以有多个条件

    学习条件查询就是学习条件的构建方式,而在SQL语句当中构造条件的运算符分为两类:

    • 比较运算符

    • 比较运算符功能
      >大于
      >=大于等于
      <小于
      <=小于等于
      =等于
      <> 或 !=不等于
      between ... and ...在某个范围之内(含最小、最大值)
      in(...)在in之后的列表中的值,多选一
      like 占位符模糊匹配(_匹配单个字符, %匹配任意个字符)
      is null是null
    • 逻辑运算符

    逻辑运算符功能
    and 或 &&并且 (多个条件同时成立)
    or 或 ||或者 (多个条件任意一个成立)
    not 或 !非 , 不是

    1.5 聚合函数

     查询都是横向查询,就是根据条件一行一行的进行判断,而使用聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)

    1. select 聚合函数(字段列表) from 表名 ;

     注意 : 聚合函数会忽略空值,对NULL值不作为统计。

    常用的聚合函数

    函数功能
    count统计数量
    max最大值
    min最小值
    avg平均值
    sum求和

    1.6 分组查询

    分组: 按照某一列或者某几列,把相同的数据进行合并输出。

    分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。

    分组查询通常会使用聚合函数进行计算。

     

    select  字段列表  from  表名  [where 条件]  group by 分组字段名  [having 分组后过滤条件];

    注意事项:

    • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

    执行顺序:where > 聚合函数 > having

    where与having区别(面试题)

    • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。

    • 判断条件不同:where不能对聚合函数进行判断,而having可以。

    1.7 排序查询

    1. select 字段列表
    2. from 表名
    3. [where 条件列表]
    4. [group by 分组字段 ]
    5. order by 字段1 排序方式1 , 字段2 排序方式2 … ;
    • 排序方式:

      • ASC :升序(默认值)

      • DESC:降序

     注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

    1.8 分页查询

    分页操作在业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作。

    select  字段列表  from   表名  limit  起始索引, 查询记录数 ;

    案例1:从起始索引0开始查询员工数据, 每页展示5条记录

    1. select id, username, password, name, gender, image, job, entrydate, create_time, update_time
    2. from tb_emp
    3. limit 0 , 5; -- 从索引0开始,向后取5条记录

    注意事项:

    1. 起始索引从0开始。 计算公式 : 起始索引 = (查询页码 - 1)* 每页显示记录数

    2. 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT

    3. 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 条数

    if(表达式, tvalue, fvalue) :当表达式为true时,取值tvalue;当表达式为false时,取值fvalue

    case 表达式 when 值1 then 结果1 [when 值2 then 结果2 ...] [else result] end  

    2. 多表设计

    项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

    • 一对多(多对一)

    • 多对多

    • 一对一

    2.1 一对多

    一对多关系实现:在数据库表中多的一方,添加字段,来关联属于一这方的主键。

    2.1.2 外键约束

    外键约束:让两张表的数据建立连接,保证数据的一致性和完整性。

    对应的关键字:foreign key

    方式1:通过SQL语句操作

    1. -- 创建表时指定
    2. create table 表名(
    3. 字段名 数据类型,
    4. ...
    5. [constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
    6. );
    7. -- 建完表后,添加外键
    8. alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);

    方式2:图形化界面操作

     外键约束(foreign key):保证了数据的完整性和一致性。

    物理外键和逻辑外键
    • 物理外键

      • 概念:使用foreign key定义外键关联另外一张表。

      • 缺点:

        • 影响增、删、改的效率(需要检查外键关系)。

        • 仅用于单节点数据库,不适用与分布式、集群场景。

        • 容易引发数据库的死锁问题,消耗性能。

    • 逻辑外键

      • 概念:在业务层逻辑中,解决外键关联。

      • 通过逻辑外键,就可以很方便的解决上述问题。

    在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。 甚至在一些数据库开发规范中,会明确指出禁止使用物理外键 foreign key

    2.2 一对一

    一对一关系表在实际开发中应用起来比较简单,通常是用来做单表的拆分,也就是将一张大表拆分成两张小表,将大表中的一些基础字段放在一张表当中,将其他的字段放在另外一张表当中,以此来提高数据的操作效率。

    一对一的应用场景: 用户表(基本信息+身份信息)

     

    • 基本信息:用户的ID、姓名、性别、手机号、学历

    • 身份信息:民族、生日、身份证号、身份证签发机关,身份证的有效期(开始时间、结束时间)

    如果在业务系统当中,对用户的基本信息查询频率特别的高,但是对于用户的身份信息查询频率很低,此时出于提高查询效率的考虑,我就可以将这张大表拆分成两张小表,第一张表存放的是用户的基本信息,而第二张表存放的就是用户的身份信息。他们两者之间一对一的关系,一个用户只能对应一个身份证,而一个身份证也只能关联一个用户。

    那么在数据库层面怎么去体现上述两者之间是一对一的关系呢?

    其实一对一我们可以看成一种特殊的一对多。一对多我们是怎么设计表关系的?是不是在多的一方添加外键。同样我们也可以通过外键来体现一对一之间的关系,我们只需要在任意一方来添加一个外键就可以了。

    一对一 :在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)  

    2.3 多对多

    多对多的关系在开发中属于也比较常见的。比如:学生和老师的关系,一个学生可以有多个授课老师,一个授课老师也可以有多个学生。在比如:学生和课程的关系,一个学生可以选修多门课程,一个课程也可以供多个学生选修。

    案例:学生与课程的关系

    • 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

    • 实现关系:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

     

  • 相关阅读:
    macOS 的「预览」有几种用法
    独立站如何从0到1新手独立站卖家必看闭环流程
    【Day17】Java算法刷题 【面试题 01.08. 零矩阵】 【844. 比较含退格的字符串】
    Redis List类型命令 - Set类型命令 - SortedSet类型命令
    oracle如果不适用toad或者plsql工具如何获取索引建表语句
    蓝桥杯刷题6--二分法
    面试必备!TCP协议经典十五连问!
    Docker的数据管理(数据卷,容器互联)
    【题解】2023 DTS算法竞赛集训 第1次
    一种通过注解处理数据权限设计整理
  • 原文地址:https://blog.csdn.net/weixin_38189581/article/details/132921514