快速业务通道

编写SQL查询的关键—SQL语句的执行顺序

作者 佚名技术 来源 数据库编程 浏览 发布时间 2012-03-22
; 对于第 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

   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号