目标数据库结构
1.not in的使用
我们先来看看例子:
5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.SID,Student.Sname
from Student
where SID not in (select distinct(SC.SID) from SC,Course,Teacher
where SC.CID=Course.CID and Teacher.TID=Course.TID and Teacher.Tname='叶平');
NOT IN运算符允许从结果集中排除特定值的列表。就像这一题中,not in 运算符后面查找得到的结果是学过叶平老师的课的同学的学号和姓名。
接下来是对not in运算符的补充。
(1)or 运算符
当要比较具有多个值的列时,使用IN运算符。
例如,您可能需要选择来自纽约,洛杉矶和芝加哥的所有客户。
使用OR条件,您的SQL将如下所示:
SELECT * FROM customers
WHERE City = 'New York'
OR City = 'Los Angeles'
OR City = 'Chicago';
结果:
(2)in 运算符
可以使用单个IN条件而不是多个OR条件实现相同的结果:
SELECT * FROM customers
WHERE City IN ('New York', 'Los Angeles', 'Chicago');
这也将产生相同的结果:
注意在语法中使用括号。
2.as的用法以及exists()
举例如下:
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select Student.SID,Student.Sname
from Student,SC
where Student.SID=SC.SID and SC.CID='001'and exists(
Select * from SC as SC_2 where SC_2.SID=SC.SID and SC_2.CID='002');
在这道例题中使用了as 和 exists(),首先,as的用法比较简单,在这里as的作用是将子查询中的SC表的名字改为它的别名SC_2,这样做的目的是为了和主查询的SC表区分开。
而exists()的用法为:指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,在例题中,首先根据主查询中的条件查找出结果,然后再执行子查询,把主查询查找出来的结果的每一行数据与子查询条件进行对比,依次判断where后面的条件是否成立。如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。
3.Count()函数
举例如下:
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select SID,Sname
from Student
where SID in (select SID from SC ,Course ,Teacher
where SC.CID=Course.CID and Teacher.TID=Course.TID and Teacher.Tname='叶平'
group by SID having count(SC.CID)=(select count(CID) from Course,Teacher
where Teacher.TID=Course.TID and Tname='叶平'));
count()函数用来返回指定列的值的数量。这题就是首先用子查询查找出叶平老师教的课的数量,然后查找分数表,课程表和老师表的集合后的表,首先查出上过叶平老师课的学生的所有记录,其中肯定有学生不止上过一次叶平老师的课,根据SID分组,再计算每组中的选课数与叶平老师的是否相同。