该声明
SELECT password
FROM users
WHERE username=''
UNION
SELECT 'test'
FROM users
返回
password
--------
test
和声明
SELECT username, password
FROM users
WHERE username=''
UNION
SELECT 'test', 'test'
FROM users
返回
username password
-------- --------
test test
这里到底发生了什么?
因为如果您省略该WHERE
子句,则第一个SELECT
返回所有用户行并UNION SELECT
添加到该行test test
:
username password
-------- --------
johnny pw123
wiener peter
test test
我知道添加WHERE username=''
子句不会返回任何行,因此UNION SELECT
添加到任何包含test test
.
但是当您只有语句SELECT 'test, 'test' FROM users
时,它不会返回一个这样的行,而是为每个用户返回一行。所以多行。此语句的输出中的行数与 users 表中的用户数一样多:
username password
-------- --------
test test <- one for johnny
test test <- one for wiener
所以我试图调和这些行为。SELECT
以上通常会为每个用户返回一行,但是当它添加UNION SELECT
到 first 返回的SELECT
行时,它只返回一行,而不是每个用户一个。第一个SELECT
不返回任何内容,除非该WHERE
子句被省略,在这种情况下它返回所有用户行。
作为这个长问题的UNION SELECT
附加内容test test
,例如
username password
-------- --------
johnny pw123
wiener peter
所以很自然,它们属于“用户名”和“密码”列。但是,当您有WHERE
使第一个SELECT
不返回任何内容的子句时,整个语句如何返回
password username
-------- --------
test test
并不是
Expr1000 Expr1000
-------- --------
test test
是因为说SELECT
返回“无”是不准确的,而是返回“在'用户名'和'密码'的列下没有行”,这意味着它为UNION SELECT
这些列建立,而不管第一SELECT
列下是否有任何行他们?
我是否通过苏格拉底的方法回答了我自己的问题?还是我的想法不对?如果我自己回答了,我很抱歉浪费你五分钟的时间阅读 400 字。