`
wsql
  • 浏览: 12130054 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

WHERE条件和排序

 
阅读更多

一、条件简介
了解条件的一般形式
最普通的条件如下形式:


gyj@OCM> Select * from t1 where name='gyj2';

ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000

条件只能跟在WHERE之后,用来限制输出的行。通常条件的形式是“列名 比较运算符 值”的形式。上面例子中,比较运算符就是“=”,也就是寻找NAME等于’gyj2’的行。

二、比较运算符
1、运算符形式的比较符号(PPT)
运算符 含义
=等于
> 大于
>= 大于等于
< 小于
<= 小于等于
<> ,!= ,^= 不等于

了解各种比较运算符的意义,这一块比较简单,我就不多说了。

2、非运算符形式的比较符号
了解BETWEEN、IN、LIKE、IS NULL 、EXIST的使用,并了解通配符在LIKE中的使用
(1)列名 [NOT] BETWEEN …… AND …… :在两数之间(并且包括这两个数)


gyj@OCM> select * from t1 where id between 4 and 6;

ID NAME SALARY
---------- ---------- ----------
4 gyj4 15000
5 gyj5 12000
6 gyj6 12000


显示雇员编号在4和6之间的。在BETWEEN前加上NOT,意义正好相反,表示在两数之外:


gyj@OCM> select * from t1 where id not between 4 and 6;

ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
7 gyj7 12000
1 gyj1 12000
1 gyj1 20000


(2)列名 [NOT] IN (值1,值2,……) : 列值等于值1或等于值2或值3,等等。


gyj@OCM> select * from t1 where id in (5,6,7);

ID NAME SALARY
---------- ---------- ----------
5 gyj5 12000
7 gyj7 12000
6 gyj6 12000


显示雇员编号等于5,6,7的,如果我们在IN前面加上NOT,显示的结果是id不等于5或6或7的行。


gyj@OCM> select * from t1 where id not in (5,6,7);
gyj@OCM> select * from t1 where id not in (5,6,7);

ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
4 gyj4 15000
1 gyj1 12000
1 gyj1 20000


(3)字符型列LIKE ‘字符串’ :字符串匹配运算符。


gyj@OCM> select * from t1 where name like 'gyj2';

ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000


看它的效果,它有点类似于“=”。但是它的功能比等号强。因为它可以使用如下通配符:
_ : 对应任意的一个字符。
% : 对应任意长度的任意字符。
其中%的任意长度可以是从0到任意长度。而_对应的字符,必需是一个。


gyj@OCM> select * from t1 where name like '_o%';

ID NAME SALARY
---------- ---------- ----------
9 Joe 22000
10 Tom 28000


‘_o%’的意义是,第一个字符任意,第二个字符是o,第三个字符向后任意字符,且长度任意,可以没有,也就是只有两个字符,如’No’,o后面没有字符了。也可以如示例子中显示的结果Joe,Tom,o后面分别有1个字符。
如果将条件变为:


gyj@OCM> select * from t1 where name like '%o_';

ID NAME SALARY
---------- ---------- ----------
9 Joe 22000
10 Tom 28000
11 guoyJoe 30000


'%o_',这次是o的后面必须有一个字符,什么字符无所谓。o的前面有什么字符、有没有字符、有多长的字符都无所谓。
有了这两个通配符,LIKE的功能就比等号强多了,比如我想显示所有姓“郭”的人,只要将条件定为:name like ‘郭%’ 即可。如果想显示姓郭的,但整个姓名是两个字的,’郭_’ ,姓名是三个字的’郭__’。等等。
还有一点,在LIKE运算符后的字符串中,%和_不再是普通的字符,而有了特殊的含意。类似的情况我们前面也遇到过,单引号在字符串中也有特殊的含意,表示字符串的开始和结束。如果我想在字符串中使用普通意义的单引号,可以连续输入两个单引号,在字符串中,就表示一个普通意义的字符:单引号。想要在LIKE后的字符串中使用普通意义上的字符%、_ ,也需要额外的处理。比如:'DBA\_%' ESCAPE '\' ,它表示以DBA_开头的任意字符串。ESCAPE指定了一个字符 \ ,因此,在字符串中 \ 后的_ 将不再是特殊字符通配符,而是普通字符_。LIKE加通配符的功能是很强的。但它的查找速度要比普通的等号慢。这很好理解,功能强了后,必然性能要低。因此,在使用时要根据情况选用。不可滥用。


gyj@OCM> select * from t1 where name like 'DBA\_%' ESCAPE '\';

ID NAME SALARY
---------- ---------- ----------
14 DBA_y 30000

gyj@OCM> select * from t1 where name like 'DBA\%%' ESCAPE '\';

ID NAME SALARY
---------- ---------- ----------
15 DBA%y 30000


(4)IS NULL 和 IS NOT NULL
我们以前曾讲到过,NULL就是未知,不知道。任何数据和未知运算,结果还是未知。就像一个不知道是几的数加1,结果还是不知道是几。同样,如果不知道和1作比较,无论比较操作是大于、等于还是小于等等,结果也是不知道。如果有人问你,产知道是几的数是否等于1,你的答案是什么!肯定还是不知道。看下面的测试,我如下显示薪水等于NULL的行,也就是显示薪水等于不知道是几的行:


gyj@OCM> select * from t1 where salary=NULL;

no rows selected


结果当然还是不知道。在表中是有薪水为NULL的行,但是普通的等于,是没办法针对NULL值。必须要使用IS NULL才行:
select * from t1 where salary is NULL;


gyj@OCM> select * from t1 where salary is NULL;

ID NAME SALARY
---------- ---------- ----------
8 gyj8


这次有了结果。gyj8的薪水为空。如果要显示薪水非空的,是使用IS NOT NULL:


gyj@OCM> select * from t1 where salary is not NULL;

ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
4 gyj4 15000


3、逻辑运算符
讲述AND、OR、NOT的使用,和BETWEEN …… and ……,IN的比较
逻辑运算符的作用是将多个条件连接起来。比如我想显示年龄大于20,小于30行。AGE>20是一个条件,AGE<30又是一个条件,如果想将两个条件组合起来,就要使用逻辑运算符了,以如下三种逻辑运算符:
条件1 AND 条件2 : AND就是“且”的意思。条件1满足,且 条件2也要满足。条件1、2必须都满足。
条件1 OR 条件2 :OR是“或”的意思。条件1满足,或 条件2满足。也就是条件1、2中有一个满足就行。
NOT 条件 :将条件的结果反转。NOT,就是不、非的意思。如果条件本来满足,NOT 满足就变成了不满足。
条件在计算机中,返回的结果是真假。如果条件满足,结果就是真,如果条件不满足,结果就假。而逻辑运算符,就是专门针对对真假进行运算的。

(1)AND运算的结果表:
条件1 条件2 结果
条件1 AND 条件2 真 真 真
真 假 假
假 真 假
假 假 假

也就是只要条件1或条件2有一个不为真,整个表达式结果就是假。

(2)OR运算的结果表:
条件1条件2结果
条件1 OR 条件2 真真真
真假真
假真真
假假假
也就是只要条件1或条件2有一个为真,整个表达式结果就是真。

(3)NOT运算的结果:
条件1结果
NOT 条件1 真假
假真

NOT是非的意思。如果条件为真,NOT 真,也就是非真,结果当然就是假了。

下面我们分别试验下:


gyj@OCM> select * from t1 where not id<2;

ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
4 gyj4 15000


id<2 本来表示id号小于2,加上NOT后,变成了id号不小于2,也就是大于等于2了。显示的结果中,雇员编号为2、3、4的都显示出来了。小于2的没有显示出来。
再试一个AND,显示id号大于等于5,小于等于6行:


gyj@OCM> Select * from t1 where id>=4 and id<=7;
ID NAME SALARY
---------- ---------- ----------
4 gyj4 15000
5 gyj5 12000
7 gyj7 12000
6 gyj6 12000


再试一个OR,显示NAME等于Joe或等于Tom:


gyj@OCM> select * from t1 where name='Joe' or name='Tom';

ID NAME SALARY
---------- ---------- ----------
9 Joe 22000
10 Tom 28000


其实,利用逻辑运算符,也可以实现 BETWEEN …… AND 和IN()同样的功能。where id>=4 and id<=7这个AND的运算,就可以转化为age BETWEEN 4 and 7。但注意,id>4 and id<7 ,则应该是age BETWEEN 5 and 6。比较起来,AND和IN更灵活,功能更强。

三、各种运算符的优先级:
讲述运算任的优先顺序

优先顺序运算符类型
1 算术运算
2 字符串连接 ||
3 比较操作
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT 逻辑条件
7 AND 逻辑条件
8 OR 逻辑条件
根据上面的优先顺序,如果我有如下条件:
SALARY+100>10000 : ORACLE将先计算SALARY+100,然后,再用结果和10000比较。因为算术运算符的优先排名是1,比较操作的优先排名是3。再看如下的例子:SALARY+100>10000 AND SALARY+1>30 (可以分解成:=> N>10000 AND M>30 => X AND Y)
我们也可以使用()来改变优先顺序。()中的表达式,将是最先被计算的。

四、排序 :
讲述ORDER BY的使用,注意字符顺序
1、排序命令的形式:
ORDER BY 列名1 [ ASC | DESC ],列名2 [ ASC | DESC ],…………
ORDER BY通常要放在整条语句的最后,WHERE条件的后面。ASC是升序,DESC是降序。如果省略ASC、DESC将按升序排列,也就是说,默认顺序是升序。我们先看个例子:
select * from t1 order by salary; :按薪水从小到大排序。再看如下例子:
select * from t1 order by salry,id; :这样的排序列有两列的,先按SALARY列的升序排,如果SALARY中有重复的值,这些重复的值按ID的大小排。这就是多列排序。前面的列重复了,按后面的列排。再看下面的:
select * from t1 order by salry desc,id; :它表示先按SALARY的降序排,也就是由大到小。如果SALARY中有重复的值,重复值按ID的升序排。

2、数据顺序
(1)数字型:数字型当然简单了,2肯定比1大,如果是升序,1要排在2之前。
(2)字符型:字符型是按照字母的ASCII码进行排序的。我们可以如下显示一个字母的ASCII码:
SQL> select ascii('a') from dual;
ASCII('A')
-------------------
97

在ORACLE中,如果你想显示什么内容,可以像上面那样FROM DUAL。
从上面的结果看到,a(小写a)的ASCII码是97。我们可以再试一下,大写A的ASCII码是65。如果现在小写a 与 A排序,升序的话,肯定是大写A在前。
如果字符串长度不相同,该怎么比大小。比如’abc’和’ABCD’,像这样的情况,一般的规则是逐个字符比较,先比第一个字符,如果可以区分出大小,就不再往后比了。也就是说,不论长度。像上面,虽然‘ABCD’有四个字节,但它比’abc’小。因为第一个字符就分出来大小了’a’ 比‘A’大,后面的就不用比了。甚至’a’ 和‘ABCD’比较,也是’a’大而’ABCD’小。但是,’abc’ 和‘abcd’比较,就是’abcd’大了。因为前三个字符一样,分不出大小,因此,这时就看长度了,谁长谁就大。
汉字也一样,字母按照ASCII码,汉字也有编码,如果想看汉字的编号,可以使用如下命令:


gyj@OCM> select dump('郭'),dump('一'),dump('军') from dual;
DUMP('郭') DUMP('一') DUMP('军')
--------------------- --------------------- ---------------------
Typ=96 Len=2: 185,249 Typ=96 Len=2: 210,187 Typ=96 Len=2: 190,252
郭: 185,249 一: 210,187 军:190,252


这四个字当中,郭最小。其次是军、一
其实汉字的顺序,基本是按照汉语拼音的顺序比较。

(3)空值:这个是ORACLE中规定好的:升序排序时显示在最后,降序排序时显示在最前面。

3.列别名:
如果列有列名,在排序时可以使用列原来的名字,也可以使用列的别名:


gyj@OCM> select id,name,salary sal from t1 order by salary,id;(SALARY别名为SAL,这时使用列原名)
ID NAME SAL
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
1 gyj1 12000
5 gyj5 12000
6 gyj6 12000
7 gyj7 12000
4 gyj4 15000


gyj@OCM> select id,name,salary sal from t1 order by sal,id; (此处使用列别名)

ID NAME SAL
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
1 gyj1 12000
5 gyj5 12000
6 gyj6 12000
7 gyj7 12000
4 gyj4 15000


gyj@OCM> select id,name,salary sal from t1 order by 3,1;(3和1代表啥知道不?)

ID NAME SAL
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
1 gyj1 12000
5 gyj5 12000
6 gyj6 12000
7 gyj7 12000
4 gyj4 15000





**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name: guoyJoe

QQ: 252803295

Email: oracledba_cn@hotmail.com

Blog: http://blog.csdn.net/guoyJoe

ITPUB: http://www.itpub.net/space-uid-28460966.html

OCM: http://education.oracle.com/education/otn/YGuo.HTM
_____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036


分享到:
评论

相关推荐

    .net linq动态组合查询条件及排序

    在实际开发中,有时我们需要根据不同的业务需求动态地组合查询条件和排序规则,这在传统的ADO.NET中可能较为复杂,而在LINQ中则变得相对简单。本文将深入探讨如何在.NET中利用LINQ实现动态组合查询条件及排序。 ...

    EF多条件查询、排序Demo

    调用 `_baseService.FindAllByPage` 方法执行分页查询,并传入查询条件`@where`、当前页码`param.pageIndex`、每页显示条数`param.iDisplayLength`以及排序信息`new[] { m }`。 #### 四、总结 通过上述步骤,我们...

    8种最坑的SQL错误用法.pdf

    对于左连接查询,如果WHERE条件和排序都针对最左主表,可以先对主表进行排序和限制,以减少数据量,然后再进行连接,这将显著减少执行时间。 8. **中间结果集下推**: 对于全表聚合查询,若只关心能与主表匹配的...

    MyBatisPlus条件构造器带条件排序方法orderBy、orderByDesc、orderByAsc使用示例代码

    在实际开发中,我们经常需要对查询结果进行排序,MyBatisPlus为此提供了`orderBy`、`orderByDesc`和`orderByAsc`三个方法,方便我们实现条件排序。下面将详细介绍这三个方法的使用及原理。 `orderBy`方法是...

    mysql SELECT 列 FROM 表 WHERE 条件 选择:select * from table where 范围

    - **说明**:此语句用于从指定的表中选取数据,可以通过`WHERE`子句添加条件筛选特定的数据记录。例如,`SELECT * FROM table WHERE 范围`表示从`table`表中选择所有列,并通过`范围`条件过滤结果集。 #### INSERT ...

    sql查询和排序

    本章将深入探讨SQL语句中的条件查询和排序操作,这对于数据检索和分析至关重要。 首先,条件查询是SQL中的基础操作,它允许我们根据特定条件从数据库中筛选出所需的数据。这主要通过使用`WHERE`子句来实现。例如,...

    MySQL优化篇:排序分组优化.pdf

    在进行MySQL优化时,首先考虑的是where条件和on子句中的过滤条件,因为这些条件可以减少需要排序和分组的数据量,从而提高效率。接下来才是考虑排序和分组的优化。 最后,了解MySQL的排序算法是很重要的。在MySQL ...

    22讲 SQL语言高级02--条件查询和排序.PPT

    在高级SQL中,条件查询和排序是两个至关重要的概念,它们帮助用户从海量数据中提取出特定信息,并按照特定顺序展示结果。以下是对这两个主题的详细说明: **条件查询**: 条件查询允许我们根据指定的条件筛选出数据...

    SQL语句的条件查询和排序操作

    ### SQL语句的条件查询和排序操作 #### 条件查询 在SQL中,通过`SELECT`语句结合`WHERE`子句可以实现对数据库表中的数据进行条件筛选。这使得用户能够根据特定条件获取所需的数据行。 ##### 基础条件查询 - **...

    MySQL高级优化之-查询逻辑及where条件提取.pdf

    在优化查询时,关注点应放在WHERE条件的提取和优化上。有效的WHERE条件可以显著减少扫描的行数,提高查询效率。例如,使用索引,避免全表扫描;尽可能地让数据库引擎利用索引,而不是进行全表扫描或排序;避免在...

    cn条件查询和数据排序.ppt

    在本节课程中,主要探讨了如何在SQL中执行条件查询和数据排序,特别是针对Oracle数据库的iSQL*Plus环境。以下是一些关键知识点: 1. **WHERE子句**:WHERE子句用于在FROM子句之后指定查询条件,它帮助我们筛选出...

    数据筛选和排序.zip

    在C#编程语言中,数据筛选和排序是数据库应用系统开发中的核心技能,尤其是在构建高效、用户友好的数据管理系统时。本教学资源"数据筛选和排序.zip"包含了S1课程中关于这一主题的第六章教学内容,包括演示案例、上机...

    Mybatis排序无效问题解决.doc

    这意味着,如果传入的`sortInfo`值是`empno desc`,那么在最终生成的SQL语句中,这部分内容将直接作为排序条件使用,从而实现正确的排序。 #### 实践示例 下面给出一个具体的例子来展示如何使用`${}`表达式来解决...

    cn条件查询和数据排序PPT学习教案.pptx

    本教程主要聚焦于“CN条件查询和数据排序”,通过学习,你可以掌握如何在数据库中指定查询条件、对查询结果进行排序,以及在iSQL*Plus环境中使用变量替换等关键技能。 1. **指定查询条件**: - 在SQL语句中,`...

    Where Is It V3.97 Build 0612 绿色英文特别版

    4. **强大的过滤和排序**:提供多种过滤和排序选项,使用户可以根据需要快速筛选出所需信息。 5. **可视化展示**:Where Is It 通常采用树状视图展示文件结构,让用户清晰地看到文件之间的关联关系。 6. **批量操作*...

    易语言Access数据库过滤并排序

    例如,我们可以用"SELECT * FROM 表名 WHERE 条件"这样的SQL语句,其中"表名"是你想要查询的表,"条件"是筛选记录的标准。在易语言中,可以使用“数据库打开”、“数据库查询”等命令来执行类似的过滤操作。 排序...

    第2章 限制数据和对数据排序

    本章深入探讨了Oracle SQL中限制数据和对数据排序的关键技术, 包括`WHERE`子句的使用以及`ORDER BY`子句的应用。通过学习这些技术, 用户可以更精确地控制查询结果, 并能根据需求对结果进行排序, 这对于高效管理和...

    关于Select Where In 的排序问题

    在SQL查询中,`SELECT WHERE IN` 是一种常用的过滤数据的方式,它允许我们根据指定的一组值来筛选出满足条件的记录。然而,当需要按照`IN`子句中的顺序进行排序时,就涉及到一个特殊的技术问题。这个问题的描述是:...

    oracle限定查询和排序

    这些条件查询主要通过`WHERE`子句来实现。 ##### 1. 基本条件查询 - **单一条件查询**: - **示例**:查询编号为`7369`的用户。 ```sql SELECT * FROM emp WHERE empno = 7369; ``` - **多列条件查询**: - **...

    基于实体属性/表列名的前后端自定义通用条件查询

    在IT行业中,自定义条件查询是一项重要的功能,它允许用户根据特定需求自由组合查询...在实际开发中,还应注意安全性和性能优化,例如使用预编译的PreparedStatement来防止SQL注入,并考虑分页、排序等高级查询功能。

Global site tag (gtag.js) - Google Analytics