查询语句是数据库的核心操作。
语法格式:
SELECT [ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
各部分的含义:
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件。 根据该条件筛选出满足条件的元组。
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。
HAVING 语句: 筛选出满足指定条件的组
ORDER BY子句: 对查询结果表按照指定列指的进行排序(升序或降序)
对比关系代数:
就是仅涉及一个表的查询。
①查询指定列: 如,查询学生表中的全部学生的学号和姓名
select sno,sname from Student;
② *
选择所有的列
select * from <表名>
③查询经过计算的值
select子句中的<目标列表达式>
不仅可以是属性列, 也可是:
算数表达式,如:select Sname, 2020-Sage From Student
。 第二列, 是一个计算表达式, 用来计算出几年学生的出生日期。
字符串常量, 函数:查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。
SELECT Sname,'Year of Birth', 2020-Sage, LOWER(Sdept) FROM Student;
列别名: 给上面的查询加个列别名。
①消除取值重复的行
使用DISTINCT短语。
select DISTINCT Sno from Scourse;
②查询满足条件的元组
通过where子句实现。where子句常用的查询条件如下:
如:查询出Cno课分数大于80的学生学号
select Sno from SCourse where Cno='102' and GRADE > 80;
确定范围,查询年龄在19~23(包括19和23)的学生姓名和学号
select Sno, Sname from Student where Age BETWEEN 19 AND 23
确定集合,谓词IN 用来表示属性表示属于指定集合的元组
select Sno, Sname from Student where Age IN (19 ,20, 25)
字符匹配
语法格式:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
通配符:
ESCAPE语句:当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义。
如果LIKE后面不会含有通配符可以用= 取代。 同理 NOT LIKE 可以用!=
取代
查询姓刘的同学
select * from Student Where Sname LIKE '刘_'
注意:根据数据库字符集的不同, 要做出适当的改变。
转义查询:从某个表中查询名字叫S_
的元组,_
要转义
select * from table1 Where a='S\_' ESCAPE '\';
涉及空值的查询
查询102选修课, 成绩为空的学生学号
select Sno from SCourse Where Cno='102' and GRADE IS NULL;
IS NOT NULL 和IS NULL。注意IS不嫩用等号代替。
多重查询
用AND 或OR连接多个查询条件。
如上面那个查询就是多重查询:
select Sno from SCourse Where Cno='102' and GRADE IS NULL;
③ORDER BY子句
ASC 升序[默认], DESC 降序.
这里要注意空值的位置。
select * from SCourse order By GRADE DESC;
按学号升序, 成绩降序
select * from SCourse order By Sno, GRADE DESC;
④聚集函数
计数
COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
计算总和
SUM([DISTINCT|ALL] <列名>)
计算平均值
AVG([DISTINCT|ALL] <列名>)
求最大值
MAX([DISTINCT|ALL] <列名>)
求最小值
MIN([DISTINCT|ALL] <列名>)
如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(默认), 则表示不取消重复值。
当聚集函数哟到空值时, 除了COUNT(*)外, 都跳过空值而只处理非空值。
如下:
⑤使用GROUP BY子句
按指定的一列或多列值分组,值相等的为一组;
对查询结果的分组的目的是为了细化聚集函数的作用对象。如果未分组聚集函数作用的是整个查询结果。 分组后, 聚集函数将作用于每一组, 即每一组都有一个函数值。
如:在选修表中按照学号分组, 查询每个学生选修课的数目
SELECT SNO, COUNT(*) FROM SCourse GROUP BY SNO;
HAVING短语与WHERE子句的区别:
作用对象不同WHERE子句作用于基表或视图,从中选出满足条件的元组。
HAVING短语作用于组,从中选出满足条件的组。
细化聚集函数的作用对象。如果未分组聚集函数作用的是整个查询结果。 分组后, 聚集函数将作用于每一组, 即每一组都有一个函数值。
如:在选修表中按照学号分组, 查询每个学生选修课的数目
SELECT SNO, COUNT(*) FROM SCourse GROUP BY SNO;
HAVING短语与WHERE子句的区别:
作用对象不同WHERE子句作用于基表或视图,从中选出满足条件的元组。
HAVING短语作用于组,从中选出满足条件的组。