这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不会使用这种语句,都没有任何关系,对于您而言,没有任何损失。
另外,众多网站都有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 不知道让多少新手,琢磨了多少次,始终不得要领,同时,还有可能会误导新手误入歧途;
希望本文对您有所帮助。
转自:http://www.dzwebs.net/2418.html
相关推荐
SELECT * FROM table WHERE 1=1 AND Age = '18' AND Address = '云南省文山州广南县小波吗村' ``` - 这是一条有效的查询语句,可以正常执行。 2. **当没有条件有效时**: - 最终的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 ...
② 输入 and 1 = 1,SQL 语句变为 SELECT * FROM table WHERE id=1 and 1 = 1,语句正确,执行正常,返回的数据与原始请求无任何差异。 ③ 输入 and 1 = 2,SQL 语句变为 SELECT * FROM table WHERE id=1 and 1 = 2...
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...
SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name = 'tableName'; SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name = '%s'; ``` 通过上述知识点的详细介绍,我们不仅了解...
` 可以共享,但 `SELECT * FROM TABLE WHERE ID = :1;` 和 `SELECT * FROM TABLE WHERE ID = :ID;` 无法共享。 通过以上方法,我们可以有效地管理和优化Oracle数据库的性能,确保其能够高效稳定地运行。
1. SELECT语句: SELECT语句是SQL中最基本的查询命令,用于从数据库中选取特定的列或行。其基本语法如下: ```sql SELECT column_name(s) FROM table_name; ``` 例如,要从"Persons"表中选取"LastName"和...
SELECT * FROM student WHERE gradeid = 1 AND sex = '男'; ``` - 查询班级ID为1或性别为女的学生: ```sql SELECT * FROM student WHERE gradeid = 1 OR sex = '女'; ``` - 查询班级ID不为1的学生: ```sql...
SELECT * FROM Persons WHERE FirstName = 'John' AND LastName = 'Doe'; ``` - **OR** 运算符:结合两个或多个条件,只要至少一个条件为真就返回记录。 - 示例: ```sql SELECT * FROM Persons WHERE ...
SELECT * FROM table_name WHERE condition1 AND condition2; SELECT * FROM table_name WHERE condition1 OR condition2; ``` 5. **LIKE操作符**:用于匹配包含特定模式的数据: ```sql SELECT * FROM table...
- `SELECT * FROM (SELECT ROWNUM rnum, t.* FROM (SELECT * FROM table ORDER BY column) t WHERE ROWNUM <= page_size) WHERE rnum >= (page_number - 1) * page_size + 1;` **8.7 用查询结果创建新表** - **...
- 第一组:`SELECT * FROM table WHERE id = :var1;` - **结果**:可以共享。 - 第二组:`SELECT * FROM table WHERE id = :var1;` - `SELECT * FROM table WHERE id = :var2;` - **结果**:无法共享,因为绑定...
例如,`SELECT * FROM table WHERE column1 = 'value1' OR column2 = 'value2';` 如果 `column1` 和 `column2` 分别有各自的索引,则索引可能会失效。 2. **字符串类型未正确引用**: - 对于字符串类型的字段,...
7. **排序查询**:`SELECT * FROM table WHERE condition ORDER BY field1, field2`用于按指定字段排序结果集。 8. **逆序排序**:`SELECT * FROM table WHERE condition ORDER BY field1, field2 DESC`实现降序排序...
- **WHERE** 子句用于筛选记录。 - **语法**: `SELECT column_name(s) FROM table_name WHERE condition` - **运算符**: - `=`: 等于 - `<>` 或 `!=`: 不等于 - `>`: 大于 - `小于 - `>=`: 大于等于 - `<=`: ...
SELECT * FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T1.a = T2.a); ``` - 当 `T1` 数据量远小于 `T2` 时,`EXISTS` 更高效。 2. 使用 `IN`: ```sql SELECT * FROM T1 WHERE T1.a IN (SELECT T2.a FROM...
#### SELECT语句详解 `SELECT`语句是SQL中最常用的操作之一,主要用于从数据库中检索数据。其基本语法结构如下: ```sql SELECT column_name(s) FROM table_name; ``` - `SELECT`: 指定要检索的列名。 - `FROM`: ...
- **示例**:`SELECT column1, SUM(column2) FROM table WHERE column1 IS NOT NULL GROUP BY column1 HAVING SUM(column2) > 100;` #### 十八、联合 - **优化建议**:使用UNION时,尽量确保每个SELECT语句返回的...
SELECT * FROM emp WHERE deptno = (SELECT * FROM salno) AND sal > 1500 UNION ALL SELECT * FROM emp WHERE deptno = (SELECT * FROM salno) AND sal ; ``` 综上所述,`WITH`子句是高级SQL查询中一个非常...
- **带 ALL 关键字**: 不排除重复行: `SELECT * FROM table1 INTERSECT ALL SELECT * FROM table2;` #### 五、外连接 1. **左外连接 (LEFT OUTER JOIN)** - 包括左表中的所有行, 以及右表中匹配的行。 - **示例...