SQL 查询(SELECT)

查询是数据库中最频繁的操作了,语句简单,功能强大。
可以对基本表和视图进行查询。

  1. 模板
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM<表名或视图名>[,<表名或视图名>...]|(<SELECT语句)[AS]<别名>
[WHERE<条件表达式>]
[GRUOP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
  1. 简单查询示范
    例:
--查询学号为20125122的学生名字
select Sname
from Student
where Sno='201215126';
--查询Student表中所有记录
select *
from Student;

select后面的是想要查询的属性名,比如在第一个例子中,想查询的结果就是一个学生的名字“Sname”,当然也可以是多个,例如:

--查询专业为“IS”的学生学号和姓名
select Sno,Sname
from Student
where Sdept='CS';

from后面的是想查询的基本表的名称,如上述例子中查询的表都是“Student”
where后面是选择的条件,例如Sage<20、Sno=’…'什么的:

--查询年龄大于20的学生信息
select *
from Student
where Sage>20;

其中的“*”表示显示目标记录的所有属性。

  1. 连接
    上面的例子都是在一个表中进行查询,可以将多个表进项连接再进行查询。
    例:
--查询选了“高等数学”课程的学生学号和姓名
select Student.Sno,Sname
from Student,Course,SC
where Student.Sno=SC.Sno and Course.Cno=SC.Cno and Cname='高等数学';

其中,“Student.Sno=SC.Sno”将表Student和SC根据Sno进行连接,“Course.Cno=SC.Cno”将表Course和SC根据Cno进行连接,这样把三个表都连接在了一起,然后进行条件选择。
需要注意的是,在select一行中,Sno前带有指定的表,因为在Student和SC两个表中都有Sno,所有得带上表名加以区分。

  1. 嵌套
    连接可以做到的,嵌套也可以,而且嵌套因为无需连接,所以效率更高。
    举个简单的例子:
--查询选了课程号为“1”的学生姓名
--使用连接
select Sname
from Student,SC
where Student.Sno=SC.Sno and Cno='1';

--使用嵌套
select Sname
from Student
where Sno in(select Sno
			from SC
			where Cno='1');
  1. 聚集函数
  • 聚集函数是数据库提供的可以直接使用的函数,可以很方便地对数据进行计算。有一些计算在数据库层面就可以完成,相较于将数据导出之后再计算而言,效率更高。
  • 有个问题需要注意。如果使用聚集函数的话,最好直接给相应的列命名。一个聚集函数对应的列,不命名系统也不会报错,但如果有两个聚集函数的列,系统将会报错,强制要求给它们分别命名。

聚集函数有以下几种:

  • COUNT(*),统计元祖个数
  • COUNT([DISTINCT|ALL]),统计一列中值的个数
  • SUM([DISTINCT|ALL]),计算一列值的综合
  • AVG([DISTINCT|ALL]),计算一列值的平均值
  • MAX([DISTINCT|ALL]),求一列值中最大值
  • MIN([DISTINCT|ALL]),求一列值中最小值
    其中的DISTINCT表示除去重复值,默认是ALL。
    例:
--查询选修了课程的学生人数。
select count(distinct sno)
from SC;
--查询选修课程超过2 门课的学生学号和姓名。
select sno,sname
from Student
where sno in(select sno
			from SC
			group by sno
			having count(cno)>2);

在第二个例子中,如果想在选择语句使用聚集函数的话,必须使用having 而不是where。

猜你喜欢

转载自blog.csdn.net/sinat_41909065/article/details/84112682