select语句--多表查询

来源:互联网 发布:物流规划软件 编辑:程序博客网 时间:2024/05/21 21:49

聚合函数

        sum,avg   求和/求平均数,只支持数字

        max,min   求最大/最小数字,最早/最晚日期,最长/最短字符串,支持数字、datetime、字符串                 

        count     统计所有记录行的数量

 

        可使用distinct,区分相同的值

                select count(*) from student

                select sum(grade) from grades group by sno   --每个人的总分

                select max(grade) from grades group by cno   --课程最高成绩

                select max(logintime) from phones group by name --查找每个人最近的登录时间

        要在查询中包含非集合函数的列,则必须包含在group by子句中,

                或者在子查询中进行聚合运算,而把附加的列放到外部查询中

 

having子句

        使用group子句时,可使用having子句进一步设定统计条件

        having和group by 的关系相当于where 和select的关系

        having子句中可使用逻辑运算符连接多个条件

        having子句中可使用聚合函数,where不行

                select 

                sno,sum(grade) 'sum score',avg(grade)'avg score' 

                from grades

                where sno = '001'

                group by sno

                having avg(grade)>60

 

连接查询

        将两个表按照一定的方式连接在一起时,两个表必须有公共的数据。如,A表中的a列对应于B表中的a列。

        连接的列名可以不同,如果使用相同名称的列必须为其加上作为限制,不然会产生混淆。

        连接的过程大致如下:

                1.为连接表生成笛卡尔积。

                2.使用WHERE子句从形成的笛卡尔积中去除所有不符合限制条件的行。这 里SELECT子句还没有执行。这也是

                        为什么WHERE子句中可以使用不包含在SEELCT列表中的列的原因。

                3.使用WHERE子句进 行删除后,如果语句中包含了GROUP BY子句,将按照GROUP BY子句中指定的列对剩下的

                        行进行分组。

                4.SELECT子句将被 应用到余下的数据中,表达式也被执行,选出在SELECT列表中的列。

 

from子句进行多表查询

        from多个表,然后用这些表中的同名列做条件限定来查询

                select sname, grade from student s,grades g where s.sno = g.sno

 

SQL-92标准所定义的FROM子句的连接语法格式为

                FROM join_table join_type join_table [ON (join_condition)]

        对同一个表操作的连接又称做自连接。

        join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。

 

内连接:

        返回两个数据集合之间匹配关系的行,即取得两表(或更多表)之间共有的数据,用比较运算符比较被连接列的列值。

        有等值连接、不等连接、自然连接三种

                select sname,grade from student s

                        inner join grades g on g.sno = s.sno

 

外连接:

        外连接扩充了内连接功能,不仅把数据集合中重叠部分连接起来,还进一步返回来自左侧或右侧或全部集合中的非酦醅数据

                语法格式:

                        select *|column 

                        from table1

                                left|right|full[outer] join table2

                                on ON (join_condition)

                EG: select sname,cno,grade

                    from student s

                              left join grades g

                               on g.sno = s.sno and g.cno =5

 

交叉连接

        不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

                例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。 

                        SELECT type,pub_name

                        FROM titles CROSS JOIN publishers

                        ORDER BY type

 

使用子查询

                子查询是嵌入到一个外部查询中的select语句。

        简单子查询

                执行步骤是:1,执行一次简单子查询        2,将结果传给外部查询        3,执行一次外部查询

                简单子查询一般用关键字[not] in 引出

                select * from grades 

                where cno in (select cno from courses where chour <30)

        相关子查询

                相关子查询引用了外部的列。

                执行步骤是:1,执行一次外部查询        2,对于外部查询的每一行分别执行一次子查询        3,使用子查询的结果来确定外部查询的结果集

                一般由关键字 [not] exists 引出

                select * from student s

                where no exists

                (select * from grades g

                        where g.sno = s.sno and g.sno =5)

 

使用联合查询

        又称为并操作,联合是加法,而连接时乘法,联合将做个结果集集合在一起显示。关键字union

        语法格式:

                select_statement

                        union [all] select_stament

                        [union [all] select_stament]  [,...n]

        每个被联合的select语句的选择列表具有相同结构,有相同列数,并且结果集合中的对应列的数据类型兼容

        只有第一个select语句可以使用into

        只有在union结尾后才能使用order by语句

        select sno,sname from student

        where sno = '001'

        union

        select sno,sname from student

        where sno = '002'