javaWeb从入门到进阶(MYSQL-DQL)

前言:补充一下前面DML的增删改查

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。

insert语法

指定字段添加数据:insertinto表名(字段名1,字段名2)values(值1,值2);

全部字段添加数据:insert into表名values(值1,值2,...);

批量添加数据(指定字段):insert into表名(字段名1,字段名2) values (值1,值2),(值1,值2);

批量添加数据(全部字段):insert into表名values(值1,值2,...),(值1,值2...);

注意事项
++插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
2.字符串和日期型数据应该包含在引号中。
3.插入的数据大小,应该在字段的规定范围内。++

delete语法
删除数据:delete from 表名where 条件;

混淆点:DML的增删改查与DQL的查询

++DML的核心操作是INSERT、UPDATE、DELETE,这些是写操作。虽然DML语句中经常会用到SELECT子查询来提供修改的条件或数据,但这只是查询功能为DML服务,并不改变该语句属于DML的本质。"++

  • DQL = 问问题(只看不碰)

  • DML = 动手操作(增删改)

简单来说:如果你想看看数据,用DQL(SELECT);如果你想改数据,用DML(INSERT/UPDATE/DELETE)。

在面试中回答这个问题时,可以补充说明:虽然SELECT有时也被广义地归入DML,但严格来说,现代数据库设计中更倾向于将其分开,因为查询和修改是两种完全不同的操作类型。

DQL基本查询:

语法

select 字段列表

from 表名列表

where 条件列表

group by 分组字段列表

having 分组后条件列表

order by 排序字段列表

limit 分页参数

语法

查询多个字段:select 字段1,字段2,字段3from 表名;

查询所有字段(通配符):select*from 表名;

设置别名:select 字段1as 别名1,字段2as 别名2from 表名;

去除重复记录:select distinct 字段列表from 表名;

DQL-条件查询

语法

条件查询:select 字段列表from 表名 where 条件列表;

DQL分组查询:

聚合函数(不对null值进行计算)

介绍:将一列数据作为一个整体,进行纵向计算。语法:select 聚合函数(字段列表)from 表名;

函数

count 统计数量 推荐使用*,mysql底层进行了优化

max 最大值 select max ()from 表名;

min 最小值 slecet min()from 表名;

avg 平均值

sum 求和

语法

分组查询:select 字段列表from 表名where 条件group by 分组字段名having 分组后过滤条件;

where与having区别(面试题)

1.++执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤a2.判断条件不同:where不能对聚合函数进行判断,而having可以。++

DQL-排序查询

语法

条件查询: select 字段列表from 表名where 条件列表group by 分组字段order by 字段1排序方式1,字段2排序方式2...;

排序方式
ASC:升序(默认值)
DESC:降序

DQL-分页查询

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

起始索引=(页码-1)*每页展示记录数

注意事项
++起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。++

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

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

函数:

if(表达式, tvalue,fvalue):当表达式为true时,取值tvalue;当表达式为false时,取值fvaluecase expr when valuel then resultl when value2 then value2 ... else result end

多表设计

一对多关系实现:

在数据库表中多的一方,添加字段,来关联一的一方的主键。

目前上述的两张表,在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性的。

所以产生了外键约束来解决,保证数据的一致性和完整性

物理外键

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

缺点:
影响增、删、改的效率(需要检查外键关系)。
仅用于单节点数据库,不适用与分布式、集群场景。
容易引发数据库的死锁问题,消耗性能。

逻辑外键(推荐)
概念:在业务层逻辑中,解决外键关联。
通过逻辑外键,就可以很方便的解决上述问题。

逻辑外键是一种在应用层面实现的关联关系约束,而不是在数据库层面通过FOREIGN KEY约束强制实现的。

物理外键:像法律条文(数据库强制检查,违法就报错)

逻辑外键:像道德规范(应用层检查,违反就业务报错)

一对一

案例:用户与身份证信息的关系

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

多对多

案例:学生与课程的关系

关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

相关推荐
程序员塔塔喵8 分钟前
【MySQL篇|第十而二篇】深层次讲解MVCC机制
mysql·mvcc
飞浪纪元[FWC–FE]14 分钟前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
Ivanqhz17 分钟前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
Tsuki_tl23 分钟前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
Gauss松鼠会23 分钟前
GaussDB 整体架构解析
运维·服务器·网络·数据库·sql·架构·gaussdb
系统集成-鹰翔29 分钟前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
西瓜拿铁好喝29 分钟前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
一技安身30 分钟前
MySQL 8.4.13 LTS 通用二进制包(Linux免安装版)完整教程
linux·mysql·adb
代码派39 分钟前
业务不停机迁移 MySQL 到 TiDB,NineData 数据增量同步实操演示
数据库·mysql·tidb·ninedata·无停机迁移·增量迁移·全量迁移
Gauss松鼠会43 分钟前
GaussDB 中 gsql 与 DBeaver(JDBC)客户端工具查询时间不一致:原因、排查与处理
运维·服务器·数据库·sql·gaussdb·经验总结