--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. [转]新浪云存储SCS Node.js使用指南

    转载自:https://github.com/SinaCloudStorage/scs-sdk-js scs-sdk-js 新浪云存储(SCS) SDK for Node.js Installatio ...

  2. GCE 部署 ELK 7.1可视化分析 nginx

    目录 一.准备 1.1.服务器环境准备 二.安装 ES 2.1.遇到小问题 三.安装 Kibana 四.安装 Logstash 一.准备 我这边有一个网站放在了 Google VM 上面,所以打算在购 ...

  3. 修改阿里源为Ubuntu 18.04默认的源

    步骤如下: Step1:备份/etc/apt/sources.list sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak Step2:在/ ...

  4. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  5. Docker通过挂载安装mysql

    一.安装 mkdir -p ./docker/mysql cd docker/ cd mysql/ mkdir conf mkdir data mkdir logs  mkdir mysql-file ...

  6. class.forName 和 classLoader的区别

    Java中的Class.forName()和ClassLoader都可以用来对类进行加载.Class.forName()除了将类的.class文件加载到JVM中 还会对类进行解释,执行类中的stati ...

  7. 【51nod】2591 最终讨伐

    [51nod]2591 最终讨伐 敲51nod是啥评测机啊,好几次都编译超时然后同一份代码莫名奇妙在众多0ms中忽然超时 这道题很简单就是\(M\)名既被诅咒也有石头的人,要么就把石头给没有石头被诅咒 ...

  8. Junit测试类中如何调用Http通信

    在使用Junit做测试的时候,有时候需要调用Http通信,无论是request还是response或者是session会话,那么在测试类里该如何调用呢,其实很简单,spring给我们提供了三个类 or ...

  9. fiddler笔记:统计选项卡(Statistics)

    Request Count 选中的Session数. Bytes sent Http请求头和请求体中向外发送的字节总数. Bytes received HTTP请求头和请求体中接收到的所有字节数. R ...

  10. javascript——onsubmit和onreset事件 和开发中常用的方式

    <head> <meta charset="UTF-8"> <title></title> <script> funct ...