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,则默认是NULLDELIMITER $ 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…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
