从今天开始,我跟大家一起学习Oracle的基础知识。孔子曰:“温故而知新,可以为师矣”。学过的东西,也要经常回顾一下,才能记得更牢,用的更溜。
1.限制返回的行数
在查询时,并不是每次都要返回所有数据,比如,只要求返回三条数据。
SELECT * FROM EMP WHERE ROWNUM<=3;
但是,
如果直接用rownum=3,来查询会出现什么情况?
因为rownum是依次对数据做标识的,就像上学时依据分数排名一样,需要有第一名,后面才有第二名。
正确地取第三行数据的查询应该像下面这样,先生成序号:
SELECT *
FROM (SELECT ROWNUM AS SN, T.* FROM EMP T WHERE ROWNUM <= 3)
WHERE SN = 2;
2.从表中随机返回n条记录
随机抽取表中的3行数据,可以先按dbms_random随机排序然后取其中的三行。
SELECT *
FROM (
SELECT * FROM EMP T ORDER BY DBMS_RANDOM.VALUE()
)
WHERE ROWNUM <= 3
3.模糊查询
CREATE OR REPLACE VIEW V AS
SELECT 'ABCEDF' AS VNAME
FROM DUAL
UNION ALL
SELECT '_BCEFG' AS VNAME
FROM DUAL
UNION ALL
SELECT '_BCEDF' AS VNAME
FROM DUAL
UNION ALL
SELECT '_\BCEDF' AS VNAME
FROM DUAL
UNION ALL
SELECT 'XYCEG' AS VNAME
FROM DUAL;
要求一:查vname中包含字符串‘CDE’的。
select * from v t where t.VNAME like '%CED%'
要求二:查出vname中包含字符串‘_BCE’的。
select * from v t where t.VNAME like '\_BCE%' ESCAPE '\';
注:不加eacape会匹配不上任何一个字符串。
escape把’\’标志为转义字符,而’\’把’_’转义为字符,而非原义(通配符)。
要求三:查出vname中包含字符串‘_\BCEDF’的。
select * from v t where t.vname like '_\\BCE%' escape '\';
4, 按照子串排序
有一种速查法就是按顾客的电话号码尾号的顺序记录,这样在查找的时候就可以快速缩小查找的范围,增强顾客的认可度。如果要按照这种做法排序,应该怎么做到?通过后面几位所需的信息即可。
SELECT T.LAST_NAME AS 名称,
T.PHONE_NUMBER AS 号码,
T.SALARY AS 工资,
SUBSTR(T.PHONE_NUMBER, -4) AS 尾号
FROM HR.EMPLOYEES T
WHERE ROWNUM <=5
ORDER BY 4;
由此可见,只要能够将数据查出来,就可以根据相应的信息进行排序。
6,translate
语法格式:TRANSLATE(expr, from_string, to_string)
SELECT TRANSLATE('ab你好bcadefg', 'abcdefg', '1234567')
FROM DUAL
from_string和 to_string以字符为单位,对应字符一一替换。
如果to_string为空,那么返回空值。
如果to_string对应的位置没有字符,删除from_string中列出的字符将会被消掉。
7,下面是几个给用户赋权的语句。
grant create view to Scott;
--赋给Scott创建视图的权限
grant select any table to Scott;
--赋给Scott查询表的权限
grant select any dictionary to SCOTT;
--赋给Scott查询数据字典的权限