MySQL学习笔记(二)

一、SQL-函数

函数-介绍

函数是指一段可以直接被另一段程序调用的程序或代码。
在这里插入图片描述

字符串函数

在这里插入图片描述

示例

--concat
select concat('Hello','MySql');
--upper
select upper('Hello');
--lpad
select lpad('01',5,'-');
--trim
select trim(' Hello  MySQL ');  --中间空格还在,头尾空格去除
--substring
select substring('Hello MySQL',1,5);

案例
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001。

update emp set workno = lpad(workno,5,'0');

数值函数

常见的数值函数如下
在这里插入图片描述
示例

--ceil
select ceil(1.1);
--floor
select floor(1.9);
--mod
select mod(7,4);
--rand
select rand();
--round
select round(2.344,2);

案例
通过数据库的函数,生成一个六位数的随机验证码。

select lpad(round(rand()*100000,0),6,'0');

rand直接生成,再乘1000000后
在这里插入图片描述

日期函数

常见的日期函数如下
在这里插入图片描述
示例

--curdate()
select curdate();
--curtime()
select curtime();
--now()
select now();
--YEAR MONTH DAY
select YEAR(now());
select MONTH(now());
select DAY(now());
--date_add
select date_add((now(),INTERVAL 70 MONTH);
--datediff
select datediff('2021-10-01','2021-12-01'); --得到-61,第一个时间减去第二个时间

案例
查询所有员工的入职天数,并根据天数倒序排序。

select name,datediff(curdate(),entrydate) as 'entrydays' from emp order by entrydays desc;

流程函数

流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率
在这里插入图片描述
示例

--if
select if(false,'OK','Error');
--ifnull
select ifnull('OK','Default'); --返回ok
select ifnull('','Default'); --返回第一个空串
select ifnull(null,'Default'); --返回Default
--case when then else end
--需求:查询emp表的员工姓名和工作地址(北京/上海-》一线城市,其他->二线城市)
select
	name,
	case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end )
	from emp;

在这里插入图片描述

select
	id,
	name,
	(case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end) '数学',
	(case when english>= 85 then '优秀' when english>=60 then '及格' else '不及格' end) '英语',
	(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end) '语文'
	from scores;

总结

在这里插入图片描述

二、SQL-约束

约束-介绍

1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
2.目的:保证数据库中数据的正确、有效性和完整性。
在这里插入图片描述
在这里插入图片描述
对字段数据约束

create table user(
	id int primary key auto_increment '主键',
	name varchar(10) not null unique comment '姓名',
	age int check (age >0 && age <= 120) comment '年龄',
	status char(1) default '1' comment '状态',
	gender char(1) comment '性别'
) comment '用户表';

外键约束

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
(不建议使用外键)
在这里插入图片描述
在这里插入图片描述

语法

在这里插入图片描述
示例

--添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
--删除外键
alter table emp drop foreign key fk_emp_dept_id;

删除/更新行为

在这里插入图片描述
在这里插入图片描述

--外键的删除和更新行为
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade;	--对删除或更新级联,同步删除或更新
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;	

总结

在这里插入图片描述

三、SQL-多表查询

介绍

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

  • 一对多(多对一)
  • 多对多
  • 一对一

多表关系

一对多

在这里插入图片描述

多对多

在这里插入图片描述
代码建立
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一对一

在这里插入图片描述
示例
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

多表查询

概述

在这里插入图片描述

--消除无效的笛卡尔积
select * from emp , dept where emp.dept_id = dept.id;

多表查询分类

在这里插入图片描述

连接查询-内连接

在这里插入图片描述
内连接演示
在这里插入图片描述

--1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
--表结构:emp,dept
--连接条件:emp.dept_id = dept.id
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id;
--起别名来简化sql编写,注意起别名后where处条件就不可以用原名了
select e.name , d.name from emp e , dept d where e.dept.id = d.id;


--2.查询每一个员工的姓名,及关联的部门的名称(显式内连接实现) --- INNER JOIN ... ON ...
-- 表结构:emp , dept
-- 连接条件:emp.dept_id = dept.id
select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
--inner关键字也可以省略
select e.name, d.name from emp e join dept d on e.dept_id = d.id;

隐式连接好理解好书写,语法简单,担心的点较少。但是显式连接可以减少字段的扫描,有更快的执行速度。这种速度优势在3张或更多表连接时比较明显

连接查询-外连接

在这里插入图片描述
外连接演示

--1.查询emp表的所有数据,和对应的部门信息(左外连接)
--表结构:emp,dept
--连接条件:emp.dept_id=dept.id
select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;

select e.*, d.name from emp e left join dept d on e.dept_id = d.id; --outer可省


根据左表的所有数据去查右边的值,没有的就为空,最后返回以左表为主体的值
在这里插入图片描述

--2.查询dept表的所有数据,和对应的员工信息(右外连)
select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;

select d.*, e.* from dpt d left outer join emp e on e.dept_id = d.id;

在这里插入图片描述

连接查询-自连接

在这里插入图片描述
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重

在这里插入图片描述

--1.查询员工 及其 所属领导的名字
--表结构:emp
select a.name , b.name from a, emp b where a.managerid = b.id;

在这里插入图片描述

--2.查询所有员工emp及其领导的名字emp如果员工没有领导,也需要查询出来
--表结构:emp a , emp b
select a.name '员工' b.name '领导' from emp a left join emp b on a.managerid = b.id;

在这里插入图片描述

联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集
在这里插入图片描述
示例

--union all:union
--1.将薪资低于5000的员工,和年龄大于 50 岁的员工全部查询出来
select * from emp where salary < 5000;
union all
select * from emp where age > 50;

select * from emp where salary < 5000;
union	--删掉all即对结果去除重复
select * from emp where age > 50;

在这里插入图片描述
在这里插入图片描述
上为分别查
下为union all后
在这里插入图片描述

子查询

在这里插入图片描述

子查询-标量子查询

在这里插入图片描述

--标量子查询
--1.查询“销售部”的所有员工信息
--a.查询“销售部”部门ID
select id from dept where name = '销售部';

--b.根据销售部部门ID,查询员工信息
select *from emp where dept_id = 4; --即上条查询出的结果
--合并即为
select *from emp where dept_id = (select id from dept where name = '销售部');

--2.查询在“方东白”入职之后的员工信息
--a.查询方东白的入职日期
select entrydate from emp where name = '方东白';
--b.查询指定入职日期之后入职的员工信息
select * from emp where entrydate > (select entrydate from emp where name = '方东白');
子查询-列子查询

在这里插入图片描述

--列子查询
--1.查询“销售部”和“市场部”的所有员工信息
--a.查询“销售部”和“市场部”的部门ID
select id from dept where name = '销售部' or name = '市场部';

--b.根据部门ID,查询员工信息
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
--2.查询比财务部所有人工资都高的员工信息
--a.查询所有 财务部 人员工资
select * from emp where name = '财务部';

select salary from emp where dept_id = (select * from emp where name = '财务部');
--b:比财务部 所有人工资都高的员工信息
select * from emp where salary > all (select salary from emp where dept_id = (select * from emp where name = '财务部'))
--3.查询比研发部其中任意一人工资高的员工信息
--a.查询研发部所有人工资
select salary from emp where dept_id = (select id from dept where name = '研发部');
--b.比研发部其中任意一人工资高的员工信息(只要高于一个人就可以)
select * from emp where salary > any (select salary from emp where dept_id = (select id from dept where name = '研发部'));
子查询-行子查询

在这里插入图片描述

--行子查询
--1.查询与“张无忌”的薪资及直属领导相同的员工信息
--a.查询“张无忌”的薪资及直属领导
select salary,managerid from emp where name = '张无忌';

--b.查询与“张无忌”的薪资及直属领导相同的员工信息
select * from emp where (salary, managerid) = (select salary,managerid from emp where name = '张无忌');
子查询-表子查询
--表子查询
--1.查询与“鹿杖客”,“宋远桥”的职位和薪资相同的员工信息
--a.查询“鹿杖客""宋远桥"的职位和薪资
select job, salary from emp where name = '鹿杖客' or name = '宋远桥';
--b.查询与“鹿杖客”“宋远桥”的职位和薪资相同的员工信息
select * from emp where (job,salary) in (select job, salary from emp where name = '鹿杖客' or name = '宋远桥');

--2.查询入职日期是“2006-01-01”之后的员工信息,及其部门信息
--a.入职日期是“2006-01-01”之后的员工信息
select * from emp where entrydate > '2006-01-01';

--b.查询这部分员工,对应的部门信息
select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id;

2.a查询数据
在这里插入图片描述
2.b查询数据
在这里插入图片描述

总结

在这里插入图片描述

练习

四、SQL-事务

介绍

在这里插入图片描述
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务

事务-操作

在这里插入图片描述
在这里插入图片描述

--方式一
select @@autocommit;	--查询事务提交方式
set @@autocommit = 0;	--设置手动提交

--转账操作(张三给李四转账1000)
--1.查询张三账户余额
select * from account where name='张三';
--2.将张三账户余额-1000
update account set money = money - 1000 where name ='张三';
程序执行报错...
--3.将李四账户余额+1000
update account set money= money + 1000 where name ='李四';

--提交事务  设置手动提交后,输入指令后再commit才会生效
commit;

--回滚事务;
rollback;

在这里插入图片描述

--方式二
start transaction;	--表示开始手动控制事务,只要没有commit是不会提交,异常则rollback

--转账操作(张三给李四转账1000)
--1.查询张三账户余额
select * from account where name='张三';
--2.将张三账户余额-1000
update account set money = money - 1000 where name ='张三';
程序执行报错...
--3.将李四账户余额+1000
update account set money= money + 1000 where name ='李四';

--提交事务  设置手动提交后,输入指令后再commit才会生效
commit;

--回滚事务;
rollback;

事务-四大特性

在这里插入图片描述

事务-并发问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事务-隔离级别

在这里插入图片描述

--查看事务隔离级别
select @@transaction_isolation;

--设置事务隔离级别
set session transaction isolation level read uncommitted;

set session transaction isolation level repeatable read;

事务-总结

在这里插入图片描述

基础篇总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java mail 535 Login Fail. Please enter your authorization code to login

报错信息提示查看 https://service.mail.qq.com/detail/0/53 帮助页面意思就是说你要使用授权码登录, 但是授权码我已经正确的设置上去了 后面从 QQ邮箱出现错误 Please enter your authorization code to_邮件群发-双翼邮件群发软件官方网 看到 账户 需要是 QQ号 例如…

mysql、postgresql、druid链接池踩坑记录

The last packet successfully received from the server wIs 10,010 milliseconds ago. The last packet sent successfully to the server was 10,010 milliseconds ago.### The error may exist in URL mysql 链接字符串没有 &connectTimeout600000&socketTimeout6…

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装

一、项目创建 创建NDK项目有两种方式&#xff0c;一种从新创建整个项目&#xff0c;一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目&#xff1a; 选择包名、API版本与算法交互的语言&#xff1a; 选择C版本&#xff1a; 创建完之后&#xff0c;可…

Spring Boot教程之五十二:CrudRepository 和 JpaRepository 之间的区别

Spring Boot – CrudRepository 和 JpaRepository 之间的区别 Spring Boot建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员…

【网页自动化】篡改猴入门教程

安装篡改猴 打开浏览器扩展商店&#xff08;Edge、Chrome、Firefox 等&#xff09;。搜索 Tampermonkey 并安装。 如图安装后&#xff0c;浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name&#xff1a;脚本名称。…

spark汇总

目录 描述运行模式1. Windows模式代码示例 2. Local模式3. Standalone模式 RDD描述特性RDD创建代码示例&#xff08;并行化创建&#xff09;代码示例&#xff08;读取外部数据&#xff09;代码示例&#xff08;读取目录下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…

Spring AMQP-保证发送者消息的可靠性

1. 消息发送者的可靠性 保证消息的可靠性可以通过发送者重连和发送者确认来实现 发送者重连 发送者重连机制就是在发送信息的时候如果连接不上mq不会立即结束&#xff0c;而是会在一定的时间间隔之类进行重新连接&#xff0c;连接的次数和时间都是由我们在配置文件中指定的&…

vs2022编译webrtc步骤

1、主要步骤说明 概述&#xff1a;基础环境必须有&#xff0c;比如git&#xff0c;Powershell这些&#xff0c;就不写到下面了。 1.1 安装vs2022 1、选择使用C的桌面开发 2、 Windows 10 SDK安装10.0.20348.0 3、勾选MFC及ATL这两项 4、 安装完VS2022后&#xff0c;必须安…

UnityWebGl:打包成webgl后UGUI不显示文字(中文)问题

是由于unity默认使用的是Arial,导致打包成webgl时中文不显示 解决方案&#xff1a; 可在电脑C盘下&#xff0c;路径为C:\Windows\Fonts 找个中文简体的字体文件放到unity里面&#xff0c;格式必须为. ttf

ffmpeg-avio实战:打开本地文件或者网络直播流dome

使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…

英伟达打造个人 AI 超级计算机:Project DIGITS 震撼登场

手掌大小的超级计算机 Nvidia 在 CES 2025 上为桌面用户推出了 一款大小和手掌差不多的超级计算机——Project DIGITS AI 超级计算机。虽然它的大小和一个手掌差不多&#xff0c;但性能方面可以说是强到惊人。 Project DIGITS Project DIGITS Project DIGITS 搭载全新的 GB10 G…

SAP SD学习笔记26 - 贩卖契约(框架协议)的概要,基本契约 - 数量契约

上一章讲了品目阶层&#xff08;产品层次结构&#xff09;&#xff0c;品揃Module(分类模块) 。 SAP SD学习笔记25 - 品目阶层&#xff08;产品层次结构&#xff09;、品揃Module&#xff08;分类模块&#xff09;-CSDN博客 本章继续讲SAP的知识&#xff1a;贩卖契约&#xff…

ESP32 IDF VScode出现头文件“无法打开 源 文件 ”,并有红色下划线警告

问题背景&#xff1a; ESP32 IDF VScode出现头文件“无法打开 源 文件 ”&#xff0c;并有红色下划线警告&#xff1a; 解决办法&#xff1a; 在工程里面的.vscode文件夹下&#xff0c;检查是否存在c_cpp_properties.json文件&#xff0c;如果没有可以手动创建添加。如图…

GaussDB事务和并发控制机制

目录 一、并发控制机制 二、MVCC实现方式 三、快照实现方式 四、GaussDB的并发控制机制 五、GaussDB基于事务提交时间戳的MVCC和快照机制 六、GaussDB分布式事务 七、总结与展望 事务是数据库的核心功能之一&#xff0c;其主要目的是保障数据库系统在并发处理、系统故障…

【YOLOv8老鼠检测】

YOLOv8老鼠检测 yolo老鼠检测数据集和模型YOLOv8老鼠检测步骤YOLOv8算法说明 yolo老鼠检测数据集和模型 数据集类别信息 train: E:\python_code\dataset_1\yolo_mouse_data_5000\train/images val: E:\python_code\dataset_1\yolo_mouse_data_5000\valid/images test: E:\pyt…

2025最新解决方案:新买的mac鼠标和这个触控板反向

solution1 &#xff1a;1.打开设置&#xff0c;搜索 触控 点击 自然滚动 ----->解决的是 触控板 但是还是解决不了鼠标反向的问题 solution1 ultra&#xff1a; 下载一个免费 且纯净的 软件 Scroll Reverser for macOS 这是给出的链接&#xff0c;非常简单&#xff0c;…

【C++习题】20. 两个数组的交集

题目&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 链接&#x1f517;&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 代码&#xff1a; class Solution { public:// 函数功能&#xff1a;求两个数组…

从零开始:使用VSCode搭建Python数据科学开发环境

引言 在数据科学领域&#xff0c;一个高效、稳定的开发环境是成功的关键。本文将详细介绍如何使用Visual Studio Code搭建一个完整的Python数据科学开发环境。通过本指南&#xff0c;您将学会&#xff1a; 安装和配置VSCode&#xff0c;包括基本设置和快捷键配置设置Python开…

JVM vs JDK vs JRE

JVM是Java虚拟机的缩写&#xff0c; 用于实现Java的一次编译&#xff0c;处处运行。 Java代码写成.class后&#xff0c;由本地的虚拟机运行。 JDK&#xff08;Java Development Kit&#xff09;是一个功能齐全的 Java 开发工具包&#xff0c;供开发者使用。 JDK包含了JRE。…

Redis Zset有序集合

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis Zset有序集合 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 概述 普通命令 ZAD…