MySQL数据库 (三)- 函数/约束/多表查询/事务

news2025/4/21 18:20:20

目录

一 函数

(一 字符串函数

(二 数值函数

(三 日期函数

(四 流程函数

二 约束

(一 概述

(二 约束演示

(三 外键约束

三 多表查询

(一 多表关系

1 一对多(多对一)

2 多对多

3 一对一

(二 多表查询概述

(三 内连接

1 查询语法

2 代码实现:

(四 外连接

1 查询语法

2 代码实现

(五 自连接

1 查询语法

2  代码实现

(六 联合查询

1 查询语法

​编辑

2 代码实现:

(七 子查询

查询语法

1 标量子查询(子查询结果为单个值)

2 列子查询(子查询结果为一列)

​编辑

3 行子查询(子查询结果为一行)

​编辑

4 表子查询(子查询结果为多行多列)

四 事务

 (一 事务简介

(二 事务操作

(三 事务四大特性

(四 并发事务问题

(五 事务的隔离级别


一 函数

1 概念 :函数是指一段可以直接被另一段程序调用的程序或代码。

2 语法 

select 函数;

(一 字符串函数

1 常见字符串函数

2 代码实现:

# concat
select concat('hello ','mysql');
# lower
select lower('ANxain');
# upper
select upper('ANxian');
# lpad
select lpad('01',5,'_');
# rpad
select rpad('01',5,'_');
# trim
select trim(' hello world ');
# substring
select substring('abcdefghi',3,5);
# 将员工id补全至5位数,不足的使用0
update users set id = lpad(id,5,'0');

(二 数值函数

1 常见数值函数

2 代码实现

# ceil
select ceil(1.1);
# floor
select floor(2.1);
# mod
select mod(7,4);
# rand
select rand();
# round
select round(2.34,1);
# 设置一个六位数验证码
select rpad(round(rand()*1000000),6,'0');

(三 日期函数

1 常见日期函数

2 代码实现

# curdate
select curdate();
# curtime
select curtime();
# now
select now();
# year(date)
select year('2025-11-11');
# month(date)
select month('2025-11-11');
# day(date)
select day('2025-11-11');
# date_add(date,interval expr type)
select date_add('2025-01-01',interval 100 day );
select date_add('2025-01-01',interval 10 month );
# datediff(date1,date2)
select datediff('2025-04-13',now());
# 查询员工的入职时间-倒序排序
select name,datediff(now(),entrydate) as en from users order by en DESC ;

(四 流程函数

1 常见流程控制函数

2 代码实现

# if
select if(true,'OK','error');

# ifnull
select ifnull('OK','DEFAULT');
select ifnull(null,'DEFAULT');
# case when then else end
# 需求查询员工的姓名和工作地址如果是安徽合肥展示省会城市,其他的则显示不是省会城市
select name,(case workaddress when '安徽合肥' then '省会城市' when '山东济南' then '省会城市' else '非省会城市' end) as '是否为省会地址' from users;

# 统计公司员工的年龄
# 18-38为壮年 48 - 68 为中年 其余为老年
select name,(case when age between 18 and 38 then '壮年' when age>=48 and age<= 68 then '中年' else '老年' end) as '年龄结构' from users;

二 约束

(一 概述

1 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

2 目的:保证数据库中数据的正确。

3 分类

4 注意事项

约束是作用在表中字段上的,可以在创建表/修改表的时候添加约束。

(二 约束演示

代码实现

create table uuu(
    id     int primary key auto_increment comment '主键',
    name   varchar(10) not null unique comment '姓名',
    age    int check ( age > 0 and age < 120 ) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
) comment '约束演示表';

# 插入数据
insert into uuu(name, age, status, gender)
values ('张三', 19, '1', '男'),
       ('李四', 20, '0', '女');

insert into uuu(name, age, gender)
values ('ax',100,'男');

图形化展示

(三 外键约束

1 概念:外键约束是让两张表的约束建立连接,从而保证数据的一致性和完整性。

2 解决方案

3 代码实现:

CREATE TABLE dept (
    id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,
    name VARCHAR(50) NOT NULL COMMENT '部门名称'
) COMMENT '部门表';

INSERT INTO dept (id, name) VALUES
(1, '研发部'),
(2, '市场部'),
(3, '财务部'),
(4, '销售部'),
(5, '总经办');

CREATE TABLE emp (
    id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    age INT COMMENT '年龄',
    job VARCHAR(20) COMMENT '职位',
    salary INT COMMENT '薪资',
    entrydate DATE COMMENT '入职时间',
    managerid INT COMMENT '直属领导ID',
    dept_id INT COMMENT '部门ID'
) COMMENT '员工表';

INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id) VALUES
(1, '金庸', 66, '总裁', 20000, '2000-01-01', NULL, 5),
(2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1),
(3, '杨过', 33, '开发', 8400, '2000-11-03', 2, 1),
(4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1),
(5, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1),
(6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1);


# 添加外键
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;

4 删除/更新行为

代码演示:

alter table emp
    add constraint fk_emp_dept_id foreign key (dept_id) references dept (id) on update set null on delete set null;

补充

三 多表查询

# 函数 --- 字符串函数 数值函数 日期函数 流程函数
# 约束 --- 用于对字段内容的约束 (重点:外键约束)
# 多表查询 --- 内连接 外连接 自连接 联合查询 子查询

(一 多表关系

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

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

1 一对多(多对一)

  • 案例:部门与员工之间的关系
  • 关系:一个部门对应多个员工,一个员工对应一个部门。
  • 实现:在多的一方建立外键,指向一的一方的主键。

2 多对多

案例:学生和课程之间的关系

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

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

代码实现:

# 创建学生表
create table student(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '姓名',
    no varchar(10) comment '学号'
) comment '学生表';

insert into student values
(null, '黛绮丝', '2000100101'),
(null, '谢逊', '2000100102'),
(null, '殷天正', '2000100103'),
(null, '韦一笑', '2000100104');

# 创建课程表
create table course(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '课程名称'
) comment '课程表';

insert into course values
(null, 'java'),
(null, 'php'),
(null, 'mysql'),
(null, 'hadoop');

# 创建中间表
create table student_course(
    id int auto_increment comment '主键' primary key,
    studentid int not null comment '学生id',
    courseid int not null comment '课程id',
    constraint fk_courseid foreign key (courseid) references course (id),
    constraint fk_studentid foreign key (studentid) references student (id)
) comment '学生课程中间表';

insert into student_course values
(null, 1, 1),
(null, 1, 2),
(null, 1, 3),
(null, 2, 2),
(null, 2, 3),
(null, 3, 4);

 可视化界面

3 一对一

案例:用户与用户之间详细的关系。

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

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

代码实现

create table tb_user(
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '1: 男, 2: 女',
    phone char(11) comment '手机号'
) comment '用户基本信息表';


create table tb_user_edu(
    id int auto_increment primary key comment '主键id',
    degree varchar(20) comment '学历',
    major varchar(50) comment '专业',
    primaryschool varchar(50) comment '小学',
    middleschool varchar(50) comment '中学',
    university varchar(50) comment '大学',
    userid int unique comment '用户id',
    constraint fk_userid foreign key (userid) references tb_user(id)
) comment '用户教育信息表';

insert into tb_user(id, name, age, gender, phone) values
(null, '黄渤', 45, '1', '18800001111'),
(null, '冰冰', 35, '2', '18800002222'),
(null, '码云', 55, '1', '18800008888'),
(null, '李彦宏', 50, '1', '18800009999');

insert into tb_user_edu(id, degree, major, primaryschool, middleschool, university, userid) values
(null, '本科', '舞蹈', '静安区第一小学', '静安区第一中学', '北京舞蹈学院', 1),
(null, '硕士', '表演', '朝阳区第一小学', '朝阳区第一中学', '北京电影学院', 2),
(null, '本科', '英语', '杭州市第一小学', '杭州市第一中学', '杭州师范大学', 3),
(null, '本科', '应用数学', '阳泉第一小学', '阳泉区第一中学', '清华大学', 4);

可视化界面

(二 多表查询概述

1 概述:指从多张表中查询数据。

2 笛卡尔积:笛卡尔乘积是指在数学中,两个集合A集合和B集合的所有组合情况。(在多表查询时,要消除无效的笛卡尔积 需要指定连接条件)。

3 多表查询分类:

连接查询 

  • 内连接:相当于查询A,B交集部分数据
  • 外连接
    • 左外连接:查询左表所有数据,以及两张表交际部分数据

    • 右外连接:查询右表所有数据,以及两张表交集部分数据

  • 自连接:当前表与自身的连接查询,自链接必须使用表别名

子查询

(三 内连接

1 查询语法

  • 隐式内连接

select 字段列表 from 表1,表2 where 条件;

  • 显式内连接

select 字段列表 from 表1 (inner) join 表2 on 连接条件;

内连接查询的时两张表交集的部分

2 代码实现:

# 隐式内连接演示
# 查询员工的姓名以及关联部门的名称 表结构:emp dept 连接条件 emp.dept_id = dept.id
select emp.name,dept.name from emp,dept where emp.dept_id = dept.id;

select e.name,d.name from emp as e,dept as d where e.dept_id = d.id;
# 显示内连接演示
select e.name,d.name from emp as e inner join dept d on d.id = e.dept_id;

图形化展示:

(四 外连接

1 查询语法

  • 左外连接

select 字段 from 表1 left (outer) join 表2 on 条件;

查询的是左表的所有数据和交集部分。

  • 右外连接

select 字段 from 表1 right (outer) join 表2 on 条件;

查询的是右表的所有数据和交集部分

2 代码实现

# 左外连接
select e.*,d.name from emp e left outer join dept d on d.id = e.dept_id
# 右外连接
select e.name,d.* from dept d right join emp e on d.id = e.dept_id;

图形化展示:

(五 自连接

1 查询语法

select 字段列表 from 表A  别名A  join 表A 别名B on 条件;

自连接查询,可以是内连接查询也可以是外连接查询。

2  代码实现

# 自连接
select a.name '员工',b.name '领导' from emp a,emp b where a.id=b.dept_id;

图形化展示

(六 联合查询

1 查询语法

2 代码实现:

# 联合查询 - 去重
select * from users where age >= 48
union
select * from users where id<10;
# 联合查询 - 直接合并
select * from users where age >= 48
union all 
select * from users where id<10;

注意事项

(七 子查询

查询语法

1 标量子查询(子查询结果为单个值)

 查询语法

代码实现

# 查询工作地址安徽淮北的员工信息 子嵌套中只能查出一个id
select * from users where id = (select id from users where workaddress='安徽淮北');

2 列子查询(子查询结果为一列)

查询语法

代码实现

some与any作用相同

3 行子查询(子查询结果为一行)

查询语法

代码实现

4 表子查询(子查询结果为多行多列)

查询语法

代码实现

 

四 事务

 (一 事务简介

概念:事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。

(二 事务操作

1 操作语法

2 代码实现:

# 修改提交方式
set @@autocommit = 0;
# 查询提交方式 1 为自动 0 为手动
select @@autocommit;

# 转账操作
# 查询张三
select * from account where name ='张三';

# 张三余额减1000
update account set money = money - 1000 where name = '张三';

# 李四余额加1000
update account set money = money + 1000 where name = '李四';

# 提交事务(相当于run执行)
commit ;
# 回滚事务(类似清空clear)
rollback ;

---------------------------------------------------------------------------------------------------------------------------------

代码实现

start transaction ;
# 转账操作
# 查询张三
select * from account where name ='张三';

# 张三余额减1000
update account set money = money - 1000 where name = '张三';

# 李四余额加1000
update account set money = money + 1000 where name = '李四';

# 提交事务(相当于run执行)
commit ;
# 回滚事务(类似清空clear)
rollback ;

(三 事务四大特性

  1. 原子性(Atomicity):事务是不可分割的最小操作单位,要么全部成功,要么全部失败。
  2. 一致性(Consistency):事务完成时,必须使所有的数据保持一致状态。
  3. 隔离性(Isolation):数据库提供的隔离机制,保证事务在不受外部并发操作的独立环境下运行。
  4. 持久性(Durability):事务一旦提交或回滚,他对数据库中的改变就是永久的。

(四 并发事务问题

(五 事务的隔离级别

代码实现:

select @@transaction_isolation;

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试

《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权&#xff08;Broken object-level authorization&#xff09;1.5 破防的属性级授权&a…

攻防世界baigeiRSA

打开题目附件 import libnum from Crypto.Util import number from secret import flagsize 128 e 65537 p number.getPrime(size) q number.getPrime(size) n p*qm libnum.s2n(flag) c pow(m, e, n)print(n %d % n) print(c %d % c)n 8850300144784503160345704866…

[NKU]C++安装环境 VScode

bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂&#xff01;&#xff01;大学生及初学初学C/C进&#xff01;&#xff01;&#xff01;_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 ​ 2安装插件 2.1 C/C 2.2 C/C Compile run ​ 2.3 better C Syntax ​ 查看已…

Node.js 环境配置

什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

DMZ区的作用和原则

DMZ&#xff08;Demilitarized Zone&#xff0c;非军事化区&#xff09;是网络安全架构中一个重要的概念&#xff0c;其主要作用和原则如下&#xff1a; DMZ的作用 隔离风险 DMZ作为内外网络之间的缓冲区&#xff0c;能够有效隔离外部网络的攻击风险。将对外提供服务的服务器&…

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南

文章简介&#xff1a; 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中&#xff0c;我将详细介绍如何将本地的 Node.js 服务通过宝塔面板&#xff08;BT 面板&#xff09;上线。宝塔面板是一个强大的服务器管理工具&#xff0c;具有简洁的…

4.3 线性回归的改进-岭回归/4.4分类算法-逻辑回归与二分类/ 4.5 模型保存和加载

4.3.1 带有L2正则化的线性回归-岭回归 岭回归&#xff0c;其实也是一种线性回归&#xff0c;只不过在算法建立回归方程的时候1&#xff0c;加上正则化的限制&#xff0c;从而达到解决过拟合的效果 4.3.1.1 API 4.3.1.2 观察正则化程度的变化&#xff0c;对结果的影响 正则化力…

Mac 部署Ollama + OpenWebUI完全指南

文章目录 &#x1f4bb; 环境说明&#x1f6e0;️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama &#x1f310; OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)&#xff08;可视化…

工业物联网平台-视频识别视频报警新功能正式上线

前言 视频监控作为中服云工业物联网平台4.0的功能已经上线运行。已为客户服务2年有余&#xff0c;为客户提供多路视频、实时在线监视和控制能力。服务客户实时发现现场、产线、设备出现随机故障、事故等&#xff0c;及时到场处理维修。 视频识别&视频报警新功能当前正式上…

mysql的cpu使用率100%问题排查

背景 线上mysql服务器经常性出现cpu使用率100%的告警&#xff0c; 因此整理一下排查该问题的常规流程。 1. 确认CPU占用来源 检查系统进程 使用 top 或 htop 命令&#xff0c;确认是否是 mysqld 进程导致CPU满载&#xff1a;top -c -p $(pgrep mysqld)2. 实时分析MySQL活动 …

qt6.8安装mysql8.0驱动

qt6.8安装mysql8.0驱动 qt6.8本身是不带mysql驱动。想要在qt里面使用mysql,还是比较麻烦的。需要自己编译驱动 首先下载qt源码&#xff0c;链接Index of /archive/qt/6.8/6.8.1/single 下载mysql对于驱动文件&#xff0c;链接是MySQL :: Download MySQL Connector/C (Archiv…

π0开源了且推出自回归版π0-FAST——打造机器人动作专用的高效Tokenizer:比扩散π0的训练速度快5倍但效果相当

前言 过去的半个多月 对于大模型 deepseek火爆全球&#xff0c;我对其的解读也写成了整整一个系列 详见《火爆全球的DeepSeek系列模型》&#xff0c;涉及对GRPO、MLA、V3、R1的详尽细致深入的解读 某种意义来讲&#xff0c;deepseek 相当于把大模型的热度 又直接拉起来了——…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

《金字塔原理》笔记

金字塔原理一书的原理是关于结构化写作的&#xff0c;里面提出一个MECE法则&#xff1a;各个分论点之间要“相互独立、完全穷尽”。 我的总结 写作思路都是总分总。 要凝练最顶部的信息&#xff0c;然后按照三叉树&#xff08;最多四叉树&#xff09;一直分下去。 书中优雅的…

蓝桥杯准备 【入门3】循环结构

素数小算法&#xff08;埃氏筛&&欧拉筛&#xff09; 以下四段代码都是求20以内的所有素数 1.0版求素数 #include<iostream> using namespace std;int main() {int n 20;for(int i2;i<n;i){int j0;for(j2;j<i;j)//遍历i{if(i%j0){break;}}if(ij){cout&l…

MySQL三大日志——binlog、redoLog、undoLog详解

日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息&#xff0c;能帮助我们进行很多容错及分析工作&#xff0c;其中有三大日志与我们这些开发者息息相关&#xff0c;本文将介绍binlog、redoLog、undoLog三种日志&#xff1a; 1. redoLog 1.1 为什么…

SpringAI系列 - 使用LangGPT编写高质量的Prompt

目录 一、LangGPT —— 人人都可编写高质量 Prompt二、快速上手2.1 诗人 三、Role 模板3.1 Role 模板3.2 Role 模板使用步骤3.3 更多例子 四、高级用法4.1 变量4.2 命令4.3 Reminder4.4 条件语句4.5 Json or Yaml 方便程序开发 一、LangGPT —— 人人都可编写高质量 Prompt La…

springboot+vue导入ruoyi项目的框架

一、介绍 RuoYi-Vue版本&#xff0c;采用了前后端分离的单体架构设计软件环境&#xff1a;JDK、Mysql、Redis、Maven、Node技术选型: Spring Boot、Spring Security、MyBatis、Jwt、Vue3、Element-Plus官方地址: https://gitee.com/y_project/RuoYi-Vue 官方推荐的版本如下&a…

Conmi的正确答案——Rider中添加icon作为exe的图标

C#版本&#xff1a;.net 8.0 Rider版本&#xff1a;#RD-243.22562.250&#xff08;非商业使用版&#xff09; 1、添加图标到解决方案下&#xff1a; 2、打开“App.xaml”配置文件&#xff0c;添加配置&#xff1a; <Applicationx:Class"ComTransmit.App"xmlns&q…