013.子查询和分页子查询(sql实例)
--1 子查询
如果子查询和表连接都实现的时候,推荐用表连接实现(
一般:能用表连接实现的就用表连接,有些情况用表连接不能
或者不易实现的再选择子查询)
系统:缓存,执行计划技术手段
--1 where 条件后 + 子查询
注意: 1 先执行的是子查询语句
2 子查询嵌套的层数越大,性能会随之递减
A) 当子查询写在比较运算符之后(=,!=,>,...)时
要求:子查询的查询结果不能多于1个(1,0(不会报错,
没有结果))
--eg
select * from EMP
where SAL>(select sal from emp where EMPNO=7369 )
B) 当子查询的查询结果多于1个的时候,
使用 in,exists 存在, 关键字
-----------------------------------------
--in子查询
--查询工作部门是销售部,研发部的员工
select * from EMP
where DEPTNO in(
select deptno from DEPT
where DNAME='sales' or DNAME='research')
思考:in子查询不适合子查询的查询结果特别多的情况
--eg : 查询有员工的部门,并显示部门信息。
--1 表连接
select d.* from EMP e,DEPT d
where e.DEPTNO=d.DEPTNO
--查询没有员工的部门 (下面的语句是获取不到的)
select d.* from EMP e,DEPT d
where e.DEPTNO!=d.DEPTNO --(笛卡尔积-相等的)
--2 子查询查询没有员工的部门
select * from DEPT
where DEPTNO not in(
select distinct DEPTNO from EMP)
思考: not in 是所有子查询中效率最差的,所以能
少用就少用。
--------------------------------------------
--exists 子查询
exists(select) 返回 boolean
判断查询结果是否存在 (select * from EMP
where DEPTNO=10 )true ,false
短路的行为:查询语句不需要执行出查询结果的,一旦
查询条件为true,那么select语句就结束,exists就返回true
--常见应用
--自动
--思路:
--如果有此数据库
if(exists(select name from sysdatabases where
name='testdb'))
drop database testdb --先删除
create database testdb -- 创建
---------------------------------------------
创建表 :自动化(如果有此表,删除再创建,
否则直接创建)
select * from sysobjects where name='tab'
if (not exists( select * from sysobjects
where name='tab'))
create table tab(id int ,name varchar(20))
else
begin
drop table tab
create table tab(id int ,name varchar(20))
end
-- 查询有员工的部门,并显示部门信息。
--exists 子查询
select * from DEPT
where exists(select * from EMP
where DEPTNO=DEPT.DEPTNO )
思考:
exists 不适合的是外部查询的数据量巨大
in 不适合子查询的数据量巨大
not in 是效率的最差的子查询
当外部查询与子查询数据量相当的时候in,exists
子查询的效率也相差不大。
-- EG:用子查询实现,查询emp表中的第6到第10个员工
--(分页的基础)(特别提醒:员工编号唯一,但不一定连续)
--不考虑效率 in 子查询
select top 5 * from EMP
where EMPNO not in(select top 5 EMPNO from emp)
-------------------------------------
--2 在from 之后使用子查询(数据来源)
select from 表|视图|结果集(子查询)
--eg:查询所有销售部工作的员工信息
select 部门名称,ename from(select ENAME,SAL,JOB,DNAME 部门名称 ,
LOC部门所在地
from EMP,DEPT
where EMP.DEPTNO=DEPT.DEPTNO)as t --必须有别名
where 部门名称 ='sales'
----------------------------------------
--3 在增删改操作中嵌入子查询的案例
--A)insert +select
1) 增加多行
insert into tab_name....
select * union
select * union
select ...
2) 向现有表备份数据
insert into new_tab
select * from old_tab
--B) update +select
--eg1 员工smith要调换工作部门到 销售部(sales),
--编写修改语句实现smith的工作调转
update EMP set DEPTNO=(select deptno from DEPT
where DNAME='sales')
where ENAME='smith'
--C) delete +select
--eg2 删除所有研发部的员工(研发部的部门名称是
--research)
delete from EMP
where DEPTNO=(select deptno from DEPT
where DNAME='research')
--综合练习:分页查询
用子查询实现,查询emp表中的第6到第10个员工
(分页的基础)(特别提醒:员工编号唯一,但不一定连续)
--不考虑效率 in 子查询
--效率低
select top 5 * from EMP
where EMPNO not in(select top 5 EMPNO from emp)
--效率更好的 分页子查询(row_number)
开窗函数: row_number()over(排序是由需求决定的)
生成有序结果集并添加行号列。
select * from
(select ROW_NUMBER() over(order by empno desc)as 行号,
* from EMP ) t
where 行号 between 6 and 10
---------t_sql 语法
013.子查询和分页子查询(sql实例)的更多相关文章
- 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历
分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...
- Linq组合查询与分页组合查询结合
1.组合查询 <div>姓名:<asp:TextBox ID="T1" runat="server"></asp:TextBox& ...
- 018.查询练习50题(sql实例)
CREATE TABLE EMP(EMPNO numeric(5,0) NOT NULL primary key,--雇员的编号ENAME nvarchar(10) not null,--雇员的名字J ...
- webform组合查询和分页
1.组合查询(1)数据访问类 //参数1:SQL语句 参数2:哈希表public List<Users> chas(string s,Hashtable has) { List<Us ...
- 走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图
一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...
- SQL Server -- 回忆笔记(四):case函数,索引,子查询,分页查询,视图,存储过程
SQL Server知识点回忆篇(四):case函数,索引,子查询,分页查询,视图,存储过程 1. CASE函数(相当于C#中的Switch) then '未成年人' else '成年人' end f ...
- Server Sql 多表查询、子查询和分页
一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...
- (五)连接查询(SQL99标准)、子查询、分页查询、联合查询
一.连接查询(SQL99标准) 1.含义:当要查询的数据来自多张表时要使用连接查询 2.语法: select 查询列表 from 表1 别名 [连接类型] join 表2 别名 on 连接条件 [wh ...
随机推荐
- golang struct组合,转型问题请教
type Action interface { OnHurt2(other Action) GetDamage() int } type Base struct { atk, hp int } fun ...
- Jmeter 逻辑控制器 之 Runtime Controller
一.认识 Runtime Controller 控制其下样例执行的时间长度. 设置界面: Runtime (seconds):运行时间,单位秒.即控制其下样例执行多长时间.与线程组中的调度器的持续 ...
- ivy使用Maven阿里云镜像的问题
ivy默认使用的Maven仓库下载速度有点慢,所以想改成国内的,添加如下resolver: <ibiblio name="working-chinese-mirror" ro ...
- 事理学神器PDCA
做事情都按PDCA循环来做,基本就是一个靠谱的人. 这个方法论其实也符合架构师的思维中的分治理论.把大事拆分成一件件小事,并把小事做好. Plan Do Check Action
- IDEA配置SpringBoot应用的profile启动参数
参考博客:https://blog.csdn.net/li396864285/article/details/83576829 如图为, 配置多台eureka的启动参数, 分别为: --spring. ...
- mysql/mariadb数据库在插入表数据时,ID竟然成奇数增加了?看完下面内容就知道怎么处理了。
今天突然被问到一个问题,mysql数据库插入表数据时,设置了ID自增,但是插入数据后,ID却呈奇数增加,不是123456类型,而是13579形式,突然有点懵,研究了一会,发现是auto_increme ...
- Python时间日期格式化之time与datetime模块
1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...
- Holy Grail【spfa求最短路】
题目链接:https://www.jisuanke.com/contest/3004?view=challenges 题目大意: 1.一个无向图,给出六个顶点,添六条边,但是添边是有限制的.每次添边的 ...
- oauth2中org.springframework.security.core.userdetails.User无法转换为封装的AuthorizationInfoBean
用springboot + oauth2 + redis搭建了一个项目,创建一个自定义的AuthorizationInfoBean继承org.springframework.security.core ...
- vue-router 在微信浏览器中操作history URl未改变的解决方案
在PC端和手机浏览器中router.replace() or router.push()能够正常使用,页面的地址和页面都正常显示:但是在微信中,从/a页面通过router.push('/b')跳转到/ ...