当前位置: 首页 > news >正文

自己做一个网站多少钱/在线培训平台

自己做一个网站多少钱,在线培训平台,兰州微商城搭建,网页制作手机版下载day53 MySQL 触发器 创建触发器:(before : 前置触发器、after :后置触发器) 语法: delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin…

day53

MySQL

触发器

创建触发器:(before : 前置触发器、after :后置触发器)

语法:
delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin多条执行语句end 加上 “结束符xx”delimiter ;还原分隔符未;

注意:

由某个事件去触发某个操作,这些事件有:insert、update、delete语句;

new.字段:当前写法可以获得添加语句字段对应的值

old.字段:当前写法可以获得删除语句字段对应的值

在MySQL中,DELIMITER是用来指定SQL语句中的语句分隔符的关键字。

默认情况下,分号(;)作为语句的结束符号。

当在一个语句中包含了多个语句,比如在创建存储过程、触发器等时,如果直接使用分号作为结束符号,会导致MySQL将整个语句作为一个语句进行解析,从而导致语法错误。所以才有指定分隔符,又还原这个操作。

补充解释:

数据添加后相应的表数据更新的需求,每次用更新语句十分不便
ps:update class set sum = sum+1 where id =1;
所以使用触发器
begin end类似于{},有点像函数,多个语句时使用,单个可不用
对于前触发器,例如删除操作,要在删除之前才拿得到,如果删除之后再操作不行,因为数据已经被删了
在第一次操作之后,再进行重复操作不会再触发触发器

# 触发器# 创建场景 ----------------------------------------------------------------------------# 创建学科表,并添加数据
CREATE TABLE course(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO course(name) VALUES('JavaEE');
INSERT INTO course(name) VALUES('Python');
INSERT INTO course(name) VALUES('HTML');# 创建班级表,并添加数据
CREATE TABLE class(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO class(name) VALUES('01JavaEE');
INSERT INTO class(name) VALUES('02JavaEE');
INSERT INTO class(name) VALUES('01Python');
INSERT INTO class(name) VALUES('02Python');
INSERT INTO class(name) VALUES('01HTML');
INSERT INTO class(name) VALUES('02HTML');# 创建学生表
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),class_id INT(3),course_id INT(3)
)# ------------------------------------------------------------------------------------------------------# 需求:添加学生,并更新班级表和学科表的数据# 创建触发器(添加学生数据之后,就会触发班级表和学科表更新数据的操作)
# delimiter xx - 设置SQL命令的结束符
# trigger - 触发器
# after - 后置触发
delimiter xx
create trigger tri01 after insert on student for each rowBEGINUPDATE class SET sum=sum+1 WHERE id=new.class_id;UPDATE course SET sum=sum+1 WHERE id=new.course_id;END xx
delimiter ;INSERT INTO student(name,class_id,course_id) VALUES('小王',1,1);
INSERT INTO student(name,class_id,course_id) VALUES('小马',1,1);
INSERT INTO student(name,class_id,course_id) VALUES('小李',2,1);
INSERT INTO student(name,class_id,course_id) VALUES('麻生希',3,2);
INSERT INTO student(name,class_id,course_id) VALUES('椎名空',4,2);# ------------------------------------------------------------------------------------------------------# 需求:删除学生,并更新班级表和学科表的数据# 创建触发器(删除学生数据之前,就会触发班级表和学科表更新数据的操作)
delimiter xx
create trigger tri02 before delete on student for each rowBEGINUPDATE class SET sum=sum-1 WHERE id=old.class_id;UPDATE course SET sum=sum-1 WHERE id=old.course_id;END xx
delimiter ;DELETE FROM student WHERE id = 2;# ------------------------------------------------------------------------------------------------------# 删除触发器
DROP TRIGGER tri01;
DROP TRIGGER tri02;

运行分析:
后触发器
前触发器

存储过程

理解:类似java里面的方法,但无返回值,有返回参数

参数列表输入类型的参数 -- in输出类型的参数 -- out输入输出类型的参数 -- inout

注意:

对于传入的参数,要与本身参数区分,识别不了会报错

返回参数,需要用到传出参数,into传出参数

调用存储过程,有两种

  1. 一种直接调用查就会直接打印结果
  2. 另一种,拿到参数变量值,不会立即打印结果,还可以进行再查操作

对于传入参数与传出参数类型相同,可用传入传出参数,相当于简写

# 存储过程
# 注意:类似于Java里的方法# 创建场景 ----------------------------------------------------------------------------# 创建学生表,并添加数据
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sex VARCHAR(32),age INT(3),salary FLOAT(8,2),course VARCHAR(32)
)
INSERT INTO student(name,sex,age,salary,course) VALUES('奇男子','男',23,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('小兰','男',20,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('奇女子','女',19,17000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('刘德华','男',21,15000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('马德华','男',27,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('霍建华','男',19,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('华晨宇','男',32,5000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('黄日华','男',45,4000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('任达华','男',28,7000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('周华健','男',30,8000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('欧阳震华','男',23,12000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('麻生希','女',30,7000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('椎名空','女',23,6000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('水野朝阳','女',28,8000,'HTML');# ----------------------------------------------------------------------------# 最简单的存储过程
# 查询学生表和用户表里的数据
delimiter xx
CREATE PROCEDURE pro01()BEGINSELECT * FROM student;SELECT * FROM user;END xx
delimiter ;# 调用存储过程
CALL pro01();# ----------------------------------------------------------------------------# SQL中存储过程 与 Java中方法 的区别
# Java方法中的参数指的是外界传入到方法内部的数据,返回值指定是方法结束后返回的具体数据
# SQL存储过程中没有返回值,但是有返回参数# 存储过程中参数的分类:
#		in - 传入参数
#		out - 传出参数
#		inout - 传入传出参数# ----------------------------------------------------------------------------# 需求:创建存储过程,传入学生id,查询出学生姓名
delimiter xx
CREATE PROCEDURE pro02(IN s_id INT(3))BEGINSELECT name FROM student WHERE id=s_id;END xx
delimiter ;# 调用存储过程
CALL pro02(2);# ----------------------------------------------------------------------------# 需求:创建存储过程,传入学生id,返回学生姓名
delimiter xx
CREATE PROCEDURE pro03(IN s_id INT(3),OUT s_name VARCHAR(32))BEGINSELECT name INTO s_name FROM student WHERE id=s_id;END xx
delimiter ;# 调用存储过程
CALL pro03(3,@s_name);
SELECT @s_name;# ----------------------------------------------------------------------------# 需求:创建存储过程,传入学生id,返回学生年龄
delimiter xx
CREATE PROCEDURE pro04(INOUT param INT(3))BEGINSELECT age INTO param FROM student WHERE id=param;END xx
delimiter ;# 调用存储过程
SET @param = 3;
CALL pro04(@param);
SELECT @param;# ----------------------------------------------------------------------------# 删除存储过程
DROP PROCEDURE pro01;
DROP PROCEDURE pro02;
DROP PROCEDURE pro03;
DROP PROCEDURE pro04;

运行分析:

调用存储过程方式1

调用存储过程p1方式1
存储过程p2

调用存储过程方式2

调用存储过程p3方式2
存储过程p4

函数

预定义函数

数学函数:

绝对值函数:select abs(字段) from 表 ps:此函数指的是求绝对值

平方根函数:select sqrt(9) ps:得到的值为3

求余函数:select mod(10,3) / select 10%3 ps:得到的值为1

随机函数:select rand() ps:得到的值为0~1

幂运算函数:select pow(10,2) ps:10的2次方

字符串函数:

长度函数:select length(‘内容’)

合并函数:select concat(’hello’,’world’)

截取字符串函数:select substring(字段,start,end)

日期/时间函数:

​ 当前日期函数:curdate()

​ 当前时间函数:curtime()

​ 当前日期+时间函数:now()

​ 年函数:year(now())

​ 月函数:month(now())

​ 日函数:dayofmonth(now())

​ 时函数:hour(now())

​ 分函数:minute(now())

​ 秒函数:second(now())

​ 时间格式函数:年月日时分秒‘别名

注意:

当然对于在Navbbicat的 函数里可以看到是否删除

# 预定义函数
# 理解:MySQL给我们提供的函数
# 注意:函数必须有返回值# 数学类函数 -----------------------------------------------------
SELECT ABS(-100);# 求绝对值
SELECT sqrt(9);  # 求平方根
SELECT mod(10,3);# 求余数
SELECT pow(2,3); # 求次方
SELECT rand();# 求随机值# 字符串类函数 -----------------------------------------------------SELECT CONCAT("用良心做教育","做真实的自己");# 拼接字符串
SELECT SUBSTR("用良心做教育",2,2);# 截取字符串(目标字符串,第几个字符,截取长度)
SELECT length("用良心做教育");# 获取长度(字节)# 日期时间类函数 -----------------------------------------------------SELECT now();# 获取当前日期时间
SELECT YEAR(NOW());# 获取年
SELECT MONTH(NOW());# 获取月
SELECT DAYOFMONTH(NOW());# 获取日
SELECT HOUR(NOW());# 获取时
SELECT MINUTE(NOW());# 获取分
SELECT SECOND(NOW());# 获取秒
SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日 %H时%i分%s秒");

运行分析:
预定义函数2
预定义函数3

自定义函数

返回值,需要一个变量去接查到的数据,再返回此变量
对于5.7版本,5.5版本之类不加关键字就可运行,8.0必须加不然运行即报错
加了关键字DETERMINISTIC就认为它是一个函数

语法:
create function 函数名([参数列表]) returns 数据类型 DETERMINISTIC
beginsql语句;return 值;
end
# 自定义函数
# 注意:MySQL的函数必须有返回值# 需求:创建一个函数,传入学生id,返回学生信息delimiter xx
CREATE FUNCTION fun(s_id INT(3)) RETURNS VARCHAR(32) DETERMINISTICBEGINDECLARE s_name VARCHAR(32);SELECT name INTO s_name FROM student WHERE id=s_id;RETURN s_name;END xx
delimiter ;# 调用函数SELECT fun(3);# 删除函数:
DROP function fun;

运行分析:
自定义函数

范式

第一范式:理解为所有数据集中在一张表,存在多种问题
第二范式:简单分表,解决数据冗余,但一对多种关系出现多个数据不可避免
第三范式:再细化分表,第一范式存在问题全部解决;但表就会很多,需要多表联合查询,效率很低
反范式:就是把第三范式细化的多张表,又重新融合一些表,就会出现数据冗余,这里就考验程序员的能力考虑融合
空间换时间:对于现在的空间大可不考虑就得考虑时间
对于第三范式和反范式之间选择:根据具体项目而定,哪些该融合,哪些该细分;就简单说用的少的表可以融合到其他表

下面以表的形式理解

第一范式

第一范式

第二范式

第二范式

第三范式

第三范式

反范式

反范式

小结:

  1. 触发器
  2. 存储过程
  3. 函数
  4. 范式

相关文章:

MySQL【触发器、存储过程、函数、范式】

day53 MySQL 触发器 创建触发器:(before : 前置触发器、after :后置触发器) 语法: delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin…...

Shopee API接口——获取商家店铺商品列表

一、引言 在跨境电商领域,Shopee作为东南亚地区领先的电商平台,为众多商家提供了广阔的市场和丰富的销售机会。本文将详细介绍如何通过Shopee API获取商家店铺商品列表,并探讨其应用场景。 二、核心功能介绍 Shopee API获取商家店铺商品列…...

linux基础知识14

认知权限信息 通过ls -l可以以列表形式查看内容,并显示权限细节r代表读权限,针对文件可以查看文件内容,针对文件夹,可以查看文件夹内容,如ls命令w代表写权限,针对文件表示可以修改此文件,针对文…...

Qt开发入门与环境搭建(基础篇)

文章目录 Qt开发入门与环境搭建(基础篇)1.1 Qt是什么?1.2 Qt版本介绍1.3 Qt开发环境安装1.4 开发第一个QT程序1.5 调试输出1.6 QT Creator常用的快捷键1.7 QT帮助文档1.8 UI设计师使用1.9 按钮控件组1.10 布局控件组1.11 基本布局控件1.12 UI设计师的布局功能Qt开发入门与环…...

CentOS7环境Maxwell的安装及使用

目录 Maxwell的安装 下载安装包 解压安装包 配置环境变量 启用MySQL Binlog 创建Maxwell所需数据库和用户 配置Maxwell Maxwell的使用 启动Kafka集群 Maxwell启停 Maxwell启停脚本 MySQL数据准备 Kafka开启消费者 全量数据同步 增量数据同步 启动Kafka消费者 …...

python环境变量

目录 python环境变量 python-opencv cuda cudnn pytorch pycharm 激活ok了 pyqt5 labelimg notepad gpu-z python 3.6或3.7 标注,文件路径不能有 python环境变量 import os import syscurrent_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(…...

用进程和线程完成TCP进行通信操作及广播和组播的通信

进程 代码 #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#includ…...

浅谈Tomcat

文章目录 一、什么是Tomcat&#xff1f;二、Tomcat的下载安装三、使用tomcat访问资源 一、什么是Tomcat&#xff1f; Tomcat 就是一个 HTTP 服务器。 前面我们聊了HTTP服务器&#xff0c;像我们在网页输入URL&#xff0c;其实就是在给人家的HTTP服务器发送请求&#xff0c;既…...

C++精解【7】

文章目录 eigen矩阵初始化多维矩阵矩阵和向量size固定大小or 动态大小Matrix类六个模板参数初始化向量元素类型 参考文献 eigen 矩阵初始化 多维矩阵 数组 MatrixXi a { // construct a 2x2 matrix{1, 2}, // first row{3, 4} // second row }; Matrix<do…...

堆箱子00

题目链接 堆箱子 题目描述 注意点 将箱子堆起来时&#xff0c;下面箱子的宽度、高度和深度必须大于上面的箱子 解答思路 初始想到深度优先遍历&#xff0c;最后超时了参照题解使用动态规划&#xff0c;先将盒子从小到大进行排序&#xff0c;dp[i]存储的是到第i个箱子时堆箱…...

Linux 命令:iftop

1. 写在前面 本文主要介绍 Linux iftop&#xff08;Interface TOP&#xff09; 命令&#xff1a;iftop 是一款小巧、免费且功能强大的网卡实时流量监控工具。监控指定网卡的实时流量、端口连接信息、反向解析 IP 等&#xff0c;还可以精确显示本机网络流量及网络内各主机和本机…...

web学习笔记(六十九)vue2

目录 1. vue2创建脚手架项目 2.vue2如何关闭eslint 1. vue2创建脚手架项目 &#xff08;1&#xff09;在cmd窗口输入npm install -g vue/cli命令行&#xff0c;快速搭建脚手架。 &#xff08;2&#xff09; 创建vue2项目 &#xff08;3&#xff09; 选择配置项目&#xff0c…...

JavaScript全解:从基础到高级,掌握每一个知识点

引言&#xff1a; JavaScript是一种广泛使用的脚本语言&#xff0c;主要用于Web浏览器&#xff0c;但近年来也扩展到了服务器端&#xff08;Node.js&#xff09;和其他领域。它允许开发者创建交互式的网页&#xff0c;处理数据&#xff0c;控制用户界面&#xff0c;甚至构建完…...

RabbitMQ的Direct交换机

Direct交换机 BindingKey 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&a…...

2024.6.26 待学习知识点

OOALV https://www.cnblogs.com/BruceKing/p/11447499.html " 取工单的组件 lt_aufnr CORRESPONDING #( lt_out MAPPING aufnr aufnr EXCEPT * ). ABAP POPUP_TO_CONFIRM 弹出框函数 CLASS-EVENTS CLASS-METHODS main. CLASS-METHODS raise_event_EXIT_COMMAND IMPOR…...

【LeetCode】每日一题:相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&am…...

6.26.1 残差卷积变压器编码器的混合工作流程用于数字x线乳房x光片乳腺癌分类

基于残差卷积网络和多层感知器变压器编码器(MLP)的优势&#xff0c;提出了一种新型的混合深度学习乳腺病变计算机辅助诊断(CAD)系统。利用骨干残差深度学习网络创建深度特征&#xff0c;利用Transformer根据自注意力机制对乳腺癌进行分类。所提出的CAD系统具有识别两种情况乳腺…...

[leetcode]avoid-flood-in-the-city 避免洪水泛滥

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> avoidFlood(vector<int>& rains) {vector<int> ans(rains.size(), 1);set<int> st;unordered_map<int, int> mp;for (int i 0; i < rains.size(); i) {i…...

Pytorch基础

文章目录 零、tensorboard0.1基本使用案例 一、数据结构&#xff1a;Tensor1.1数据类型1.2Tensor的创建方式1.3张量的基本运算1.4张量的属性 二、数据集加载器DataLoaders2.0前置知识2.0.1torch.scatter()、torch.scatter_() 2.1官方案例2.1.1从TorchVision加载数据集2.1.2迭代…...

嵌入技术Embedding

嵌入&#xff08;Embedding&#xff09;是一种将高维数据映射到低维空间的技术&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;、计算机视觉和推荐系统等领域。嵌入技术的核心思想是将复杂的数据表示为低维向量&#xff0c;使其在这个低维空间中保留尽可能多的…...

Pandas中的数据转换[细节]

今天我们看一下Pandas中的数据转换&#xff0c;话不多说直接开始&#x1f387; 目录 一、⭐️apply函数应用 apply是一个自由度很高的函数 对于Series&#xff0c;它可以迭代每一列的值操作&#xff1a; 二、⭐️矢量化字符串 为什么要用str属性 替换和分割 提取子串 …...

vue2面试题——路由

1. 路由的模式和区别 路由的模式&#xff1a;history&#xff0c;hash 区别&#xff1a; 1. 表象不同 history路由&#xff1a;以/为结尾&#xff0c;localhost:8080——>localhost:8080/about hash路由&#xff1a;会多个#&#xff0c;localhost:8080/#/——>localhost:…...

【AI应用探讨】—朴素贝叶斯应用场景

目录 文本分类 推荐系统 信息检索 生物信息学 金融领域 医疗诊断 其他领域 文本分类 垃圾邮件过滤&#xff1a;朴素贝叶斯被广泛用于垃圾邮件过滤任务&#xff0c;通过邮件中的文本内容来识别是否为垃圾邮件。例如&#xff0c;它可以基于邮件中出现的单词或短语的概率来…...

使用matlab的大坑,复数向量转置!!!!!变量区“转置变量“功能(共轭转置)、矩阵转置(默认也是共轭转置)、点转置

近期用verilog去做FFT相关的项目&#xff0c;需要用到matlab进行仿真然后和verilog出来的结果来做对比&#xff0c;然后计算误差。近期使用matlab犯了一个错误&#xff0c;极大的拖慢了项目进展&#xff0c;给我人都整emo了&#xff0c;因为怎么做仿真结果都不对&#xff0c;还…...

昇思25天学习打卡营第8天|保存与加载

1. 学习内容复盘 1.1 保存与加载 上一章节主要介绍了如何调整超参数&#xff0c;并进行网络模型训练。在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;本章…...

【vueUse库Animation模块各函数简介及使用方法】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseAnimation函数1. useInter…...

汇川H5u小型PLC作modbusRTU从站设置及测试

目录 新建工程COM通讯参数配置协议选择协议配置 查看手册Modbus地址对应关系仿真测试 新建工程 新建一个H5U工程&#xff0c;不使用临时工程 系列选择H5U即可 COM通讯参数配置 协议选择 选择ModbusRTU从站 协议配置 端口号默认不可选择 波特率这里使用9600 数据长度&…...

基于Java的多元化智能选课系统-计算机毕业设计源码040909

摘 要 多元化智能选课系统使用Java语言的Springboot框架&#xff0c;采用MVVM模式进行开发&#xff0c;数据方面主要采用的是微软的Mysql关系型数据库来作为数据存储媒介&#xff0c;配合前台技术完成系统的开发。 论文主要论述了如何使用JAVA语言开发一个多元化智能选课系统&a…...

idea使用maven打包报错GBK不可映射字符

方法一&#xff1a;设置环境变量 打开“控制面板” > “系统和安全” > “系统”。点击“高级系统设置”。在“系统属性”窗口中&#xff0c;点击“环境变量”。在“系统变量”部分&#xff0c;点击“新建”&#xff0c;创建一个新的变量&#xff1a; 变量名&#xff1a;…...

解决Linux系统Root不能远程SSH登录

问题描述 在使用Linux主机或者开发板的时候远程SSH一直登录不上Root账户&#xff0c;只能登录其他账户。 问题解决 使用文本编辑器修改SSH的配置文件sshd_config。这个文件通常位于/etc/ssh/目录下。 sudo nano /etc/ssh/sshd_config在sshd_config文件中&#xff0c;找到Pe…...