null限定和排序数据限定和排序数据 -Itpub技术培训
目的目的
排序是昂贵的操作
限制某一查询所取记录
排序查询结果使用选择限定记录使用选择限定记录SELECT *
FROM emp
WHERE deptno= 10;排序是昂贵的操作排序是昂贵的操作从开始就考虑优化
排序往往花费大量的时间及资源
磁盘排序比内存排序慢10000倍,在磁盘Cache存在的情况下基本上也会慢100倍
限定所选择的记录限定所选择的记录使用where子句限定返回的记录
WHERE子句在 FROM 子句后
SELECT [DISTINCT] {*, column [alias], ...}
FROM table
[WHERE condition(s)];使用WHERE子句使用WHERE子句
SQL> SELECT ename, job, deptno
2 FROM emp
3 WHERE job='CLERK';ENAME JOB DEPTNO
---------- --------- ---------
JAMES CLERK 30
SMITH CLERK 20
ADAMS CLERK 20
MILLER CLERK 10字符串和日期字符串和日期字符串和日期要用单引号扩起来
字符串是大小写敏感的,日期值是格式敏感的
缺省的日期格式是 'DD-MON-RR'SQL> SELECT ename, job, deptno
2 FROM emp
3 WHERE ename = 'JAMES';注意:注意: 数字通常不要使用引号引起来,以免产生数据库歧义及潜在转换!日期格式日期格式SQL> select * from v$nls_parameters;
PARAMETER VALUE
------------------------------ --------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY RMB
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR日期格式日期格式内部以数字形式存储
默认显示格式为DD-MON-RR
内部仍然保存日期和时间的所有组成部分
Oracle服务器不存在2000年问题RR日期格式 RR日期格式 日期格式日期格式SQL> select name,value$ from props$ where name like '%DATE%';
NAME VALUE$
------------------------------ ----------------------------------
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'PROPS$'比较运算符比较运算符运算符
=
>
>=
<
<=
<>含义
等于
大于
大于等于
小于
小于等于
不等于使用比较运算符使用比较运算符
SQL> SELECT ename, sal, comm
2 FROM emp
3 WHERE sal<=comm;ENAME SAL COMM
---------- --------- ---------
MARTIN 1250 1400其它的比较运算符其它的比较运算符运算符
BETWEEN ...AND...
IN(list)
LIKE
IS NULL含义
在两值之间 (包含)
匹配列出的值
匹配一个字符模式
是空值 使用BETWEEN运算符使用BETWEEN运算符使用BETWEEN运算符显示某一 值域范围的记录
ENAME SAL
---------- ---------
MARTIN 1250
TURNER 1500
WARD 1250
ADAMS 1100
MILLER 1300
SQL> SELECT ename, sal
2 FROM emp
3 WHERE sal BETWEEN 1000 AND 1500;使用IN运算符使用IN运算符使用IN运算符获得匹配列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
值的记录
SQL> SELECT empno, ename, sal, mgr
2 FROM emp
3 WHERE mgr IN (7902, 7566, 7788); EMPNO ENAME SAL MGR
--------- ---------- --------- ---------
7902 FORD 3000 7566
7369 SMITH 800 7902
7788 SCOTT 3000 7566
7876 ADAMS 1100 7788据说据说In 最多允许1000个值列表
这是一个朋友的测试结果使用LIKE运算符使用LIKE运算符
使用LIKE运算符执行通配查询
查询条件可包含文字字符或数字
(%) 可表示零或多个字符
( _ ) 可表示一个字符SQL> SELECT ename
2 FROM emp
3 WHERE ename LIKE 'S%';使用LIKE运算符使用LIKE运算符使用组合方式匹配字符
使用ESCAPE 标识符来查找带特殊符号的字符号
SQL> SELECT ename
2 FROM emp
3 WHERE ename LIKE '_A%';ENAME
----------
JAMES
WARDESCAPE用法ESCAPE用法SQL> select * from test;
NAME
------------------------------
test%te
SQL> select name from test where name like '%t\%%' escape '\';
NAME
------------------------------
test%te
SQL>
SQL> select name from test where name like '%t\%' escape '\';
未选定行怎样插入特殊字符怎样插入特殊字符SQL> insert into test values('aa&a');
输入 a 的值: c
原值 1: insert into test values('aa&a')
新值 1: insert into test values('aac')
已创建 1 行。
SQL> select * from test;
NAME
------------------------------
test%te
aac
--SQL> show escape
escape OFF
SQL> set escape on
SQL> show escape
escape "\" (hex 5c)
SQL> INSERT INTO test VALUES ('\&1');
已创建 1 行。
SQL> select * from test;
NAME
------------------------------
test%te
aac
&1
使用IS NULL运算符使用IS NULL运算符查询包含空值的记录
SQL> SELECT ename, mgr
2 FROM emp
3 WHERE mgr IS NULL;ENAME MGR
---------- ---------
KING逻辑运算符逻辑运算符运算符
AND OR
NOT含义
如果组合的条件都是TRUE,
返回TRUE
如果组合的条件 之一是TRUE,返回TRUE
如果下面的条件是FALSE,返回TRUE使用AND运算符使用AND运算符
AND需要条件都是TRUE.SQL> SELECT empno, ename, job, sal
2 FROM emp
3 WHERE sal>=1100
4 AND job='CLERK'; EMPNO ENAME JOB SAL
--------- ---------- --------- ---------
7876 ADAMS CLERK 1100
7934 MILLER CLERK 1300使用OR运算符使用OR运算符
OR需要条件之一是TRUESQL> SELECT empno, ename, job, sal
2 FROM emp
3 WHERE sal>=1100
4 OR job='CLERK'; EMPNO ENAME JOB SAL
--------- ---------- --------- ---------
7839 KING PRESIDENT 5000
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
...
14 rows selected.使用NOT运算符使用NOT运算符
SQL> SELECT ename, job
2 FROM emp
3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST');ENAME JOB
---------- ---------
KING PRESIDENT
MARTIN SALESMAN
ALLEN SALESMAN
TURNER SALESMAN
WARD SALESMAN优先级规则优先级规则括号将跨越所有优先级规则次序 运算符
1 所有的比较运算
2 NOT
3 AND
4 OR优先级规则优先级规则
ENAME JOB SAL
---------- --------- ---------
KING PRESIDENT 5000
MARTIN SALESMAN 1250
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
WARD SALESMAN 1250SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE job='SALESMAN'
4 OR job='PRESIDENT'
5 AND sal>1500;优先级规则优先级规则
ENAME JOB SAL
---------- --------- ---------
KING PRESIDENT 5000
ALLEN SALESMAN 1600使用扩号提高优先级(Very Imporatant)SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE (job='SALESMAN'
4 OR job='PRESIDENT')
5 AND sal>1500;注意注意 很多人在简单的问题上犯下重大的错误,所以在你的SQL中,使用()来明确你的业务逻辑!
ORDER BY 子句ORDER BY 子句使用ORDER BY 子句将记录排序
ASC: 升序,缺省
DESC: 降序
ORDER BY 子局在SELECT指令的最后
SQL> SELECT ename, job, deptno, hiredate
2 FROM emp
3 ORDER BY hiredate;
ENAME JOB DEPTNO HIREDATE
---------- --------- --------- ---------
SMITH CLERK 20 17-DEC-80
ALLEN SALESMAN 30 20-FEB-81
...
14 rows selected.降序排序降序排序
SQL> SELECT ename, job, deptno, hiredate
2 FROM emp
3 ORDER BY hiredate DESC;ENAME JOB DEPTNO HIREDATE
---------- --------- --------- ---------
ADAMS CLERK 20 12-JAN-83
SCOTT ANALYST 20 09-DEC-82
MILLER CLERK 10 23-JAN-82
JAMES CLERK 30 03-DEC-81
FORD ANALYST 20 03-DEC-81
KING PRESIDENT 10 17-NOV-81
MARTIN SALESMAN 30 28-SEP-81
...
14 rows selected.使用列的别名排序使用列的别名排序
SQL> SELECT empno, ename, sal*12 annsal
2 FROM emp
3 ORDER BY annsal; EMPNO ENAME ANNSAL
--------- ---------- ---------
7369 SMITH 9600
7900 JAMES 11400
7876 ADAMS 13200
7654 MARTIN 15000
7521 WARD 15000
7934 MILLER 15600
7844 TURNER 18000
...
14 rows selected.多个列排序多个列排序通过ORDER BY 列表的顺序来排序
你可使用不在SELECT序列上的列来排序SQL> SELECT ename, deptno, sal
2 FROM emp
3 ORDER BY deptno, sal DESC;ENAME DEPTNO SAL
---------- --------- ---------
KING 10 5000
CLARK 10 2450
MILLER 10 1300
FORD 20 3000
...
14 rows selected.小结小结
SELECT [DISTINCT] {*, column [alias], ...}
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr, alias} [ASC|DESC]];