SQL中的数据库对象
视图:VIEW
-
概念
① 虚拟表,本身不存储数据,可以看做是存储起来的SELECT语句
② 视图中SELECT语句中涉及到的表,称为基表
③ 针对视图做DML操作,对影响到基表中的数据,反之亦然
④ 创建、删除视图本身,不会影响到基表 -
创建视图
CREATE VIEW view_emp_avg_salary(dept_id, avg_salary) AS SELECT department_id, AVG(salary) FROM employees WHERE department_id IS NOT NULL GROUP BY department_id;
-
查看视图:
DESC 视图名;
-
修改视图
# 方式一 CREATE OR REPLACE VIEW 视图名 AS SELECT ...#方式二 ALTER VIEW 视图名 AS SELECT ...
-
删除视图
DROP VIEW 视图名;
索引:INDEX
用于提高查询性能
存储过程:PROCEDURE
用于完成一次完整的业务处理,没有返回值,但可以通过传出参数将多个值传给调用者
- 创建
① 无参数无返回值
② 无参数有返回值:# 查询所有员工信息 DELIMITER $ CREATE PROCEDURE select_all_emp() BEGINSELECT * FROM employees; END $ DELIMITER; # 调用 CALL select_all_emp();
OUT
③ 有参数无返回值:# 查询员工中的最低工资,并将最低工资输出到ms DELIMITER $ CREATE PROCEDURE select_min_sal(OUT ms DECIMAL) BEGINSELECT MIN(salary) INTO msFROM employees; END $ DELIMITER; # 调用 CALL select_min_sal(@ms); # 查看参数结果 SELECT @ms;
IN
④ 有参数有返回值:# 查询指定姓名的员工工资 DELIMITER $ CREATE PROCEDURE show_salary_by_lastname(IN lastName VARCHAR(50)) BEGINSELECT salaryFROM employeesWHERE last_name = lastName; END $ DEIMITER; # 调用 CALL show_salary_by_lastname('Popp');
IN
、OUT
⑤ 有参数有返回值:# 查询指定姓名的员工工资和部门,并从参数中返回出来 DELIMITER $ CREATE PROCEDURE show_salary_by_lastname2(IN lastName VARCHAR(50), OUT sal DECIMAL, OUT dept_id INT) BEGINSELECT salary,department_id INTO sal, dept_idFROM employeesWHERE last_name = lastName; END $ DELIMITER; # 调用 CALL show_salary_by_lastname2('Popp', @sal, @deptId); # 查询结果 SELECT @sal, @deptId;
INOUT
# 查询指定员工的领导姓名,并从参数中返回出来 DELIMITER $ CREATE PROCEDURE show_manager_by_lastname(INOUT lastName VARCHAR(50)) BEGINSELECT m.last_name INTO lastNameFROM employees e JOIN employees mON e.manager_id = m.employee_idWHERE e.last_name = lastName; END $ DELIMITER; # 调用 SET @lastname = 'Popp'; CALL show_manager_by_lastname(@lastname); # 查询结果 SELECT @lastname;
- characteristics
①LANGUAGE SQL
:表明存储过程执行体是由SQL语句构成的
②[NOT] DETERMINISTIC
:存储过程的执行结果是否确定,默认为不确定
③CONTAINS SQL
:存储过程的执行体包含SQL语句,但不包含读写数据的SQL语句,默认是这个
④NO SQL
:存储过程的执行体不包含任何SQL语句
⑤READS SQL DATA
:存储过程的执行体包含读数据的SQL语句
⑥MODIFIES SQL DATA
:存储过程的执行体包含写数据的SQL语句
⑦SQL SECURITY {DEFINER | INVOKER}
:执行权限
⑧COMMENT
:备注信息 - 查看创建信息:
SHOW CREATE PRODECURE 存储过程名称;
- 查看状态信息:
SHOW PROCEDURE STATUS LIKE '存储过程名称';
- 修改特性
ALTER PROCEDURE '存储过程名称' SQL SECURITY INVOKER COMMENT '备注信息...';
- 删除:
DROP PROCEDURE '存储过程名称';
存储函数:FUNCTION
用于完成一次特定的计算,有一个返回值
# 查询指定部门的员工人数
DELIMITER $
CREATE FUNCTION select_count_by_dept(dept_id INT)
RETURNS INT
DETERMINISTIC
CONTAINS SQL
READS SQL DATA
BEGINRETURN(SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END $
DELIMITER;
# 使用
SELECT select_count_by_dept(50);
触发器:TRIGGER
相当于事件监听器,当数据库发生特定事件时,触发器被触发,完成相应的处理
-
创建
代码格式:
CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
BEGIN
代码块;
END;
① 案例一:向一张表中添加数据之前,同时向另一张表添加数据
DELIMITER // CREATE TRIGGER test_before_trigger BEFORE INSERT ON table1 FOR EACH ROW BEGININSERT INTO table2(name)VALUES ('before_name...'); END // DELIMITER; # 测试 INSERT INTO table1(age) VALUES(18);
② 案例二:在向employees表中添加员工信息之前,检验此员工的工资是否大于领导的工资,大于的话报错,否则添加成功(
NEW
代表添加的数据信息,OLD
代表删除的数据信息)DELIMITER // CREATE TRIGGER verify_trigger BEFORE INSERT ON employees FOR EACH ROW BEGINDECLARE manager_sal DECIMAL DEFAULT 0.0;SELECT salary INTO manager_sal FROM employees WHERE employee_id = NEW.manager_id;IF NEW.salary > manager_sal# 抛出错误THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '添加失败:薪资高于领导工资';END IF; END // DELIMITER;
-
查看
① 查看数据库中的所有触发器:SHOW TRIGGERS;
② 查看某个触发器的定义:SHOW CREATE TRIGGER 触发器名称;
-
删除:
DROP TRAGGER 触发器名称;
变量
- 系统变量:以@@开头
① 查看全局系统变量:SHOW GLOBAL VARIABLES;
② 查看会话系统变量
③ 查看指定系统变量SHOW SESSION VARIABLES; SHOW VARIABLES;
④ 修改系统变量的值SELECT @@global.max_connections; # 查看服务器最大连接数 SELECT @@global.character_set_client; # 查看字符集 SELECT @@session.character_set_client; # 查看字符集 SELECT @@session.pseudo_thread_id; # 查看当前会话的MySQL连接ID SELECT @@character_set_client; # 先查看会话的字符集,若没有再查看全局的字符集
SET @@global.max_connections = 166; # 修改全局变量,方式一 SET GLOBAL max_connection = 167; # 修改全局变量,方式二SET @@session.character_set_client = 'gbk'; # 修改会话变量,方式一 SET SESSION character_set_client = 'gbk'; # 修改会话变量,方式二
- 用户变量
① 会话用户变量:以@开头
② 局部变量# 声明和初始化 SET @a = 1; SET @b := 2; SELECT @avg_sal := AVG(salary) FROM employees; # 这种情况必须用:= SELECT COUNT(*) INTO @emp_total FROM employees; #使用 SELECT @a, @b, @avg_sal, @emp_total;
说明:
a、使用关键字:DECLARE
b、只能在存储过程和存储函数中使用
c、必须写在BEGIN...END
的首行
d、格式:DECLARE 变量名 类型 [DEFAULT 值]
,若不指明DEFAULT
,则默认是NULL
DELIMITER $ CREATE PROCEDURE test() BEGIN# 声明局部变量DECLARE a INT DEFAULT 0;DECLARE b INT;DECLARE name VARCHAR(30);#赋值SET a = 5;SET b := 6;SELECT last_name INTO nameFROM employeesWHERE employee_id = 100;#使用SELECT a, b, name; END $ DELIMITER;
定义条件与处理程序
- 定义条件
① 格式:DECLARE 错误名称 CONDITION FOR 错误码;
② 目的:给错误码命名
③ 错误码分类:MySQL_error_code、sqlstate_value - 定义处理程序
① 格式:DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;
② 处理方式分类:
a、CONTINUE
:遇到错误不处理,继续执行
b、EXIT
:遇到错误马上退出
c、UNDO
:遇到错误后撤回之前的操作
③ 错误类型分类
a、SQLSTATE '字符串错误码'
:字符串类型错误码,长度为5
b、MySQL_error_code
:数值类型错误码
c、错误名称:定义条件时声明的名称
d、SQLWARNING
:匹配所有以01开头的错误码
e、NOT FOUND
:匹配所有以02开头的错误码
f、SQLEXCEPTION
:匹配没有被d、e匹配到的错误码 - 案例
DELIMITER $ CREATE PROCEDURE UpdateTest() BEGIN# 因email是NOT NULL,所以执行第一个UPDATE会报错“1048 - Column 'email' cannot be null”# 在此声明错误处理DECLARE CONTINUE HANDLER FOR 1048 SET @message = 'aaa';SET @a = 1;UPDATE employees SET email = NULL WHERE employee_id = 100;SET @a = 2;UPDATE employees SET email = '123@qq.com' WHERE employee_id = 100;SET @a = 3; END $ DELIMITER;# 调用 CALL UpdateTest(); # 查看变量 SELECT @a, @message; // 3, aaa
流程控制
分支结构
-
IF
DELIMITER // CREATE PROCEDURE testIf() BEGINDECLARE score DECIMAL(10,2) DEFAULT 85;IF score >= 90 THEN SELECT 'A';ELSEIF score >= 80 AND score < 90 THEN SELECT 'B';ELSEIF score >= 60 AND score < 80 THEN SELECT 'C';ELSE SELECT 'D';END IF; END // DELIMITER;CALL testIf();
-
CASE
①CASE ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END CASE;
DELIMITER // CREATE PROCEDURE testCase() BEGINDECLARE n INT DEFAULT 2;CASE nWHEN 1 THEN SELECT 'n = 1';WHEN 2 THEN SELECT 'n = 2';ELSE SELECT 'n = 9';END CASE; END // DELIMITER;
②
CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END CASE;
DELIMITER // CREATE PROCEDURE testCase() BEGINDECLARE n INT default 10;CASEWHEN n > 20 THEN SELECT 'n > 20';WHEN n >= 10 THEN SELECT 'n >= 10';ELSE SELECT 'n < 10';END CASE; END // DELIMITER;
循环结构
-
LOOP
DELIMITER // CREATE PROCEDURE testLoop() BEGINDECLARE n INT DEFAULT 1; # n = 1# 开始循环aaa: LOOPIF n >= 8THEN LEAVE aaa;END IF;SET n = n + 1;END LOOP aaa;SELECT n; END // DELIMITER;
-
WHILE
DELIMITER // CREATE PROCEDURE testWhile() BEGINDECLARE n INT DEFAULT 1;WHILE n < 10DOSET n = n + 1;END WHILE;SELECT n; END // DELIMITER;
-
REPEAT
DELIMITER // CREATE PROCEDURE testRepeat() BEGINDECLARE n INT DEFAULT 1;REPEATSET n = n + 1;UNTIL n > 10END REPEAT;SELECT n; END // DELIMITER;
跳转语句
-
LEAVE
① 同BREAK
,格式:LEAVE 循环名;
② 使用场景:循环体中、BEGIN...END
中DELIMITER // CREATE PROCEDURE testLeave(IN num INT) label_test: BEGINIF num = 0 THEN LEAVE label_test;ELSEIF num < 5 THEN SELECT num;ELSE SELECT 'num >= 5';END IF;SELECT 'is end'; END // DELIMITER;
-
ITERATE
① 同CONTINUE
,格式:ITERATE 循环名;
② 使用场景:循环体中DELIMITER // CREATE PROCEDURE test_iterate() BEGINDECLARE num INT DEFAULT 0;iterate_test: LOOPSET num = num + 1;IF num > 5 THEN LEAVE iterate_test;ELSEIF num > 2 THEN ITERATE iterate_test;ELSE SELECT 'is end';END IF;END LOOP;SELECT num; END // DELIMITER;
游标
随意的定位到某一条记录,可以逐条读取数据。在使用游标过程中,会对数据加锁,不适合高并发场景。
DELIMITER //
CREATE PROCEDURE test_cursor(IN limit_total_salary DECIMAL, OUT total_count INT)
BEGIN# 声明变量DECLARE sum_sal DECIMAL DEFAULT 0.0;DECLARE emp_count INT DEFAULT 0;DECLARE emp_sal DECIMAL;# 声明游标DECLARE cursor_test CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;# 打开游标OPEN cursor_test;# 使用游标WHILE sum_sal < limit_total_salaryDOFETCH cursor_test INTO emp_sal;SET sum_sal = sum_sal + emp_sal;SET emp_count = emp_count + 1;END WHILE;SET total_count = emp_count;# 关闭游标CLOSE cursor_test;
END //
DELIMITER;
# 调用
CALL test_cursor(100000, @count);
SELECT @count;
相关文章:
SQL中的数据库对象
视图:VIEW 概念 ① 虚拟表,本身不存储数据,可以看做是存储起来的SELECT语句 ② 视图中SELECT语句中涉及到的表,称为基表 ③ 针对视图做DML操作,对影响到基表中的数据,反之亦然 ④ 创建、删除视图本身&#…...

DeepSeek:性能强劲的开源模型
deepseek 全新系列模型 DeepSeek-V3 首个版本上线并同步开源。登录官网 chat.deepseek.com 即可与最新版 V3 模型对话。 性能对齐海外领军闭源模型 DeepSeek-V3 为自研 MoE 模型,671B 参数,激活 37B,在 14.8T token 上进行了预训练。 论…...

医疗可视化大屏 UI 设计新风向
智能化交互 借助人工智能与机器学习技术,实现更智能的交互功能。如通过语音指令或手势控制来操作大屏,医护人员无需手动输入,可更便捷地获取和处理信息。同时,系统能根据用户的操作习惯和数据分析,自动推荐相关的医疗…...
从企业级 RAG 到 AI Assistant , Elasticsearch AI 搜索技术实践
文章目录 01 AI 搜索落地的挑战02 Elasticsearch 向量性能 5 倍提升03 Elasticsearch 企业版 AI 能力全面解读04 阿里云 Elasticsearch 将准确率提升至 95%05 AI Assistant 集成通义千问大模型实现 AI Ops01 AI 搜索落地的挑战 在过去一年中,基座大模型技术的快速迭代推动了 …...
TypeScript语言的并发编程
TypeScript语言的并发编程 引言 随着现代应用程序的复杂性不断增加,性能和用户体验的重要性显得尤为突出。在这种背景下,并发编程应运而生,成为提升应用程序效率的重要手段。在JavaScript及其超集TypeScript中,尽管语言本身是单…...

benchANT 性能榜单技术解读 Part 1:写入吞吐
近期,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…...
虚拟机防火墙管理
虚拟机防火墙管理 在网络防护方面,PVE提供了相当良好的防火墙管理功能,并且可以适用于节点实体机、客体机、让客体机内不需要另外再安装软体防火墙,对于效能与统一管理大有助益,管理者可以方便一次管理所有的防火墙规则࿰…...

Nginx反向代理请求头有下划线_导致丢失问题处理
后端发来消息说前端已经发了但是后端没收到请求。 发现是下划线的都没收到,搜索之后发现nginx默认request的header中包含’_’时,会自动忽略掉。 解决方法是:在nginx里的nginx.conf配置文件中的http部分中添加如下配置: unders…...

【STM32+CubeMX】 新建一个工程(STM32F407)
相关文章: 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步Cu…...

机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构
导读: 由于环境中静态障碍物和动态障碍物的约束,机器人在密集且交互复杂的人群中导航,往往面临碰撞与延迟等安全与效率问题。举个简单的例子,商城和车站中的送餐机器人往往在人流量较大时就会停在原地无法运作,因为它不…...

H2数据库在单元测试中的应用
H2数据库特征 用比较简洁的话来介绍h2数据库,就是一款轻量级的内存数据库,支持标准的SQL语法和JDBC API,工业领域中,一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…...

部署HugeGraph
部署HugeGraph 这里以hugegraph1.2.0为例子,演示一下如何安装部署hugegraph 一、下载并安装JDK11 下载JDK11 https://www.oracle.com/java/technologies/downloads/#java11 使用scp命令将安装包上传到服务器 scp /path/to/local/file usernameserver_ip:/path/…...
2025年第三届“华数杯”国际赛A题解题思路与代码(Matlab版)
游泳竞技策略优化模型代码详解(MATLAB版) 第一题:速度优化模型 本部分使用MATLAB实现游泳运动员在不同距离比赛中的速度分配策略优化。 1. 模型概述 模型包含三个主要文件: speed_optimization.m: 核心优化类plot_speeds.m: …...
嵌入式基础 -- IMX8MP的 GPC 模块技术
General Power Controller (GPC) 模块技术文档 1. GPC 模块简介 1.1 模块功能 GPC(General Power Controller)模块是用于 i.MX8M Plus 应用处理器 的电源管理组件,支持以下功能: 管理 ARM Cortex-A53 和 Cortex-M7 平台的低功…...

选择器css
1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…...

全方位解读消息队列:原理、优势、实例与实践要点
全方位解读消息队列:原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下,分布式系统架构愈发复杂,消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”,在古代,各地的信件、物资运…...
JavaScript运算符与控制结构
JavaScript作为一门强大的前端语言,提供了丰富的运算符与控制结构,使程序逻辑更加灵活与高效。 1. JavaScript运算符 算术运算符 运算符描述示例结果加法5 38-减法7 - 43*乘法2 * 612/除法8 / 24%取模(余数)10 % 31**幂运算3 …...

2030年中国AI人才缺口或达400万,近屿智能助力AI人才储备增长
在当今数字化浪潮下,人工智能(AI)已成为推动各行业发展的关键力量。然而,吸引和留住 AI 人才正成为全球性难题,中国亦不例外。据麦肯锡 2022 年全球人工智能商业高管调查,75% 的中国受访者在招聘数据科学家…...

如何设计一个注册中心?以Zookeeper为例
这是小卷对分布式系统架构学习的第8篇文章,在写第2篇文章已经讲过服务发现了,现在就从组件工作原理入手,讲讲注册中心 以下是面试题: 某团面试官:你来说说怎么设计一个注册中心? 我:注册中心嘛&…...

ubuntu 20.04 安装docker--小白学习之路
更新包 sudo apt-get update # 安装需要的软件包以使apt能够通过HTTPS使用仓库 sudo apt-get install ca-certificates curl gnupg lsb-release 使用清华大学源 # 添加Docker官方的GPG密钥 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...