时间:2014.02.23
地点:基地
————————————————————————————————
一、简述
SQL查询基本结构包括:selectfrom和where。查询源以from字句引出,源即某个关系,在该关系上进行where和select指定的运算,然后产生一个新的关系。
————————————————————————————————
二、单关系查询
这页是最简单的查询。比如我们在大学数据库中需要查询所有教师的名字,即从关系instructor中找出name属性,形成一个新关系。于是可以用SQL表示为:
select namefrom instructor在关系模型的形式化定义中,关系是一个集合,对的,是集合,集合中应该不会出现重复的名字。而在实践中,有时我们需要去除重复,而上述语句并不能做到,它只是简单列出name属性,为此当想要强行删除重复时只需在select后加入关键字distinct即可,即:
select distinct namefrom instructor而select后则用来显示指明不去除重复,当然不去除重复是默认行为。
select字句还可以带+ - * /运算符的算术表达式,运算对象可是常熟或元组的属性,比如:
select ID,name,dept_name,salray*1.1from instructor;where字句则提供谓词条件,只有满足条件的元组才能被重关系中选出形成新的关系,比如:
select namefrom instructorwhere dept_name='Comp.Sci.' and salary>7000;SQL可以在where字句中使用逻辑连词and or not。逻辑连词的运算对象可以是各类比较运算符。
如此总来的说,在编写SQL语句时,我们
1.先用select表明目的,需要一个什么模式的新关系
2.再用from字句表明来源,即旧的关系
3.最后用where字句表明筛选条件
————————————————————————————————
三、多关系查询
当我们需要从多个关系中或许信息时我们需要用到多关系查询,比如你在大学数据库中想要找到所有教师的名字,以及他们所在的院和院所属的建筑,于是你会发现在instructor关系只能获取教师名name和所在院明dept_name,而院楼名则在关系department中的building属性中。同单关系查询,我们的select from where作用还是一样,我们把所有要访问的关系都列在from字句中,并在where字句中指定匹配条件,啊,在select一下,新的关系就形成了。
select name,instructor.dept_name,buildingfrom instructor,departmentwhere instructor.dept_name=department.dept_name这里还要注意dept_name出现在from列出两个关系中,因此需要关系名做前缀来说明来自哪个关系。
典型的SQL查询模式如下:
select A1,A2,A3......,Anfrom r1,r2,r3......rmwhere P;Ai代表属性,ri代表关系,P为谓词,省略where字句则默认谓词是true
另外需要说明的是,通过from字句所定义的关系是一个笛卡尔积关系,啊,什么事笛卡尔积关系,就是某一个关系的元组都和其余关系的每一个元组结合一下,假如r1有3个元组,r2有2个元组,r3有5个元组那么笛卡尔积关系有2*3*5=60个元组。通常这样的笛卡尔积关系是无意义的,而且很庞大。因此where字句常被用来限制笛卡尔积所建立的无意义组合。譬如我们需要把instructor关系和teach关系中元组具有相同ID值的进行匹配,我们只需用where条件从笛卡尔积中筛选出来即可。
select name,course_idfrom instructor,teacherswhere instructor.ID=teachers.ID