另外,众多网站都有select * from table where 1=1此类语句的介绍,并且,针对该类语句,讲得实在是让人越看越迷茫(一个抄袭一个的,简直不像话),不知道是在说什么,导致很多新手不得要领,从而对其耿耿于怀。
本文,专为您讲解该语句,阅读完此文,您就会拨开云雾、茅塞顿开。
我们先来看看这个语句的结果:select * from table where 1=1,其中where 1=1,由于1=1永远是成立的,返回TRUE,条件为真;所以,这条语句,就相当于select * from table,返回查询表中的所有数据。
一、不用where 1=1 在多条件查询中的困扰
举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下:
string MySqlStr=”select * from table where”;
if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr+“Age=“+“'Age.Text'“;
}
if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Address=“+“'Address.Text'“;
}
①种假设
如果上述的两个IF判断语句,均为True,即用户都输入了查询词,那么,最终的MySqlStr动态构造语句变为:
MySqlStr=”select * from table where Age='18' and Address='云南省文山州广南县小波吗村'”
可以看得出来,这是一条完整的正确的SQL查询语句,能够正确的被执行,并根据数据库是否存在记录,返回数据。
②种假设
如果上述的两个IF判断语句不成立,那么,最终的MySqlStr动态构造语句变为:
MySqlStr=”select * from table where“
现在,我们来看一下这条语句,由于where关键词后面需要使用条件,但是这条语句根本就不存在条件,所以,该语句就是一条错误的语句,肯定不能被执行,不仅报错,同时还不会查询到任何数据。
上述的两种假设,代表了现实的应用,说明,语句的构造存在问题,不足以应付灵活多变的查询条件。
二、使用 where 1=1 的好处
假如我们将上述的语句改为:
string MySqlStr=”select * from table where 1=1 ”;
if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Age=“+“'Age.Text'“;
}
if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Address=“+“'Address.Text'“;
}
现在,也存在两种假设
①种假设
如果两个IF都成立,那么,语句变为:
MySqlStr=”select * from table where 1=1 and Age='18' and Address='云南省文山州广南县小波吗村'”,很明显,该语句是一条正确的语句,能够正确执行,如果数据库有记录,肯定会被查询到。
②种假设
如果两个IF都不成立,那么,语句变为:
MySqlStr=”select * from table where 1=1”,现在,我们来看这条语句,由于where 1=1 是为True的语句,因此,该条语句语法正确,能够被正确执行,它的作用相当于:MySqlStr=”select * from table”,即返回表中所有数据。
言下之意就是:如果用户在多条件查询页面中,不选择任何字段、不输入任何关键词,那么,必将返回表中所有数据;如果用户在页面中,选择了部分字段并且输入了部分查询关键词,那么,就按用户设置的条件进行查询。
说到这里,不知道您是否已明白,其实,where 1=1的应用,不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法。
三、我必须使用 where 1=1 才能做多条件查询吗
非也,您爱使用就使用,您不喜欢使用就不使用,对于您而言,不损失什么,也不会多得什么;
那么,如果我不使用where 1=1做多条件查询,该如何构造动态查询语句呢?非常简单,在下给您提供一种思维:
如下语句:
string MySqlStr=”select * from table”;
if(Age.Text.Lenght>0)
{
QuerySqlStr=QuerySqlStr+“Age=“+“'Age.Text'“;
}
if(Address.Text.Lenght>0)
{
QuerySqlStr=QuerySqlStr+“and Address=“+“'Address.Text'“;
}
if(QuerySqlStr.Lenght>0)
{
MySqlStr=MySqlStr+“ where “+QuerySqlStr;
}
不管你使用不使用where 1=1做多条件查询,只要您能够保证您构造出来的查询语句,是正确的就万无一失了。
四、where 1=1 的总结
为方便构造动态的多条件之不确定因素的复杂的正确的查询语句所采取的一种“江湖手段”。
此类方法,一般,在书籍上不常见,而在实际的应用中,人们得从现实角度考虑,即要保证能满足多条件查询、同时还要能应付不确定因素的灵活性,最后还要保证语句不出现任何语法错误。
该方法不失为一种好方法;但是,却由于这 where 1=1 不知道让多少新手,琢磨了多少次,始终不得要领,同时,还有可能会误导新手误入歧途;
希望本文对您有所帮助。
外连接问题补充
一般来说oracle中的外连接是用(+)
a.col1 = b.col1(+)的意思是
对于a中的记录如果b中没有相应记录的话
(既a中的col1在b中没有对应的col1),选择出的结果为a中记录列出,而涉及到b中的记录用null补上。
如果有对应记录,则用a.col1=b.col1条件将其选择出。
例子:
a表
col1 col2
1 a
2 b
3 c
b表
col1 col3
1 d
2 e
select a.col1,a.col2,b.col3 from a,b where a.col1=b.col1(+);
结果:
col1 col2 col3
1 a d
2 b e
3 c
呵呵,够明白了吧。
相关推荐
例如,`UPDATE table SET field1=value1 WHERE 范围`表示根据条件`范围`更新表`table`中`field1`的值为`value1`。 #### 查找模糊匹配 - **语法**:`SELECT * FROM table WHERE field1 LIKE '%value1%'` - **说明**...
例如,如果用户都没有输入条件,查询语句将是`"select * from table where 1=1"`,这等同于`"select * from table"`,会返回表中的所有数据。如果有输入,比如年龄和地址,语句会变为`"select * from table where 1=...
SELECT * FROM table WHERE 1=1 AND Age = '18' AND Address = '云南省文山州广南县小波吗村' ``` - 这是一条有效的查询语句,可以正常执行。 2. **当没有条件有效时**: - 最终的SQL语句将是: ``` SELECT *...
即使用户没有输入任何条件,查询也会变成`SELECT * FROM table WHERE 1=1`,这实际上等同于`SELECT * FROM table`,返回所有数据。如果用户输入了条件,这些条件会附加到`1=1`后面,保持查询的正确性。 ### `WHERE ...
SET @sql = 'SELECT * FROM table WHERE 1=1'; IF (@addDate IS NOT NULL) BEGIN SET @sql = @sql + ' AND addDate=' + CAST(@addDate AS NVARCHAR(20)); END; IF (@name <> '' AND @name IS NOT NULL) BEGIN...
1. **等值比较**: 使用 `=` 来判断两个表达式是否相等,例如 `SELECT * FROM table WHERE column = 'value'`。 2. **不等值比较**: 使用 `<>` 或 `!=` 来判断两个表达式是否不相等,例如 `SELECT * FROM table ...
解决方法是将or语句改写为使用索引的方式,例如,SELECT * FROM table WHERE column1 = 'value1' UNION ALL SELECT * FROM table WHERE column2 = 'value2'. 导致索引失效的原因有很多,需要我们在使用索引的时候,...
`SELECT * FROM table WHERE EXISTS (SELECT * FROM table WHERE id = 1);` NOT IN NOT IN 是一种条件判断运算符,用于判断某个值是否不在一个列表中。其基本语法为: `<Exp> NOT IN (<Exp1>, , , ...)` 其中,`...
SELECT @X=1,@product=1 WHILE @X<=20 BEGIN SELECT @X=@X+1 SELECT @product=@product*@X END SELECT '1*2*3*......*20的积'=@product GO --单元十 创建于管理视图 --创建视图V_Sale1,并显示销售日期、客户编号、...
if exists(select 1 from sys.sysforeignkey where role='FK_CHOOSE_C_CHOOSE_CO_COURSES') then alter table choose_course delete foreign key FK_CHOOSE_C_CHOOSE_CO_COURSES end if; if exists(select 1 from...
EXPLAIN (SELECT * FROM staffs WHERE NAME = 'July') UNION (SELECT * FROM staffs WHERE NAME = 'August'); ``` 使用 `UNION` 可以提高某些情况下的查询效率。 #### 二、批量导入 除了SQL优化之外,批量导入...
SELECT * FROM SCORE WHERE CNO = '3-105' AND DEGREE = (SELECT DEGREE FROM SCORE WHERE SNO = '109'); ``` 使用子查询来匹配特定学生的分数。 #### 20. 查询每门课程中分数最高的学生的学号和分数 ```sql SELECT...
1. IN运算的嵌套查询:如`SELECT * FROM table WHERE column IN (SELECT column FROM another_table)`。 2. NOT IN运算的嵌套查询:排除IN中的结果,如`SELECT * FROM table WHERE column NOT IN (SELECT column ...
在SQL注入时会用到这个,例如select * from table1 where name=’lala’给强行加上select * from table1 where name=’lala’ or 1=1这就又变成了无约束的查询了。 最近发现的妙用在于,在不定数量查询
create table emp_bak as select * from emp; 该语句将创建一个备份表emp_bak,并将emp表中的所有记录复制到emp_bak表中。 这些语句只是 Oracle select 查询语法的基础部分,使用这些语句可以完成许多复杂的查询...
- **内连接**: `SELECT * FROM table1, table2 WHERE table1.column = table2.column;` - **外连接**: `SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;` - **示例**: - 查询所有不...
SELECT * FROM Table1 WHERE pkid = 1 FOR UPDATE; ``` 2. **FOR UPDATE OF**: - `FOR UPDATE OF`允许开发者指定需要锁定的特定列,而不是锁定所有列。 - 这意味着只有指定的列会被锁定,其他未被指定的列可以...
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) create table [Table1] ([col1] int,[col2] int) //添加字段 if not exists...
1. 增删改查的Sql语句 建表:create table user(id Integer(11) primary key auto_increment,name varchar(20)); 增:insert into user(name,age,sex) values(?...根据名称查找:select * from user where name=?; 2.