数据查询是数据库的核心操作,一般格式为
select [all|distinct]<目标列表表达式>[,<目标列表表达式>]
FROM<表名或者视图名>[,<表名或视图名>]|(<SELECT>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>] [HAVING<条件表达式>]
[ORDER BY<列名2> [ASC|DESC]];
整个SELECT语句的含义是,根据where 子句的表达式从from 子句中指定表查找满足的数据,在用select子句中的目标表达式选出元组中的属性值形成结果表。
如果有Group by子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组,通常会在每个组中作用聚合函数,如果Group by 子句带having 短语,则值要满足指定条件的组及以输出。
如果有order by 子句,则结果还会按照列名2的值按照升序或者降序进行排序。
select 语句既可以完成简单的单表查询,也可以完成连接查询和嵌套查询
以学生表为例(单表)
查询全体学生学号和姓名
select number,name from student;
查询全体学生的姓名、学号、所在系
select name,number,dept from student;
查询全校学生的详细记录
select * from student;
查询全体学生的姓名其及出生年月
select name,2020-age from student
查询结果中第二列不是个列名而是计算表达式,是用当前年份2020减去学生年龄。<目标列表表达式>不仅科可以是算术表达式,还可以是字符串
选择表中的若该元组
(1)消除取值重复的行
两个本来并不完全相同的元组在投影到指定的某些列上后,可以会变成相同的行。可以用DISTINCT消除
select distinct number from sc;
where子句常用的查询条件
查询条件 | 谓词 |
比较 | =,>,<,>=,<=,!=,<>,!>;NOT+上述比较运算符 |
确定范围 | between and,not between and |
确定集合 | in,not in |
字符匹配 | like,not like |
空值 | is null,is not null |
多重条件(逻辑运算) | and,or,not |
查询年龄不在21~24岁之间的学生姓名、系别、年龄
select name sex from student where not between 21 and 24;
%代表任意长度的字符串,例如a%b表示以a开头b结尾任意长度的字符串
_代表任意单个字符 例如a_b表示以a开头b结尾长度为3的字符串
Order by 子句
用户可以用order by子句对查询结果按照一个或者多个属性列的升序(asc)或降序(DESC)默认为升序
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
select * from student order by dept,age,desc;
Group by 句子
Group by子句将查询结果按某一列或多列的值分组,值相等的为一组。
对查询结果分组的目的是为了细化聚集函数的作用对象,如果未对查询结果分组,聚集函数将作用于整个查询结果,分组后聚集函数将作用于每个组
select number ,count(number) from sc group by number;