程序员

SQL干货篇之查询数据

2017-04-10  本文已影响130人  爱撒谎的男孩

单表查询

只在一个表中查询数据

SELECT * FROM student where Sno='13143';   //根据学号查询数据

多表查询

同时查询多个表

SELECT student.Sno,student.Sname,Grade
FROM student,SC where Grade>=90;

说明:这是在学生表student和成绩表SC中查询成绩大于90的学生姓名和学号,因为这里Sno,Sname在两个表中都存在,因此要指定查询哪一个表中的数据,而Grade只在SC表中出现,因此不用指明哪张表

模糊查找

说明:模糊查找用likenot like进行查找

空值查询

判断数据是否为空用is not nullis null
SELECT * FROM student where Sname is null;查询姓名为空的学生信息

多重条件的查询

多重条件的查询用AND和OR,其区别不用多说了
SELECT Sname FROM student where Sdept='IS' and Sage>20;查找院系是IS并且年龄超过20岁的学生姓名

ORDER BY子句(排序)

用户可以使用ORDER BY子句对数据进行升序(ASC)或者降序(DESC)排列

聚集函数

  • COUNT(*) 统计元组个数
  • COUNT(DISTINCT|ALL <列名>) 计算一列中值的个数,其中DISTINCT表示去除重复的元素,ALL则保留所有的元素
  • SUM(DISTINCT|ALL <列名>) 计算一列值的总和
  • AVG(DISTINCT|ALL<列名>) 计算一列中的平均值
  • MAX(DISTINCT|ALL<列名> ) 求一列中的最大值
  • MIN(DISTINCT|ALL<列名> ) 求一列中的最小值

实例:

  • select count(*) from student; 查询学生总数
  • select count(DISTINCT Sdept); 查询总共有多少系
  • select AVG(Grade) from SC; 查询学生的平均分
  • select SUM(Grade) from SC; 查询学生的总分
  • select MAX(Grade) from SC where Cno='1'; 查询课程1的最高分
  • select MIN(Grade) from SC where Cno='1'; 查询课程1的最低分

注意:where子句中不能用聚集函数,只有在select子句和Group by子句中才能使用聚集函数

GROUP BY子句

实例:

注意:这里的如果使用了聚集函数,那么select子句中出现的选项一定要在聚集函数或者Group by子句中出现,否则就会出现错误,如:select Sno,count(Cno) from sc;这条语句就是错误的,因为Sno没有出现在聚集函数或者Group by子句中,如果改成select Sno,count(Cno) from SC Group by Sno;就正确了,因为Sno出现在了Group by子句中了

连接查询

如果一个查询涉及两个以上的表则称之为连接查询,连接查询包括等值连接查询,自然连接查询,自身连接查询,非等值连接查询,外连接查询,复合条件查询

等值和非等值连接查询

当连接运算符为=时为等值连接查询,否则为非等值连接查询

实例:

  • select student.*,SC.* from student,SC where student.Sno=SC.Sno;查询每个学生及其选修课程的情况

自然连接查询

在等值连接的基础上去掉相等的属性组就是自然连接查询

实例:
select student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade from student,SC where student.Sno=SC.Sno;

嵌套查询

SQL语言中一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另外一个查询块的WHERE子句或HAVING短语的条件查询称之为嵌套查询
实例:

SELECT SNAME FROM STUDENT WHERE SNO IN    /*外层查询*/
(SELECT SNO FROM SC WHERE CNO='2');    /*内层查询或者子查询*/

注意:

  • 这里的查询条件Sno只能有一个,并且外层查询的where子句中出现的Sno属性要和内层查询select语句中的Sno属性要对应。
  • 子查询中不能使用ORDER BY子句,ORDER BY子句只能对最终的查询结果排序

带有IN谓词的嵌套查询

实例:

SELECT Sno,Sname,Sdept from student where Sdept IN
(SELECT Sdept From student Where Sname='刘晨');

查询与刘晨在同一个系的学生信息,当然本例中也可以用自身连接查询来完成,如下:

select first.Sno,first.Sname,first.Sdept 
from student first,student second
where first.Sdept=second.Sdept and second.Sname='刘晨';

带有比较运算符的子查询

select Sno,Cno from sc x where Grade >
(select AVG(Grade) from sc y where x.Sno=y.Sno);

查询了所有学生成绩超过选修课程平均成绩的课程号

带有ANY或者ALL的谓词子查询

ANY表示查询条件只要满足其中一个即可,而ALL表示查询条件要满足所有的才行
实例:

  • SELECT SNAME,SAGE FROM STUDENT WHERE SAGE<ANY(SELECT SAGE FROM STUDENT WHERE SDEPT='CS') AND SDEPT!='CS';查询非计算机系的比计算机系任意一个学生年龄小的学生姓名和年龄,这里只要满足比一个学生的年龄小即可
  • SELECT SNAME,SAGE FROM STUDENT WHERE SAGE<ALL(SELECT SAGE FROM STUDENT WHERE SDEPT='CS') AND SDEPT!='CS';查询非计算机系的比计算机系的所有学生年龄小的学生信息,这里要满足比所有的学生信息都要小,就是比计算机系年龄最小的都要小

带有EXISTS谓词的子查询

EXISTS表示存在的意思,带有EXISTS的子查询步返回任何的数据,只产生逻辑真或者假

  • SELECT Sname From student where EXISTS (SELECT Sname from SC where Sno=student.Sno and Cno='2');查询选择课程2的学生姓名,这里只判断是否存在这样的学生,如果子查询中没有找到课程2这项,那么查到的就是空,子查询只判断是否为true or false,当然还有NOT EXISTS

集合查询

集合操作包括并操作UNION、交操作INTERSECT、差操作EXCEPT

实例:

  • select * from student where Sdept= 'CS' UNION select * from student where Sage>19;查找计算机系的学生以及年龄不大于19岁的学生信息,这里UNION会自动去掉重复的元组,如果想要保留全部的数据需要用UNION ALL
  • select Sno from SC where Cno='1' UNION select Sno from SC where Cno='2';查询选修课程1或者选修课程2的学生学号,这里并集就是去掉重复的元组,使用UNION ALL 可以保留
  • select Sno from SC where Cno='1' Intersect select Sno from SC where Cno='2';查询同时选修课程1和课程2的学生学号

基于派生表的查询

select Sno,Cno from SC,(select Sno,AVG(Grade) from SC Group by Sno) 
AS AVG_SC(avg_Sno,avg_grade)
where SC.Sno=AVG_SC.avg_Sno and SC.Grade>=AVG_SC.avg_grade;

这里的From子句中将会派生出一个AVG_SC表,该表由avg_Sno、avg_grade组成,主查询将SC表和AVG_SC表进行连接,选出修课成绩大于其平均成绩的课程号

注意:如果子查询中没有聚集函数,那么派生表不用指定属性列,子查询后面的列名为其属性,如下:

select Sname from student,(select Sno From SC where Cno='1') AS SCI where student.Sno=SCI.Sno;这里的SCI默认的列属性名是Sno,AS关键词可以省略,但是必须要为派生表指定一个别名。

上一篇下一篇

猜你喜欢

热点阅读