高级语句(二)

news2025/7/5 13:58:37

一、VIEW(视图)

1、 概念

可以被当作是虚拟表或存储查询

视图跟表格的不同是,表格中有实际储存资料,而视图是建立在表格之上的一个架构,它本身并不实际储存资料。

临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。

视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。

2、 创建、查看和删除视图

CREATE VIEW "视图表名" AS "SELECT 语句";                      #创建视图表
SELECT * FROM `V_NAME_VALUE`;                       #查看视图表
DROP VIEW V_NAME_VALUE;                         #删除视图表

实例操作:

create view v_test1_2 as select A.name,A.xueke from test2 A where name in (select B.name from test1 B where age > 20);
select *from v_test1_2;
drop view v_test1_2;

二、联集

将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要是同样的

1、UNION

生成结果值将没有重复,且按照字段的顺序进行排序

语法:[SELECT 语句 1] UNION [SELECT 语句 2];

实例操作:

select name from test1 union select name from test2;


 

2、UNION ALL

将生成结果的值都列出来,无论有无重复

语法:[SELECT 语句 1] UNION ALL [SELECT 语句 2];

实例操作:

select name from test1 union all select name from test2;


  

三、交集值

取两个SQL语句结果的交集

1、取交集值的方法1(2种简单方法,内连接+on/using,去重则加上distinct)

select A.name from test1 A inner join test2 B on A.name=B.name;
select A.name from test1 A inner join test2 B using(name);
select distinct A.name from test1 A inner join test2 B on A.name=B.name;

2、取交集方法2(1种,union all结合group by)

两表其中的一个表没有指定的行,而另一个表这个行有重复不可用,要求两个表确实有交集的时候用

select A.name from (select name from test1 union all select name from test2) A group by A.name having count(*) > 1;
select A.name from (select name from test1 union all select name from test2) A group by A.name having count(name) > 1; 
select name from test1 union all select name from test7; #拆分上面的SQL语句
select A.name,count(name) from (select name from test1 union all select name from test2) A group by A.name having count(name) > 1; #显示count值,便于理解
 
select A.name,count(name) from (select distinct name from test1 union all select distinct name from test2) A group by A.name having count(name) > 1; #去重显示,在联集两个表之前先把表去重,以防一个表中本身就有重复值


  

3、取交集(去重)——4种方法

取两个SQL语句结果的交集,且没有重复

方法一:
mysql> select A.name from (select B.name from test1 B inner join test2 C on B.name=C.name) A group by A.name;
方法二:
select distinct A.name from test1 A inner join test2 B using(name);
方法三:
select distinct name from test1 where name in (select name from test2);
方法四:
select distinct A.name from test1 A left join test2 B using(name) where B.name is NOT NULL;

方法一:内连接取交集结合group by去重


  

方法二:内连接取交集结合distinct去重

方法三:where+in遍历取交集并结合distinct去重


 

方法四:使用左连接(也可用右连接)+where 判断NOT NULL 取交集并结合distinct去重


  

四、无交集值

显示第一个SQL语句的结果,且与第二个SQL语句没有交集的结果,且没有重复

方法一:
select A.name from (select distinct name from test1 union all select distinct name from test2) A group by A.name having count(name)=1;
方法二:
select distinct name from test2 where name not in (select distinct name from test1);
select distinct name from test1 where name not in (select distinct name from test2);
方法三:
select distinct A.name from test1 A left join test2 B using(name) where B.name is NULL;
select distinct B.name from test1 A right join test2 B using(name) where A.name is NULL;

方法一:union all结合group by进行分组汇总并使用count=1取无交集值

方法二:where+not in遍历取无交集值并结合distinct去重

方法三:使用左连接(或者右连接)+where 判断NULL 取无交集并结合distinct去重

五、CASE的用法

是SQL用来作为IF-THEN-ELSE之类逻辑的关键字

1、语法格式:

SELECT CASE (字段名)
    WHEN "条件1" THEN  "结果1"
    WHEN "条件2" THEN  "结果2"
    ……
    ELSE "结果N"
    END
FROM "表名"

条件可以是一个数值或是公式。ELSE子句不是必须的

2、实例操作


 

六、空值(NULL)和无值(“”)的区别

区别:

无值的长度为0,不占用空间;而空值null 的长度是null,是占用空间的;

IS NULL或者IS NOT NULL,是用来判断字段是不是NULL或者不是NULL,是不能查出是不是无值的;

无值的判断使用=’‘或者<>’'来处理。<>代表不等于;

在通过count()指定字段统计有多少行数时,如果遇到NULL值会自动忽略掉,遇到空值会自动加入记录中进行计算。

1、判断空值和无值的字符长度

select length(NULL),length(''),length('1');

  

2、使用count统计行数(体现null与空值的区别)

count(*) 表示包括所有列的行数,不会忽略null值;空值正常统计

count(列名) 表示只包括这一列,统计时会忽略null值的行;空值正常统计

七、正则表达式(REGEXP)

1、正则表达式匹配符

字符解释举列
^匹配文本的开始字符’ ^aa ’ 匹配以 aa 开头的字符串
$匹配文本的结束字符’ aa$ ’ 匹配以aa结尾的字符串
.匹配任何单个字符’ a.b '匹配任何a和b之间有一个字符的字符串
*匹配零个或多个在它前面的字符’ ab*c ’ 匹配 c 前面有任意个 b
+匹配前面的字符1次或多次’ ab+ ’ 匹配以 a 开头,后面至少一个 b 的字符串
字符串匹配包含指定的字符串’ aa '匹配含有 aa 的字符串
a1 I a2匹配 a1 或 a2‘aa l bb’ 匹配 aa 或者 bb
[…]匹配字符集合中的任意一个字符‘[abc]’ 匹配 a 或者 b 或者 c
[^…]匹配不在括号中的任何字符’ [^ab] ’ 匹配不包含 a 或者 b 的字符串
匹配前面的字符串n次’ a{2} ’ 匹配含有2个a的字符串
匹配前面的字符串至少n次,至多m次’ f{1,3} ’ 匹配 f 最少1次,最多3次

2 语法

SELECT 选项 FROM 表名 WHERE 选项 REGEXP (模式)

select * from test1 where name regexp '三$';
select * from test1 where age regexp '18|22';
select * from test1 where name regexp '^小|^阿';

八、存储过程

1、概述

存储过程是一组为了完成特定功能的SQL语句集合

存储过程在使用过程中是将常用或者复杂的工作预先使用 SQL 语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中,当需要使用时,只需要调用即可

存储过程在执行上比传统SQL速度更快、执行效率更高。

2、优点

执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率

SQL语句加上控制语句的集合,灵活性高

在服务器端存储,客户端调用时,降低网络负载

可多次重复被调用,可随时修改,不影响客户端调用

可完成所有的数据库操作,也可控制数据库的信息访问权限

九、 创建、调用、查看和删除存储过程

1 创建存储过程

DELIMITER $$                                #将语句的结束符号从分号;临时改为两个$$ (可以是自定义)
CREATE PROCEDURE proc()                     #创建存储过程,过程名为Proc, 不带参数
-> BEGIN                                    #过程体以关键字BEGIN开始
-> SELECT * FROM test5;                     #过程体语句(自己根据需求进行编写)
-> END $$                                   #过程体以关键字END结束
DELIMITER ;                                 #将语句的结束符号恢复为分号

实例操作:

mysql> delimiter ##
mysql> create procedure proc()
    -> begin
    -> insert into test3 values (2,'lucy',23);
    -> insert into test3 values (2,'jack',21);
    -> insert into test3 values (4,'nancy',22);
    -> select * from test3;
    -> end ##


  

2 调用存储过程

CALL proc;

3 查看存储过程

SHOW CREATE PROCEDURE [数据库.] 存储过程名;      #查看某个存储过程的具体信息(如果在指定库中,库名可以省略)
SHOW CREATE PROCEDURE learn.proc;                 #未省略库名
SHOW CREATE PROCEDURE proc;                     #省略库名
 
SHOW PROCEDURE STATUS [LIKE '%proc%'] \G                #竖列查看

实例操作:

方法一:
show create procedure proc;
show create procedure proc\G;
方法二:
show procedure status like '%proc%';
show procedure status like '%proc%'\G;


  

4 存储过程的参数

IN输入参数

  • 表示调用者向过程传入值(传入值可以是字面量或变量)

OUT输出参数

  • 表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT输入输出参数

  • 既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

实例操作:

IN 传入参数

mysql> delimiter ##
mysql> create procedure proc1(in iage int)
    -> begin
    -> select * from test5 where age > iage ;
    -> end ##
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;
mysql> call proc1(21);

OUT输出参数

因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的num为null

#调用了proc2存储过程,输出参数,改变了num变量的值

INOUT输入输出参数


  
调用了proc3存储过程,接受了输入的参数,也输出参数,改变了变量

5 删除存储过程

存储过程内容的修改方法是通过删除原有存储过程之后以相同名称创建新的存储过程

DROP PROCEDURE IF EXISTS proc1;


  

十、存储过程的控制语句

1 条件控制语句 if-then-else … end if

mysql> delimiter ##                                #修改默认结束符为##
mysql> create procedure proc1(in iage int)         #创建存储过程proc1,参数为iage,数据类型为int
    -> begin                                       #过程体以关键词begin开始
    -> declare var int;                            #定义变量var为int类型
    -> set var=iage*2;                             #设置变量var等于传入参数的2倍
    -> if var >=20 then                            #如果var大于等于20,则执行下面的过程体
    -> update test3 set age=age+1;                 #设置test5中的age+1
    -> else                                        #如果变量var不大于10,则执行下面过程体
    -> update test3 set age=age-1;                 #设置表test5中的age-1
    -> end if;                                     #结束if语句
    -> end ##                                      #结束创建存储过程
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;                                 #重新修改默认结束符为原来的;
mysql> call proc1(10);                             #调用proc1的存储过程,并传入参数10
Query OK, 6 rows affected (0.00 sec)

2 循环语句while … end while

mysql> delimiter ##                       #修改默认结束符为##
mysql> create procedure proc4()           #创建存储过程为proc4
    -> begin                              #过程体以关键字begin开始
    -> declare var int;                   #定义变量var为int类型
    -> set var=0;                         #设置var=0
    -> while var <10 do                   #使用while循环,var要小于10
    -> insert into test5(id) values(var); #满足条件则进行添加数据,内容为变量var
    -> set var=var+1;                     #变量var每次循环后加1
    -> end while;                         #结束while循环
    -> end ##                             #结束创建存储过程
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;                        #重新修改默认结束符为原来的;
mysql> call proc4;                        #调用proc4存储过程
Query OK, 1 row affected (0.01 sec)

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

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

相关文章

关于预处理器 sass 的超全用法

随着用户需求的增加&#xff0c;应用于页面的 css 代码越来越复杂越发臃肿难以维护&#xff0c;但是又没有 css 的替代品&#xff0c;css 预处理器作为 css 的扩展&#xff0c;出现在前端技术中。 sass 是 css 预处理器中常用的一种&#xff0c;它是一种动态样式语言&#xff0…

基于html+css图展示58

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

C++系列九:预处理功能

预处理功能 1. 宏定义2. 文件包含3. 条件编译4. 代码注释5. 预处理器注意事项6. 总结 预处理器是 C 编译器提供的一个工具&#xff0c;允许程序员在编译之前对源代码文件做出修改。它主要是根据在代码中命名实体的定义&#xff08;如宏、条件编译指令&#xff09;、源文件调用等…

分布函数有什么意义?

累积分布函数&#xff08;CDF&#xff09;有什么意义&#xff1f; 参考文献&#xff1a;姜咏梅. 浅析分布函数的意义与应用[J]. 科学与财富,2014(10):207-207,208. DOI:10.3969/j.issn.1671-2226.2014.10.183. 关于PMF、PDF、CDF的介绍&#xff0c;移步至我的笔记&#xff1a…

【SPSS】因子分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 因子分析 因子分析案例 因子分析

Clion开发STM32之OTA升级模块(一)

什么是OTA 百度百科解释个人理解&#xff1a;就是不通过烧录的方式&#xff0c;通过串口、网口、无线对主板运行的程序进行升级。减少后期的一个维护迭代程序的一个成本。 STM32的OTA升级模块的一个设计 程序启动的一个框架流程图(大致流程) FLASH的一个划分框图 BootLoader…

Nautilus Chain 或成未来最好的链上隐私生态

Nautilus Chain 目前仍旧处于测试网阶段&#xff0c;作为目前行业内首个&#xff0c;也是最受关注的 Layer3 模块化链&#xff0c;Nautilus Chain 在测试网早期阶段&#xff0c;整体就有着十分出色的数据表现。而该链有望在 6 月上线主网&#xff0c;面向更为广泛的开发者、用户…

分布式数据库设计与实现

分布式数据库设计与实现 摘要背景二期项目包括数据库选型分布式数据库设计数据集成测试部署分布式数据库扩展阅读 摘要 : 本文论述《金蚕工程》的分布式数据库的设计和实现。该项目的设计目标是实现企业间茧、丝等的合同交易&#xff08;交易规则和期货交易一样&#xff09;、…

【springcloud 微服务】springcloud openfeign使用详解

目录 一、前言 二、openfeign介绍 2.1 openfeign介绍 2.2 openfeign优势 三、Spring Cloud Alibaba整合OpenFeign 3.1 前置准备 3.2 代码整合过程 3.2.1 添加feign依赖 3.2.2 添加feign接口类 3.2.3 调整调用的方法 3.2.4 核心配置文件 3.2.5 接口模拟测试 四…

libevent介绍和使用

libevent介绍 libevent 是一个开源的事件通知库&#xff0c;它提供了一个跨平台的抽象接口&#xff0c;libevnet处理的事件包括网络IO事件&#xff0c;定时事件以及信号事件。它可以在不同的操作系统上使用&#xff0c;包括Linux、Windows和Mac OS X等。libevent 的主要目的是…

最全面的ChatGPT镜像网址:值得三连~~~

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…

69.建立手风琴组件第二部分

上节课我们构建了下图一样的基本样式&#xff0c;这节课我们来构建布局&#xff01; ● 建立阴影&#xff0c;并生成grid布局 .item {box-shadow: 0 0 32px rgba(0,0,0,0.1);#添加外阴影&#xff0c;为半透明黑色&#xff0c;大小为0&#xff0c;0&#xff0c;32pxpadding: 24p…

C++编译Boost库读写和解析JSON文件和XML文件(2023.5.14)

C编译Boost读写并解析JSON文件和XML文件 需求分析前提环境&#xff08;Win11、VS 2015&#xff09;1、Boost简介1.1 为何使用Boost&#xff1f;1.2 Boost快速上手&#xff08;Windows系统&#xff09; 2、Boost 安装和使用2.1 自己下载源码编译生成Boost库(v 1.82.0)2.2 从官网…

基于微信平台教务管理系统的设计与实现(论文+源码)_kaic

摘 要 网络技术的快速发展也使得越来越多的研究学者将计算机技术应用到停车、医疗、商业、旅游等各行各业&#xff0c;这些传统行业在计算机技术的催动下&#xff0c;正在快速发展。为了顺应时代发展的变化&#xff0c;将计算机技术应用到教务管理领域显得极为重要。 本文设计…

哈希表+unordered_map封装

目录 1&#xff1a;hashtable.h 2&#xff1a;unordered_map.h 3&#xff1a;unordered_set 4&#xff1a;讲解 1&#xff1a;hashtable.h #pragma once #include<vector> using namespace std; namespace OpenAdress {enum State{EXIST,DELETE,EMPTY,};template<c…

redis淘汰策略

8种淘汰策略 volatile-lru&#xff0c;针对设置了过期时间的key&#xff0c;使用lru算法进行淘汰。 allkeys-lru&#xff0c;针对所有key使用lru算法进行淘汰。 volatile-lfu&#xff0c;针对设置了过期时间的key&#xff0c;使用lfu算法进行淘汰。 allkeys-lfu&#xff0c;针…

『C++』特殊类设计

「前言」文章是关于C特殊类设计方面的 「归属专栏」C嘎嘎 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 一点浩然气&#xff0c;千里快哉风。 ——苏轼《水调歌头黄州快哉亭赠张偓佺》 目录 一、请设计一个类&#xff0c;不能被拷贝 …

IDEA开发实现Maven+Servlet+Mybatis实现CRUD管理系统-Mapper代理开发

Mapper代理开发概述 之前我们写的代码是基本使用方式&#xff0c;它也存在硬编码的问题&#xff0c;如下&#xff1a; 这里调用 selectList() 方法传递的参数是映射配置文件中的 namespace.id值。这样写也不便于后期的维护。如果使用 Mapper 代理方式&#xff08;如下图&…

stm32之hal库学习(3)---STM32 启动模式分析

启动模式 我们知道的复位方式有三种&#xff1a;上电复位&#xff0c;硬件复位和软件复位。当产生复位&#xff0c;并且离开复 位状态后&#xff0c;CM3 内核做的第一件事就是读取下列两个 32 位整数的值&#xff1a; &#xff08;1&#xff09;从地址 0x0000 0000 处取出堆栈…

Linux基本指令----下

Linux基本指令----下 date指令cal指令find指令which指令whereis指令grep指令du指令zip/unzip指令tar指令bc指令uname -r指令关机指令重要热键结语 date指令 语法&#xff1a; date 指定格式显示时间&#xff1a; date %Y:%m:%d&#xff0c;date 用法&#xff1a;date [OPTION]…