SQL数据查询语句(二)

时间:2024-04-02 19:26:11

继上次的浅析SQL语句基本操作,本次重点介绍SQL语句的单表查询、连接查询

先简单介绍几个简单的查询子句

select 子句:指定要显示的属性列
form子句:指定查询对象(基本表或视图)
where子句:指定查询条件
group by 子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
having短语:只有满足指定条件的组才予以输出
order by子句:对查询结果表按指定列值的升序或降序排序

查询指定列:select 列名 ,列名 from 表名 如:select student_number,studnet_name from student;
查询所有属性列: select * from student;
给个稍复杂的例子:
select student_name,'Year of Birth:',2020-student_age from student;
这里只有student_name和student_age 是属性列,第二个显示,第三个是计算结果如下:SQL数据查询语句(二)
在查询时为了是显示更加明了可以使用别名
只需要在列名后直接加就行
SQL数据查询语句(二)
查询中有时候有的列有许多重复值但是我们又不想让这些值重复出现我们可以加上distinct关键词来约束
select distinct student_number from student;

SQL数据查询语句(二)


比较大小,筛选查询:
select student_name,student_age from student where student_age<20; **谓词:between and在什么之间** not between and 不在什么之间
如:select student_number from student where student_age between 20 and 30;
谓词 :in<值表>,not in <值表>
为了赛选,所查询的在所制定的中选择
select studnet_name ,from student where student_age in(20,21);
我这里数字定义的是int所以额不用加单引号;

SQL数据查询语句(二)


select * from student where student_number like '1807915108'

select * from student where student_number ='1807915108'
是等价的。
含通配符的例子:
select * from student where student_name like ''梁%;
SQL数据查询语句(二)
SQL数据查询语句(二)

使用换码字符将通配符转义为普通字符,可以用escape‘\’语句
SQL数据查询语句(二)
多重条件查询
常常利用and和or来连接多个查询条件,and的优先级高于or(或),可以用括号改变优先级
select student_name from student where student_age <21 and student_number='1807915108';
order by子句
可以按一个或多个属性列排序,升序:asc;降序:desc;缺省值为升序。一般用于成绩排序查询
select * from student where student_age<21 order by student_grade desc;
成绩降序排列
SQL数据查询语句(二)
聚集函数
查询总人数:select count(*)from student;
avg(grade)也是类似的:select avg(student_grade) from student where student_age < 21;其他几个也类似;
group by子句

SQL数据查询语句(二)


注意:where子句是不能用聚集函数作为条件表达式的。

SQL数据查询语句(二)

连接查询

连接查询就是同时涉及两个以上的表的查询,连接条件或连接谓词:用来连接两个表的条件。
一般格式:

SQL数据查询语句(二)


这里有一些限制:连接的字段是谓词中的列名称,连接条件中的个连接字段类型必须是可比性的,但名字不必相同。
等值连接运算符为“=”
看个例子:查询每个学生及其选修课的情况
select student.* ,sc.* from student,sc where student.student_number=sc.student_number;

连接操作的执行有三种操作方法:嵌套循环法、排序合并法、索引连接

嵌套循环法:

首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中的一个元组
表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中的一个元组。重复上述操作直到表1中的全部元组都处理完毕。

排序合并法:

常用于=连接,首先按连接属性对表1和表2排序,对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中的一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不在继续。
找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的一个元组与该元组拼接起来,形成结果表中的一个元组。直到遇到表2中大于表1连接字段值的元组时,对表2的查询不在继续。重复上述操作,直到表1或表2中的全部元组都处理完毕为止。

索引连接:

对表2按连接字段建立索引,对表1中的每个元组,一次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果中的一个元组。
看个例子:要求是查询选修2号课程且成绩在90分以上的所有学生的学号和姓名;
select student.sno,sname from student,sc where student.sno=sc.sno and sc.cno='2' and sc.grade>90;
可以上看出一条SQL语句可以同时完成连接和连接查询,这时where子句是由连接谓词个选择谓词组成的复合条件。
分析下这条语句的执行过程:先从sc中挑选出cno='2'并且grade>90的元组组成一个中间关系,再和student中满足连接条件的元组进行连接得到最终的结果关系。
还有一种是自身连接的:一个表与其自己进行连接,这时就需要利用别名来区分了:

SQL数据查询语句(二)


数据如下:

SQL数据查询语句(二)

外连接

与普通连接的区别:普通连接操作只输出满足连接条件的元组,外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。
左外连接:列出左边关系中所有的元组
右外连接:列出有关系中所有的元组

SQL数据查询语句(二)


左外连接结果:

SQL数据查询语句(二)


多表连接
多表连接两个表连接类似:
如下样例:
select student.sno,sname,cname,grade from student,sc,course where student.sno=sc,sno and sc.cno=course.cno;
这样就将三个表进行了连接操作。下篇将会介绍嵌套查询、集合查询!!