查询语句大致有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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
Oracle优化-检查Oracle数据库性能
张静懿
54次阅读
2025-03-22 13:53:22
MySQL数据库优化总结
鲁鲁
48次阅读
2025-03-25 23:06:42
Oracle数据库常用脚本(八)
hongg
45次阅读
2025-04-02 09:09:23
ORACLE数据库查看执行计划
张静懿
44次阅读
2025-03-23 22:23:04
oracle巡检的其他检查
听溪
44次阅读
2025-03-23 22:17:19
oracle检查数据库cpu、I/O、内存性能
怀念和想念
44次阅读
2025-03-23 22:06:48
MySQL数据库“干货”来袭!41个常用脚本,速来领取
青年数据库学习互助会
42次阅读
2025-03-31 10:03:01
MySQL 查询数据
张静懿
41次阅读
2025-03-26 18:35:38
Oracle巡检-检查Oracle相关资源的使用情况
听溪
40次阅读
2025-03-22 12:46:43
oracle数据库查询与管理
芃芃
38次阅读
2025-03-18 23:52:52