mysql 关联查询 非常规sql

本文介绍了MySql关联查询中ON与WHERE条件的区别,包括它们在查询过程中的作用及适用场景,并详细解释了Bigint类型与Java类型之间的映射关系。


 

两个表关联 通过2个字段关联, 如果a表一个字段为null b表也有一个字段为null 关联后可以查询到吗?
在数据库中,使用 NULL 进行关联时,通常不会得到预期的结果,因为 NULL 不能直接与其他值进行比较,包括另一个 NULL 值。也就是说,NULL = NULL 在 SQL 中是不成立的。
不过,如果你需要通过两个字段的 NULL 进行关联,可以使用 IS NULL 或 COALESCE 等方式进行特殊处理。
例如,如果你想通过 a 表的 field1 和 b 表的 field2 进行关联,并且考虑到 NULL 值的情况,你可以使用类似下面的 SQL 查询:

SELECT *
FROM a
LEFT JOIN b  a.node=b.node
  ON (a.name = b.name OR (a.name IS NULL AND b.name IS NULL))


这个查询的逻辑是:
当 a.field1 和 b.field2 相等时进行关联。
如果 a.field1 和 b.field2 都是 NULL,也视为匹配进行关联。
这样你就可以在查询中包括 NULL 字段的匹配了。
需要注意的是,具体的查询写法可能依赖于你使用的数据库类型(例如 MySQL、PostgreSQL、SQL Server 等),但基本思路是一致的。

关联查询为什么一般建议 小表驱动大表

on a.字段=b.字段 and b.字段=‘123‘ 注意 and后只写b表字段的过滤条件 

 AND过滤的使用场景

 a left join b on a.id=b.id AND b.date=今天   这样可以查询 a表有 b表缩小了范围后的一对多的数据.

 关联查询时 on 条件过滤和where条件过滤的区别

-- 将过滤条件放在on后面,是在联合查询之前,先对右表进行查询过滤(只对右表条件过滤有效, 左表无效),将查询过滤的结果作为临时表,再和左表进行联合查询;左表结果是全量的

-- mysql中left join on后面and 和where条件查询的差异

-- 说下原因:
(1):ON后面的筛选条件主要是针对的是关联表【而对于主表筛选条件不适用】。
(2):对于主表的筛选条件应放在where后面,不应该放在ON后面
(3):对于关联表我们要区分对待。如果是要条件查询后才连接应该把查询件放置于ON后。如果是想再连接完毕后才筛选就应把条件放置于where后面
(4):对于关联表我们其实可以先做子查询再做join (这样就不用 on后接 and条件了)


Mysql中Bigint与Java数据类型对应关系

Mysql主键有符号的bigint自增 对应java的Long类型

用navicat建表, 主键用bigint, 无需勾选, 就是有符号的
MySQL中,有符号类型 Bigint(20)的取值范围为-9223372036854775808~9223372036854775807,与Java.lang.Long的取值范围完全一致,mybatis/mybatis-plus会将 Bigint(20)映射为Long类型。


MySQL中有符号int类型最大可以支持到约22亿,这个范围远远超过了我们实际项目中的需求和MySQL单表所能支持的性能上限。对于OLTP应用来说,单表的数据规模一般控制在千万级别,单表数据量不会达到亿的级别(Mysql单表性能问题要考虑在内)。
Mysql中无符号int类型,上限为42亿,预留量非常充足。

<think>好的,用户想了解SQL注入中的联合查询用法防护方法。首先,我需要回顾一下联合查询的基本概念。联合查询通常用于合并两个或多个SELECT语句的结果,攻击者可能会利用这个功能来获取未授权的数据。比如,当应用程序存在SQL注入漏洞时,攻击者可以通过注入UNION SELECT语句来提取其他表中的数据。 接下来,我得考虑联合查询注入的典型步骤。通常,攻击者需要确定目标表的列数,这可以通过ORDER BY子句来试探,直到出现错误。然后,他们会寻找可以回显数据的列,例如在前端显示的位置,使用UNION SELECT将恶意查询结果合并进去。比如,如果原始查询返回两列,攻击者可能构造类似UNION SELECT username, password FROM users的语句,从而获取敏感信息。 关于防护方法,首先要提到的就是参数化查询,这可以防止恶意输入被解释为SQL代码。另外,输入验证也很重要,比如过滤掉一些特殊字符或使用白名单机制。限制数据库权限同样关键,确保应用程序使用的数据库账户只有必要的最小权限,避免攻击者利用注入点执行高危操作。还有,使用Web应用防火墙(WAF)可以帮助检测拦截常见的注入攻击模式。 然后需要检查用户提供的引用内容。引用[1]提到了HTTP分割注入,使用控制字符如%0a、%0d,这可能与CRLF注入有关,但联合查询注入直接关联不大。不过,这提醒我需要注意不同注入类型的防御措施可能有重叠部分。引用[2]提到sqlmap工具可以自动解析SQL语句并确定注入技术,这说明自动化工具在检测联合查询注入方面的应用,防御时也要考虑对抗此类工具的方法。 用户可能还需要具体的示例来理解攻击如何发生,以及防护措施如何实施。例如,给出一个存在漏洞的SQL语句,然后展示攻击者如何注入UNION查询,接着演示如何通过参数化查询修复该漏洞。此外,可能需要解释错误回显的重要性,因为攻击者依赖错误信息来判断注入是否成功,因此关闭错误回显也是一种防护手段。 最后,生成的相关问题需要围绕联合查询的深入分析、防御技术对比、工具检测原理以及实际案例分析,这样用户可以有进一步的学习方向。需要确保回答结构清晰,分点说明,同时引用提供的资料来支持观点,比如在提到sqlmap时引用[2],在讨论特殊字符过滤时提到引用[1]中的控制字符。</think>### SQL注入联合查询的原理与防护 #### 一、联合查询注入原理 1. **基础条件** 联合查询注入要求: - 原始查询结果列数需与`UNION SELECT`子句列数一致 - 目标页面具有**数据回显点**(如搜索结果页) 2. **攻击示例** 假设存在漏洞的SQL语句: ```sql SELECT title, content FROM articles WHERE id=$input_id ``` 攻击者注入载荷: ``` 1 UNION SELECT username, password FROM users-- ``` 最终执行: ```sql SELECT title, content FROM articles WHERE id=1 UNION SELECT username, password FROM users-- [^2] ``` #### 二、关键攻击步骤 1. **列数探测** 通过`ORDER BY n`递增测试,直至触发错误: ``` ?id=1 ORDER BY 3-- ``` 若在`n=3`时报错,说明原始查询有2列 2. **回显位定位** 使用可识别字符串标记有效列: ``` ?id=-1 UNION SELECT 'COL1','COL2'-- ``` 3. **数据提取** 结合数据库特性获取元数据: - MySQL示例: ``` UNION SELECT table_name,column_name FROM information_schema.columns-- ``` #### 三、联合查询防御方案 1. **参数化查询**(根本性防护) ```python # Python示例(使用Psycopg2) cursor.execute("SELECT * FROM users WHERE id = %s", (user_input,)) ``` 2. **输入过滤强化** - 过滤特殊字符:`UNION`、`SELECT`、`INFORMATION_SCHEMA`等 - 正则表达式过滤:`/(\s+UNION\s+SELECT\s+)/i`[^1] 3. **权限最小化** - 数据库用户权限限制为`SELECT`/`UPDATE`必需表 - 禁用`FILE`、`EXECUTE`等高危权限 4. **防御纵深体系** | 防护层 | 具体措施 | |---|---| | 应用层 | 预编译语句+输入验证 | | 网络层 | WAF规则(如拦截包含`INFORMATION_SCHEMA`的请求) | | 数据层 | 列级访问控制 | #### 四、高级对抗技术 1. **编码绕过检测** - 十六进制编码:`UNION` → `\x55\x4e\x49\x4f\x4e` - URL编码:`SELECT` → `%53%45%4c%45%43%54` 2. **非常规注入点利用** - HTTP头注入(如`X-Forwarded-For`) - JSON/XML参数注入
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值