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

2023-09-16 18:05:52

1. 数据库操作-DQL

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

1.1 介绍

查询关键字:SELECT

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

 

1.2 语法

SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP  BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

1.3 基本查询

-- 查询多个字段

select 字段1, 字段2, 字段3 from  表名;


-- 查询所有字段(通配符)

select *  from  表名;

-- 设置别名

select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ]  from  表名;


-- 去除重复记录

select distinct 字段列表 from  表名;

1.4 条件查询

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

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

  • 比较运算符

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

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

1.5 聚合函数

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

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 排序查询

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

    • ASC :升序(默认值)

    • DESC:降序

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

1.8 分页查询

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

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

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

select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp
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语句操作

-- 创建表时指定
create table 表名(
	字段名    数据类型,
	...
	[constraint]   [外键名称]  foreign  key (外键字段名)   references   主表 (主表列名)	
);


-- 建完表后,添加外键
alter table  表名  add constraint  外键名称  foreign key(外键字段名) references 主表(主表列名);

方式2:图形化界面操作

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

物理外键和逻辑外键

  • 物理外键

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

    • 缺点:

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

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

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

  • 逻辑外键

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

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

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

2.2 一对一

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

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

 

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

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

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

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

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

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

2.3 多对多

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

案例:学生与课程的关系

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

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

 

更多推荐

EPC与5GC/5GS互联互通

一、5GS与EPC/E-UTRAN互通的非漫游架构1.N26接口是MME和5GSAMF之间的CN间接口,以实现EPC和NG核心之间的互通。网络中支持N26接口是可选的,用于互通。N26支持在S10上支持的功能的子集(对于互通是必要的)。2.PGW-C+SMF和UPF+PGW-U专用于5GS和EPC之间的互通,这是可选的

人工智能术语翻译(五)

文章目录摘要QRST摘要人工智能术语翻译第五部分,包括Q、R、S、T开头的词汇!Q英文术语中文翻译常用缩写备注QFunctionQ函数Q-LearningQ学习Q-NetworkQ网络QuadraticLossFunction平方损失函数QuadraticProgramming二次规划QuadraturePair象限对

Anaconda下Jupyter Notebook执行OpenCV中cv2.imshow()报错(错误码为1272)网上解法汇总记录和最终处理方式

零、我设备的相关信息Python3.8.8Anaconda32021.05查询匹配python3.8.*的OpenCV匹配版本为:4.1.*—4.2.*,我最后安装4.2.0.32版本如下我记录了“从发现问题,到不断试错,最后解决问题”的完整过程,以备自己复盘使用,大家不愿费时的可直接查看总结版的处理方式记录一、问题起

【CNN-FPGA开源项目解析】02--floatAdd16模块

文章目录前言浮点数加法的思路floatAdd16完整代码floatMult16代码逐步解析指数化为一致底数相加,处理进位溢出结果标准化和舍位整合为最后的16位浮点数结果[sign,exponent,fraction]其他变量宽度表特殊情况处理always敏感列表前言​上一篇文章(floatMult16模块解析)内,已经

深度剖析Linux信号机制

文章目录信号的概念信号的分类信号的产生方式从键盘获取通过系统调用硬件异常软件条件如何处理信号的到来信号的更深入剖析信号的处理动作是何时进行的?当有一大批同种信号到来时会怎样?Linux也提供了一批信号相关的系统调用信号的概念Linux中的信号是进程异步通信的一种方式。当某个信号发送到一个进程上,那么该进程就会分析该信号

java学习--day5 (java中的方法、break/continue关键字)

文章目录day4作业今天的内容1.方法【重点】1.1为什么要有方法1.2其实已经见过方法1.3定义方法的语法格式1.3.1无参无返回值的方法1.3.2有参无返回值的方法1.3.3无参有返回值的方法1.3.4有参有返回值的方法2.break和continue关键字2.1break;2.2continue;3.案例关于方法

7、DVWA——SQL盲注

文章目录一、概述二、low2.1通关思路(布尔盲注)(1)判断是否存在SQL注入漏洞(2)判断属于数字型注入还是字符型注入(3)判断结果集中的字段数(4)猜数据库名长度(5)猜数据库名(6)猜表的个数(7)猜第一个表名(8)猜user表中的字段个数、每个字段的长度、名称(9)猜字段内容2.2通关思路(时间盲注)(1)判

ASCII码对照表(十进制、八进制、十六进制、二进制的字符对照表)

ASCII(AmericanStandardCodeforInformationInterchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC646。ASCII第一次以规范标准的类型发表是在1967年,最后一次

Java实现添加文字水印、图片水印功能实战

Java实现添加文字水印、图片水印功能实战本文介绍java实现在图片上加文字水印的方法,水印可以是图片或者文字,操作方便。java实现给图片添加水印实现步骤:获取原图片对象信息(本地图片或网络图片)添加水印(设置水印颜色、字体、坐标等)处理输出目标图片1.java实现给图片添加文字水印1.1获取原图片对象信息第一步:获

不过是一棵红黑树(附源码)

前言红黑树,可谓是名号响当当的一种数据结构了。在数据结构学习的初期我们了解到了搜索二叉树,并且知道搜索二叉树的效率是非常之高的,在理想情况下10亿个数据中找一个值它也只需要30次左右,但是它尽管如此厉害可是也有不足的地方,在一些极端情况下,搜索二叉树可能会被退化成一棵单链表,那么此时它的效率就会大打折扣的变成O(n)。

IOTE 2023国际物联网展直击:芯与物发布全新定位芯片,助力多领域智能化发展

IOTE2023国际物联网展,作为全球物联网领域的盛会,于9月20日在中国深圳拉开帷幕。北斗星通集团应邀参展,旗下专业从事物联网、消费类GNSS芯片研发设计的芯与物公司也随其亮相本届盛会。展会上,芯与物展示了一系列创新的GNSS定位芯片产品,引领了国内定位技术的发展潮流。其市场总监黄秋菊女士揭幕了公司最新的产品CC11

热文推荐