DQL 查询语句

排序

# 单列排序
  * 只按某一个字段进行排序,单列排序

# 组合排序
  * 同时对多个字段进行排序,如果第1个字段相等,则按照第2个字段排序,依次类推
  * 语法:

# 具体操作
  * 查询所有的数据,在年龄降序排序的基础上,如果年龄相同再按照数学成绩升序排序

聚合函数

之前我们做的查询都是横向查询,都是根据条件一行一行的进行判断。而使用聚合函数查询是纵向查询,是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值 NULL。

# 五个聚合函数

# 语法(我们发现对于 NULL 的记录不会统计,因此如果统计个数,不要使用有可能为 null 的列)

# 如果必须统计 NULL,可以使用 IFNULL() 函数,如果记录为 NULL,则给个默认值,这样统计的数据就不会遗漏。

# 具体操作

分组

# GROUP BY 怎么分组的?
  * 将分组字段结果中相同内容作为一组,如:按照性别将学生分成 2 组

# GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。
  * 分组的目的就是为了统计,因此分组后查询的字段一般就是 分组字段 和 聚合函数。

# 具体操作
  * 按性别进行分组,求男生和女生的数学平均分

  * 查询男女各有多少人,按性别分组

  * 查询年龄大于 25 岁的人,按性别分组,统计每组的人数

  * 查询年龄大于 25 岁的人,按性别分组,统计每组的人数,并只显示性别人数大于 2 的数据

# 注意:如果我们使用某个字段进行分组,那么在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪一组。

# having 和 where 的区别

# 面试题
  * Orders 表数据如下所示,执行如下 SQL 语句,运行结果是?

   * SELECT 
    product,
    sum(price)
   FROM
    orders
   GROUP BY
    product 
   WHERE
    sum(price) > 30;

limit 语句

# 准备数据

# limit 的作用
  * LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查询记录的条数

  * LIMIT 语法格式

# 具体操作
  * 查询学生表中的数据,从第 3 条开始显示,显示 6 条

# LIMIT 的使用场景
  * 分页:比如我们登录淘宝、京东,返回的商品信息可能有几万条,不是一次全部显示出来的,而是一页显示固定的条数。


# 开始索引的公式
  * 开始的索引 = (当前页码 - 1)* 每页显示的条数

# 注意:LIMIT 分页操作是 MySQL 的方言,在别的数据库中都有各自不同的分页语句

数据库备份和还原

备份的应用场景

# 在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补的。

备份与还原语句

# 备份格式:DOS 下,未登录的时候

# 还原格式:mysql 中的命令,需要登录后才可以操作

# 具体操作
  * 备份 day21 数据库中的数据到 d:\day21.sql 文件中(数据库中的所有表和数据都会导出成为 SQL 语句)

  * 还原 day21 数据库中的数据

图形化界面的备份与还原

# 备份数据库中的数据
  * 选中数据库,右键 “备份 / 导出”
  * 指定导出路径,保存成 .sql 文件即可

# 还原数据库中的数据
  * 删除数据库
  * 数据库列表区域右键 “执行 SQL 脚本”,指定要执行的 SQL 文件,执行即可。

数据库表的约束

数据库约束的概述

# 约束的作用
  * 对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。

# 约束的种类

主键约束

# 主键的作用
  * 用来唯一标识数据库中的每一条记录

# 哪个字段应该被设置为表的逐渐
  * 通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复且非空即可。
  * 身份证、学号等不建议设置成主键

# 创建主键
  * 关键字:PRIMARY KEY
  * 特点:
    1)非空  not null
    2)唯一 
  * 创建主键的方式
    1)在创建表的时候给字段添加主键

    2)在已有表中添加主键

# 具体操作
  * 创建学生表 st5,包含字段(id,name,age),将 id 设置成主键


# 删除主键

# 主键自增
  * 如果让我们自己添加主键很有可能重复,因此我们希望每次插入新记录时,数据库自动生成主键字段的值


# 修改自增长的默认起始值
  * 默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下列 SQL语法
    1)创建表时指定起始值

    2)创建好以后修改起始值


# DELETE 和 TRUNCATE 对自增长的影响
  * DELETE:删除所有记录后,自增长没有影响

  * TRUNCATE:删除以后,自增长又重新开始

唯一约束

# 什么是唯一约束?
  * 表中某一列不能出现重复的值

# 唯一约束的基本格式

# 删除唯一约束
  * ALTER TABLE 数据表名 DROP INDEX 列名;

# 实现唯一约束(唯一约束限定的列的值可以有多个 NULL)

非空约束

# 什么是非空约束?
  * 某一列不能为 NULL

# 非空约束的基本语法格式

# 具体实现

# 默认值

# 疑问:如果一个字段设置了非空与唯一约束,该字段与主键的区别?
  * 主键数在一个表中只能有一个。主键可以单列,也可以多列
  * 自增长只能用在主键上

外键约束

# 单表的缺陷
  * 创建一个员工表,包含字段(id,name,age,dep_name,dep_location),id 为主键并自动增长

  * 存在缺陷:
    1)数据冗余
    2)后期会出现增删改问题

# 解决方案


  * 问题:当我们在 employee 的 dep_id 里面输入不存在的部门,数据依然可以添加,但是并没有对应的部门。employee 的 dep_id 中的数据理论上只能是 department 表中存在的 id

  * 解决方式:使用外键约束

# 什么是外键约束
  * 一张表的外键是另一张表的主键,所以两张表就形成了关联关系
  * 什么是外键:在从表中与主表主键对应的那一列,如:员工表中的 dep_id
  * 主表:一方,用来约束别人的表
  * 从表:多方,被别人约束的表

# 创建约束的语法(外键可以为 NULL 但是不可以为主表主键中不存在的值)
  * 新建表时增加的外键

  * 已有表增加外键

# 具体操作(必须先创建主表,再创建从表)


# 删除外键

# 外键的级联
  * 出现新的问题:

  * 什么是级联操作:
     在修改和删除主表的主键时,同时更新或删除副标的外键值,称为级联操作。


# 数据约束小结

表与表之间的关系

表关系的概念

# 现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系

一对多

# 一对多(1 :n)
  * 例如:班级和学生,部门和员工,客户和订单,分类和商品

# 一对多建表原则:在从表(多方)创建一个字段,作为外键指向主表(一方)的主键

多对多

# 多对多(m :n)
  * 例如:老师和学生,学生和课程,用户和角色

# 多对多关系的建表原则:需要创建第三张表,中间表至少两个字段,这两个字段分别作为外键指向各自一方的主键

一对一

# 一对一(1 :1)
  * 在实际开发中应用不多,因为一对一可以创建成一张表

# 建表原则
  * 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一 UNIQUE
  * 外键是主键:主表的主键和从表的主键,形成主外键关系

一对多关系案例

# 需求:一个旅游线路分类中有多个旅游线路


# 具体操作


多对多关系案例

# 需求:一个用户收藏多个线路,一个线路被多个用户收藏


# 具体操作


表和表之间的关系小结

数据库设计

数据规范化

# 什么是范式
  * 好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据库的设计和存储,这些规则就是范式。

# 三大范式:
  * 目前关系型数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)
  * 满足最低要求的范式就是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式依此类推。一般说来,数据库只须满足第三范式(3NF)就足够了。

1NF

# 概念:
  * 数据库表的每一列都是不可分割的原子数据项,不能是集合、数组等非原子数据项。即表中的某个列有多个值时,必须拆分为不同的列。简言之,第一范式每一列不可再拆分,称为原子性。

# 示例

 学号  姓名  班级
 1  张三  一年级三班
 2  李四  一年级二班
 3  王五  一年级一班

2NF

# 概念:在满足 1NF 的基础上,非码属性必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)
  * 函数依赖:A -- > B,如果通过 A 属性(属性组)的值可以唯一确定 B 属性的值,则称 B 依赖于 A
    如: 学号 -- > 姓名, (学号 , 课程名称)-- > 分数
  * 完全函数依赖:A -- > B,如果 A 是一个属性组,则 B 属性值的确定需要依赖 A 属性组中的所有的属性值
  * 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
  * 当存在一个复合主键包含多个主键列的时候,才会发生不符合第二范式的情况。比如有一个主键有两个列,不能存在只依赖于其中一个列的情况,这就是不符合第二范式

# 示例:
  * 借书证表

 学生证号   学生名称   学生证办理时间   借书证号   借书名称  借书证办理时间

  * 分成两张表

 学生证号   学生名称   学生证办理时间 
 借书证号   借书名称  借书证办理时间

3NF

# 概念:
  * 在满足第二范式的前提下,表中的每一个列都直接依赖于主键,而不是通过其他列简介依赖于主键
  * 简言之,第三范式就是所有列不依赖于其他非主键列,也就是在满足 2NF 的基础上,任何非主列不得传递依赖于主键。
  * 所谓传递依赖,指的是如果存在“A -> B -> C” 的决定关系,则C传递以来于A。因此满足第三范式的数据库表应该不存在以下的依赖关系:主键列 -> 非主键列x -> 非主键列y

# 示例:
  * 学生信息表

 学号   姓名   年龄   所在学院   学院地点 

  * 存在的决定关系:
  学号(姓名) -> 所在学院 -> 学院地点
  * 拆分成两张表

 学号   姓名   年龄   所在学院的编号(外键)
 学院编号   所在学院   学院地点 

三大范式小结

MySQL 表的约束与数据库设计的更多相关文章

  1. Mysql表的约束设计和关联关系设计

    https://blog.csdn.net/u012750578/article/details/15026677 Mysql表的约束设计和关联关系设计 ======================表 ...

  2. Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束

    Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎:    MySQL中的数据用各种不同的技术存储在文件( ...

  3. MySql表、约束、视图

    MySql表.约束.视图 索引组织表 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表成为索引组织表(index organized table). 每张表都有主键,如果创建表 ...

  4. Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计

    Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计   二者服务的对象不一样 目的也是不一样的 商品分类是为商品服务的 用来管理商品 商品类型是为扩展属性服务的 用来管理属性 举例:[转] ...

  5. MySQL 约束和数据库设计

    1.MySQL 约束: 1.约束的概念: 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性. MySQL中,常用的几种约束: 约束类型: 非空 主键 唯一 外键 默认值 ...

  6. day39 python 学习 数据库学习 五个约束,数据库设计(一对一,一对多等等)

    删除重复数据:  注意数据库不能又查又删 *******#删除作者为重复数据并保留ID最大的是数据 delete from ren where author in (select * from(sel ...

  7. mySQL教程 第1章 数据库设计

    E-R设计 很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白.因此在学SQL语句之前,先介绍一下数据库设计. 下面举例 ...

  8. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

  9. MySQL优化技巧之四(数据库设计中的一些技巧)

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

随机推荐

  1. python对csv文件读写的两种方式 和 读写文件编码问题处理

    ''' 如果文件读取数据出错,可以考虑加一个encoding属性,取值可以是:utf-8,gbk,gb18030 或者加一个属性error,取值为ignore,例如 open(path, encodi ...

  2. JavaScript——二

    样式: 实验二. querySelectorAll()里面如果填id名称就直接写,如果要确定某个属性的值,就要用到[ ]来具体选择,其中写多个以空格隔开就表达第一个声明下的第二个标签内部的某个属性 这 ...

  3. K8S(09)交付实战-通过流水线构建dubbo服务

    k8s交付实战-流水线构建dubbo服务 目录 k8s交付实战-流水线构建dubbo服务 1 jenkins流水线准备工作 1.1 参数构建要点 1.2 创建流水线 1.2.1 创建流水线 1.2.2 ...

  4. npm/yarn查看当前使用源与设置其它源

    npm, yarn查看源和换源: npm config get registry // 查看npm当前镜像源 npm config set registry https://registry.npmj ...

  5. 十大排序算法时间复杂度 All In One

    十大排序算法时间复杂度 All In One 排序算法时间复杂度 排序算法对比 Big O O(n) O(n*log(n)) O(n^2) 冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 ...

  6. js script all in one

    js script all in one 你不知道的 js secret https://html.spec.whatwg.org/multipage/scripting.html https://h ...

  7. Express vs Koa

    Express vs Koa https://www.esparkinfo.com/express-vs-koa.html https://www.cleveroad.com/blog/the-bes ...

  8. js binary search algorithm

    js binary search algorithm js 二分查找算法 二分查找, 前置条件 存储在数组中 有序排列 理想条件: 数组是递增排列,数组中的元素互不相同; 重排 & 去重 顺序 ...

  9. PAUL ADAMS ARCHITECT:华州加州城市楼市竞争力居全美前列

    美国房地产公司最新一份报告显示,美国楼市竞争力最高的十个城市中有八个来自华盛顿州和加利福尼亚州,主要原因在于越来越多的买家考虑迁居房价更划算的都会区.数据显示,斯潘那维65%的房屋以高于要价的价格售出 ...

  10. BGV等 DeFi产品暴涨背后隐藏着什么?

    比特币突破两万七千美金,在此创造了历史.在比特币一路飙升的背后,到底是谁注入了"强心针".笔者认为今年以来推动BTC长期上涨的主要动力主要包括四个:经济形势恶化.央行大量放水(主要 ...