设为首页 收藏本站
查看: 467|回复: 0

[经验分享] oracle常用数据操纵语言

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-2-9 08:22:02 | 显示全部楼层 |阅读模式
DISTINCT:
    指定结果集中返回指定列存在不重复数据的记录
SELECT DISTINCT EMAIL  FROM HR.EMPLOYEES;


ROWNUM:
    使用ROWNUM列来查询结果集中前N个记录
SELECT * FROM HR.EMPLOYEES WHERE ROWNUM<=3;


显示列别名:

SELECT EMP_NAME AS 姓名 FROM HR.EMPLOYEES;


设置查询条件:
SELECT SALARY FROM HR.EMPLOYEES WHERE SALARY>2000 AND SALARY <4000;


在查询条件中使用BETWEEN关键字
SELECT SALARY FROM HR.EMPLOYEES WHERE SALARY BETWEEN 2000 AND 4000;


在查询条件中使用IN关键字
    指定查询的取值列表
SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,LAST_NAME, SALARY FROM HR.EMPLOYEES WHERE SALARY IN ('2000','3000');

FIRST_NAME         LAST_NAME               SALARY
-------------------- ------------------------- ----------
Anthony          Cabrio                 3000
Kevin             Feeney                 3000



实现模糊查询:
    使用LIKE关键字和通配符实现模糊查询
%    包含零个或多个任意字符的字符串
-    任意单个字符
?    任意单个字符
#    表示0~9的数字
[]    指定范围或集合中的任意单个字符,[a~f]表示a~f中的一个字符

SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,LAST_NAME,PHONE_NUMBER FROM HR.EMPLOYEES WHERE PHONE_NUMBER LIKE '%80%';

FIRST_NAME         LAST_NAME               PHONE_NUMBER
-------------------- ------------------------- --------------------
Shelley          Higgins               515.123.8080
Trenna             Rajs               650.121.8009



排序结果集:
ORDER BY {<排序表达式>[ASC|DESC]} [,...N]
SELECT FIRST_NAME,LAST_NAME,SALARY FROM HR.EMPLOYEES WHERE ROWNUM<=10 ORDER BY SALARY DESC

对多列进行排序:
SELECT FIRST_NAME,LAST_NAME,SALARY,PHONE_NUMBER FROM HR.EMPLOYEES WHERE ROWNUM<=10 ORDER BY SALARY,PHONE_NUMBER;

使用分组统计:
    使用GROUP BY子句指定查询结果的分组条件
    选择列表中每一个非聚合表达式内的所有列都应包含在GROUP BY列表中,GROUP BY 表达式必须与选择列表表达式完全匹配
GROUP BY [ALL] <分组表达式>[,....n]
SYS AS SYSDBA@ORCL>SELECT DEPARTMENT_ID,AVG(SALARY) FROM HR.EMPLOYEES GROUP BY DEPARTMENT_ID;
DEPARTMENT_ID AVG(SALARY)
------------- -----------
      100  8601.33333
       30         4150

HAVING
    HAVING通常与GROUP BY 子句一起使用,作用与WHERE子句一样
    HAVING:子句搜索条件在进行分组操作之后应用
    WHERE:子句搜索条件在进行分组之前应用
SYS AS SYSDBA@ORCL>SELECT DEPARTMENT_ID,AVG(SALARY) FROM HR.EMPLOYEES GROUP BY DEPARTMENT_ID HAVING  AVG(SALARY)>4000;

DEPARTMENT_ID AVG(SALARY)
------------- -----------
      100  8601.33333
       30         4150
             7000
       20         9500

连接查询:
    内连接 使用比较运算符(=号),包含空值的列不与任何值匹配,不能包含在结果集中,空值不与其他的空值匹配
SYS AS SYSDBA@ORCL>SELECT T1.FIRST_NAME,T1.LAST_NAME,T2.DEPARTMENT_NAME FROM HR.DEPARTMENTS T2,HR.EMPLOYEES T1 WHERE T1.DEPARTMENT_ID=T2.DEPARTMENT_ID;

SYS AS SYSDBA@ORCL>SELECT T1.FIRST_NAME,T1.LAST_NAME,T2.DEPARTMENT_NAME FROM HR.DEPARTMENTS T2 INNER JOIN HR.EMPLOYEES T1 ON  T1.DEPARTMENT_ID=T2.DEPARTMENT_ID;

    外连接:主表的每一行数据去匹配从表中的数据列,符合的返回到结果集中,不符合的,将被填上空值后返回到结果集中
     
    LEFT [OUTER] JOIN左向外连接:连接子句左侧的表为主表,主表中的所有记录都将出现在结果集中,如果主表中的记录在右表中没有匹配的数据,则结果集中右表的列值为空   
    SYS AS SYSDBA@ORCL>SELECT T1.DEPARTMENT_NAME,T2.FIRST_NAME FROM HR.DEPARTMENTS T1 LEFT OUTER JOIN HR.EMPLOYEES T2 ON T1.DEPARTMENT_ID=T2.DEPARTMENT_ID;
   
    RIGHT [OUTER] JOIN右向外连接:子句右侧的表为主表,主表中所有记录都将出现在结果集中,如果主表中的记录在左表中没有匹配的数据,则结果集中右表的列
    SYS AS SYSDBA@ORCL>SELECT T1.FIRST_NAME,T2.DEPARTMENT_NAME FROM HR.EMPLOYEES T1  RIGHT OUTER JOIN HR.DEPARTMENTS T2 ON T1.DEPARTMENT_ID=T2.DEPARTMENT_ID;

    FULL [OUTER] JOIN完整外部连接:    连接包括连接表中的所有行,无论它们是否匹配(相关于左向外连接与右向外连接的并集)
SYS AS SYSDBA@ORCL>SELECT T1.FIRST_NAME,T2.DEPARTMENT_NAME FROM HR.EMPLOYEES T1  FULL  OUTER JOIN HR.DEPARTMENTS T2 ON T1.DEPARTMENT_ID=T2.DEPARTMENT_ID;

    交叉连接:不常用,两个表中的每两行都可能互相组合成为结果集中的一行,一般用于穷举两个表的所有可能的记录组合
    SELECT T1.FIRST_NAME,T2.DEPARTMENT_NAME FROM HR.EMPLOYEES T1  CROSS  JOIN HR.DEPARTMENTS T2
    查询不存在员工的部门:
    SYS AS SYSDBA@ORCL>SELECT T1.FIRST_NAME,T2.DEPARTMENT_NAME FROM HR.EMPLOYEES T1  RIGHT OUTER JOIN HR.DEPARTMENTS T2 ON T1.DEPARTMENT_ID=T2.DEPARTMENT_ID WHERE T1.FIRST_NAME IS NULL;


    使用简单的子查询:
    子查询就是在一个SELECT语句中又嵌套一个SELECT语句
    SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,LAST_NAME,SALARY FROM HR.EMPLOYEES WHERE DEPARTMENT_ID=(SELECT DEPARTMENT_ID FROM HR.DEPARTMENTS WHERE DEPARTMENT_NAME='Marketing');
   
    查询所有低于平均工资的员工:
SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,SALARY FROM HR.EMPLOYEES WHERE SALARY<(SELECT AVG(SALARY) FROM HR.EMPLOYEES);
   
    IN关键字与返回多值的子查询
    SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,LAST_NAME,SALARY FROM HR.EMPLOYEES  WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM HR.DEPARTMENTS WHERE DEPARTMENT_NAME='Marketing' OR DEPARTMENT_NAME='Purchasing');
   

    使用UNION关键字的合并查询:
    将两个或更多查询的结果给合为单个结果集,结果集包含联合查询中的所有查询的全部行,会自动过滤重复的记录
    SYS AS SYSDBA@ORCL>SELECT DEPARTMENT_ID,DEPARTMENT_NAME FROM HR.DEPARTMENTS
        UNION   SELECT DEPARTMENT_ID,FIRST_NAME FROM HR.EMPLOYEES WHERE SALARY>1000;
    UNION ALL: 将不会过滤重复的记录

在SELECT语句中使用DECODE函数:
    将输入值和函数职的参数列表相比较,根据输入值返回一个对应值,如果参数列表中没有对应值,则返回默认值
    DECODE(<输入值>,<值1>,<结果1>[,<值2>,<结果2>][,<默认值>])
    SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,DECODE(SALARY,'2600','LOW','10000','HIGH','VERY_LOW')AS SALARY FROM HR.EMPLOYEES;
   
在SELECT 语句中使用CASE函数(与DECODE函数功能相同)
    CASE<输入值>WHEN<值1>THEN<结果1>
    [WHEN<值2>THEN<结果2>]
    [ELSE<默认结果>]
    END
SYS AS SYSDBA@ORCL>SELECT FIRST_NAME,CASE SALARY WHEN 2600 THEN 'LOW' WHEN 10000 THEN 'HIGH' ELSE 'VERY_LOW' END  AS SALARY FROM HR.EMPLOYEES;
    CASE
    WHEN<逻辑表达式1>THEN<结果1>
    [WHEN<逻辑表达式2>THEN<结果2>]
    [ELSE<默认结果>]
    END

SELECT FIRST_NAME,CASE WHEN SALARY<=2000 THEN 'LOW' WHEN SALARY>=3000 AND SALARY<=10000 THEN 'HIGH' ELSE 'VERY_LOW' END AS SALARY FROM HR.EMPLOYEES;

保存查询结果:
    将查询结果保存到一个新表中
    CREATE TABLE <新表名> AS
    <SELECT 子句>
    <FROM 子句>
    <WHERE 子句>
    SYS AS SYSDBA@ORCL>CREATE TABLE HR.EMP_USER AS SELECT FIRST_NAME,LAST_NAME,SALARY FROM HR.EMPLOYEES;
    SYS AS SYSDBA@ORCL>DESC HR.EMP_USER;
Name                                   Null?    Type
----------------------------------------------------------------- -------- --------------------------------------------
FIRST_NAME                                    VARCHAR2(20)
LAST_NAME                               NOT NULL VARCHAR2(25)
SALARY                                     NUMBER(8,2)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-42134-1-1.html 上篇帖子: oracle数据库逻辑对象管理_同义词 下篇帖子: oracle备份和恢复数据库 oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表