DQL

发布时间:2024-08-24 16:01

常见的sql分类五种分类

  1. DDL (Data Definition Language)数据库定义语言
  2. DML (Data Manipulation Language)数据操作语言
  3. DCL (Data Control Language)数据控制语言
  4. TCL (Transactional Control Language) 事务控制语法
  5. DQL (Data Query Language) 数据查询语言

有时候会把DQL归入到DML中, 因为DML常见的操作是针对数据表中数据的 增删改 ,而查数据的DQL,同样是基于表中数据级别的操作,所以真的把DQL归入到DML也说的过去,但是DQL 单条select语句的复杂程度就远远高于 DDL DML DCL TCL中的任意一种,所以我单独整理出来

Select知识图谱

如何写查询sql?

-- 一条查询语句,最容易确定就是 要查询的结果是什么! 也就是 select 后面紧跟的信息;
-- 数据从哪里获取? from XXX表

-- 最简单的查询 ,`查询某某某,且表中的字段` 简单的没话说
   -- select XXX from 表名
   
-- 如果让查询  查询某某某 ,出现了一个 的  结果就不一样了
    -- 内连接:
         -- 隐式内连接
            -- 等值内连接
            -- 不等值内连接
            -- 自表连接(查询表中的A字段需要B字段辅助)
         -- 显示内连接
            -- 关键字 inner join on XXX=YYY
    
    -- 外连接:
         -- 左外连接
            -- left join on : 特点, 显示的结果为左表中的全部数据加上右表中匹配上的数据(没有的字段为null)
         -- 右外连接
            -- right join on : 特点, 右表中的全部数据+ 左表中匹配上的数据 (没有的字段为null)
    -- 自然连接 antural join
        --  默认去除笛卡尔积的条件是 两个表的相同字段 相等(存在多个字段,多个字段分别相等)
    
-- 如果是我们查询某某的某某某 ,一般是子查询
    -- 单行子查询
        -- 特点: 查询的结果是一行一列
        -- 通用的操作符: > >= < <= != <>
        
    -- 多行子查询
        -- 特点: 查询的结果是多行多列
        -- 常用的关键字: or , in , all , exits , not in (<>all) , any
        -- 注意点: 多行子查询要规避null,   not in (子查询) 这时子查询结果如果有null, 整个的结果为空
            -- 错误实例: select * from emp where empno not in (select mgr from emp);
            -- 错误点: 因为子查询结果中存在null,所以和前面的关键字 not in 结合,结果为 空
            -- 解决: 加添加, where mgr is not null

exits 关键字

-- exists (查询语言) , 在大数据级别下,它的效率很高!!!
-- 查询到结果 true 否则 false

例:查询有员工的部门信息:

  select * from DEPT  d where exists (select * from emp e where d.DEPTNO=e.DEPTNO);

虚表/伪标

dual是Oracle中的虚表,它的存在主要是为了补全语法结构(select XXX 后面没有from 的话,报错 ), 里面只有一行一列 存着个X

select 1+1; // 在Oracle中会报错, 而Mysql不会报错

select 1+1 from dual; // 添加From 关键字+ 虚表 dual 补全语法结构

伪列 rownum

就是Oracle 特有的用来表示行号的, 默认起始值为1 ,有了结果再 +1
-- 练习; 找到员工表中,工资最高的前三名 -- 添加上一个条件 rownum<4 就行

-- 空格+新表名  里面的表可以用里面的表的别名  反之不可以
select ROWNUM ,table1.*  from ( select *  from EMP e order by sal desc) table1  where rownum<4; 

-- 练习: 查询员工表中的 薪水大于本部门的平均薪水的员工


select * from (select DEPTNO ,avg(sal) avgsal from EMP group by deptno) table1 , emp where emp.DEPTNO=table1.DEPTNO and emp.sal>table1.avgsal;

-- 在Oracle中的分页
-- mysql中的分页使用limit
-- oracle只能使用rownum

    select * from (select rownum hanghao,emp.* from EMP) tt where tt.hanghao between 1 and 5;

伪列 rowid

伪列,每行记录存放的真实物理地址

简单使用,查看emp表里面每行的物理地址

 select rowid ,e.* from EMP e;

-- 去除(删除) 表中的重复记录

create table p(name varchar2(20));
insert into p(name) values ('张三');
insert into p(name) values ('张三');
insert into p(name) values ('李四');

select ROWID from p;

-- 删除,rowid 是从小到大排序的, 我们只要  rowid 小的
delete from p where p.ROWID>(select min(rowid) from p p2 where p.name=p2.name);

并集运算

-- 交并补

-- 例: 工资大于1500 ,或者20号部门下的员工

select * from EMP where emp.sal>1500 or EMPNO=20;

-- 并集 union 去重并且排序
-- 并集 union all 不去重
---差集 minus A minux B A-B
-- 注意点:
-- 1.列的类型要一致
-- 2. 按顺序书写
-- 3. 列的数量要一致,如果不一致,会用空值填充

用法

select XXX union , union, minus select XXX;

别名查询

as关键字可以省略

select ename as "姓   名", sal as 工资 from emp;

取出重复数据

distinct关键字,在select之后

查询中的四则运算

  • select 显示字段 ... ; 显示字段如果是数字,Oracle支持四则运算
  • 注意:null值, 不可以做四则运算-- 解决 nvl(P1,P2)函数,若P1为null,那么取P2的值

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号