读《程序员的SQL金典》[1]--基础数据检索
前言
《程序员的SQL金典》这本书是杨中科老师的,拜读了一下,简单做了读书笔记供以后翻阅。仅供学习分享,要想细读的话推荐购买原版呀!
这次读书的时候用了新的办法把看书计划进行了量化,虽然简单,发现还是有效果的。
1. Count(*)与Count(column)区别
Count(*)统计结果集总条数;
Count(column)统计结果集中column字段不为null的总条数。
2. 低效的where 1=1
为了实现动态拼接查询条件的功能,有时我们会使用where 1=1这样看似聪明的解决方案。但实际上会造成很大的性能损失,这个条件使得数据库无法使用索引等优化查询策略,数据库会进行全表扫描。当数据量较大的时候查询速度可能会变得很慢。(在SQL Server2012等数据库中,对这种情况其实已经做了优化)
优化前:
private static void CreateWhere(QueryParam param) {
string where = " where 1=1 " ;
if (param != null )
{ if (param.HasPicture)
{
where += " AND picture<>'' " ;
}
if (param.ClassId > )
{
where += " AND ClassID=@classid " ;
}
if (param.AuthorId > )
{
where += " AND UserId=@UserId";
}
}
}
可以改用下面的逻辑实现。
private static void CreateWhere1(QueryParam param)
{
StringBuilder where = new StringBuilder( " where 1=1 ");
bool hasWhere = false ;
if (param != null )
{
if (param.HasPicture)
{
hasWhere = AppendWhereIfNeed(where, hasWhere);
where.AppendLine( "picture<>'' ");
}
if (param.ClassId > )
{
hasWhere = AppendWhereIfNeed(where, hasWhere);
where.AppendLine( "ClassID=@classid ");
}
if (param.AuthorId > )
{
hasWhere = AppendWhereIfNeed(where, hasWhere);
where.AppendLine( "UserId=@UserId");
}
}
}
private static bool AppendWhereIfNeed( StringBuilder where, bool hasWhere)
{
if (hasWhere)
{
where.Append( " and ");
}
else
{
where.Append( " where ");
}
return true ;
}
3.Group By分组
分组查询时,所有SELECT语句中出现的列必须出现在Group By子句中(聚合函数除外。)
实例:
①错误
SELECT FAge ,FSalary FROM T_Employee GROUP BY FAge
--选择列表中的列 'T_Employee.FSalary' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
②正确
SELECT FAge ,Max( FSalary) FROM T_Employee GROUP BY FAge
FAge (无列名)
22 1200.00
23 5000.00
25 8300.00
28 6200.00
4.Having 语句
①聚合函数不能出现在where语句中,此时可以使用having语句代替。
SELECT FAge , COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge --WHERE COUNT(*)>1--错误 HAVING COUNT (*)> 1--正确
②HAVING子句位置要在GROUP子句之后;
③HAVING子句也可以像where一样使用较复杂的过滤条件
SELECT FAge ,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT (FAge)= 1 OR COUNT(FAge )=2 SELECT FAge ,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT (FAge) IN(1 ,2)
5.ROW_NUMBER() OVER(排序规则)
ROW_NUMBER()函数可以计算数据的行号。但该函数不能放在WHERE子句中,如果想根据行号进行过滤可以使用子查询来实现。
SELECT * FROM
(
SELECT ROW_NUMBER () OVER (ORDER BY FSalary DESC) num, FName,FSalary
FROM T_Employee
) A
WHERE A .num BETWEEN 1 AND 3
6.DISTINCT
DISTINCT是针对这个结果集取消重复的,而不是针对单个列。
7.字符串计算函数
①LEN(string)可以计算字段的长度。
SELECT FName ,LEN( FName) AS NameLength
FROM T_Employee
WHERE FName IS NOT NULL
②SUBSTRING(str,start,length):
字符串截取函数。str表示原字符串,start为开始位置(从1开始计算),length为截取的长度。
SELECT FName ,SUBSTRING( FName,1 ,2) AS NameLength
FROM T_Employee
WHERE FName IS NOT NULL
执行结果:
FName NameLength
Tom To
Jerry Je
Jane Ja
8.UNION
UNION可以进行结果集的合并。如果想合并之后自动去掉重复行,可以使用UNION ALL.
读《程序员的SQL金典》[1]--基础数据检索的更多相关文章
- 读《程序员的SQL金典》[4]--SQL调优
一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...
- 读《程序员的SQL金典》[2]--函数
一.数学函数 1.RAND SELECT RAND () ---0.302870228294199 取0-1之间的随机小数. 2.小数取整 CEILINT(data)舍掉小数部分并向上取整. FLOO ...
- 读《程序员的SQL金典》[3]--表连接、子查询
一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...
- 【程序员的SQL金典】笔记(第6章~第11章)
第六章 索引与约束 1.索引用来提高数据的检索速度,而约束则用来保证数据的完整性. 2.创建索引 创建索引的SQL 语句是CREATE INDEX,其语法如下: CREATE INDE ...
- 程序员的sql金典
1.数据库基础概念 2.数据类型 3.通过SQL语句管理数据表 4.数据的增删改 5.Select的基本用法 6.高级数据过滤 7.数据分组 8.限制结果集行数和抑制重复数据 9.计算字段 10.不从 ...
- 【程序员的SQL金典】笔记(第1章~第5章)
第一章数据库入门 1.概念: 数据库 表 列 记录(行) 主键 索引 第二章 数据表的创建和管理 1.数据库系统中的数据类型大致可以分为五类:整数.数值.字符相关.日期时间以及二进 ...
- 好程序员web前端分享HTML基础篇
好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...
- 面向.Net程序员的Sql版本管理
代码版本管理基本上程序员们都知道 TFS GIT SVN等等 但是对于数据库版本管理 java程序员或许会了解一些 但是.Net程序员收获的资料应该不多. 特别是现在云概念使用越来越广的情况下,与应用 ...
- 程序员书单_java学习基础编程篇
Java程序设计语言.(美国)阿诺德.清晰版 http://download.csdn.net/detail/shenzhq1980/9076093 JAVA2核心技术第1卷.基础知识7th.part ...
随机推荐
- git sshkeygen Fingerprint cannot be generated解决方法
ssh-keygen -t rsa -C "xxx@xxx.com" 生成后使用cat或者vim 查看该rsa,然后复制到github的ssh keys中: 提示: ...
- 《Linux内核设计的艺术》学习笔记(四)默认段和偏移寄存器
参考书籍:<Intel微处理器> 表1 默认的16位段 + 偏移寻址组合 段 偏移量 特殊用途 CS IP 指令地址 SS SP或BP 堆栈地址 DS BX.DI.SI.8位或16位数 数 ...
- Spring管理bean的生命周期
1: bean的创建: 如果我们默认的scope配置为Singleton的话, bean的创建实在Spring容器创建的时候创建: 如果scope的配置为Prototype的话,bena的创建是在 ...
- [转]linux中如何安装软件?
Linux下软件的安装与卸载 在Windows下安装软件时,只需运行软件的安装程序(setup.install等)或者用zip等解压缩软件解开即可安装,运行反安装程序 (uninstall.u ...
- javascript获取类元素
代码测试是ie5+: 原生javascript中筛选出含有指定类的元素: 思想:在指定范围里把所有的元素筛选出来,然后把里面的每个元素都遍历找出它们含有的所有类,然后逐个元素遍历它们各自的类,如果指定 ...
- 进击的Hybrid App,量身定做缓存机制
引用张图,简单粗俗的解释下 Native App.Web App 和 Hybrid App Navtie App: 使用平台系统提供的原生语言来编写的 App,如果Android用java,ios用o ...
- (一)S5PV210开发板常用易忘操作记录
一.调试串口 2.SD卡槽 (三)启动方式选择 蜂鸣器下面的白色2针插座(图中红色线圈出来的那个)为选择USB/SD卡启动的开关.默认情况下为SD卡启动,如果需要USB启动则使用短路帽(若没有短路帽, ...
- ios7适配一些问题以及64位32位
ios7适配一些问题(http://www.cocoachina.com/ios/20130703/6526.html) 1.iOS应用如何实现64位的支持 http://www.codeceo.co ...
- white-space: nowrap
CSS:需要加上宽度(width:100px).超出隐藏(overflow:hidden;).强制在同一行显示(white-space: nowrap;).省略号(text-overflow:elli ...
- 别人要访问我的电脑上部署的tomcat,必须关闭防火墙吗?
局域网内要访问服务器上部署的tomcat,必须关闭防火墙吗? 不一定. 如果是需要使用 IP:端口号(ip:port)来访问,可以做以下设置(这里仅是说的tomcat访问). 首先在服务器的控制面板中 ...