-- 多表查询:一次查询多张表-- 情况1:合并结果集:把两个结果集通过 union /union all 合并为一个结果集SELECT sname,sex FROM student;SELECT tname,tsex FROM teacher;/*合并结果集:结果集的列数必须相同+对应列的列类型必须一致*//*获取全校师生的名字和性别:去除了重复的行*/SELECT sname,sex FROM student UNIONSELECT tname,tsex FROM teacher;/*获取全校师生的名字和性别:保留所有记录*/SELECT sname 师生名字,sex 师生性别 FROM student UNIONALLSELECT tname,tsex FROM teacher;
3.2 连接查询
-- 情况2:连接查询:同时查询两张表/from后面有两张表-- 笛卡尔积::让两张表的所有记录见面SELECT t.*,s.*FROM teacher t,student s;/*行数=9*47 列数=4+6*/-- r=1+sind@-- 去除垃圾的笛卡尔积行:主表的主键值=从表的外键值/*获取学生及其老师的信息*/-- 方言格式的内连接SELECT t.*,s.*FROM teacher t,student s WHERE t.tid=s.stid;-- 标准格式的内连接SELECT t.*, s.*FROM teacher t INNERJOIN student s ON t.tid=s.stid;-- 左外连接:保证左边表的完整性::/*获取所有老师及其学生的信息*/SELECT t.*,s.*FROM teacher t LEFTJOIN student s ON t.tid=s.stid;SELECT t.*,s.*FROM student s RIGHTJOIN teacher t ON t.tid=s.stid;-- 右外连接:保证右边表的完整性::/*获取所有学生及其老师的信息*/SELECT t.*,s.*FROM teacher t RIGHTJOIN student s ON t.tid=s.stid;
3.3 子查询
-- 情况3:子查询:select嵌套select-- 子select在where后面:作为条件-- 可以使用的运算符:比较运算符:= > >= < <= != (子select获取的是一个值:单行单列)-- 范围判断: in/not in /> all /> any /< all /< any /*获取分数最高的学生的信息*/SELECT*FROM student WHERE score=MAX(score);-- Invalid use of group function/where后面不能出现聚合函数-- 获取最高分SELECTMAX(score)FROM student;-- 获取分数市最高分的学生的信息SELECT*FROM student WHERE score=(SELECTMAX(score)FROM student);/*获取年龄和王三、李四、a3d22eeb相同的所有学生的信息*/-- 获取"王三","李四","王五"个学生的年龄SELECT sage FROM student WHERE sname IN("王三","李四","王五");-- 获取年龄是这个范围内的所有学生的信息SELECT*FROM student
WHERE sage IN(SELECT sage
FROM student
WHERE sname IN("王三","李四","王五"));/*获取和年龄为21的所有学生分数不同的其他所有学生*/SELECT score FROM student WHERE sage=21;SELECT*FROM student
WHERE score NOTIN(SELECT score
FROM student
WHERE sage=21);/*获取比class_2班的所有学生分数高的所有学生*/SELECTMAX(score)FROM student WHERE sclass="class_2";SELECT*FROM student WHERE score >(SELECTMAX(score)FROM student WHERE sclass="class_2");SELECT score FROM student WHERE sclass="class_2";SELECT*FROM student WHERE score >ALL(SELECT score FROM student WHERE sclass="class_2");/*获取比class_2班任意学生分数高的所有学生的信息*/SELECT*FROM student WHERE sclass!='class_2'AND score >ANY(SELECT score FROM student WHERE sclass="class_2");/*获取和class_2班学生性别相同并且姓相同的所有学生*//*获取class_2班学生性别相同并且姓*/SELECTDISTINCT sex,SUBSTRING(sname,1,1) xing FROM student WHERE sclass="class_2";SELECT*FROM student
WHERE sclass!='class_2'AND(sex,SUBSTRING(sname,1,1))IN(SELECTDISTINCT sex,SUBSTRING(sname,1,1) xing
FROM student
WHERE sclass="class_2");/*获取和张三相同性别 相同老师的所有学生的信息*/SELECT sex,stid FROM student WHERE sname="王三";SELECT*FROM student WHERE sname!='王三'AND(sex,stid)=(SELECT sex,stid FROM student WHERE sname="王三");-- 子select在from后面:作为表/*获取女老师及其学生的信息*/SELECT*FROM student s,teacher t WHERE t.tsex='女'AND t.tid=s.stid;SELECT*FROM student s,(SELECT*FROM teacher WHERE tsex='女') t WHERE s.stid=t.tid;-- 子select在select后面:作为结果集的列/*获取所有学生 及其与平均分之间的差值*/SELECT*,score-AVG(score)FROM student;-- 集合函数只能是一个值SELECT*,score-(SELECTAVG(score)FROM student) 差值 FROM student;-- 获取所有学生的信息 并显示学生的最高分SELECT*,(SELECTMAX(score)FROM student) 最高分 FROM student;SELECT*,1FROM student;SELECT*,MAX(score)FROM student;