暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DQL数据查询语言

芃芃 2025-03-27
16


查询语句大致有6种处理过程:去重distinct查询、where条件查询、group by分组查询、having过滤查询、order by排序查询、分页查询,还有3种多表进行的数据共查:多表查询、联合查询、子查询。这些方式都是为了便于得到我们想要的数据。

语法:

select [DISTINCT] [字段]|[*]

from 表名

[where 查询条件]

[group by 分组条件]

[having 过滤条件]

[order by 排序条件 asc|desc]

[分页条件];

执行顺序:

1. FROM阶段

2. WHERE阶段

3. GROUP BY阶段

4. HAVING阶段

5. SELECT阶段

6. ORDER BY阶段

3.1 去重distinct查询
--查询所有部门的编号

select distinct deptno from emp;



3.2 where条件查询


除去上面的运算符,还有

逻辑运算符与或非:and、or、not

类似于in的exist

例between的用法

--输出工资在2000-4000范围的数据

select * from emp

where sal between 2000 and 4000;



3.3 group by分组查询


3.4 having过滤查询
Having 过滤查询的功能和where一致,不同的地方是执行顺序不同。



3.5 order by排序查询


这里order by 为啥可以用别名sum_sal,而having不能用别名呢?

是因为前面所讲的执行顺序的知识。

Order by的执行顺序在select之后。

3.6 分页查询
分页查询在MySQL上用法比较方便:limit

在Oracle的用法是:

给表加上行号的字段,再通过子查询的方式来实现。



3.7 多表查询
多表查询是多张表相关联进行的查询,关键点在于表关联字段。

3.7.1 内连接
select * from a join b on a.条件=b.条件 where 条件;



e.deptno=d.deptno的作用:它对两个表进行连接查询,oracle会扫描dept表,分别检查每条记录在连接条件e.deptno=d.deptno中字段的值从emp表取出的记录的列值是否相等。如果相等,则将这两个记录连接,产生一条新的记录作为查询到的一行,再继续从表emp中取下一条记录。重复这个步骤,一直到处理完emp表的全部符合条件的记录。

3.7.2 外连接
外连接有三种类型:左连接、右连接、全连接。

3.7.2.1 左连接
作用:可以显示相等连接时左表存在右表不存在的数据,右表不存在的记录用空值显示

select * from a left join b on a.条件=b.条件

3.7.2.2 右连接
作用:可以显示相等连接时左表不存在右表存在的数据,左表不存在的记录用空值显示

select * from a right join b on a.条件=b.条件

3.7.2.3 全连接
作用:可以显示相等连接时左右表互相不存在的数据、左右表互相不存在的记录用空值显示

select * from a full join b on a.条件=b.条件

3.7.3 交叉连接
交叉连接的原理是笛卡尔积,也就是两表的乘积。

假如a表有3条数据,b表有4条数据,那么交叉连接后共12条数据。

select * from a cross join b

3.8 联合查询
联合查询就是将上下两个结果集进行并集、交集、差集运算。

取结果集时有几点注意:

上下两个结果集的字段的类型要一致。
上下两个结果集的字段的顺序要一致。
上下两个结果集的字段的数量要一致。
3.8.1 并集
并集有两种处理方式:union all和union,一个是两个结果集数据全取合并成一个结果集,一个是做去重后的结果集。

例:



3.8.2 交集
intersect:显示两个结果集共有的数据部分。

3.8.3 差集
minus:显示第一个结果集A有的内容,但是第二个结果集B没有的数据,即A-B。

例:

运行该语句的结果显示如下:



运行这条语句显示:



取差集后:



3.9 子查询
3.9.1 FROM子句中的子查询


3.9.2 运算符的子查询
运算符主要有:>、>=、<、<=、!=、<>、=、<=>、in、not in、any、some、all、exits、not exists

现以exists举例(主要当初学习exists,摸索了好两天才学明白它的作用):

用法:select * from A where exists(select * from B where A.id = B.id);

原理:

先执行外查询select * from A,然后取出一条数据传给内查询。
再执行内查询select * from B,外查询传入的数据和内查询的数据如果满足where条件A.id = B.id,则返回ture,如果一条都不满足,则返回false。
内查询返回true,则外查询的这行数据保留,反之内查询返回false则外查询的这行数据不保留。外查询的所有数据逐行查询传入内查询匹对。
例:



3.9.3 SELECT下的子查询
Select下的子查询使用情况我列举了3个常见用法,可看案例:



3.9.4 with...as 子查询
with...as用来定义一个sql片段,且该片段会被整个sql语句反复使用很多次,这个sql片段就相当于是一个公用临时表

例:

with aaa as (select * from emp)

select * from aaa;

with...as需和查询语句一起执行,否则报错无select关键字;还有不能在with..as后加分号,不然也报错无select关键字。另外查询语句有多表查询不能有相同的列,否则,with..as无法识别具体哪个列。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_63021300/article/details/132267190

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论