Oracle笔记:简单数据查询

01 查询输出基本表指定列

--SELECT * FROM EMP;
--SELECT DISTINCT * FROM EMP;
SELECT EMPNO,ENAME,JOB FROM EMP;
--SELECT DISTINCT JOB FROM EMP;
--SELECT DISTINCT JOB,MGR FROM EMP;

02 对数据列进行运算并输出

SELECT EMPNO AS 编码,SAL+1000 AS 工资 FROM EMP;
--数据列进行算术运算时,必须要保证该列的数据类型是可运算的,否则将出现错误提示

03 单条件查询

SELECT * FROM EMP WHERE JOB = 'MANAGER';
--SELECT * FROM EMP WHERE 1>0;

04 根据查询结果创建和复制表

CREATE TABLE EMPTEMP1
AS
SELECT * FROM EMP WHERE JOB = 'MANAGER';

CREATE TABLE EMPTEMP2
AS
SELECT * FROM EMP WHERE ROWNUM<1;

05 返回表中前N行记录

SELECT * FROM EMP WHERE ROWNUM=1;
SELECT * FROM EMP WHERE ROWNUM=2;--NO ROWS SELECTED
--rownum从自然数1开始,因此条件ROWNUM=1是成立的,但是ROWNUM=n(n>1)是不成立的,应该与ORDER BY子句结合使用
SELECT * FROM
    (SELECT P.*,ROWNUM AS RN FROM EMP P ORDER BY EMPNO)
    WHERE RN=2;

06 消除重复行

--SELECT DISTINCT * FROM EMP;
--SELECT DISTINCT JOB FROM EMP;
SELECT DISTINCT JOB,MGR FROM EMP;

07 NULL值判断

SELECT * FROM EMP WHERE COMM IS NULL;
--SELECT * FROM EMP WHERE COMM IS NOT NULL;
--空值并不包括零,一个或多个空字符串。他是一个未赋值的值

08 查询字段为某个范围内的记录

SELECT * FROM EMP WHERE COMM BETWEEN 0 AND 300;

SELECT * FROM(
SELECT P.*,NVL(COMM,0) AS COMMT FROM EMP P)
WHERE COMMT BETWEEN 0 AND 300;
--BETWEEN V1 TO V2运算符在比较值的范围时,取值范围包含V1和V2

09 返回字段值为列表中某个值的记录

--SELECT * FROM EMP WHERE MGR IN(NULL);--NO ROW SELECTED;NULL值判断只能使用is,not is或处理空值后再判断
--SELECT * FROM EMP WHERE MGR IN(7566,7698);
SELECT * FROM EMP WHERE MGR NOT IN(7566,7698);

10 条件组合查询

--SELECT * FROM EMP 
--WHERE MGR IN(7566) AND EMPNO=7902;

SELECT * FROM EMP
WHERE JOB ='CLERK' OR COMM <=500;

11 复合条件查询

SELECT * 
    FROM EMP
    WHERE (JOB ='CLERK' OR COMM <=500) 
           AND COMM IS NOT NULL;
--复合条件尽量使用()括号区分优先级

12 实现模糊查询

--SELECT * FROM EMP WHERE ENAME LIKE '%LLE%';--包含一个或多个字符的字符串匹配
SELECT * FROM EMP WHERE ENAME LIKE 'K_NG';--任意单字符匹配

通配符:
% 零或者多个字符
_ 单一任何字符(下划线)
\ 特殊字符

oracle10g以上支持正则表达式的函数主要有下面四个:
1,REGEXP_LIKE :与LIKE的功能相似
2,REGEXP_INSTR :与INSTR的功能相似
3,REGEXP_SUBSTR :与SUBSTR的功能相似
4,REGEXP_REPLACE :与REPLACE的功能相似
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
‘^’ 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
‘′匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则′匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则 也匹
配 ‘\n’ 或 ‘\r’。
‘.’ 匹配除换行符之外的任何单字符。
‘?’ 匹配前面的子表达式零次或一次。
‘+’ 匹配前面的子表达式一次或多次。
‘*’ 匹配前面的子表达式零次或多次。
‘|’ 指明两项之间的一个选择。例子’^([a-z]+|[0-9]+)$‘表示所有小写字母或数字组合成的
字符串。
‘( )’ 标记一个子表达式的开始和结束位置。
‘[]’ 标记一个中括号表达式。
‘{m,n}’ 一个精确地出现次数范围,m=<出现次数<=n,’{m}‘表示出现m次,’{m,}'表示至少
出现m次。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。
字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
各种操作符的运算优先级
\转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
|
*/

其中关于条件,SQL提供了四种匹配模式:

1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。

比如 SELECT * FROM [user] WHERE u_name LIKE ‘%三%’

将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。

另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件
SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’

若使用 SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%’
虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

2,_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:

比如 SELECT * FROM [user] WHERE u_name LIKE ‘
只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;

再比如 SELECT * FROM [user] WHERE u_name LIKE ‘三__’;
只找出“三脚猫”这样name为三个字且第一个字是“三”的;

  1. regexp_like 正则表达式函数查询
    –查询FieldName中以1开头60结束的记录并且长度是7位
    select * from fzq where FieldName like ‘1____60’;
    select * from fzq where regexp_like(FieldName,‘1…60’);
    –查询FieldName中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
    –使用like就不是很好实现了。
    select * from fzq where regexp_like(FieldName,‘1[0-9]{4}60’);
    – 也可以这样实现,使用字符集。
    select * from fzq where regexp_like(FieldName,‘1[[:digit:]]{4}60’);
    – 查询FieldName中不是纯数字的记录
    select * from fzq where not regexp_like(FieldName,’1+KaTeX parse error: Double superscript at position 81: …e(FieldName,'^[^̲[:digit:]]+’);
    –查询以12或者1b开头的记录.不区分大小写。
    select * from fzq where regexp_like(FieldName,’^1[2b]’,‘i’);
    –查询以12或者1b开头的记录.区分大小写。
    select * from fzq where regexp_like(FieldName,’^1[2B]’);
    – 查询数据中包含空白的记录。
    select * from fzq where regexp_like(FieldName,’[[:space:]]’);
    –查询所有包含小写字母或者数字的记录。
    select * from fzq where regexp_like(FieldName,’^([a-z]+|[0-9]+)$’);
    –查询任何包含标点符号的记录。
    select * from fzq where regexp_like(FieldName,’[[:punct:]]’);

13 使用ESCAPE和转义字符

SELECT * FROM
(SELECT '%~!@#$%^&*()_+' AS C1, '__@@%%' AS C2 FROM DUAL)
WHERE C1 LIKE '!%%' ESCAPE '!' AND C2 LIKE '!_%' ESCAPE '!';
--转义字符不仅可以为例子中使用的“!”,也可以使用ESCAPE关键字定义其他字符
DROP TABLE EMP CASCADE CONSTRAINT;

CREATE TABLE EMP(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
);

COMMENT ON COLUMN EMP.EMPNO IS '编码';
COMMENT ON COLUMN EMP.ENAME IS '名称';
COMMENT ON COLUMN EMP.JOB IS '工作';
COMMENT ON COLUMN EMP.MGR IS '主管';
COMMENT ON COLUMN EMP.HIREDATE IS '聘用时间';
COMMENT ON COLUMN EMP.SAL IS '工资';
COMMENT ON COLUMN EMP.COMM IS '提成';
COMMENT ON COLUMN EMP.DEPTNO IS '部门编码';

INSERT INTO EMP
SELECT 7369 AS EMPNO, 'SMITH' AS ENAME, 'CLERK' AS JOB, 7902 AS MGR, TO_DATE('19801217','yyyy-MM-dd') AS HIREDATE, 800 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7499 AS EMPNO, 'ALLEN' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810220','yyyy-MM-dd') AS HIREDATE, 1600 AS SAL, 300 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7521 AS EMPNO, 'WARD' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810222','yyyy-MM-dd') AS HIREDATE, 1250 AS SAL, 500 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7566 AS EMPNO, 'JONES' AS ENAME, 'MANAGER' AS JOB, 7839 AS MGR, TO_DATE('19810402','yyyy-MM-dd') AS HIREDATE, 2975 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7654 AS EMPNO, 'MARTIN' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810928','yyyy-MM-dd') AS HIREDATE, 1250 AS SAL, 1400 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7698 AS EMPNO, 'BLAKE' AS ENAME, 'MANAGER' AS JOB, 7839 AS MGR, TO_DATE('19810501','yyyy-MM-dd') AS HIREDATE, 2850 AS SAL, NULL AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7782 AS EMPNO, 'CLARK' AS ENAME, 'MANAGER' AS JOB, 7839 AS MGR, TO_DATE('19810609','yyyy-MM-dd') AS HIREDATE, 2450 AS SAL, NULL AS COMM, 10 AS DEPTNO FROM DUAL UNION ALL
SELECT 7788 AS EMPNO, 'SCOTT' AS ENAME, 'ANALYST' AS JOB, 7566 AS MGR, TO_DATE('19821209','yyyy-MM-dd') AS HIREDATE, 3000 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7839 AS EMPNO, 'KING' AS ENAME, 'PRESIDENT' AS JOB, NULL AS MGR, TO_DATE('19811117','yyyy-MM-dd') AS HIREDATE, 5000 AS SAL, NULL AS COMM, 10 AS DEPTNO FROM DUAL UNION ALL
SELECT 7844 AS EMPNO, 'TURNER' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810908','yyyy-MM-dd') AS HIREDATE, 1500 AS SAL, 0 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7876 AS EMPNO, 'ADAMS' AS ENAME, 'CLERK' AS JOB, 7788 AS MGR, TO_DATE('19830112','yyyy-MM-dd') AS HIREDATE, 1100 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7900 AS EMPNO, 'JAMES' AS ENAME, 'CLERK' AS JOB, 7698 AS MGR, TO_DATE('19811203','yyyy-MM-dd') AS HIREDATE, 950 AS SAL, NULL AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7902 AS EMPNO, 'FORO' AS ENAME, 'ANALYST' AS JOB, 7566 AS MGR, TO_DATE('19811203','yyyy-MM-dd') AS HIREDATE, 3000 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7934 AS EMPNO, 'MILLER' AS ENAME, 'CLERK' AS JOB, 7782 AS MGR, TO_DATE('19820123','yyyy-MM-dd') AS HIREDATE, 1300 AS SAL, NULL AS COMM, 10 AS DEPTNO FROM DUAL;
COMMIT;

  1. [:digit:] ↩︎

猜你喜欢

转载自blog.csdn.net/qq_39827640/article/details/106353685
今日推荐