文章目录
SELECT语句是SQL中最重要的一条命令,可以完成基于基本表和视图的信息检索。
SELECT语句的语法为:
SELECT [ALL|DISTINCT] 目标列,…
FROM 表名|视图名,…
[WHERE 条件]
[GROUP BY 分组列名 [HAVING 条件]]
[ORDER BY 排序列名 [ASC|DESC]]
- 整个语句的含义是:根据WHERE子句的条件,从FROM子句指定的基本表或视图中找出满足条件的元组,按指定的目标列形成输出结果。
- 若有GROUP BY子句,则将满足WHERE条件的元组按分组列的值进行分组(分组列值相等的元组在一个组中),然后在各组中进行聚集。若GROUP BY带有HAVING子句,则只输出满足HAVING条件的结果。常用聚集函数有COUNT、SUM、AVG、MAX、MIN,分别表示计数、求和、求平均值、求最大值、求最小值。
- 若有ORDER BY子句,则将结果按排序列的值进行排序。ASC为升序,DESC为降序,默认为ASC。
单表查询是指仅涉及一个表的查询。
连接查询是指同时涉及两个以上表的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。
嵌套查询是指将一个SELECT语句嵌套在另一个SELECT语句的WHERE或HAVING子句中的查询,其中,外层查询称为父查询,内层查询称为子查询。嵌套查询分为:
- 不相关子查询:子查询的查询条件不依赖于父查询,求解过程由里向外。
- 相关子查询:子查询的查询条件依赖于父查询,求解过程由外向里。
子查询可以带有IN谓词、六种比较运算符、ALL谓词、ANY谓词、EXISTS谓词,其中EXISTS表示存在量词 , 它 表 示 若 内 层 查 询 结 果 非 空 , 则 外 层 W H E R E 子 句 返 回 t r u e , 否 则 返 回 f a l s e 。 E X I S T S 表 示 存 在 量 词 ,它表示若内层查询结果非空,则外层WHERE子句返回true,否则返回false。EXISTS表示存在量词 ,它表示若内层查询结果非空,则外层WHERE子句返回true,否则返回false。EXISTS表示存在量词,该类子查询的目标列为*,表示若内层查询结果非空,则外层WHERE子句返回true,否则返回false。T-SQL中没有全称量词",但带有全称量词的谓词可以转换为等价的带有存在量词的谓词:("x)P≡Ø($x(ØP))。
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可以进行并UNION、交INTERSECT和差EXCEPT等集合操作,参加集合操作的各结果表的列数必须相同且对应列的数据类型也必须相同。T-SQL只支持UNION集合操作。
1.单表查询
⑴ 选择表中的若干列
SELECT * FROM Course;
SELECT * FROM SC;
SELECT * FROM Student;
⑵ 选择表中不重复的元组
SELECT DISTINCT(Sno) FROM SC;
⑶ 选择表中满足条件的元组
1、
SELECT *FROM SC WHERE Sno='20121521';
2、
SELECT Sname FROM Student WHERE Sage BETWEEN 18 AND 19;
3、
SELECT Sno FROM SC WHERE Cno IN (1,3);
4、
--%匹配任意长度
--_匹配单个字符
SELECT * FROM Course WHERE Cname LIKE '数据%';
SELECT * FROM Course WHERE Cname LIKE '数据_';
SELECT * FROM Course WHERE Cname LIKE '%系统';
5、
SELECT Cname FROM Course WHERE Cpno is null;
6、
SELECT Sno FROM SC WHERE Grade >= 80;
⑷ 使用Order By子句对查询结果进行排序
SELECT Sno,Grade FROM SC ORDER BY Sno ASC,Grade DESC;
⑸ 使用聚集函数查询
⑹ 使用GROUP BY子句进行分组查询
--选修人数大于等于两人的课程
SELECT Cno Course,COUNT(Sno) AS 人数 FROM SC GROUP BY Cno HAVING COUNT(Sno)>=2;
2.多表查询
⑴ 等值连接查询
SELECT * FROM SC X,Student Y WHERE Y.Sno=X.Sno;
SELECT X.*,Y.* FROM SC X,Student Y WHERE Y.Sno=X.Sno;
SELECT Y.Sname,X.Grade FROM SC X,Student Y WHERE Y.Sno=X.Sno AND X.Sno='20121521';
⑵ 自然连接查询
SELECT SC.Sno,Cno,Grade,Sname,Ssex,Sage,Sdept FROM SC,Student Y WHERE Y.Sno=SC.Sno;
⑶ 外连接查询
--无任何选课记录也要显示其基本信息
SELECT Student.Sno,Cno,Grade,Sname,Ssex,Sage,Sdept FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
3.嵌套查询
⑴ 不相关子查询
--查询选修了3号课程的学生信息
SELECT * FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno=3);
⑵ 相关子查询
【例】查询至少销售了商店s02所销售的全部商品的商店号。执行代码及结果如图3-17所示。
4. 使用UNION的集合查询
SELECT * FROM Student WHERE Sdept='CS'
UNION
SELECT * FROM Student WHERE Sdept='IS'