1.简单子查询
1.1 子查询概述
SQL语句最强大的地方就是子查询。子查询是一个嵌套在select,insert,update或delete语句或其他子查询中的查询。基本的子查询分为三类:通过in,any,all修改的比较运算符引入的列表上的子查询;通过未修改的比较运算符引入且必须返回单个值的子查询;通过exists的存在测试的子查询。子查询几乎可以放在任何SQL语句中,任何允许使用表达式的地方都可以使用子查询。
1.2 如何编写子查询概述
首先查出学生“张翰”的班级编号,然后再studentinfo学生表中查询出和“张翰”的班级编号相同的学生编号,姓名和班级编号。
示例:mysql>select id,studentname,classid
from studentinfo where classid =
(select classid from studentinfo where studentname = '张翰');
此查询涉及到学生信息表Studentinfo、学生成绩表Exam、课程表Subject三个表,所以需要根据主外键关系作为查询条件,并指定课程名为“基于c语言理解软件编程”和成绩等于90分。
示例:mysql> SELECT S.StudentName FROM StudentInfo as S
inner join Exam as e
on S.ID=e.StudentID
inner join Subject as sub
on sub.ID =e.SubjectID
where sub.sub jectname = '基于c语言理解软件编程' and e.exam = 90;
2.在UPDATE、DELETE、INSERT语句中使用子查询
子查询除用在SELECT语句中完成复杂查询功能外,还可用在UPDATE、DELETE、INSERT语句中完成复杂的更新、删除、插入功能。在UPDATE、DELETE和INSERT语句中使用子查询和在SELECT语句中使用子查询的原理是一样的,内层子查询的结果作为外层查询的WHERE条件的参考值来使用。
2.1 UPDATE语句中使用子查询更新“李启全”的“基于c语言理解软件编程”成绩为55分。先查询出名为“李启全”的教师编号和“基于C语言理解软件编程”的课程编号,然后作为UPDATE语句的条件。
示例:mysq1>UPDATE Exam SET ExamExam+5
where StudentID =
SELECT ID FROM StudentInfoWHERE StudentName=-'李启全')
AND SubjectID =
SELECT ID FROM Subject WHERE SubjectName--基于C语言理解软件编程'):
2.2 在DELETE中使用子查询与其他语句一样,子查询主要是放在DELETE语句的WHEE条件中,作为除的条作删除“李启全”的所有考试成绩。
示例:mysq1>DELETE FROM EXAM WHERE STUDENTID =(ELECT ID FROM StudentInfo WHERE StudentName=='李启全');
2.3 在INSERT中使用子查询在INSERT语句中使用子查询的主要作用是实现追加子查询,基本语法:INSERTINTO表名(字段列表)SELECT字段列表FROM表名
3.高级查询
3.1 使用=、>等比较运算符时,子查询返回结果只能是一条或空记录,不允许子查询返回多条记录。
3.2 使用EXISTS和NOT EXISTS
> EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果是TUE,此时外层>查询语句将进行查询,如果子查询没有返回任何行,那么EXISTS返回的结果是FALSE,此时外层语句将不进行查询。
> 示例:mysql>select studentid,exam from exam where subjectid=2 and exists(select studentid from exam where exam<60);
> 3.3 使用ALL、ANY/SOME的查询
>
> ALL用在子查询前,通过比较运算符将一个表达式的值或列值与子查询返回的一列值中的每一行进行比较,只要有一次比较的结果为FALSE,则ALL测试>返回FALSE。ALL要求子查询必须返回而且只能返回一个字段。
> 语法格式如下:
>
> 表达式或字段比较运算符ALL(子查询)
>
> 查询成绩比科目编号为“1”的这门课程的所有成绩都大的学生考试信息。
> 示例:mysql>SELECT FROM ExamWHERE Exam ALL (SELECT Exam from EXAM WHERESubjectID=1);
>
> ANY与子查询在一起使用时,按照比较运算符、表达式或字段对子查询的结果的每-行进行一次计算和比较。只要有一次满足条件,那么ANY的结果就 > 是真。当子查询每行的结果与ANY前面的表达式或字段比较结果全为假时,则假。“ANY"与“IN"等效。
>
> 表达式或字段比较运算符any/some(子查询)
> 查询成绩比科目编号为“1”的任意一个成绩都大考试成绩。
>
> 4. 连接查询和子查询的性能比较
> 我们现在学习了连接查询和子查询。一般情况下,子查询都可以用连接查询替换。当处理同样的业务时,既可以使用子查询也可以使用连接查询,但是同样的写法会产生性能的极大差异。实践证明子查询效率特别低,而一般的子查询都可以由连接查询来实现相同的功能,连接查询的效率要提高很多,所以建议在数据查询时避免使用子查询(尤其是在记录很多时),而最好用关联查询来实现。