mysql中or和and使用的坑

user表:mysql中or和and使用的坑
where中可以包含任意数目的and和or操作符,在没有任何其他符号的时候,例如括号,SQL会首先执行and条件,然后才执行or语句

举例以下操作:
例1:
SELECT * FROM lt_user
WHERE
id=2 and phone=‘15936263992’
or
id=3 and phone=‘13718803009’

sql会首先执行or左右的两个and,类似以下sql,便于理解,并不会自动加括号,此处括号为了体现and的优先级
SELECT * FROM lt_user
WHERE
(id=2 and phone=‘15936263992’)
or
(id=3 and phone=‘13718803009’)

得到结果:
mysql中or和and使用的坑

例2:
SELECT * FROM lt_user
WHERE
id=2 and phone=‘15936263992’
or
id=3 and phone=‘13718803009’
or
account > 666666

相当于以下sql,便于理解,并不会自动加括号,此处括号为了体现and的优先级
SELECT * FROM lt_user
WHERE
(id=2 and phone=‘15936263992’)
or
(id=3 and phone=‘13718803009’)
or
(account > 666666)

或者是以下3条sql的差集
SELECT * FROM lt_user WHERE id=2 and phone=‘15936263992’
SELECT * FROM lt_user WHERE id=3 and phone=‘13718803009’
SELECT * FROM lt_user WHERE account > 666666

得到结果:
mysql中or和and使用的坑

例3:需求找id=6或者id等于9的并且account > 999999的数据
SELECT * FROM lt_user WHERE id=6 or id=9 and account > 999999

相当于以下sql,便于理解,并不会自动加括号,这样就得到错误的数据
SELECT * FROM lt_user WHERE id=6 or (id=9 and account > 999999)

or的大多情况应配合()使用,应改为以下sql
SELECT * FROM lt_user WHERE (id=6 or id=9) and account > 999999

得到正确结果:
mysql中or和and使用的坑

例4:sql注入语句
SELECT * FROM bm_admin
WHERE
admin_id=1000 and admin_username=‘ad213n’
or
1=1;

此处 1=1,代表true,而在mysql中数据存在即为true,不存在才为false
执行为
SELECT * FROM bm_admin
WHERE
(admin_id=1000 and admin_username=‘ad213n’ )
or
1=1;

数据为 admin_id=1000 and admin_username=‘ad213n’ 或者 存在的数据,所以能获取所有数据。

以user表为例:
SELECT * FROM lt_user WHERE id=2 and phone=‘15936263992’ or 1=1

获取全表13条数据:
mysql中or和and使用的坑