--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实例)的更多相关文章

  1. 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历

    分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...

  2. Linq组合查询与分页组合查询结合

    1.组合查询 <div>姓名:<asp:TextBox ID="T1" runat="server"></asp:TextBox& ...

  3. 018.查询练习50题(sql实例)

    CREATE TABLE EMP(EMPNO numeric(5,0) NOT NULL primary key,--雇员的编号ENAME nvarchar(10) not null,--雇员的名字J ...

  4. webform组合查询和分页

    1.组合查询(1)数据访问类 //参数1:SQL语句 参数2:哈希表public List<Users> chas(string s,Hashtable has) { List<Us ...

  5. 走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图

    一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...

  6. SQL Server -- 回忆笔记(四):case函数,索引,子查询,分页查询,视图,存储过程

    SQL Server知识点回忆篇(四):case函数,索引,子查询,分页查询,视图,存储过程 1. CASE函数(相当于C#中的Switch) then '未成年人' else '成年人' end f ...

  7. Server Sql 多表查询、子查询和分页

    一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...

  8. Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

    GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...

  9. (五)连接查询(SQL99标准)、子查询、分页查询、联合查询

    一.连接查询(SQL99标准) 1.含义:当要查询的数据来自多张表时要使用连接查询 2.语法: select 查询列表 from 表1 别名 [连接类型] join 表2 别名 on 连接条件 [wh ...

随机推荐

  1. webstorm关闭vim模式

  2. 微信小程序文字超过行后隐藏并且显示省略号

    在小程序开发过程中,经常会遇到一些数据无法在text中完全展示,所以会使用到隐藏相关文字,并在后方加上省略号(...). 只需要在对应的text中设置下面的css就可以了. overflow:hidd ...

  3. Flutter中通过循环渲染组件

    class ContactsState extends State<Contacts>{ List formList; initState() { super.initState(); f ...

  4. 深入浅出的分析 Set集合

    01. 摘要 Set集合的特点主要有:元素不重复.存储无序的特点. 打开 Set 集合,主要实现类有 HashSet.LinkedHashSet .TreeSet .EnumSet( RegularE ...

  5. 在Ubuntu上安装Intellij IDEA并创建桌面快捷方式

    环境信息 版本号 Ubuntu 18.04 LTS Intellij IDEA 2019.1.3 1.首先从官网获取安装包 官方下载地址传送门 然后我就在下载目录下得到了tar.gz的包 2.接下来开 ...

  6. 理解、学习与使用 JAVA 中的 Optional【转载】

    这是一篇转载的文章.刚学java的时候看了好久这个Optional,但一直是懵的.今天又又遇到了,重新回来再看的时候,发现并没有那么难道那个. 转载的文章再开头处写了一个对于理解Optional很关键 ...

  7. 洛谷 题解 P4158 【[SCOI2009]粉刷匠】

    状态: dp[i][j][k][0/1]: 到达第i行时, 到达第j列时, 刷到第k次时, 这一格有没有刷对 转移 换一块木板时肯定要多刷一次 dp[i][j][k][0]=max(dp[i-1][m ...

  8. storm常见问题

    一.storm ui 不显示 supervisor 信息 在zk节点上删掉storm信息,重新启动storm集群即可

  9. [转帖]四个修改Docker默认存储位置的方法

    四个修改Docker默认存储位置的方法 https://blog.51cto.com/forangela/1949947 易改乾坤关注0人评论27435人阅读2017-07-22 09:18:48   ...

  10. SpringBoot传参方式

    地址传参 1.创建一个Action类 package com.lion.action; import org.springframework.stereotype.Controller; import ...