All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
扩展LINQ,to,SQL:使用Lambda,Expression批量删除数据_[Asp.Net教程]
Asp.Net,动态生成验证码_[Asp.Net教程]
SQL循序渐进(19)DISTINCT和排除复制_[SQL,Server教程]
SQL Server开发中注意的十个问题_[SQL Server教程]
ASP.NET实现自动返回上次请求页面小技巧_[Asp.Net教程]
初学者学习PHP开发应该掌握的几段精华代码_php资料_编程技术
SQL数据操作基础(初级)3_mssql学习_编程技术
SQL循序渐进(15)IN,和,BETWEEN,条件运算符_[SQL,Server教程]
PHP结合MySQL初级网站编程教程_[PHP教程]
.net下用javascript调用webservice_[Asp.Net教程]
Reading number is top 10 pictures
The real super beauty5
Beautiful Japanese beauty(漂亮的日本美女)3
9.3阅兵全景图8-航空梯队
真正的国产-非模拍 贵在是真实2
A man's favorite things15
Original author said, this is the Hengyang people
Fat bird to fly
Look for from human art net, is good1
The sixties of the last century, China is such a kill pig
西班牙山村小景4
Download software ranking
Wild things 2
C语言教程TXT
尖东毒玫瑰B
Boxer's Top ten classic battle4
Eclipse 4.2.2 For Win32
I'm come from Beijing1
Unix video tutorial8
Boxer's Top ten classic battle3
仙剑奇侠传98版歌曲
Dance with duck(male prostitution)
delv published in(发表于) 2013/12/30 4:45:49 Edit(编辑)
编写SQL查询的关键—SQL语句的执行顺序_mssql学习_编程技术

编写SQL查询的关键—SQL语句的执行顺序_mssql学习_编程技术

编写SQL查询的关键—SQL语句的执行顺序_mssql学习_编程技术-你的首页-uuhomepage.com
编写 SQL 语句是每个程序员应该具备的基本功。在实际开发过程中,需要编写比较复杂的 SQL 查询语句是必不可少的,但很多 SQL 书籍上不是简单的介绍一下就是出最终的查询语句,编写复杂 SQL 查询的具体思路却没有多少介绍,这不能不说是一种巨大的遗憾 , 看着一串无比复杂的 SQL 语句,没有掌握方法的话谁看了都会头晕 ^-^
回忆一下学习编程语言的经历( C++,java 等),我们一般都是先学习变量的定义,然后是流程控制语句,接着是函数,类等等。但我们在学习 SQL , SQL 书籍上都普遍忽略了一个重要的方面: SQL 语句的执行顺序。 不知道是什么原因,这一点确实没被多少书籍提过。掌握了SQL语句的执行顺序的规律,就能较轻松的编写出复杂的 SQL 查询。
SQL 语句的执行顺序如下:
1 、 from 子句组装来自不同数据源的数据;
2 、 where 子句基于指定的条件对记录行进行筛选;
3 、 group by 子句将数据划分为多个分组;
4 、使用聚集函数进行计算;
5 、使用 having 子句筛选分组;
6 、计算所有的表达式;
7 、使用 order by 对结果集进行排序。
下面举一个简单的例子举例说明,假设有以下一张表 student :
ID
Name
Age
1
Tom
23
2
Jack
25
3
Lucy
15
4
Anay
18
5
Bobby
21
要求通过 SQL 语句把年龄大于 20 的学生姓名查出来
SQL 语句如下:
Select name
From student
Where age>20
结果是:
Tom
Jack
Bobby
那对于这个简单的 SQL 语句,执行顺序是怎么样的呢?
1. from 子句组装来自不同数据源的数据,简单点来说就是要确定查询的数据来自哪个表。如果 from 关键字后跟的表有两个或以上,就产生笛卡尔积。
2. where 子句对每个记录行进行 筛选,把不符合条件的行筛选掉。
3. 针对符合条件的行执行相应的表达式操作,即 select 部分。
我们针对前面的写的 SQL 语句简单模拟一下执行过程:
1. 确定数据表,我们能根据 from 子句( From student )确定数据是来自下面的的表 student
ID
Name
Age
1
Tom
23
2
Jack
25
3
Lucy
15
4
Anay
18
5
Bobby
21
表 1
2. 根据 where 子句中的条件( Where age>20 )筛选 记录行,请留意, where 子句的 筛选是对每一行 from 表中的每一行进行的。
(1) 对于第 1 行
1
Tom
23
Age=23>20, 符合条件
(2) 对于第 2 行
2
Jack
25
Age=25>20, 符合条件
(3) 对于第 3 行
3
Lucy
15
Age=15<20, 不符合条件
(4) 对于第 4 行
4
Anay
18
Age=18<20, 不符合条件
(5) 对于第 5 行
5
Bobby
21
Age=21>20, 符合条件
由上述的 (1)(2)(5) 可知,最终符合条件的记录为下表 2
ID
Name
Age
1
Tom
23
2
Jack
25
5
Bobby
21
表 2
4. 计算所有的表达式,即 Select name 部分,针对表 2 中的数据,最终符合条件的是 3 行,分别从每一行挑选出需要的字段值 name ,最终的结果如下表 3
Name
Tom
Jack
Bobby
表 3
下面举一般比较复杂的例子,有 3 个表 teacher 表, student 表, tea_stu 关系表:
teacher 表 teaID name age
student 表 stuID name age
teacher_student 表 teaID stuID
要求用一条 sql 查询出这样的结果
1. 显示的字段要有老师 name, 每个老师所带的学生人数
2 只列出老师 age 为 45 以下,学生 age 为 12 以上的记录
先准备测试数据:
drop table if exists tea_stu;
drop table if exists teacher;
drop table if exists student;
create table teacher(teaID int primary key,name varchar(50),age int);
create table student(stuID int primary key,name varchar(50),age int);
create table tea_stu(teaID int references teacher(teaID),stuID int references student(stuID));
insert into teacher values(1,' Tom',46), (2,' Jack',35) , (3,' Tony',36) , (4,' Lucy',37);
insert into student values(1,' Lili',11), (2,' Anay',15) , (3, 'Bobby',16) , (4, 'Jeff',17);
insert into tea_stu values(1,1), (1,2), (1,3),(2,2), (2,3), (2,4),(3,3), (3,4), (3,1),(4,4), (4,1), (4,2) , (4,3);
题目要求是列出 老师所带的学生数,条件是 老师 age 为 45 以下,学生 age 为 12 以上,最理想的情况是有下面的一个表 , 如图 1
图 1
如果能构造一个图 1 的表,那么实现题目要求的 SQL 语句用下面的简单 SQL 查询就行:
select teacher.name, count(student.name)
from table
where teacher.age<45
and student.age>12
group by teacher.name;
数据库中学生的信息和老师的信息是分别存放在 student, teacher 表中的,信息的关联只能依靠 tea_stu ,那么怎么构造图 1 的表呢?这时候可以用到表的关联,把这三个表的数据关联起来, 注意:只要是表的关联就会产生笛卡尔积,所以务必把笛卡尔积去掉。 关联表的最小粒度关联可以 去掉 笛卡尔积,具体的查询语句为:
select teacher.name, teacher.age,student.name,student.age
from teacher,student,tea_stu
where teacher.teaID=tea_stu.teaID
and student.stuID=tea_stu.stuID
所以综合以上所述,就能得出最终的查询语句
select teacher.name, count(student.name) student_num
from teacher,student,tea_stu
where teacher.teaID=tea_stu.teaID
and student.stuID=tea_stu.stuID
and teacher.age<45
and student.age>12
group by teacher.name;
结果如图 2 所示:
图 2




添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.