1,EXISTS子查询
a, DROP TABLE IF EXISTS temp;#检测temp表是否已经创建
CREATE TABLE temp(.......);
b, 语法 SELECT .....FROM 表名 WHERE EXISTS(子查询);为TRUE有返回结果,为FALSE无返回结果,外层查询不执行。
2,GROUP BY子句实现分组查询
SELECT .... FROM <表名>
WHERE .....
GROUP BY ....
例:SELECT `subjectNo`,AVG(`studentResult`) AS 课程平均成绩
FROM `result`
GROUP BY `subjectNo`;
多列分组例:
SELECT `gradeld` AS 年级编号,`sex` AS 性别,COUNT(*) AS 人数
FROM `student`
GROUP BY `gradeld`,`sex`
ORFER BY `gradeld`;
3,分组筛选语句 SELECT ....... FROM<表名>
WHERE.....
GROUP BY.....
HAVING....
例:SELECT `subiectNo`,AVG(`studentResult`)AS 课程平均成绩
FROM `result`
GROUP BY `subjetNo`
HAVING AVG(`studentResult`)>=60;
4,在SELECT语句中,WHERE,GROUP BY,HAVING子句的执行次序:
a,WHERE子句用来筛选FROM子句中指定的操作所产生的行和从数据源中去掉不符合其搜索条件的数据。
b,GROUP BY子句用来分组WHERE子句的输出和搜集数据到各个组中。
c,HAVING子句用来从分组的结果中筛选行和去掉不符合其组搜索条件的各组数据行。
5,常用的多表连接查询
内连接(INNER JOIN)
SELECT ... FROM 表1 INNER JOIN 表2 ON.......等价于 SELECT .... FROM 表1,表2 WHERE...
例:SELECT`student`.`studentName`,`result`.`subjectNo`,`result`.`studentResult`
FROM `student`,`result`
WHERE `student`.`studentNo` = `result`.`studentNo`;
SELECT S.`studentName`,R.`subjectNo`,R.`studentResult`
FROM `student` AS S
INNER JOIN `result` AS R ON (S.`studentNo` = R.`studentNo`);
三表内连接:SELECTS.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩
FROMstudent AS S
INNER JOIN `result` AS R ON (S.`studentNo` = R.`studentNo`)
INNER JOIN `subject` AS SU ON(SU.subjectNo=R.subjectNo);
外链接:左外连接(LEFT JOIN)
SELECT S.studentName,R.subjectNo,R.studentResult
FROM resultAS R
LEFT JOIN student AS S
ON S.studentNo = R.studentNo;
右外连接(RIGHT JOIN)
SELECT图书编号,图书名称,出版社名称
FROM 图书表
RIGHT JOIN 出版社表
ON 图书表.出版社编号 = 出版社表.出版社编号;