数据查询--单表查询(SQL)

    SQL为使用者提供SELECT语句进行数据查询,语句一般格式为:

SELECT [ALL|DISTINCT]<目标列表达式1>,<目标列表达式2>,...
FROM <表名或视图名>
WHERE <条件表达式>
GROUP BY <列名1>
[HAVING <条件表达式>]
ORDER BY <列名> [ASC|DESC];

    语句的含义为:根据WHERE子句的条件表达式从FROM子句指定的表中找出满足条件的元组,然后再按SELECT子句中的目标表达式选出元组中对应的属性值形成目标表。

    如果有GROUP BY 子句,则将结果按<列名>的值进行分组,该属性值相等的元组为一个组。如果GROUP BY 子句后带有HAVING语句,则只有满足HAVING 语句的条件方可输出。

    如果有ORDER BY 子句,结果还要按<列表2>的值进行升(降)序排序操作后输出。

单表查询

    单表查询是指只涉及一个表的查询。 

    下面我们用一个学生的信息表为例讲解。

    表名:Student

SnoSnameSsexSageSdept
学号姓名性别年龄专业
选择表中的若干列查询指定列
  •     查询指定列

     很多情况下,不同用户对于表中的一部分属性感兴趣,这是就可以运用SELECT语句查询用户指定列信息。

    例:查询全体学生的姓名,学号,所在系。

SELECT Sname,Sno,Sdept
FROM Student;

    当然也有一些用户需要对全部信息进行浏览统计:

 SELECT *
 FROM Student;

等价于

SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;

  •     查询计算后的值

    SELECT 子句后的<目标列表达式>不仅可以是列名,也可以是表达式(计算表达式、函数表达式、字符串等)

 SELECT Sname,2018-Sage,LOWER(Sdept)
 FROM Student;

  • 该语句输出的是全体学生的姓名及出生年份,LOWER()函数将其所在专业名转化为小写然后输出。
选择表中的若干元组

  •     消除表中的重复行

    两个本来并不完全相同的元组投影到指定的某些列上时,可能会变成相同的行,这时可以用DISTINCT消除他们:

SELECT DISTINCT Sno
FROM Student;

    用户不指定DISTINCT关键词时,默认为ALL。

SELECT Sno
FROM Student;

等价于

SELECT ALL Sno
FROM Student;
  •     查询满足条件的元组
常用的查询条件
查询条件谓词
比较=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
确定范围BETWEEN AND,NOT BETWEEN AND
确定集合IN,NOT IN
字符匹配LIKE,NOT LIKE
多重条件AND,OR,NOT

例:查询计算机专业全体学生名单。

SELECT Sname
FROM Student
WHERE Sdept='CS';

查询20岁以下的学生姓名及其年龄。

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

确定范围在20~24岁之间的学生姓名、专业和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 24;

查找计算机(CS)、数学(MA)、和信息(IS)专业的学生姓名和性别。

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
ORDER BY 子句

    用户可以用ORDER BY 子句对查询结果进行属性值的升序(ASC)或降序(DESC)进行排序。默认值为升序。

例:查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。

SELECT Sno,Grade
FROM Student
WHERE Cno='3'
ORDER BY Grade DESC;

对于空值,排序时现实的次序由具体系统实现来决定。各个系统的实现可以不同,只要保持一致就行。

聚集函数
    

主要函数
COUNT(*)统计元组个数
COUNT( [DISTINCT|ALL] <列名> )统计一列中值的个数
SUM( [DISTINCT|ALL] <列名> )计算一列值的总和(此列必须是数值型)
AVG( [DISTINCT|ALL] <列名> )
计算一列值的平均值(此列必须是数值型)
MAX( [DISTINCT|ALL] <列名> )
求一列值的最大值
MIN( [DISTINCT|ALL] <列名> )
求一列值的最小值
GROUP BY 子句

    GROUP BY 子句将查询结果按一列或多列的值分组,值相等的为一组。分组后聚集函数将作用于每一个组,即每一个组都有一个函数值。

    如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足条件的组,则可以使用HAVING短语指定筛选条件。

例:查询选修了三门以上课程的学生学号。

SELECT Sno
FROM Student
GROUP BY Sno
HAVING COUNT(*)>3;

WHERE 子句作用于表,从中选出满足条件的组;(WHERE 子句不能用聚集函数作为条件表达式)

HAVING语句作用于组,从中选择满足条件的组。



  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值