五、限定查询和排序显示 5.1、限定查询 5.1.1 认识限定查询
范例:以 nolog 的方式打开 sqlplus (在命令行终端)
sqlplus /nolog范例:使用 sys 管理员登录
CONN sys/chagne_on_install AS SYSDBA;范例:切换到 PDB 之中
ALTER SESSION SET CONTAINER=pdbmldn;范例:打开 PDB
ALTER DATABASE pdbmldn OPEN;范例:查看 sh 用户的数据表内容
SELECT COUNT(*) FROM sh.sales;现在这张表中存在有 9w 多条记录,如果直接发出如下指令:
SELECT * FROM sh.sales;现在显示结果一直不停变换,无法查看,按 Ctrl+C 停止。所以现在数据量一大,那么是不可能这样直接查看全部数据的,所以全部数据行的显示根本就不可能使用。很多时候往往需要针对所需要的数据进行筛选,而筛选就是限定查询的功能。
现在连接到 c##scott 用户:
conn c##scott/tiger; 5.1.2 限定查询语法: SELECT [DISTINCT] * | 列名称 [AS] [列别名],列名称 [AS] [列别名],... FROM 表名称[表别名] [WHERE 条件( s )];
在这个语法之中,就是比之前的语法多了一个 WHERE 子句,在 WHERE 子句之中可以设置一系列的过滤条件。而这些条件可以设置多个,那么这多个条件之间就可以利用逻辑运算进行连接。
逻辑运算符共有以下三种:
与(AND):连接多个条件,多个条件同时满足时才返回 TRUE,有一个条件不满足结果就是 FALSE ;
或(OR):连接多个条件,多个条件之中只要有一个返回 TRUE ,结果就是 TRUE ,如果多个条件返回的都是 FALSE ,结果才是 FALSE ;
非(NOT):求反操作,可以将 TRUE 变 FALSE ,FALSE 变 TRUE 。
逻辑真值表:
NO.条件 x条件 yx AND yx OR yNOT x1 TRUE TRUE TRUE TRUE FALSE
2 TRUE NULL NULL TRUE FALSE
3 TRUE FALSE FALSE TRUE FALSE
4 NULL TRUE NULL TRUE NULL
5 NULL NULL NULL NULL NULL
6 NULL FALSE FALSE NULL NULL
7 FALSE TRUE FALSE TRUE TRUE
8 FALSE NULL FALSE NULL TRUE
9 FALSE FALSE FALSE TRUE TRUE
范例:统计出基本工资高出 1500 的全部雇员信息
现在的查询已经出现了一个条件要求,所以在这种情况下就必须使用 WHERE 子句进行条件的设置。
SELECT * FROM emp WHERE sal>1500;
现在可以发现并不是所有的数据都显示了,只是部分的数据显示,而且这部分都是满足条件的数据。
现在对于 SQL 语法而言,就具备了三个子句:
第一步:执行 FROM 子句,来控制数据的来源
第二步:执行 WHERE 子句,使用限定符进行数据行的过滤
第三步:执行 SELECT 子句,确定要显示的数据列
5.1.3 对数据进行限定查询在之前所使用的 “ > ” 是一个关系运算符,在标准 SQL 之中定义了许多的运算符。
常用限定运算符:
NO运算符符号描述1 关系运算符 >、<、>=、<=、=、!=、<> 进行大小或相等的比较,其中不等于有两种:!= 和 <>
2 判断 null IS NULL 、IS NOT NULL 判断某一列的内容是否是 null
3 逻辑运算符 AND 、OR、NOT AND 表示多个条件必须同时满足,OR 表示只需要有一个条件满足即可,NOT 表示条件取反,即:真变假,假变真
4 范围查询 BETWEEN 最小值 AND 最大值 在一个指定范围中进行查找,查找结果为:“ 最小值 <= 内容 <= 最大值 ”
5 范围查询 IN 通过 IN 可以指定一个查询的范围
6 模糊查询 LIKE 可以对指定的字段进行模糊查询
5.1.3.1 关系运算符
关系运算就是确定大小、相等关系的比较。
范例:要求查询出所有基本工资小于等于2000的全部雇员信息
SELECT * FORM emp WHERE sal<=2000;范例:根据之前的查询结果发现 SMITH 的工资最低,现在希望可以取得 SMITH 的详细资料。
SELECT * FORM emp WHERE ename='SMITH';范例:查询出所有办事员(CLERK)的雇员信息
SELECT * FORM emp WHERE job='CLERK';但是在使用关系运算符判断字符数据的时候请一定要主要大小写的编写问题。因为 Oracle 是区分大小写的。
范例:错误的代码
SELECT * FORM emp WHERE job='clerk'; // 不会有结果返回范例:取得了所有办事员的资料之后,为了和其他职位的雇员对比,现在决定再查询出所有不是办事员的雇员信息。
既然现在职位不是办事员,那么肯定使用不等于符号(<>, !=)
实现一:
SELECT * FORM emp WHERE job<>'CLERK';实现二:
SELECT * FORM emp WHERE job!='CLERK';范例:查询出工资范围在 1500 ~ 3000 (都包含)的全部雇员信息
现在这个判断是两个条件,而且这两个条件肯定需要同时满足,那么就使用 AND 进行条件的连接
SELECT * FORM emp WHERE sal>=1500 AND sal<=3000;范例:查询职位是销售,并且基本工资高于 1200 的所有雇员信息
SELECT * FORM emp WHERE job='SALESMAN' AND sal>1200;范例:查询出 10 部门中的经理或者是 20 部门的业务员的信息
SELECT * FORM emp WHERE (deptno=10 AND job='MANAGER') OR (deptno=20 AND job='CLERK');范例:查询不是办事员的且基本工资大于 2000 的全部雇员信息
实现一:基本实现
SELECT * FORM emp WHERE job!='CLERK' AND sal>2000; SELECT * FORM emp WHERE job<>'CLERK' AND sal>2000;实现二:使用 NOT 对条件求反
SELECT * FORM emp WHERE NOT(job='CLERK' OR sal<=2000); 5.1.3.2 范围查询范例:使用 BETWEEN...AND... 操作符查询工资范围在 1500(含)~ 3000(含)的全部雇员信息
SELECT * FORM emp WHERE sal BETWEEN 1500 AND 3000;范例:查询���在 1981 年雇佣的全部雇员信息
SELECT * FORM emp WHERE hiredate BETWEEN '01-1月-81' AND '31-12月-1981'; 实际上这里就实现了日期和字符串数据之间的转换操作的功能。
5.1.3.3 null 判断:
判断内容是否为 null : IS NULL , IS NOT NULL
语法:
判断为 NULL:字段|值 IS NULL;
判断不为 NULL:字段|值 IS NOT NULL; ( NOT 字段|值 IS NULL; )
NULL 是一个未知的数据,所以对于 NULL 的处理,如果直接利用关系运算判断,是不会有结果的
范例:利用 = 进行 NULL 比较
SELECT * FORM emp WHERE comm=null AND empno=7369;结果显示没有任何数据返回,因为 NULL 不能使用 = 判断。
范例:查询出所有领取佣金的雇员的完整信息
佣金的字段是 comm,领取佣金的概念就属于佣金不为null。
实现一:直接使用IS NOT NULL 完成
SELECT * FORM emp WHERE comm IS NOT NULL;实现二:使用IS NULL 并使用NOT 求反完成
SELECT * FORM emp WHERE NOT comm IS NULL;范例:查询出所有不领取佣金的雇员的完整信息
SELECT * FORM emp WHERE comm IS NULL;