DML(数据操作语言)

Data Manipulation Language,用来对数据库表中的数据记录进行增、删、改操作

添加数据

-- DML : 数据操作语言
-- DML : 插入数据 - insert
-- 1.为tb_emp表的username,name,gender字段插入值
insert into tb_emp(username, name, gender,create_time, update_time)values ('wuji', '张无忌', 1, now(), now());-- 2.为tb_emp表的所有字段插入值
insert into tb_emp values (null, 'zhiruo', '123', '周芷若', 2, '1.jpg', 1, '2010-01-01', now(), now());-- 3.批量为tb_emp表的username, name, gender字段插入数据
insert into tb_emp(username, name, gender,create_time, update_time)values ('weifuwang', '韦一笑', 1, now(), now()),('xieshiwang', '谢逊', 1, now(), now());

注意:

1.插入数据时,指定的字段顺序需要与值的顺序是一一对应的

2.字符串和日期型数据应该包含在引号中

3.插入的数据大小,应该在字段的规定范围内

修改数据

-- DML : 更新数据 - update
-- 1.将tb_emp表的ID为1的员工姓名name字段更新为‘张三’
update tb_emp set name = '张三', update_time = now() where id = 1;-- 2.将tb_emp表的所有员工的入职日期更新为‘2010-01-01’
update tb_emp set entrydate = '2010-01-01', update_time = now();

删除数据

-- DML : 删除数据 - delete
-- 1.删除tb_emp表中ID为1的员工
delete from tb_emp where id = 1;-- 2.删除tb_emp表中的所有员工
delete from tb_emp;

注意:delete不能删除某一个字段的值,如果要操作应该使用update将该字段值设为null

DQL(数据查询语言)

Data Query Language,用来查询数据库表中的记录

基本查询

-- DQL : 基本查询
-- 1.查询指定字段 name,entrydate 并返回
select name, entrydate
from tb_emp;-- 2.查询返回所有字段
-- 推荐
select id, username, password, name, gender, image, job, entrydate, create_time, update_time
from tb_emp;-- 不推荐(不直观、性能低)
select *
from tb_emp;-- 3.查询所有员工的name, entrydate,并起别名(姓名,入职日期)
select name as 姓名, entrydate  入职日期
from tb_emp;-- 4.查询已有的员工关联了哪几种职位(不要重复)
select distinct job
from tb_emp;

条件查询

-- DQL : 条件查询-- 1.查询 姓名为杨逍的员工
select *
from tb_emp
where name = '杨逍';-- 2.查询 id小于等于5的员工信息
select *
from tb_emp
where id <= 5;-- 3.查询没有分配职位的员工信息
select *
from tb_emp
where job is null;-- 4.查询有职位的员工信息
select *
from tb_emp
where job is not null;-- 5.查询密码不等于‘123456’的员工信息
select *
from tb_emp
where password != '123456';select *
from tb_emp
where password <> '123456';-- 6.查询入职日期在‘2000-01-01’(包含)到‘2010-01-01’(包含)之间的员工信息
select *
from tb_emp
where entrydate between '2000-01-01' and '2010-01-01';-- 7.查询入职时间在‘2000-01-01’(包含)到‘2010-01-01’(包含)之间且性别为女的员工信息
select *
from tb_emp
where entrydate between '2000-01-01' and '2010-01-01' and gender = 2;-- 8.查询职位是2(讲师),3(学工主管),4(教研主管)的员工信息
select *
from tb_emp
where job in (2,3,4);-- 9.查询姓名为两个字的员工信息
select *
from tb_emp
where name like '__';-- 10.查询姓‘张’的员工信息
select *
from tb_emp
where name like '张%';

分组查询

-- DQL : 分组查询
-- 聚合函数 : 不对null值进行计算-- 1.统计该企业员工数量
select count(id)
from tb_emp;select count(1)
from tb_emp;-- 推荐,因为底层对count(*)作了优化
select count(*)
from tb_emp;-- 2.统计该企业最早入职的员工
select min(entrydate)
from tb_emp;-- 3.统计该企业最迟入职的员工
select max(entrydate)
from tb_emp;-- 4.统计该企业员工ID的平均值
select avg(id)
from tb_emp;-- 5.统计该企业员工的ID之和
select sum(id)
from tb_emp;

-- 分组
-- 1.根据性别分组,统计男性和女性员工的数量
select gender, count(*) -- 注意要返回分组字段
from tb_emp
group by gender;-- 2.先查询入职时间在‘2015-01-01’(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位
select job
from tb_emp
where entrydate<='2015-01-01'-- where不能使用聚合函数
group by job
having count(*)>=2;

where和having的区别:

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

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

排序查询

-- 排序查询
-- 1.根据入职时间,对员工进行升序排序
select *
from tb_emp
order by entrydate;-- 2.根据入职时间,对员工进行降序排序
select *
from tb_emp
order by entrydate desc;-- 3.根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序
select *
from tb_emp
order by entrydate, update_time desc;

分页查询

-- 分页查询
-- 1.从起始索引0开始查询员工数据,每页展示5条记录
select *
from tb_emp
limit 0,5;-- 2.查询第1页员工数据,每页展示5条记录
select *
from tb_emp
limit 0,5;-- 3.查询第2页员工数据,每页展示5条记录
select *
from tb_emp
limit 5,5;-- 4.查询第3页员工数据,每页展示5条记录
select *
from tb_emp
limit 10,5;-- 起始索引 = (页码-1)*每页展示记录数

注意:

1.起始索引从0开始,起始索引 = (查询页码-1)*每页显示的记录数

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

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

案例

1.根据需求完成员工管理的条件分页查询

-- 案例1 : 按需求完成员工管理的条件分页查询 - 根据输入条件,查询第一页数据,每页展示10条记录
-- 输入条件:-- 姓名:张-- 性别:男-- 入职时间:2000-01-01   2015-12-31select *
from tb_emp
where name like '张%'and gender = 1and entrydate between '2000-01-01' and '2015-12-31'
order by update_time desc
limit 0,10;

2.根据需求,完成员工信息的统计

-- 案例2-1 : 根据需求,完成员工性别信息的统计
-- if(条件表达式,true取值,false取值)
select if(gender=1,'男性员工', '女性员工') 性别, count(*)
from tb_emp
group by gender;-- 案例2-2 : 根据需求,完成员工职位信息的统计
-- case 表达式 when 值1 then 结果1 when 值2 then 结果2 ...end
select (case jobwhen 1 then '班主任'when 2 then '讲师'when 3 then '学工主管'when 4 then '教研主管'else '未分配职位'end) 职位,count(*) 数量
from tb_emp
group by job;

多表设计

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

一对多

需求:根据页面原型及需求文档,完成部门及员工模块的表结构设计

首先创建一个员工表和一个部门表,这里员工表新增一个字段dept_id表示归属部门的id

-- 员工
create table tb_emp (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管',entrydate date comment '入职时间',dept_id int unsigned comment '部门ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';-- 部门
create table tb_dept(id int unsigned primary key auto_increment comment 'ID',name varchar(10) not null unique comment '部门名称',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '部门表'

出现的问题:部门数据可以直接删除,例如在部门表中删除某各部门,然而还有部分员工归属于该部门下,此时就出现了数据的不完整、不一致问题

这里就不采用SQL语句建立外键了,直接使用图形化工具

物理外键

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

缺点:影响增、删、改的效率(需要检查外键关系)

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

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

逻辑外键

概念:在业务逻辑中,解决外键关联(代码中解决)

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

一对一

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

关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率

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

多对多

案例:学生与课程的关系

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

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

案例

需求:参考页面原型及需求,设计合理的表结构

分类表、菜品表、套餐表的关系如图所示,菜品表和套餐表是多对多关系,因此建立了一个中间表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918667.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918667.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918667.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 类元编程(元类基础知识)

元类基础知识 元类是制造类的工厂&#xff0c;不过不是函数&#xff08;如示例 21-2 中的 record_factory&#xff09;&#xff0c;而是类。图 21-1 使用机器和小怪兽图示法描述元 类&#xff0c;可以看出&#xff0c;元类是生产机器的机器。根据 Python 对象模型&#xff0c;类…

【Vue 3 响应式系统深度解析:reactive vs ref 全面对比】

Vue 3 响应式系统深度解析&#xff1a;reactive vs ref 全面对比 目录 概述响应式系统基础reactive 深度分析ref 深度分析底层实现原理依赖收集机制演进解构和转换工具常见误区和陷阱技术选型指南最佳实践和建议 概述 Vue 3 引入了基于 Proxy 的全新响应式系统&#xff0c;…

JavaSE高级-01

文章目录1. 异常异常的分类自定义异常异常的处理资源关闭&#xff1a;try-with-resource2. 泛型泛型类泛型接口泛型方法、通配符、上下限通配符泛型的上下限泛型支持的类型3. 包装类4. Collection集合和Map集合4.1 Collection集合Collection集合特点Collection的遍历方式一&…

MyBatis执行器与ORM特性深度解析

一、MyBatis的Executor执行器详解1. MyBatis执行器类型MyBatis有三种核心执行器实现&#xff0c;在org.apache.ibatis.executor包中定义&#xff1a;执行器类型特点描述SimpleExecutor默认执行器&#xff0c;每次执行都会创建新的Statement对象ReuseExecutor重用预处理语句(Pre…

红黑树的特性与实现

在数据结构领域&#xff0c;二叉搜索树&#xff08;BST&#xff09;凭借 O (log n) 的平均时间复杂度成为查找、插入和删除操作的优选结构。但它有个致命缺陷&#xff1a;当输入数据有序时&#xff0c;会退化为链表&#xff0c;时间复杂度骤降至 O (n)。为解决这一问题&#xf…

ClickHouse从入门到企业级实战全解析课程简介

【课程简介】你是否正在面临这些挑战&#xff1f;海量数据的分析查询慢如蜗牛&#xff0c;报表一等就是几小时&#xff1f;想构建实时数仓&#xff0c;却不知如何高效处理 Kafka 等流式数据&#xff1f;对 ClickHouse 的众多 MergeTree 引擎感到困惑&#xff0c;不知如何选型&a…

【新启航】从人工偏差到机械精度:旋转治具让三维扫描重构数据重复精度提升至 ±0.01mm

在三维扫描重构领域&#xff0c;传统人工操作方式受限于人为因素干扰&#xff0c;数据重复精度难以保证&#xff0c;无法满足高精度工业检测与逆向工程需求。旋转治具凭借先进的机械设计与自动化控制技术&#xff0c;将三维扫描重构数据重复精度提升至 0.01mm&#xff0c;实现从…

《汇编语言:基于X86处理器》第13章 复习题和编程练习

本篇记录了《汇编语言&#xff1a;基于X86处理器》第13章 复习题和编程练习的学习笔记。13.6 复习题1.当汇编过程被高级语言程序调用时&#xff0c;主调程序与被调过程是否应使用相同的内存模式?答&#xff1a;主调程序与被调过程使用的内存模式必须相同。2.C 和 C程序调用汇编…

SpringAI智能航空助手实战<Demo>

我们将如何将我们得传统业务进行智能化的改造>>>1.将我们传统的航空票务系统 我们之前通过按钮的方式来完成 现在我们通过智能对话的方式完成 >现在我们通过对话的方式来完成 整个智能化的改造 传统应用如何进行智能化改造 我们把我们的项目通过Spring-ai 来接入A…

windows git安装步骤

1&#xff0c;从官网下载安装包&#xff1a;gitg官网 进行安装 2&#xff0c;配置git环境&#xff1a; git config --global user.name "Your Name" git config --global user.email "Your Email"3&#xff0c;生成 SSH Key&#xff1a; ssh-keygen -t r…

使用chroma和LlamaIndex做RAG增强

RAG 原理&#xff1a;通过 “检索&#xff08;从知识库获取相关信息&#xff09;→ 增强&#xff08;将信息作为上下文输入模型&#xff09;→ 生成&#xff08;模型基于上下文回答&#xff09;” 三步&#xff0c;解决大模型知识时效性、领域局限性问题。 接下来将完成这么一个…

2025 最应避免的摄影陷阱以及解决方案

你有没有想过&#xff0c;当你拍完了一个完美的场景后&#xff0c;却发现画面模糊、光线不足&#xff0c;或者更糟的是&#xff0c;存储卡中的文件丢失了&#xff1f;这些问题可能会发生在任何人身上&#xff0c;无论是业余爱好者、专业人士还是最好的摄影师。当珍贵的记忆变成…

python类--python011

面向对象编程中的类的概念、属性使用、继承和类的改造问题等。7.1 初识类在软件编程中&#xff0c;面向过程和面向对象是两种主要的编程方法。面向过程的编程强调通过函数来实现特定的功能&#xff0c;具有灵活性&#xff0c;但在复杂系统中往往导致代码重复&#xff0c;维护困…

Python函数篇:从零到精通

一、函数1.1 为什么有函数我们对于一个项目时&#xff0c;会有上千甚至上万条代码&#xff0c;当我们要使用到某个函数时&#xff0c;例如我需要计算一个求和代码&#xff0c;获得求和的值来服务我们的项目&#xff0c;那我们可能会这样#计算1&#xff5e;100的和 theSun 0 fo…

QT项目之记事本

本文用QT实现记事本功能。一、成品展示1.界面主要元素&#xff1a;1.标题为MyNoteBook&#xff1b;2.相应图标为&#xff1a;打开文件&#xff0c;保存&#xff0c;退出&#xff1b;3.右下角标注光标所在行列&#xff0c;默认编码方式为UTF-8&#xff1b;4.鼠标所在图标位置时会…

【软件测试】性能测试 —— 工具篇 JMeter 介绍与使用

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录1. JMeter 的介绍2. JMeter 安装、配置、搭建2.1 前置条件 —— Java环境搭建2.2 JMeter 下载2.3 JMeter 安装…

二十二、Mybatis-快速入门程序

入门程序大概步骤叙述&#xff1a; 步骤一&#xff1a;创建springboot工程并且数据库提前创建表步骤二&#xff1a;创建springboot工程对Mybatis相关依赖注意打勾步骤三&#xff1a;编写查找方法步骤四&#xff1a;编写测试方法项目目录结构与数据库以及代码&#xff1a; 项目目…

Blender模拟结构光3D Scanner(一)外参数匹配

如何使用Blender模拟FPP(Fringe Projection Profilometry) 原理的结构光3D传感器&#xff1f;主要包含的工作有&#xff1a;1&#xff09;相机、投影仪定位与内外参数匹配&#xff1b;2&#xff09;投影仪投射指定Pattern图像&#xff1b;3&#xff09;被测物体材质属性配置等&…

LangChain是如何实现RAG多轮问答的

目录引言一、LangChain实现RAG多轮问答核心机制1. 对话历史管理&#xff08;Memory&#xff09;2. 问题重写&#xff08;Query Rewriting&#xff09;3. 检索增强生成&#xff08;RAG Core&#xff09;4. 链式工作流&#xff08;Chain&#xff09;二、关键设计特点三、完整示例…

DAY 44 预训练模型

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 一、预训练的概念 我们之前在训练中发现&#xff0c;准确率最开始随着epoch的增加而增加。随着循环的更新&#xff0c;参数在不断发生更新。 所…