SQL进阶笔记

SQL进阶笔记

CASE表达式

  1. 简单case表达式

    case sexwhen '1' then '男'when '2' then '女'else '其他' end
    
  2. 搜索case表达式

    case when sex ='1' then '男'when sex ='2' then '女'else '其他' end
    

    编写SQL语句的时候需要注意,在发现为真的WHEN子句时,CASE表达式的真假值判断就会中止,而剩余的WHEN子句会被忽略。为了避免引起不必要的混乱,使用WHEN子句时要注意条件的排他性

-- 这样写结果不会出现“第二”
case when col_1 in('a','b') then '第一'when col_1 in('a') then '第二'else '其他' end

注意事项:养成写ELSE子句的习惯(不要忘了写END、统一各分支返回的数据类型)

与END不同,ELSE子句是可选的,不写也不会出错。不写ELSE子句时,CASE表达式的执行结果是NULL。但是不写可能会造成“语法没有错误,结果却不对”这种不易追查原因的麻烦,所以最好明确地写上ELSE子句(即便是在结果可以为NULL的情况下)。养成这样的习惯后,我们从代码上就可以清楚地看到这种条件下会生成NULL,而且将来代码有修改时也能减少失误

3.简单例子1:统计下表PopTbl中的内容,得出如下表“统计结果”所示的结果

在这里插入图片描述

-- 把县编号转换成地区编号
select case pref_namewhen '德岛' then '四国'when '香川' then '四国'when '爱媛' then '四国'when '高知' then '四国'when '福冈' then '九州'when '佐贺' then '九州'when '长椅' then '九州'else '其他' end as district,sum(population)from poptblgroup bycase pref_namewhen '德岛' then '四国'when '香川' then '四国'when '爱媛' then '四国'when '高知' then '四国'when '福冈' then '九州'when '佐贺' then '九州'when '长椅' then '九州'else '其他' end
-- 在PostgreSQL和MySQL中可以这样写
select case pref_namewhen '德岛' then '四国'when '香川' then '四国'when '爱媛' then '四国'when '高知' then '四国'when '福冈' then '九州'when '佐贺' then '九州'when '长椅' then '九州'else '其他' end as district,sum(population)from poptblgroup by district;/*这里的GROUP BY子句使用的正是SELECT子句里定义的列的别称——district。但是严格来说,这种写法是违反标准SQL的规则的。因为GROUP BY子句比SELECT语句先执行,所以在GROUP BY子句中引用在SELECT子句里定义的别称是不被允许的。事实上,在Oracle、DB2、SQL Server等数据库里采用这种写法时就会出错*/

4.简单例子2:

统计表poptbl2

在这里插入图片描述

结果表

  • 第一种做法,写两个查询,用union合并

    select pref_name,sum(population) from poptbl2 where sex ='1' group by pref_name;
    union
    select pref_name,sum(population) from poptbl2 where sex ='2' group by pref_name;
    
  • 第二种做法,使用case表达式

    select pref_name,
    -- 男性人口
    sum(case when sex ='1' then population else 0 end) as cnt_m,
    -- 女性人口
    sum(case when sex ='2' then polulation else 0 end) as cnt_f
    from poptbl2
    group by
    pref_name;
    /*
    上面这段代码所做的是,分别统计每个县的“男性”(即’1')人数和“女性”(即’2')人数。也就是说,这里是将“行结构”的数据转换成了“列结构”的数据。除了SUM, COUNT、AVG等聚合函数也都可以用于将行结构的数据转换成列结构的数据
    */
    

    5.用CHECK约束定义多个列的条件关系

    -- 假设某公司规定“女性员工的工资必须在20万日元以下”,而在这个公司的人事表中,这条无理的规定是使用CHECK约束来描述的,代码如下所示
    constraint check_salary check 
    (case when sex = '2' then case when salary <=200000
    then 1 else 0 end
    else 1 end =1)
    -- 逻辑与也是一个逻辑表达式,意思是“P且Q”,记作P∧Q。用逻辑与改写的CHECK约束如下
    constraint check_salary check
    (sex = '2' and salary <=200000)
    /*
    说明:
    如果在CHECK约束里使用逻辑与,该公司将不能雇佣男性员工。而如果使用蕴含式,男性也可以在这里工作。
    解释:
    要想让逻辑与P∧Q为真,需要命题P和命题Q均为真,或者一个为真且另一个无法判定真假。也就是说,能在这家公司工作的是“性别为女且工资在20万日元以下”的员工,以及性别或者工资无法确定的员工(如果一个条件为假,那么即使另一个条件无法确定真假,也不能在这里工作)。而要想让蕴含式P→Q为真,需要命题P和命题Q均为真,或者P为假,或者P无法判定真假。也就是说如果不满足“是女性”这个前提条件,则无需考虑工资约束。*/

    6.逻辑与和蕴含式

在这里插入图片描述

蕴含式在员工性别不是女性(或者无法确定性别)的时候为真,可以说相比逻辑与约束更加宽松

简单应用:

假设现在需要根据以下条件对该表的数据进行更新。

1.对当前工资为30万日元以上的员工,降薪10%。

2.对当前工资为25万日元以上且不满28万日元的员工,加薪20%。按照这些要求更新完的数据应该如下表所示

在这里插入图片描述

执行下面两个UPDATE操作好像就可以做到,但这样的结果却是不正确的。

-- 对当前工资为30万日元以上的员工,降薪10%
update salarise set salary=salary*0.9 where salary >=300000;
-- 对当前工资为25万日元以上且不满28万日元的员工,加薪20%
update salarise set salary=salary*1.2 where salary >=250000 and salary <=280000;

分析一下不正确的原因:

例如这里有一个员工,当前工资是30万日元,按“条件1”执行UPDATE操作后,工资会被更新为27万日元,但继续按“条件2”执行UPDATE操作后,工资又会被更新为32.4万日元。这样,本来应该被降薪的员工却被加薪了2.4万日元

在这里插入图片描述

用case来写

update salarise set salary = case when salary >= 300000then salary*0.9then salary >= 250000 andsalary <280000 then salary*1.2else salary end;
/* 
说明:需要注意的是,SQL语句最后一行的ELSE salary非常重要,必须写上。因为如果没有它,条件1和条件2都不满足的员工的工资就会被更新成NULL。这一点与CASE表达式的设计有关,在刚开始介绍CASE表达式的时候我们就已经了解到,如果CASE表达式里没有明确指定ELSE子句,执行结果会被默认地处理成ELSE NULL*/

7.表之间的数据匹配

in和exisin和区别:

in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理

练习1:

在这里插入图片描述

select key,case when x<y then y else x end as greatest from greatests;

练习2:

在这里插入图片描述

-- 用case表达式
select key,case when case when x<y then y else x end <z then z else case when x<y then y else x end end as greatestfrom greatests;
-- 用max函数
select key,max(num) as greatest form(select key,x as num from greatsetsunion allselect key,y as num from greatestsunion allselect key,z as num from greatests
) as a
group by key;
-- Oracle或者MySQL数据库
select key,greatest(greatest(x,,y),z) as greatest from greatests;

练习3:

select sex,
-- 全国
sum(population) as numbers,
-- 德岛、香川、爱媛、高知
sum(case when pref_name ='德岛' then population eles 0 end as col_1 ),
sum(case when pref_name ='香川' then population else 0 end as col_2 ),
sum(case when pref_name ='爱媛' then population eles 0 end as col_3 ),
sum(case when pref_name ='高知' then population eles 0 end as col_4 ),
-- 四国
sum(case when pref_name in('德岛','香川','爱媛','高知') then population else 0 end as zaijie)
from poptbl2 
group by sex;

练习4:

在这里插入图片描述

select key from greatests 
order by 
case when b then 1 when a then 2when d then 3when d then 4else null end;						

自连接

  1. 删除重复行

在这里插入图片描述

  1. 查找局部不一致的列

    • 表Addresses

在这里插入图片描述

select distinct p1.name,p1.address from addresses p1,addresses p2  where p1.family_id=p2.family_id and p1.address<> p2.address; 
  • 表Products

在这里插入图片描述

select distinct p1.name,p1.price from products p1,products p2  where p1.name <> p2.name and p1.price = p2.price

三值逻辑和NULL

慨念

普通语言里的布尔型只有true和false两个值,这种逻辑体系被称为二值逻辑。而SQL语言里,除此之外还有第三个值unknown,因此这种逻辑体系被称为三值逻辑(three-valued logic)

两种NULL、三值逻辑还是四值逻辑

“两种NULL”这种说法大家可能会觉得很奇怪,因为SQL里只存在一种NULL。然而在讨论NULL时,我们一般都会将它分成两种类型来思考。因此这里先来介绍一些基础知识,即两种NULL之间的区别。

  • null的区别

    两种NULL分别指的是“未知”(unknown)和“不适用”(not applicable,inapplicable)。以“不知道戴墨镜的人眼睛是什么颜色”这种情况为例,这个人的眼睛肯定是有颜色的,但是如果他不摘掉眼镜,别人就不知道他的眼睛是什么颜色。这就叫作未知。而“不知道冰箱的眼睛是什么颜色”则属于“不适用”。因为冰箱根本就没有眼睛,所以“眼睛的颜色”这一属性并不适用于冰箱。

    总结:

    未知”指的是“虽然现在不知道,但加上某些条件后就可以知道”;而“不适用”指的是“无论怎么努力都无法知道”

  • 为什么必须写成“IS NULL”,而不是“=NULL”

    先看这个例子吧

    select * from table where name =null
    /*
    说明:
    对NULL使用比较谓词后得到的结果总是unknown。而查询结果只会包含WHERE子句里的判断结果为true的行,不会包含判断结果为false和unknown的行。不只是等号,对NULL使用其他比较谓词,结果也都是一样的。所以无论name是不是NULL,比较结果都是unknown
    */
    --类似还有
    1 = null
    2 > null
    3 < null
    4 <> null
    null = null
    

    null的理解:

    列的值为NULL”“NULL值”这样的说法本身就是错误的。因为NULL不是值,所以不在定义域(domain)中。相反,如果有人认为NULL是值,那么请问:它是什么类型的值?关系数据库中存在的值必然属于某种类型,比如字符型或数值型等。所以,假如NULL是值,那么它就必须属于某种类型

  • 比较谓词和NULL(1):排中律不成立

    我们假设约翰是一个人。那么,下面的语句(以下称为“命题”)是真是假?

    约翰是20岁,或者不是20岁,二者必居其一

    说明:是的这是正确的,但是现实世界中正确的事情在SQL里却不正确的情况时有发生。实际上约翰这个人是有年龄的,只是我们无法从这张表中知道而已。换句话说,关系模型并不是用于描述现实世界的模型,而是用于描述人类认知状态的核心(知识)的模型。因此,我们有限且不完备的知识也会直接反映在表里。

    表students

在这里插入图片描述

SQL查询语句

-- 查询约翰
select * from students where age = 20 or age <> =20 
-- 必须加了这个第三真值才会出现约翰
or age is null

比较谓词和NULL(2):CASE表达式和NULL

-- 错误写法
case col_1  when 1 then 'X'when null then 'O' end
-- 说明:第二个句子相当于 col_1=null,所以结果显而易见
-- 正确写法
case when col_1 =1 then 'X' when col_1 is null then 'O' end
  • NOT IN和NOT EXISTS不是等价的

在这里插入图片描述

EXISTS只会返回true或者false。因此就有了IN和EXISTS可以互相替换使用,而NOT IN和NOT EXISTS却不可以互相替换的混乱现象

总结:

1.NULL不是值。

2.因为NULL不是值,所以不能对其使用谓词。

3.对NULL使用谓词后的结果是unknown。

4.unknown参与到逻辑运算时,SQL的运行会和预想的不一样。

5.按步骤追踪SQL的执行过程能有效应对4中的情况。

要想解决NULL带来的各种问题,最佳方法应该是往表里添加NOT NULL约束来尽力排除NULL。这样就可以回到美妙的二值逻辑世界(虽然并不能完全回到)

HAVING子句的力量

简单例子:查找一个连续编号的表里是否存在缺失数据

表test_01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e14hHRom-1671262600579)(C:\Users\TiAmo\AppData\Roaming\Typora\typora-user-images\image-20220712100449328.png)]

-- 不存在就没有缺失数据,反之存在
select '存在缺失数据' as gpa from test_01 having count(*) <> max(id)
-- 查找缺失数据的最小值
select min(id+1) as id from test_01  where id+1 not in(select id from test_01)
  1. COUNT(*)和COUNT(列名)的区别

    第一个是性能上的区别;第二个是COUNT(*)可以用于NULL,而COUNT(列名)与其他聚合函数一样,要先排除掉NULL的行再进行统计

    第二个区别也可以这么理解:COUNT(*)查询的是所有行的数目,而COUNT(列名)查询的则不一定是。

在这里插入图片描述

-- 查询结果还是不一样
select count(*),count(number) from test_01

结果:

在这里插入图片描述

  1. 例子

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kw7oRWPR-1671262600580)(C:\Users\TiAmo\AppData\Roaming\Typora\typora-user-images\image-20220712103530795.png)]

    -- 可能会这样写
    select distinct shop from shopltems where item in(select item from items)
    -- 结果
    -- shop
    -- 仙台
    -- 东京
    -- 大版-- 正确的写法
    select t1.shop from shopltems t1,items t2 where t1.item=t2.item group byt1.item 
    -- 分组里数量一致
    having count(t1.item)=(select count(item) from items)
    

外连接(outer jion/left join)

简单例子:将下原表简化成结果表

原表:

DROP TABLE IF EXISTS `courses`;
CREATE TABLE `courses`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`course` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
------------------------------------------------------------------------------------------------------
INSERT INTO `courses` VALUES (1, '赤井', 'SQL入门');
INSERT INTO `courses` VALUES (2, '赤井', 'UNIX基础');
INSERT INTO `courses` VALUES (3, '铃木', 'SQL入门');
INSERT INTO `courses` VALUES (4, '吉田', 'UNIX基础');
INSERT INTO `courses` VALUES (5, '工藤', 'SQL入门');
INSERT INTO `courses` VALUES (6, '渡边', 'SQL入门');
INSERT INTO `courses` VALUES (7, '工藤', 'Java中级');
INSERT INTO `courses` VALUES (8, '赤井', 'SQL入门');

在这里插入图片描述

结果表:

在这里插入图片描述

代码:

-- 第一种写法outer jion
SELECTt0.NAME,
CASEWHEN t1.NAME IS NOT NULL THEN'O' ELSE NULL END AS 'SQL入门',
CASEWHEN t2.NAME IS NOT NULL THEN'O' ELSE NULL END AS 'UNIX基础',
CASEWHEN t3.NAME IS NOT NULL THEN'O' ELSE NULL END AS 'Java中级'from (select distinct `name` from courses) as t0left outer join (select `name` from courses where course ='SQL入门') t1on t1.`name`=t0.`name`left outer join(select `name` from courses where course ='UNIX基础') t2on t2.`name`=t0.`name`left outer join(select `name` from courses where course ='Java中级') t3on t3.`name`=t0.`name`-- 第二种嵌套case表达式SELECT`name`,case when sum(case when course = 'SQL入门' then 1 ELSE null end)=1 then 'O' else null end as 'SQL入门',case when sum(case when course = 'UNIX基础' then 1 ELSE null end)=1 then 'O' else null end as 'UNIX基础',case when sum(case when course = 'Java中级' then 1 ELSE null end)=1 then 'O' else null end as 'Java中级'fromcoursesGROUP BY name;
-- 特别注意,错误的写法
SELECTt0.`name`,-- 这里会报 作为一个表达式使用的子查询返回了多列
-- 	( SELECT 'O' FROM courses t1 WHERE course = 'SQL入门' AND t0.`name` = t1.`name` ) AS 'SQL入门',( SELECT 'O' FROM courses t2 WHERE course = 'UNIX基础' AND t0.`name` = t2.`name` ) AS 'UNIX基础',( SELECT 'O' FROM courses t3 WHERE course = 'Java中级' AND t0.`name` = t3.`name`)  AS 'Java中级' 
FROM( SELECT DISTINCT `name` FROM courses ) as t0;

在这里插入图片描述

用关联子查询比较行与行

增长、减少、维持现状

例子:使用SQL输出与上一年相比营业额是增加了还是减少了

表:Sales

在这里插入图片描述

SQL:

-- 第一种写法,子查询
select t1.year,t1.sale,case 
-- 比较上一年的结果——>持平
when sale =(select sale from sales t2 where t2.year=t1.year-1 ) then '持平'
-- 上升
when sale >(select sale from sales t3 where t3.year=t1.year-1 ) then '上升'
-- 下降
when sale <(select sale from sales t3 where t3.year=t1.year-1 ) then '下降'
else '起点对比数据' end as sale_state
from sales t1
order by t1.year;-- 第二种写法,自连接,会少一行1990
select t1.year,t1.sale,case
when t1.sale = t2.sale then '持平'
when t1.sale > t2.sale then '上升'
when t1.sale < t2.sale then '下降'
else '起点对比数据' end as sale_state
-- t2是上一年数据
from sales t1,sales t2
where t2.year=t1.year-1
order by t1.year

假如上表数据缺失就不能用year-1这个条件了

在这里插入图片描述

-- 查询每一年与过去最临近的年份之间的营业额之差
SELECTS2.YEAR AS pre_year,S1.YEAR AS now_year,S2.sale AS pre_sale,S1.sale AS now_sale,S1.sale - S2.sale AS diff FROM Sales2 S1,Sales2 S2 
WHERES2.YEAR = ( SELECT MAX( YEAR ) FROM Sales2 S3 WHERE S1.YEAR > S3.YEAR ) 
ORDER BYnow_year;

查询重复的情况

酒店预约的简单例子:表——Reservations

在这里插入图片描述

SQL:

-- 查询日期冲突的客人
SELECTreserver,start_date,end_date 
FROMreservations t1 
WHEREEXISTS (SELECT* FROMreservations t2 WHERE-- 和自己比较t1.reserver <> t2.reserver -- 入住日期和离开日期 在别人住的时间AND ( t1.start_date BETWEEN t2.satrt_date AND t2.end_date OR t1.start_date BETWEEN t2.start_date AND t2.end_date ) )

in和exists的区别

  1. 如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in
  2. EXISTS不仅可以将多行数据作为整体来表达高级的条件,而且使用关联子查询时性能仍然非常好

集合运算

UNION:交集

  1. 查询重复的数据
-- 公式 S UNION S = S
-- 查询A B表的数据
select count(*) as row_num from (select * from tableA union select * from tableB ) Tme

最近忙着做项目,还有一些后面再补充吧。

查看全文

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

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

相关文章:

在这里插入图片描述

SQL进阶笔记

SQL进阶笔记
CASE表达式 简单case表达式 case sexwhen 1 then 男when 2 then 女else 其他 end搜索case表达式 case when sex 1 then 男when sex 2 then 女else 其他 end编写SQL语句的时候需要注意,在发现为真的WHEN子句时,CASE表达式的真假值判断就会中……

ABBYY2023PDF及OCR文字识别软件

ABBYY FineReader PDF2023最新版使专业人士在数字化工作场所能够更大限度地提高效率。 FineReader PDF 的特色是采用了 ABBYY 新推出的基于 AI的OCR 技术,可以更轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。 现在,信息工……

【财务】财务分析—管理报告体系搭建

财务分析体系搭建的是一个系统化的功能,涉及的业务面非常广,财务分析也能表现出清晰的数据,以此进行改善;本文作者详细分析了财务分析中的管理报告体系的搭建,我们一起来看一下。 一、理清核算、财报、管报、预算关系 ……

设计模式-策略、装饰、代理

前言
本文为datawhale2022年12月组队学习《大话设计模式》task2打卡学习,内容主要以官方所提供为主,会加入一些个人的学习心得。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern
一、策略模式
1.1 基本定义
策略模式&#……

[附源码]Nodejs计算机毕业设计基于框架的校园爱心公益平台的设计与实现Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流
项目运行 环境配置:
Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。
项目技术:
Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分……

USB接口WIFI(MT7601芯片)的驱动源码移植过程详解(驱动源码编译、wpa_supplicant工具交叉编译、文件系统移植)

1、MT7601的移植步骤 (1)确认你的WT7601网卡硬件是正常的; (2)修改驱动源码,依赖内核源码树编译并加载; (3)交叉编译wpa_supplicant工具,移植到根文件系统里; (4)添加驱动和wpa_supplicant工具依赖的配置文件&#xff……

u盘/移动硬盘的视频文件出现损坏怎么办?修复损坏视频办法分享!

一般情况下,视频文件都是比较大,如果直接存放于电脑,就会占用比较大的存储空间。不少小伙伴都会把它存放于U盘或者移动硬盘,而且作为一种便携式硬盘,可以在各电脑之间使用,非常方便。但这也造成文件很容易出……

基于VUE.JS的招聘系统

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):本文是基于Vue.js对招聘系统的设计与实现,对招聘系统管理员、个人用户、企业用户三个模块功能的完善……

计算机网络原理第2章 物理层

目录 2.1 物理层的基本概念
2.2.1 数据通信系统的模型 2.2.2 有关信号的几个基本概念
1.通信
2.调制
3.编码
2.2.3 信道的极限容量
1.信道能够通过的频率范围(奈氏准则)
2. 信噪比(香农公式) 3.奈氏准则与香农公式的比……

jmeter做压测性能调优:SSL上下文切换导致SSL频繁握手【杭州多测师_王sir】【杭州多测师】…

一、问题背景在使用 JMeter 压测时,发现同一后端服务,在单机 500 并发下,HTTP 和 HTTPS 协议压测 RT 差距非常大。同时观测后端服务各监控指标水位都很低,因此怀疑性能瓶颈在 JMeter 施压客户端。二、问题分析切入点:垃……

学会这些终端快捷键,让你在Linux上的操作快100倍

🪶 简述 Linux命令行的许多快捷键与GNU/Emacs编辑器非常像,因此我十分建议可以学习学习emacs编辑器,来了解或发现更多的命令行快捷键。 点此访问emacs官网 点此访问emacs中国(论坛) 简述一下Emacs:Emacs’一切皆快捷键……

手把手教你Temporal Fusion Transformer——Pytorch实战

建立了一个关于能源需求预测的端到端项目: 如何为 TFT 格式准备我们的数据。 如何构建、训练和评估 TFT 模型。 如何获取对验证数据和样本外预测的预测。 如何使用built-in model的可解释注意力机制计算特征重要性、季节性模式和极端事件鲁棒性。
什么是Temporal F……

【Java开发】设计模式 12:解释器模式

1 解释器模式介绍
解释器模式是一种行为型设计模式,它提供了一种方法来解释语言、表达式或符号。
在该模式中,定义了一个表达式接口,并实现了对应的表达式类,这些类可以解释不同的符号组成的表达式,从而实现对语言的……

反序列化渗透与攻防(五)之shiro反序列化漏洞

Shiro反序列化漏洞
Shiro介绍
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默……

vue2+vue3

vue2vue3尚硅谷vue2vue2 课程简介【02:24】vue2 Vue简介【17:59】vue2 Vue官网使用指南【14:07】vue2 搭建Vue开发环境【13:54】vue2 Hello小案例【22:25】了解: 不常用常用:id 更常用 简单class差值总结vue 实例vue 模板 : 先 取 &#xff0……

【hello Linux】环境变量

目录 1. 环境变量的概念 2. 常见的环境变量 3. 查看环境变量 4. 和环境变量相关的命令 5. 环境变量的组织方式 6. 通过代码获取环境变量 7. 通过系统调用获取环境变量 Linux🌷 在开始今天的内容之前,先来看一幅图片吧! 不知道你们是否和我一……

【Linux基础】常用命令整理

ls命令
-a选项,可以展示隐藏的文件和文件夹-l选项,以列表形式展示内容-h,需要和-l搭配使用,可以展示文件的大小单位ls -lah等同于la -a -l -h
cd命令(change directory)
语法:cd [Linux路径]……

客快物流大数据项目(一百一十二):初识Spring Cloud

文章目录
初识Spring Cloud
一、Spring Cloud简介
二、SpringCloud 基础架构图…

C和C++中的struct有什么区别

区别一: C语言中: Struct是用户自定义数据类型(UDT)。 C语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。
区别二:
C中的struct是没有权限设置的&#xff0c……

docker的数据卷详解

数据卷 数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方修改会立即同步
一个数据卷可以同时被多个容器同时挂载,一个容器也可以被挂载多个数据卷
数据卷作用:容器数据持久化 /外部机器和容器间接通信 /容器……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注