数据库复杂查询

数据库复杂查询,第1张

数据库的查询功能实现原理:

数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

图1展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)O(log2n)的复杂度内获取到相应数据。

希望可以帮到你

--查询选修了“计算机体系结构”的学生的基本信息。

select *

from 学生

where 学号 in

(select 学号

from 选课

where 课程号 in

(select 课程号

from 课程

where 课程名称='计算机体系结构'))

--查询年龄比李勇小的学生的学号和成绩。

select 学号,成绩

from 选课

where 学号 in

(select 学号

from 学生

where 年龄<

(select 年龄

from 学生

where 姓名 ='李勇'))

--查询其他系中比系编号为“D1”的学生中年龄最小者要最大的学生的信息。

select *

from 学生

where 系编号<>'D1'and 年龄>

(select min (年龄)

from 学生

where 系编号='D1')

--查询其他系中比系编号为“D3”的学生年龄都大的学生的姓名。

select 姓名

from 学生

where 系编号<>'D3'and 年龄>all

(select 年龄

from 学生

where 系编号='D3')

--查询“C1”课程的成绩高于70分的学生姓名。

select 姓名

from 学生

where 学号 in

(select 学号

from 选课

where 课程号 ='C1'and 成绩>70)

--查询“C1”课程的成绩不高于70分的学生姓名。

select 姓名

from 学生

where 学号 in

(select 学号

from 选课

where 课程号 ='C1'and 成绩<=70)

--查询选修了所有课程的学生姓名。

select 姓名

from 学生

where not exists

(select *

from 课程

where not exists

(select *

from 选课

where 学生.学号=选课.学号 and 课程.课程号=选课.课程号))

--查询学校开设的课程总数。

select count(*)

from 课程

--查询选修两门以上课程的学生姓名。

select 姓名

from 学生

where 学号 in

(select 学号

from 选课 group by 学号 having count(*)>=2)

--查询开设的课程和选修该课程的学生的总成绩、平均成绩、最高成绩和最低成绩。

select 课程号,sum(成绩),avg(成绩),max(成绩),min(成绩)

from 选课 group by 课程号

--查询系编号为“D2”或选修课程的最低成绩大于等于60分的学生信息。

select *

from 学生

where 系编号='D2'

union

select *

from 学生

where 学号 in

(select 学号

from 选课 group by 学号 having min(成绩)>=60)

select

    class

    ,sum(case when age butween 10 and 20 then 1 else 0 end) as '[年龄在10-20的人数]'

    ,sum(case when age>20 then 1 else 0 end) as '[年龄在20以上的人数]'

    ,sum(case when sex='男' then 1 else 0 end) as '[男生人数]'

from

    表名

group by

    class


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9236256.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存