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 ...
随机推荐
- 利用matlab自带函数快速提取二值图像的图像边缘 bwperim函数
clear all;close all;clc; I = imread('rice.png'); I = im2bw(I); J = bwperim(I); % 提取二值图像图像边缘 figure ...
- Python数据结构与语法
字典:Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组.字典等其他容器模型:值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组:遍历字典时遍历的是键:访问v ...
- OpenGL.Qt551.问题
1.Qt551 + vs2013 + Win7x64 缘由:将“教程14:渲染到纹理.html(http://www.opengl-tutorial.org/cn/intermediate-tutor ...
- thinkphp5 默认配置代码
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...
- JAVA计算字符串UTF-8字节数
String str = "C++/C#/JAVA软件开发"; try { System.out.println(str.getBytes("UTF-8").l ...
- 【转载】SpringBoot-配置发送邮件遇到的一些问题
前言:前一天调用163邮箱发送邮件还么有问题,今天再调用就各种发送不成功,害的我都关闭授权,还花了一毛钱短信费重新开启授权,最后百度到了一篇文章,非常贴切,在此转载下. 本人遇到的错误代码是554,邮 ...
- 有趣的后渗透工具 Koadic
koadic是DEFCON黑客大会上分享出来的的一个后渗透工具,虽然和msf有些相似,但是Koadic主要是通过使用Windows ScriptHost(也称为JScript / VBScript)进 ...
- 审计一套CMS中的SQL注入
漏洞分为系统漏洞和应用漏洞,系统漏洞以二进制漏洞为代表,其挖掘难度较高需要对反汇编和操作系统原理深入理解,而除了系统漏洞以外还有一些应用漏洞,包括不限MySQL,Apache,为代表的Web漏洞,这里 ...
- 怎样理解第三方Cookie
1. Cookie往往是用来存储用户信息的, 但有些恶意站点设法伪造了带有正确Cookie的HTTP请求, 这时就会产生安全问题( CSRF 攻击 ). 这里恶意网站获取cookie的行为就是第三方c ...
- hdu 2066 Dijstra 堆优化
嗯 有广搜的意思 #include<cstdio> #include<iostream> #include<queue> #include<vector> ...