一、多表查询:根据特定的连接条件从不同的表中获取所需的数据

  多表查询语法:

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

  但要注意where 不要省了,省略where 即为笛卡尔集

  笛卡尔集的产生条件:省略连接条件,连接条件无效

  笛卡尔集的造成的影响: 第一个表中的所有行与第二个表中的所有行相连接,数据无效。

两张表间有一个相同的字段,才好进行有效的多表查询。

  使用表别名和表前缀:

SELECT t1.column, t2.column
FROM table1 t1, table2 t2
WHERE t1.column1 = t2.column2;

查询时列名前,加表名或表别名前辍(如果字段在两个表中是唯一的可以不加)

  为表名定义别名,可以简化SQL书写,格式:“from 表名 别名”

如:from emp e,dept d

建议使用表的别名及表前缀,使用表别名可以简化查询,而使用表前缀则可以提高查询性能。

  多表查询的另一种写法:

  联接:内联接 —— inner join

select emp.column,dept.column
from emp join dept
on(emp.column= dept.column)

  注释:INNER JOIN 与 JOIN 是相同的 。

  联接:外联接 —— outer join ( left outer join, right outer join)

select emp.column,dept.column
from emp
left join dept
on(emp.column= dept.column)
where dept.column is null

  注释:可省略outer,以左表为主,右表中只显示匹配左表的数据。

二、子查询就是位于SELECT、UPDATE、或DELETE语句中内部的查询

  子查询的分类:

  独立子查询 —— 独立子查询可以独立执行,不受外部查询的影响

  相关子查询 —— 引用外部SQL语句中的一列或多列,需要与外部查询联合起来确定。

  子查询语法: 

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);

  子查询(内部查询)在执行主查询之前执行一次,然后主查询(外部查询)会使用该子查询的结果

  子查询的规则:  

  将子查询括在括号中

将子查询放置在比较条件的右侧

只有在执行排序Top-N分析时,子查询中才需要使用ORDER BY 子句

单行运算符用于单行子查询,多行运算符用于多行子查询

  (1)单行子查询:

  即子查询只返回一行结果,使用单行的比较运算符:= ,>, >= ,< , <= ,<>

select ename,job from emp
where
empno = (select empno from emp where mgr = 7902 );

  使用聚合函数的子查询

select ename,job,sal  from emp
where
sal >(select avg(sal) from emp);

  在HAVING子句中使用子查询

select deptno,min(sal) from emp
group by deptno
having
min(sal) > (select min(sal) from emp where deptno = 20);

  在FROM 子句中使用子查询

select ename,job,sal
from (select * from emp) as t1; -- 注意:from子查询后边一定要跟别名

单行子查询中的常见错误:

  1. 子查询的结果返回多于一行

  2. 子查询中不能包含ORDER BY子句

  3. 子查询内部没有返回行,如下语句可以正确执行,但没有数据返回

select empno,ename from emp
where
sal = (select sal from emp where deptno = 20);
--Error 子句中无返回行,或返回多行均为错误。
select empno,ename from emp
where
sal >(select avg(sal) from emp order by empno);
--Error 子句中不能包含order by

  (2)多行子查询:

  即子查询返回多行结果 —— 返回结果要采用多行比较运算符(in <not in>、any、all、some)。

  在多行子查询中使用IN 操作符

select empno,ename,job from emp
where
sal in (select max(sal) from emp group by deptno);

 --IN 给定的值是否与子查询或列表中的任一值相匹配 就成立。

 --NOT IN 给定的值是否与子查询或列表中的所有值都不匹配 就成立。

 注意:要防止子查询返回空值,因为只要空值成为子查询的一部分,就不能用notin运算符。

select empno,ename,job
from emp
where
sal < any(select avg(sal) from emp group by deptno);

 --ALL 对所有数据都满足条件,整个条件才成立

 --ANY 只要有一条数据满足条件,整个条件就成立

(3)多列子查询:

  子查询只返回多列结果,多列子查询分为:成对比较多列子查询、非成对比较多列子查询

  成对比较 —— 查询工资为部门最高的记录  

select * from scott.emp
where (sal,job)
in(select max(sal),job from scott.emp group by job);

  非成对比较 —— 实现了与上述类似的功能

select * from scott.emp
where
sal in (select max(sal) from scott.emp group by job)
and job in (select distinct job from scott.emp);

  (4)相关子查询:

子查询中使用了主查询中的某些字段,

  相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,主查询选择的每一行均执行一次子查询。

  --查询工资高于同一部门的员工的部门号,姓名,工资

select deptno,ename,sal from emp outer
where
sal >(select avg(sal) from emp inner where inner.deptno = outer.deptno);

  (5) 嵌套子查询:即位于子查询内部的子查询,嵌套可达32层(实际工作中嵌套超过两层就要被打PP了-.-),然而应尽量避免使用嵌套子查询,使用表连接的查询性能会更高。

三、分页

  方法1:适用于 SQL Server 2000/2005

SELECT TOP 10 *
FROM tableName
WHERE id
NOT IN (
SELECT TOP 10*(pageNum-1) id FROM tableName ORDER BY id
)
ORDER BY id

  方法2:适用于 SQL Server 2000/2005

SELECT TOP pageSize *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS rows,* FROM tableName
) aliasName
WHERE rows > pageSize*(currentPage-1) -- pageSize 每页显示条数
-- currentPage 当前页数
-- aliasName 意指别名

Server Sql 多表查询、子查询和分页的更多相关文章

  1. ylb: SQL表的高级查询-子查询

    ylbtech-SQL Server: SQL Server- SQL表的高级查询-子查询 SQL Server 表的高级查询-子查询. 1,ylb:表的高级查询-子查询返回顶部 --======== ...

  2. [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

    今天遇到一个奇怪的问题,项目突然要从mysql切换到sql server数据库,包含order by 子句的嵌套子查询报错. 示例:select top 10 name,age,sex from ( ...

  3. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

  4. sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

    执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...

  5. oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by

    select语句学习 . 创建表 create table user(user varchar2(20), id int); . 查看执行某条命令花费的时间 set timing on: . 查看表的 ...

  6. [转]sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

    执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...

  7. SQL Server 一句Sql把表结构全部查询出来

    --一句Sql把表结构全部查询出来 SELECT 表名 = Case When A.colorder=1 Then D.name Else '' End, 表说明 = Case When A.colo ...

  8. Python-select 关键字 多表查询 子查询

    sql 最核心的查询语句!!!! 增删改 单表查询 select语句的完整写法 关键字的书写顺序 执行顺序 多表查询 笛卡尔积 内连接 左外连接 右外连接 全外连接 通过合并左外连接和右外连接 子查询 ...

  9. ORDER BY 子句在视 图、内联函数、派生表、子查询和公用表表达式中无效

    SQL语句: select * from (select distinct t2.issue,cashmoney from (select distinct issue from lot_gamepa ...

  10. 【数据库】SQL经典面试题 - 数据库查询 - 子查询应用二

    上节课我们通过子查询,完成了查询的最高分学生的需求,今天我们来学习子查询的分类,以及通过子查询来完成工作中经常遇到一些个性化需求. 子查询概念: 一个SELECT语句嵌套在另一个SELECT语句中,子 ...

随机推荐

  1. PTA 词频统计(30 分)

    词频统计(30 分) 请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词. 所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留 ...

  2. 第11章 Tomcat的系统架构与设计模式

    11.1 Tomcat总体设计 11.1.1 Tomcat总体架构 Tomcat和核心有连个组件:Connector和Container,Connector是可以被替换的.一个container可以有 ...

  3. mysql字符类型

    字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...

  4. vue-cli脚手架build目录下utils.js工具配置文件详解

    此文章用来解释vue-cli脚手架build目录中的utils.js配置文件 此配置文件是vue开发环境的wepack相关配置文件,主要用来处理css-loader和vue-style-loader ...

  5. 用exp、dmp导入导出用户到同一个实例下时,类型type会有问题

    oralce的type都有唯一id,在同一个实例下,通过导入导出方法创建type时,会有唯一性问题 最好的解决方法使用impdb,expdb的方式导入导出 用oid=n解决. 实在不行,可用稍微麻烦的 ...

  6. C#使用protobuf

    C# protobuf的使用方法 通过.proto文件导出C#支持的.cs类文件 protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.googl ...

  7. 利用HADOOP中的jar写一个RPC

    RPC调用需要服务端和客户端使用相同的协议: 协议: package cn.itcast.bigdata.hadooprpc.protocol; public interface IUserLogin ...

  8. MySQL中TRUNCATE和ROUND函数的用法

    一.TRUNCATE(expr, int_expr)用法 TRUNCATE函数将expr按照int_expr长度在小数点后按照位数直接进行截取. 实例: ); 输出结果:200.1256 二.ROUN ...

  9. Java基础-JDK、JRE与JVM的区别

    JRE与JVM.JDK的区别 从下而上:最上层    JDK  -- java development kit (java开发工具包)中间层    JRE -- java runtime enviro ...

  10. ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\WWFDATA.dbf'

    错误提示如下图: ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\DB_DATA\SEINESCMDB\WWFDATA_DATA01.dbf' 分析原因及解决方法: 1.查看 ...