SQL语言是一门简单易学却又功能强大的语言,它能让你快速上手并写出比较复杂的查询语句。但对于大多数开发者来说,使用SQL查询数据库并没有一个抽象的过程和一个合理的步骤,这很可能会使在写一些特定的SQL查询语句来解决特定问题时被”卡”住,本系列文章主要讲述SQL查询时一些基本的理论,以及写查询语句的抽象思路。
[b]SQL查询简介
[/b]SQL语言起源于1970年E.J.Codd发表的关系数据库理论,所以SQL是为关系数据库服务的。而对于SQL查询,是指从数据库中取得数据的子集,这句话貌似听着有些晦涩是吧,下面通过几张图片简单说明一下:
假如一个数据库中只有一个表,再假如所有数据如下图(取自AdventureWork示例数据库):
[url=http://www.1sucai.cn/upload/201109/20110904232526652.png][img]http://files.jb51.net/upload/201109/20110904232526156.png[/img]
[/url]
而对于子集的概念,look下图:
[url=http://www.1sucai.cn/upload/201109/20110904232526126.png][img]http://files.jb51.net/upload/201109/20110904232526903.png[/img]
[/url]
最后,子集如下:
[url=http://www.1sucai.cn/upload/201109/20110904232527912.png][img]http://files.jb51.net/upload/201109/20110904232527219.png[/img]
[/url]
其实,SQL中无论多复杂的查询,都可以抽象成如上面的过程.
[b]精确查询的前置条件
[/b]对于正确取得所需要的数据子集.除了需要思路正确并将思路正确转变为对应SQL查询语句之外。还有很重要的一点是需要数据库有着良好的设计.这里的良好设计我所指的是数据库的设计符合业务逻辑并至少实现第三范式,对于实现第三范式,这只是我个人观点,对于范式的简单介绍,请看我的博客:数据库范式那些事.如果数据库设计很糟糕,存在很多冗余,数据库中信息存在大量异常,则即使SQL写的正确,也无法取得精确的结果。
[b]两种方式,同一种结果[/b]
在SQL中,取得相同的数据子集可以用不同的思路或不同的SQL语句,因为SQL源于关系数据库理论,而关系数据库理论又源于数学,思考如何构建查询语句时,都可以抽象为两种方法:
[b]1.关系代数法
[/b]关系代数法的思路是对数据库进行分步操作,最后取得想要的结果.
比如如下语句:
[url=http://www.1sucai.cn/upload/201109/20110904232527627.png][img]http://files.jb51.net/upload/201109/20110904232527750.png[/img]
[/url]
相应sql语句如下:
[url=http://www.1sucai.cn/upload/201109/20110904232527930.png][img]http://files.jb51.net/upload/201109/20110904232527558.png[/img]
[/url]
比如上面,我想选择第二条和第六条,为了说明比较运算符和逻辑运算符,可以使用如下Sql语句:
[url=http://www.1sucai.cn/upload/201109/20110904232527815.png][img]http://files.jb51.net/upload/201109/20110904232527269.png[/img]
[/url]
对于不加括号时:
[url=http://www.1sucai.cn/upload/201109/20110904232527684.png][img]http://files.jb51.net/upload/201109/20110904232527649.png[/img]
[/url]
加了括号改变运算顺序后:
[url=http://www.1sucai.cn/upload/201109/20110904232527559.png][img]http://files.jb51.net/upload/201109/20110904232527384.png[/img]
[/url]
很特别的NULL
假如在一个用户注册的表中,一些选填信息并不需要用户必须填写,则在数据库中保存为null,这些null值在利用上面where子句后的运算符时,有可能造成数据丢失,比如一个选填信息是性别(Gender),假设下面两条条件子句:
[url=http://www.1sucai.cn/upload/201109/20110904232527908.png][img]http://files.jb51.net/upload/201109/20110904232527477.png[/img]
[/url]
使用视图的优点是可以对查询进行加密以及便于管理,据说还可以优化性能(我不认可这点).
防止重复
有时候我们对于取出的数据子集不想重复,比如你想知道一些特定的员工一共属于几个部门
[url=http://www.1sucai.cn/upload/201109/20110904232527599.png][img]http://files.jb51.net/upload/201109/20110904232527839.png[/img]
[/url]
这样的结果是没有意义的,SQL提供了Distinct关键字来实现这点:
[url=http://www.1sucai.cn/upload/201109/20110904232527865.png][img]http://files.jb51.net/upload/201109/20110904232527881.png[/img]
[/url]
聚合函数
所谓聚合函数,是为了一些特定目的,将同一列多个值聚合为一个,比如我想知道一群人中最大年龄是多少可以利用MAX(Age),比如我想知道一个班级平均测验成绩是多少可以用AVG(Result)……
总结
文章简单概述了SQL查询的原理以及简单的单表查询,这些都是数据库查询的基础概念,对于进行复杂查询来说,弄明白这些概念是必不可少的。
微信版

扫一扫进微信版
返回顶部