第三章:关系数据库标准语言sQL 数据库查询
第三章:关系数据库标准语言SQL 数据库查询 1
SELE0T语句语法格式 结果集中可以 结果集中只能 包含重复行 包含唯一行 从基本结果集中 返回额外的行 SELECTLALL DISTINC [TOP( expression )[ PERCENT[ WITH TIES J] *指定要选择的列及其限定* INTO new table /*ⅠNTO子句,指定结果存入新表* FROM table source I /*FROM子句,指定表或视图* [WHERE Search condition /* WHERE子句,指定查询条件* I GROUP BY group by expression /* GROUP BY子句,指定分组表达式* [HAVING Search condition /* HAVING子句,指定分组统计条件* ORDER BY order_expression LASC I DESC ]] /* ORDER BY子句,指定排序表达式和顺序* 升序 降序
2 SELECT [ ALL | DISTINCT ] [ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ] /*指定要选择的列及其限定*/ [ INTO new_table ] /*INTO 子句,指定结果存入新表*/ [ FROM table_source ] /*FROM 子句,指定表或视图*/ [ WHERE search_condition ] /*WHERE 子句,指定查询条件*/ [ GROUP BY group_by_expression] /*GROUP BY 子句,指定分组表达式*/ [ HAVING search_condition] /*HAVING 子句,指定分组统计条件*/ [ ORDER BY order_expression [ ASC | DESC ] ] /*ORDER BY 子句,指定排序表达式和顺序*/ SELECT语句语法格式 结果集中可以 包含重复行 结果集中只能 包含唯一行 从基本结果集中 返回额外的行 升序 降序
SELE0T语句的处理顺序 FRO 所有被使用的子句必须按语法说 ON 12345678 明中显示的顺序严格的排序。 JOI WHERE GROUP BY WITH CUBE或 WITH ROLLUP HAVING SELECT DISTINCT ORDER BY 11 TOP
3 所有被使用的子句必须按语法说 明中显示的顺序严格的排序。 1 FROM 2 ON 3 JOIN 4 WHERE 5 GROUP BY 6 WITH CUBE 或 WITH ROLLUP 7 HAVING 8 SELECT 9 DISTINCT 10 ORDER BY 11 TOP SELECT语句的处理顺序
sELECT ist语句语法格式 返回标识列返回行GUD列 /*选择当前表或视图的所有列*/ I table name view_hame table_alias f *选择指定的表或视图的所有列* I( column name SIDENTITY SROWGUID 3 /*选择指定的列* udt column name[.: property name field name method name( argument [,n))] 用户定义类型用户定义类型的方 /*选择用户定义数据类型的属性、方法和字段 (列的名称 法、属性或字段 expression [AS column alias 替换列名的 /*AS子句,定义列别名*/ 可选名 I column alias= expression /*选择指定列并更改列标题*
SELECT_list语句语法格式 ::= { * /*选择当前表或视图的所有列*/ | { table_name | view_name | table_alias }.* /*选择指定的表或视图的所有列*/ | { { column_name | $IDENTITY | $ROWGUID } /*选择指定的列*/ | udt_column_name [ { . | :: } { { property_name | field_name }| method_name ( argument [ ,...n] ) } ] /*选择用户定义数据类型的属性、方法和字段 */ | expression [ [ AS ] column_alias ] /*AS 子句,定义列别名*/ } | column_alias = expression /*选择指定列并更改列标题*/ } [ ,...n ] 返回标识列 返回行 GUID 列 用户定义类型 列的名称 用户定义类型的方 法、属性或字段 替换列名的 可选名 4
选择所有列 EG:查询 PXSCJ数据库中XSB表的所有数据。 SELECT* FROM XSB 2、选择表中指定的列 EG:查询 PXSCJ数据库的XSB表中各个同学的姓名、专业和总学分。 SELECT XSB. Stu ID XSB Sname XSB. Tcredit FROM XSB 3、消除结果集中的重复行 EG:查询XSB表中的专业,消除结果集中重复行。 SELECT DISTINCT XSB. Major FROM XSB 比较:查询XSB表中的专业和性别,消除结果集中重复行。 SELECT DISTINCT XSB. Major, XSB Ssex FROM XSB
5 1、选择所有列 EG:查询PXSCJ数据库中XSB表的所有数据。 SELECT * FROM XSB; 2、选择表中指定的列 EG:查询PXSCJ数据库的XSB表中各个同学的姓名、专业和总学分。 SELECT XSB.Stu_ID,XSB.Sname,XSB.Tcredit FROM XSB; 3、消除结果集中的重复行 EG:查询XSB表中的专业,消除结果集中重复行。 SELECT DISTINCT XSB.Major FROM XSB; 比较:查询XSB表中的专业和性别,消除结果集中重复行。 SELECT DISTINCT XSB.Major,XSB.Ssex FROM XSB;
4、定义列别名 EG:查询XSB表中学生的学号、姓名和总学分,结果中各列的标题分别指定 为“学号”、“姓名”和“总学分”。 SELECT XSB. Stu Id as学号XSB. Sname as姓名,XSB. Credit as总学分 FROM XSB 5、限制结果集返回行数 EG:查询XSB表中学生的姓名、专业和总学分,返回结果集的前6行。 SELECT TOP(6) XSB Sname, XSB. Major, XSB. Tcredit FROM XSB 比较:查询XSB表中学生的姓名、专业和总学分,返回结果集的前6%行。 SELECT TOP(6 PERCENT XSB Sname, XSB. Major, XSB. Tcredit FROM XSB 6
6 4、定义列别名 EG:查询XSB表中学生的学号、姓名和总学分,结果中各列的标题分别指定 为“学号”、“姓名”和“总学分”。 SELECT XSB.Stu_ID AS 学号,XSB.Sname AS 姓名,XSB.Tcredit AS 总学分 FROM XSB; 5、限制结果集返回行数 EG:查询XSB表中学生的姓名、专业和总学分,返回结果集的前6行。 SELECT TOP(6) XSB.Sname,XSB.Major,XSB.Tcredit FROM XSB; 比较:查询XSB表中学生的姓名、专业和总学分,返回结果集的前6%行。 SELECT TOP(6)PERCENT XSB.Sname,XSB.Major,XSB.Tcredit FROM XSB;
6、替换查询结果中的数据 EG:查询XSB表中学生的学号、姓名和总学分,对总学分按以下规则替换 若总学分为空值,则替换为“尚未选课”;若总学分小于50,则替换为“不 合格”;若总学分在50与52之间,则替换为“合格”;若总学分大于52,则 替换为“优秀”。列标题更改为“等级”。 SELECT XSB. StU id, XSB Sname,等级= CASE WHEN XSB. Tcredit IS NULL then尚未选课 WHEN XSB. Credit=50 and XSB. Tcredit<=52 tHeN 'At' ELSE'优秀 END FROM XSB
7 6、替换查询结果中的数据 EG:查询XSB表中学生的学号、姓名和总学分,对总学分按以下规则替换: 若总学分为空值,则替换为“尚未选课”;若总学分小于50,则替换为“不 合格”;若总学分在50与52之间,则替换为“合格”;若总学分大于52,则 替换为“优秀”。列标题更改为“等级”。 SELECT XSB.Stu_ID,XSB.Sname,等级= CASE WHEN XSB.Tcredit IS NULL THEN '尚未选课' WHEN XSB.Tcredit =50 and XSB.Tcredit <=52 THEN '合格' ELSE '优秀' END FROM XSB;
7、计算列值 EG:按150分计算成绩并查询学生的成绩情况。 SELECT CJB. StU d cjb.c id成绩 CJB Grade*1.5 FROM CJB ECx: SELECT CJB. Stu ID, CJB. C ID, CJB Grade=CJB Grade*1.5 FROM CJB 8、聚合函数 (1)SUM和AVG SUM/AVG(LALLI DISTINCT] expression SUM/AVG在计算时,忽略NULL值。 8
8 7、计算列值 EG:按150分计算成绩并查询学生的成绩情况。 SELECT CJB.Stu_ID,CJB.C_ID,成绩=CJB.Grade*1.5 FROM CJB; 比较:SELECT CJB.Stu_ID,CJB.C_ID,CJB.Grade=CJB.Grade*1.5 FROM CJB; 8、聚合函数 (1)SUM 和 AVG SUM/AVG ( [ ALL | DISTINCT ] expression ) SUM/AVG在计算时,忽略NULL值
EG:求学号为081101的学生所学课程的平均成绩和总成绩。 SELECT AVG( CJB Grade)AS平均成绩SUM( CJB Grade)AS总成绩 FROM CJB WHERE CJB. Stu Id=081101 (2)MAX和MIN MAX/MIN (ALLI DISTINCT expression MAX/MIN在计算时,忽略NULL值。 EG:求选修101课程的学生的最高分和最低分 SELECT MAX( CJB Grade)AS最高分 MIN(CJB Grade)AS最低分 FROM CJB WHERE CJB. C ID=101
9 EG:求学号为081101的学生所学课程的平均成绩和总成绩。 SELECT AVG(CJB.Grade) AS 平均成绩,SUM(CJB.Grade) AS 总成绩 FROM CJB WHERE CJB.Stu_ID='081101'; (2)MAX 和 MIN MAX/MIN ( [ ALL | DISTINCT ] expression ) MAX/MIN在计算时,忽略NULL值。 EG:求选修101课程的学生的最高分和最低分。 SELECT MAX(CJB.Grade) AS 最高分,MIN(CJB.Grade) AS 最低分 FROM CJB WHERE CJB.C_ID='101';
(3) COUNT COUNT(LALL DISTINCT J expression)I*) COUNT在计算时,忽略NULL值; COUNT(*)返回总数目,包含空值。 EG:求学生的总数。 SELECT COUNT() FROM XSB EG:统计备注不为空的学生数。 SELECT COUNT(XSB Remark) FROM XSB EG:求选修了课程的学生总数。 SELECT COUNT(DISTINCT CJB. Stu ID) FROM CJB 10
10 (3)COUNT COUNT{ ( [ ALL | DISTINCT ] expression ) | *} COUNT在计算时,忽略NULL值;COUNT(*)返回总数目,包含空值。 EG:求学生的总数。 SELECT COUNT(*) FROM XSB; EG:统计备注不为空的学生数。 SELECT COUNT(XSB.Remark) FROM XSB; EG:求选修了课程的学生总数。 SELECT COUNT(DISTINCT CJB.Stu_ID) FROM CJB;