一、表连接-JOIN

1. 自连接实例

查询类型相同的订单信息。

SELECT O1 .*,O2.*
FROM T_Order O1 JOIN T_Order O2
ON O1 .FTypeId= O2.FTypeId AND O1.FID <O2. FId

二、子查询

子查询允许将sql语句查询结果作为结果集供其他语句使用。子查询可以简化复杂sql,但是使用不当会造成性能问题。

1.INSERT子查询

INSERT...SELECT....可以将SELECT查询结果导入到另外一个表中,并且可以在导入之前对数据进行处理。

例如:

INSERT INTO T_ReaderFavorite2( [FCategoryId],FReaderId )
SELECT FCategoryId ,(FReaderId+ 1)
FROM T_ReaderFavorite

2.UPDATE子查询

可以在UPDATE的where子句中使用子查询。

例如:

UPDATE T_Book
SET FYearPublished =2014
WHERE
(
SELECT COUNT (*)
FROM T_Book b2 WHERE T_Book .FCategoryId= b2.FCategoryId
)>3

3.DELETE子查询

DELETE FROM T_ReaderFavorite
WHERE
(
SELECT COUNT (*) FROM T_ReaderFavorite T WHERE T. FCategoryId=T_ReaderFavorite .FCategoryId
)>=5

三、NULL

我们都知道,NULL在数据库中表示某个字段的值为未知。

以下面的数据为例:

1.NULL与比较运算符

在比较运算符运算时,运算结果仍未NULL,因为DBMS认为无法确定NULL是否在某个取值范围之内。例如:

SELECT * FROM T_Employee WHERE FSalary< 5000 OR FSalary>=5000

2.NULL与计算字段

如果NULL值出现在任何计算字段中,那么运算结果都为NULL。

可以根据具体业务需求进行处理,例如使用IS NOT NULL进行过滤,或者将Null处理成其他值。

例如:

SELECT FSalary /1000 FROM T_Employee WHERE FSalary IS NOT NULL
SELECT (CASE WHEN FSalary IS NULL THEN 0 ELSE FSalary END)/1000 FROM T_Employee

3.NULL与字符串运算

如果NULL与字符串进行计算,那么结果也都是NULL.

SELECT 'dear ' +FName FROM T_Employee

4.NULL与函数

NULL值出现在普通函数时,结果还是NULL; 但当NULL值出现在聚合函数时,NULL值将被忽略。

SELECT FSalary +1000 FROM T_Employee

SELECT Count (Fid), COUNT(FSalary ) FROM T_Employee

四、开窗函数

1. OVER()

开窗函数可以对结果集进行聚合计算,但和平时用的聚合函数有些差别。看个实际例子:

想查询工资低于5k的员工姓名和年龄,并且每行都要展示符合条件人群总数。

SELECT FName ,FAGE , ( SELECT COUNT (*)FROM T_Person WHERE FSALARY< 5000)
FROM T_Person
WHERE FSALARY <5000

通过子查询方式实现的想要的结果,但是使用开窗函数可以更加简单。

开创函数格式:函数(列) OVER()。

==》

SELECT FName , FAGE , COUNT(*) OVER()
FROM T_Person
WHERE FSALARY <5000

2.PARTITION BY()

开窗函数OVER后面括号中可以使用PARTITION BY子句进行行的分区来进行聚合运算,而且可以创建多个分区。这些分区主要是用来进行聚合运算的,不会影响结果集。

COUNT (*) OVER (PARTITION BY FCITY )表示按照FCITY字段进行分区,并且返回当前行所属的组的聚合计算结果。

实例:

SELECT FCITY ,FAGE, COUNT(*) OVER(PARTITION BY FCITY) AS NUM1 ,COUNT(*) OVER( PARTITION BY FAGE ) AS NUM2
FROM T_PERSON
ORDER BY FAGE DESC

3.高级开窗函数

①计算排名

ROW_NUMBER()计算一行在结果集中的行号,可以当作是唯一的排名。

RANK()和DENSE_RANK()函数都是用来计算排名的,不同的是当名次重复时的处理方式。

如:

SELECT FName ,FSalary,
ROW_NUMBER() OVER(ORDER BY FSalary DESC ) ,
RANK() OVER(ORDER BY FSalary DESC ),
DENSE_RANK() OVER(ORDER BY FSalary DESC )
FROM T_Person

②NTILE(num)分区

NTILE()函数用来将结果集中的行按照某个列的值进行平均分割,然后返回当前行所在的区域编号。NTILE()函数接受一个整数类型的值,这个值表示把结果集分割成的份数。注意必须在NTILE()函数后的OVER()子句中使用ORDER BY指定排序。

SELECT FName , FSalary ,FAge,
NTILE(3 ) OVER (ORDER BY FSalary )
FROM T_Person ;

读《程序员的SQL金典》[3]--表连接、子查询的更多相关文章

  1. 读《程序员的SQL金典》[1]--基础数据检索

    前言 <程序员的SQL金典>这本书是杨中科老师的,拜读了一下,简单做了读书笔记供以后翻阅.仅供学习分享,要想细读的话推荐购买原版呀! 这次读书的时候用了新的办法把看书计划进行了量化,虽然简 ...

  2. 读《程序员的SQL金典》[4]--SQL调优

    一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...

  3. 读《程序员的SQL金典》[2]--函数

    一.数学函数 1.RAND SELECT RAND () ---0.302870228294199 取0-1之间的随机小数. 2.小数取整 CEILINT(data)舍掉小数部分并向上取整. FLOO ...

  4. 【程序员的SQL金典】笔记(第6章~第11章)

        第六章 索引与约束   1.索引用来提高数据的检索速度,而约束则用来保证数据的完整性.   2.创建索引 创建索引的SQL 语句是CREATE INDEX,其语法如下: CREATE INDE ...

  5. 程序员的sql金典

    1.数据库基础概念 2.数据类型 3.通过SQL语句管理数据表 4.数据的增删改 5.Select的基本用法 6.高级数据过滤 7.数据分组 8.限制结果集行数和抑制重复数据 9.计算字段 10.不从 ...

  6. .Net程序员学用Oracle系列(14):子查询、集合查询

    1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY ...

  7. 【程序员的SQL金典】笔记(第1章~第5章)

      第一章数据库入门 1.概念: 数据库 表 列 记录(行) 主键 索引         第二章 数据表的创建和管理 1.数据库系统中的数据类型大致可以分为五类:整数.数值.字符相关.日期时间以及二进 ...

  8. [SQL SERVER系列]之嵌套子查询和相关子查询

    子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...

  9. SQL的多表连接查询

    SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...

随机推荐

  1. EBS R12.2应用层关闭脚本的执行过程

    $ pwd /app/oracle/apps/VIS/fs1/inst/apps/VIS_erptest/admin/scripts $ ./adstpall.sh apps/apps You are ...

  2. Java Servlet(七):JavaWeb MVC 操作(jdk7+tomcat7+eclipse)

    之前一段时间一直忙于毕业设计,也没有空学习了,本篇继续学习. 本篇将开始学习java web下使用servlet下来操作数据库,并展示到界面上的使用方法. 新建工程ServletMvc001. 目录结 ...

  3. 感冒了~ vs中py和vb实现一个小算法

    1+1*2+1*2*3+--+1*2*3*n 下面是窗体,就一个按钮和编辑框. 中途还遇到了编码问题,但是感冒太难受,加上明天还要上课.就睡了~ 晚安世界.

  4. 【selenium 3】 Mac 下测试环境搭建 Firefox 47+ gecko driver Mac

    错误代码如下:File "/usr/local/lib/python2.7/dist-packages/selenium-3.0.0b2-py2.7.egg/selenium/webdriv ...

  5. jq 解析josn字符串

    1. var obj = jQuery.parseJSON("${ruleModel.rules}"); 2. var obj = eval("("+" ...

  6. 【final】站立会议---11.28

    名称:nice! 组长:李权 成员:韩媛媛 刘芳芳 宫丽君 于淼 项目名称:约跑app 时间:11月28日 12:30 内容: 新任务的分配 1.李权分配任务 2.韩媛媛写站立会议 3.刘芳芳修改BU ...

  7. JSP-12-使用过滤器和监听器

    1 什么是过滤器及其工作方式 向Web应用程序的请求和响应添加功能的Web组建 过滤器可以统一的集中处理请求和响应 15.2 过滤器的实现 新建 filter ,注意此时是在 src中建立的(同cla ...

  8. opencv的学习笔记1

    想在周末去游泳,找了些游泳的注意事项什么的,想想还没干正事,就来继续看看opencv的使用吧,晚上看了opencv的一些基本入门的东西,打算下面主要总结CSDN上一个大牛的博文,链接如下:http:/ ...

  9. Hadoop编程1:天气数据AWK & MapReduce

    本文介绍通过AWK和MapReduce两种方式统计出每年温度到最高气温直.awk速度虽然快,而且简短,但是数据量巨大到时候,就遇到力瓶颈,及时分布式执行awk脚本,也会出现机器死掉等问题,需要容错机制 ...

  10. <c:if>标签判断是否为空

    <c:if test="${not empty feeType}">  注意:大括号外面不能为空. ${orderNo.ethdOriginalOrderNo} < ...