oracle查询出来的顺序不一致_SQL语言之核心查询

SQL:结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和 程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行的结果返回给客户端。Oracle SQL语句由如下命令组成:

Ø 数据定义语言(DDL),包括CREATE(创建)命令、ALTER(修改)命令、DROP(删除)命令等。

Ø 数据操纵语言(DML),包括INSERT(插入)命令、UPDATE(更新)命令、DELETE(删除)命令等。

Ø 数据查询语言(DQL),包括基本查询语句、Order By子句、Group By子句等。

Ø 事务控制语言(TCL),包括COMMIT(提交)命令、ROLLBACK(回滚)命令。

Ø 数据控制语言(DCL),GRANT(授权)命令、REVOKE(撤销)命令。

目前主流的数据库产品(比如:SQL Server、Oracle)都支持标准的SQL语句。数据定义语言,表的增删改操作,数据的简单查询,事务的提交和回滚,权限的授权和撤销等,Oracle与SQL Server在操作上基本一致。

下面简析SQL的数据查询语言内容

1.查询结构

select      *|字段|表达式(聚合函数,常量)--如果有 group by,select中的表达式中字段必须包含于group by的字段中 from        表名 where      条件(对字段的限定,多个条件用and/or/not连接) group by 字段(多个字段,用逗号隔开) having     字段(对分组后的聚合值进行限定) order by  字段|表达式 例:

ce5cca3c4104fbeafb2d41fceaeeb0cd.png

2.执行顺序

select        5 from         1 where       2 group by  3 having      4 order by   6

3.运算

算术运算  +、 - 、* 、/ 关系运算  >、 >= 、= 、<= 、< 、<>、 != 逻辑运算  not 、and 、or

4.空值

' '和null都是空值 查询用:is null/is not null (1)不参与算术、关系、聚合运算 (2)排序永远是最大的

5.虚拟表

dual

6.集合in

多个or判断可以用in集合替换

7.模糊查询like

通配符:'_'和'%'

_   :代替任意1个字符

%:代替任意个字符

8.聚合函数(一般配合分组使用group by)

sum/avg/count/min/max

9.子查询(select/update/delete中包含的select语句为子查询)

单行子查询:

        -- 查看与7369员工工资相同的其他员工的信息

        select * from emp

    where sal = (select sal from emp where empno = 7369) and  empno<>7369;

        -- 查看和10号部门员工工资相同的其他部门的员工信息

        select * from emp

        where sal in (select sal from emp where deptno = 10);

多行子查询: 

        -- 查看和7369员工工资相同的其他员工的信息

        select * from sal = (select sal from emp where empno = 7369)

        --查看和10号部门员工工资相同的其他部门的员工信息

        select * from emp 

        where sal in (select sal from emp where deptno =10) and deptno !=10;

10.集合运算(a={1,2,3} , b={2,3,4})

交集:INTERSECT              -- 两者共有部分 并集(去重):  UNION         并集(不去重):UNION ALL     补集:MINUS                  -- 前者有后者无 当使用集合操作的时候,要注意: 1.查询所返回的列数以及列的类型必须匹配,列名可以不同。 2.只有UNION ALL不会去重。其他三个都需要排序后去重,性能比较差 例题: (1).求员工表和部门表中的共有的部门编号 SELECT DEPTNO FROM EMP INTERSECT SELECT DEPTNO FROM DEPT; (2).求员工表或者部门表中所包含的部门编号(不去重) SELECT DEPTNO FROM EMP UNION ALL  SELECT DEPTNO FROM DEPT; (3).求员工表或者部门表中所包含的部门编号(去重) SELECT DEPTNO FROM EMP UNION SELECT DEPTNO FROM DEPT; (4).求部门表中不在员工表中的部门编号 SELECT DEPTNO FROM DEPT MINUS SELECT DEPTNO FROM EMP; -- SELECT deptno  FROM EMP MINUS SELECT deptno FROM DEPT;

11.去重(DISTINCT, GROUP BY, UNION, ROWID)

-- 查看部门编号(去重) SELECT DISTINCT DEPTNO FROM EMP; SELECT deptno FROM emp GROUP BY deptno; -- DISTINCT 只能出现在最前,不能一个字段去重一个字段不去重 -- 错误1 SELECT JOB, DISTINCT DEPTNO FROM EMP; -- 错误2 SELECT DISTINCT JOB,DISTINCT DEPTNO FROM EMP;

    -- 三种等价去重性能对比

-- 性能最好 SELECT deptno,job FROM emp GROUP BY deptno,job; -- 性能其次 SELECT DISTINCT deptno,job FROM emp; -- 性能很差 SELECT deptno,job FROM emp UNION SELECT deptno,job FROM emp;

12. 连接查询(重点)

  包括内联接(inner join 1种)和外联接(outer join 3种)   (1)内连接(inner join):inner可省略     内连接写法1(标准写法)     SELECT        FROM 表名1       JOIN 表名2       ON 表名1.字段1=表名2.字段1     -- 等值连接      AND 表名1.字段2>=表名2.字段2    -- 不等连接       OR ...;例: -- 查询员工信息及其部门信息 SELECT *                     -- E.*,D.*  / DEPTNO -- 指向对象才行   FROM DEPT E  JOIN EMP D                 -- 两张表调换顺序无关 ON E.DEPTNO = D.DEPTNO;  -- 顺序无关 D.DEPTNO=E.DEPTNO -- oracle SELECT *   FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO; 例: -- 查询员工信息及其部门信息 SELECT * -- E.*,D.*  / DEPTNO -- 指向对象才行   FROM DEPT E   JOIN EMP D -- 两张表调换顺序无关     ON E.DEPTNO = D.DEPTNO; -- 顺序无关 D.DEPTNO=E.DEPTNO -- oracle SELECT * FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;

(2)左外连接(left outer join): outer可省略

left join 跟表的前后顺序有关 左外连接写法1(标准写法) SELECT    FROM 表名1                     -- 主表        LEFT JOIN 表名2                -- 从表 ON 表名1.字段1=表名2.字段1   -- 等值连接  AND 表名1.字段2>=表名2.字段2  -- 不等连接 OR ...; 下面额外加一点进阶的小知识 ---- 统计各部门人数,同时加上一个汇总项(总计:总人数)

53f32469394864c4131b20a9ce58e5ad.png

今天就先分享这部分啦,明白断续,学起来 a24f01e36e63959f852a3b0ceccd12b9.png*本人不才,如知识点有误,欢迎来稿指正,谢谢!*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值