一、数据查询的一般格式:
二、单表查询
1. 查询指定列与计算的值
(1) 查询指定列:只需在SELECT子句中加入要查询指定列字段即可,有时会根据题意要求去从,那么得在字段前添加DISTINCT关键字。
SELECT DISTINCT Sno FROM SC;
(2) 查询经过计算的值:在SELECT子句中的目标列表达式可以为如下:
- 算术表达式
- 字符串常量
- 函数
- 列的别名
SELECT Sname,2009-Sage --查询算术表达式结果 FROM Student; SELECT Sname,'Year of Birth:' --查询字符串常量 FROM Student; SELECT Sname,LOWER(Sdept) --查询经过函数处理的字段信息结果 FROM Student; --查询结果为列的信息,不过视图上列名为别名 SELECT Sname AS NAME,’Year of Birth: ’ AS BIRTH FROM Student;
2. 查询满足条件的元组
(1) 比较大小
查询谓词:=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
SELECT COUNT(Jno) AS '项目总数' FROM SPJ WHERE Sno = 'S1';
(2) 确认范围:
查询谓词:BETWEEN AND,NOT BETWEEN AND
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
(3) 确认集合:
查询谓词:IN , NOT IN
SELECT Sname,Ssex FROM Student WHERE Sdept IN ( 'IS','MA','CS' );
(4) 字符匹配
查询谓词:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
匹配串为含通配符的字符串
%:代表任意长度(长度可以为0)的字符串
_:代表单个字符
--查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%'; --查询姓"欧阳"且全名为三个汉字的学生的姓名。 SELECT Sname FROM Student WHERE Sname LIKE '欧阳_';
使用换码字符ESCAPE将通配符转义为普通字符
--查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。 SELECT * FROM Course WHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ‘;
(5) 空值查询
查询谓词:IS NULL 或 IS NOT NULL
SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
(6) 多重条件查询
查询谓词:AND和OR来联结多个查询条件,其中查询条件又可包含上述的查询条件。
SELECT Sname FROM Student WHERE Sdept= 'CS' AND Sage<20;
3. ORDER BY ... DESC/ASC (缺省值为升序)
表示对查询结果的升降序显示,ASC为升序,DESC为降序。
SELECT Sno,Grade FROM SC WHERE Cno= ' 3 ' ORDER BY Grade DESC;
注意:
- 当排序列含空值时,ASC:排序列为空值的元组最后显示,DESC:排序列为空值的元组最先显示。
- ORDER BY 不能在子查询中使用,由于ORDER BY是对查询结果的排序。
4. GROUP BY ... HAVING ...
其作用对象是查询的中间结果表,最终结果表为按指定条件对查询结果的分组结果。
GROUP BY后为分组依据(字段名),被指定的一列或多列值分组,值相等的为一组;HAVING后多为聚合函数满足条件,聚合函数将会分别作用于前面根据分组依据分完组的每个组。
/*查询供应了3个以上项目的供应商代码和供应的项目总数。*/ SELECT Sno, COUNT(DISTINCT Jno) AS '项目总数' FROM SPJ GROUP BY Sno HAVING COUNT(DISTINCT Jno) > 3;
注意:
- 使用Group By子句后,Select子句的字段列表达式只能是分组依据和聚集函数
- HAVING短语与WHERE子句的主要区别是作用对象不同,其中WHERE子句作用于基表或视图,从中选择满足条件的元组,而HAVING短语作用于组,从中选择满足条件的组
5. 聚合函数
计数:
COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
计算总和:
SUM([DISTINCT|ALL] <列名>)
计算平均值:
AVG([DISTINCT|ALL] <列名>)
最大最小值:
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
SELECT COUNT(Jno) AS '项目总数' FROM SPJ WHERE Sno = 'S1';
注意:只能在SELECT子句中或HAVING后使用。
二、连接查询
1. 等值与非等值查询