EXISTS子查询
如何用SQL语句检测temp表是否已经创建?
DROP TABLE IF EXISTS temp;
CREATE TABLE temp (
… … #省略建表语句
) ;
EXISTS子查询的语法
SELECT …… FROM 表名 WHERE EXISTS(子查询);
子查询有返回结果: EXISTS子查询结果为TRUE
子查询无返回结果: EXISTS子查询结果为FALSE,
外层查询不执行
子查询注意事项
任何允许使用表达式的地方都可以使用子查询
嵌套在父查询SELECT语句的子查询可包括
SELECT子句
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
分组查询用法
掌握GROUP BY子句实现分组查询
SELECT …… FROM <表名>
WHERE ……
GROUP BY ……
SELECT列表中只能包含:
1.被分组的列
2.为每个分组返回一个值的表达式,如聚合函数
分组筛选
SELECT …… FROM <表名>
WHERE ……
GROUP BY ……
HAVING……
WHERE与HAVING对比
WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句
用来分组 WHERE 子句的输出
HAVING子句
用来从分组的结果中筛选行
常用的多表连接查询
内连接(INNER JOIN)
外连接
左外连接 (LEFT JOIN)
右外连接 (RIGHT 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`);
三表内连接
SELECT S.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩
FROM student AS S
INNER JOIN `result` AS R ON (S.`studentNo` = R.`studentNo`)
INNER JOIN `subject` AS SU ON (SU.subjectNo=R.subjectNo);
左外连接
主表(左表)student中数据逐条匹配表result中的数据
1.匹配,返回到结果集
2.无匹配,NULL值返回到结果集
SELECT S.studentName,R.subjectNo,R.studentResult
FROM student AS S
LEFT JOIN result AS R
ON S.studentNo = R.studentNo;
右外连接
右外连接的原理与左外连接相同
右表逐条去匹配记录;否则NULL填充
CREATE TEMPORARY TABLE 表名(查询语句);
临时表只在当前连接可见,连接关闭自动删除,修改临时表数据不影响原表数据
联合查询 union