数据库-SQL练习3

SELECT:
【例3.29】

SELECT *
FROM Student
WHERE Sno LIKE '201215121';

等价于(注意‘’里别多填了空格)

SELECT *
FROM Student
WHERE Sno='201215121';

如果后面的匹配串中不含通配符,则可以用=运算符取代LIKE,用!=或<>(不等于)运算符取代NOT LIKE。

SELECT *
FROM Student
WHERE Sno NOT LIKE '201215121';
/*等价于*/
SELECT *
FROM Student
WHERE Sno<>'201215121';
/*等价于*/
SELECT *
FROM Student
WHERE Sno!='201215121';

【例3.30】查询所有姓刘的同学的姓名、学号和性别。

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';

%表示任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b为结尾的任意长度的字符串,如acb,addgs,ab,a等都满足该匹配串。
在这里插入图片描述
【例3.31】

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';

_表示任意单个字符。例如a_b表示以a开头,以b结尾的长度为3的任意字符串。在SQL server中‘欧阳’也满足,也可以查询出来。
在这里插入图片描述
【例3.32】

SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_阳%';

在这里插入图片描述
【例3.33】

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname  NOT LIKE '刘%';

所有不以刘开头的都被找到。
在这里插入图片描述
【例3.34】

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';

ESCAPE’‘表示’'为转码字符,这样匹配串中紧跟在“\”后面的字符“”不再具有通配符的意义,转义为普通的“”字符。
在这里插入图片描述
【例3.35】

SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE'\';

这里的匹配串’DB_%i__’,第一个_前面有换码字符’’,所以它被转义为普通的_字符。而i后面的两个_的前面均没有换码字符,所以它们都作为转义字符。结果显示‘DB_i’、‘DB_Desig’都满足该语句。
在这里插入图片描述
【例3.36】

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;  /*分数Grade是空值*

注意这里的”IS“不能用”=“代替。
在这里插入图片描述
【例3.37】

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;  /*成绩不为空*/

在这里插入图片描述
【例3.38】

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

在这里插入图片描述
逻辑运算符AND和OR可以用来连接多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。
在例3.27中的IN谓词实际上是多个OR运算符的缩写,因此该例子中的查询也可以用OR运算符写成如下形式:

SELECT Sname,Ssex
FROM Student
WHERE Sdept='CS'OR Sdept='MA'OR Sdept='IS';

【例3.39】

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;  /*按成绩降序*/

用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。对于空值,SQL serer中,按降序排,空值的元组最后显示;按升序排,空值的元组最先显示。
在这里插入图片描述

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade ;  /*按成绩升序*/

在这里插入图片描述
【例3.40】

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;   /*先按系号升序排列,再按年龄降序排列*/

在这里插入图片描述
【例3.41】

SELECT COUNT(*)
FROM Student;

聚集函数COUNT(*):统计元组个数。
【例3.42】

SELECT COUNT(DISTINCT Sno)
FROM SC;

学生每选修一门课,在SC中都有一条相应的记录。一个学生要选多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。
DISTINCT短语表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或ALL短语(ALL为默认值,表示不取消重复列),则表示不取消重复值。
聚集函数COUNT([DISTINCT|ALL] <列名>):统计一列中值的个数。
【例3.43】

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

在这里插入图片描述
聚集函数AVG([DISTINCT|ALL] <列名>):计算一列的平均值(此列必须是数值型)。
【例3.44】

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

聚集函数MAX([DISTINCT|ALL] <列名>):求一列值中的最大值。
【例3.45】

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

聚集函数SUM([DISTINCT|ALL] <列名>):计算一列的总和(此列必须是数值型)。
当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。
COUNT(*)函数是对元组进行计数,某个元组的一个或部分列取空值不影响COUNT的统计结果。
注意:WHERE子句中是不能用聚集函数作为条件表达式的,聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。
【例3.46】

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

该语句对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后对每一组作用聚集函数COUNT进行计算,以求得该组的学生人数。如果分组后还要按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。
在这里插入图片描述
【例3.47】

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

这里先用GROUP BY子句按Sno进行分组,再用聚集函数COUNT对每一组计数;HAVING短语给出了选择组的条件,只有满足条件(元组>3,表示此学生选秀的课程超过3门)的组才会被选出来。
WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组,HAVING短语作用于组,从中选择满足条件的组。
【例3.48】查询平均成绩大于等于90分的学生学号和平均成绩。

/*下面语句不对*/
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
/*提示出错:聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。*/

因为WHERE子句中是不能用聚集函数作为条件表达式的,正确语句是:

SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

总结(HAVING子句前边的语句末尾不要加“;”,会提示错误。还有一个典型就是符号空格之类的必须是英文的)
用时:3小时多点吧(这次用时比上次还少点,慢慢也找到写作业快的窍门了,就是先根据题在软件上测试运行,得到想要的结果后再在博客中把代码粘贴过来,后边写上总结或截图。之前的我先在博客里打代码再去软件测试,感觉非常慢,思路也不清晰。这次作业写得感觉比上次稍微舒服了点)

发布了6 篇原创文章 · 获赞 10 · 访问量 5358

猜你喜欢

转载自blog.csdn.net/qq_45265330/article/details/104861717