SQL中的数据库对象

视图:VIEW

  1. 概念
    ① 虚拟表,本身不存储数据,可以看做是存储起来的SELECT语句
    ② 视图中SELECT语句中涉及到的表,称为基表
    ③ 针对视图做DML操作,对影响到基表中的数据,反之亦然
    ④ 创建、删除视图本身,不会影响到基表

  2. 创建视图

    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;
    
  3. 查看视图:DESC 视图名;

  4. 修改视图

    # 方式一
    CREATE OR REPLACE VIEW 视图名
    AS
    SELECT ...#方式二
    ALTER VIEW 视图名
    AS
    SELECT ...
    
  5. 删除视图

    DROP VIEW 视图名;
    

索引:INDEX

用于提高查询性能

存储过程:PROCEDURE

用于完成一次完整的业务处理,没有返回值,但可以通过传出参数将多个值传给调用者

  1. 创建
    ① 无参数无返回值
    # 查询所有员工信息
    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');
    
    ④ 有参数有返回值:INOUT
    # 查询指定姓名的员工工资和部门,并从参数中返回出来
    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;
  2. 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:备注信息
  3. 查看创建信息SHOW CREATE PRODECURE 存储过程名称;
  4. 查看状态信息SHOW PROCEDURE STATUS LIKE '存储过程名称';
  5. 修改特性
    ALTER PROCEDURE '存储过程名称'
    SQL SECURITY INVOKER
    COMMENT '备注信息...';
    
  6. 删除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

相当于事件监听器,当数据库发生特定事件时,触发器被触发,完成相应的处理

  1. 创建

    代码格式:
    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;
    
  2. 查看
    ① 查看数据库中的所有触发器:SHOW TRIGGERS;
    ② 查看某个触发器的定义:SHOW CREATE TRIGGER 触发器名称;

  3. 删除DROP TRAGGER 触发器名称;

变量

  1. 系统变量:以@@开头
    ① 查看全局系统变量: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'; # 修改会话变量,方式二
    
  2. 用户变量
    ① 会话用户变量:以@开头
    # 声明和初始化
    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;
    

定义条件与处理程序

  1. 定义条件
    ① 格式:DECLARE 错误名称 CONDITION FOR 错误码;
    ② 目的:给错误码命名
    ③ 错误码分类:MySQL_error_code、sqlstate_value
  2. 定义处理程序
    ① 格式: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匹配到的错误码
  3. 案例
    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
    

流程控制

分支结构

  1. 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();
    
  2. 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;
    

循环结构

  1. 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;
    
  2. WHILE

    DELIMITER //
    CREATE PROCEDURE testWhile()
    BEGINDECLARE n INT DEFAULT 1;WHILE n < 10DOSET n = n + 1;END WHILE;SELECT n;
    END //
    DELIMITER;
    
  3. REPEAT

    DELIMITER //
    CREATE PROCEDURE testRepeat()
    BEGINDECLARE n INT DEFAULT 1;REPEATSET n = n + 1;UNTIL n > 10END REPEAT;SELECT n;
    END //
    DELIMITER;
    

跳转语句

  1. 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;
    
  2. 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;

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

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

相关文章

flink的EventTime和Watermark

时间机制 Flink中的时间机制主要用在判断是否触发时间窗口window的计算。 在Flink中有三种时间概念&#xff1a;ProcessTime、IngestionTime、EventTime。 ProcessTime&#xff1a;是在数据抵达算子产生的时间&#xff08;Flink默认使用ProcessTime&#xff09; IngestionT…

Ubuntu 下测试 NVME SSD 的读写速度

在 Ubuntu 系统下&#xff0c;测试 NVME SSD 的读写速度&#xff0c;有好多种方法&#xff0c;常用的有如下几种&#xff1a; 1. Gnome-disks Gnome-disks&#xff08;也称为“Disks”&#xff09;是 GNOME 桌面环境中的磁盘管理工具&#xff0c;有图形界面&#xff0c;是测试…

SpringBoot之核心配置

学习目标&#xff1a; 1.熟悉Spring Boot全局配置文件的使用 2.掌握Spring Boot配置文件属性值注入 3.熟悉Spring Boot自定义配置 4.掌握Profile多环境配置 5.了解随机值设置以及参数间引用 1.全局配置文件 Spring Boot使用 application.properties 或者application.yaml 的文…

后端服务集成ElasticSearch搜索功能技术方案

文章目录 一、为什么选用ElasticSearch二、ElasticSearch基本概念1、文档和字段2、索引和映射3、倒排索引、文档和词条4、分词器 三、ElasticSearch工作原理1、Term Dictionary、Term index2、Stored Fields3、Docs Values4、Segment5、Lucene6、高性能、高扩展性、高可用①高性…

【JavaEE进阶】获取Cookie/Session

&#x1f340;Cookie简介 HTTP协议自身是属于 "⽆状态"协议. "⽆状态"的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆⽹站成…

《Spring Framework实战》3:概览

欢迎观看《Spring Framework实战》视频教程 Spring Framework 为基于现代 Java 的企业应用程序提供了全面的编程和配置模型 - 在任何类型的部署平台上。 Spring 的一个关键要素是应用程序级别的基础设施支持&#xff1a;Spring 专注于企业应用程序的 “管道”&#xff0c;以便…

借助免费GIS工具箱轻松实现las点云格式到3dtiles格式的转换

在当今数字化浪潮下&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术日新月异&#xff0c;广泛渗透到城市规划、地质勘探、文化遗产保护等诸多领域。而 GISBox 作为一款功能强大且易用的 GIS 工具箱&#xff0c;以轻量级、免费使用、操作便捷等诸多优势&#xff0c;为…

高等数学学习笔记 ☞ 一元函数微分的基础知识

1. 微分的定义 &#xff08;1&#xff09;定义&#xff1a;设函数在点的某领域内有定义&#xff0c;取附近的点&#xff0c;对应的函数值分别为和&#xff0c; 令&#xff0c;若可以表示成&#xff0c;则称函数在点是可微的。 【 若函数在点是可微的&#xff0c;则可以表达为】…

linux之自动挂载

如果想要实现自动挂载&#xff0c;应该挂在客户端&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 客户端&#xff1a; [rootlocalhost ~]# yum install nfs-utils -y &#xff08;下载软件&#xff09; [rootlocalhost ~]# systemctl start nfs-utils.servic…

用户界面软件01

Jens Coldewey 著&#xff0c;Tom.X 译 本文中的模式语言逐步深入地探讨用户界面架构的设计&#xff0c;它基于人机工程学&#xff0c;足以形成一套完整的体系。如果你对这方面有兴趣&#xff0c;请参考[Tog92]&#xff0c;[Coo95]和[Col95]。 本文不讨论用户界面的布局&…

2025.1.8(c++对c语言的扩充——堆区空间,引用,函数)

笔记 上一笔记接续&#xff08;练习2的答案&#xff09; 练习&#xff1a;要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数&#xff0c;并在主程序中完成测试 要求使用new和d…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

Harmony开发【笔记1】报错解决(字段名写错了。。)

在利用axios从网络接收请求时&#xff0c;发现返回obj的code为“-1”&#xff0c;非常不解&#xff0c;利用console.log测试&#xff0c;更加不解&#xff0c;可知抛出错误是 “ E 其他错误: userName required”。但是我在测试时&#xff0c;它并没有体现为空&#xff0c;…

(2023|NIPS,LLaVA-Med,生物医学 VLM,GPT-4 生成自指导指令跟随数据集,数据对齐,指令调优)

LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 目录 LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day 0. 摘要 1. 简介 2. 相关工作 3. 生物医学视觉指令数据 4. 将多模态对话模型适配…

(概率论)无偏估计

参考文章&#xff1a;(15 封私信 / 51 条消息) 什么是无偏估计&#xff1f; - 知乎 (zhihu.com) 首先&#xff0c;第一个回答中&#xff0c;马同学图解数学讲解得很形象&#xff0c; 我的概括是&#xff1a;“注意&#xff0c;有一个总体的均值u。然后&#xff0c;如果抽样n个&…

国产游戏崛起,燕云十六移动端1.9上线,ToDesk云电脑先开玩

游戏爱好者的利好消息出新了&#xff01;网易大型武侠仙游《燕云十六声》正式官宣&#xff0c;移动端要在1月9日正式上线了&#xff01;你期待手游版的燕云吗&#xff1f;不妨评论区留言说说你的看法。小编分别花了几个小时在台式机电脑和手机上都试了下&#xff0c;欣赏画面还…

VS2022引入sqlite数据库交互

法一&#xff1a;用官网编译好的动态库(推荐) 下载所需文件 sqlite官网地址&#xff1a;https://www.sqlite.org/howtocompile.html 下载以下的2个压缩包 第一个压缩包 sqlite-amalgamation-xxxx.zip&#xff0c;xxxx是版本号,保持一致即可&#xff0c;这里面有sqite3.h 第…

Java后端常用的4种请求方式(通俗易懂)

文章目录 前言通用接口类(ControllerDemo)通用实体类(UserEntity)通用响应类(HttpClientResult)成功截图(先启动项目,然后右键执行main方法) HttpClientHttpClient 的主要类代码案例导入依赖工具类(HttpClientUtil)测试类 HttpURLConnection简介调用步骤代码案例导入依赖工具类…

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一&#xff09;问题&#xff1a;用ULINK2给STM32F103C8T6下载程序&#xff0c;下载方式设置如下&#xff1a; 出现下面两个问题&#xff1a; 1&#xff09;下载问题界面如下&#xff1a; 这个错误的信息大概可以理解为&#xff0c;在0x08000063地址上读取到flash存储为FF&am…

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

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