EXISTS子查询的语法
问题:如何用sql语句检测temp表是否已经创建?
方法一:这句话的意思是如果这个表存在,就删除
DROP TABLE IF EXISTS temp;
方法二:子查询的语法
语法:SELECT …… FROM 表名 WHERE EXISTS(子查询);
子查询有返回结果:exists 子查询结果为True
子查询无返回结果:exists 子查询结果为FALSE,外层查询不执行
题目:检查“Logic Java”课程最近一次考试成绩
如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数
分析:采用EXISTS检测是否有人考试成绩达到80分以上
如果有,使用SELECT语句按成绩从高到低排序,显示前5名学员学号和成绩
题目:检查“Logic Java”课程最近一次考试成绩
如果全部未通过考试(60分及格),认为本次考试偏难,计算的该次考试平均分加5分
子查询的注意事项:
任何允许使用表达式的地方都可以使用子查询
嵌套在父查询SELECT语句的子查询可包括
SELECT子句
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
题目:为每个学生制作在校期间每门课程的成绩单,
要求每个学生参加每门课程的最后一次考试成绩作为该生本课程的最终成绩
成绩单的数据项 学生姓名 课程所属的年级名称 课程名称 考试日期 考试成绩
分组查询用法
语法:SELECT …… FROM <表名> WHERE …… GROUP BY ……
题目:
统计每门课程平均分各是多少?
学号 课程编号 成绩
10000 1 71
10001 1 60
10004 1 93
10000 2 46
10002 2 60
10007 2 95
10001 3 83
10003 3 95
多列分组
分别统计每个年级男、女生人数
分组筛选
语法:SELECT …… FROM <表名> WHERE …… GROUP BY …… HAVING……
示例:
WHERE与HAVING对比
WHERE子句 用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句 用来分组 WHERE 子句的输出
HAVING子句 用来从分组的结果中筛选行
如何同时从这两个表中取得数据?
学号 |
姓名 |
年级 |
… |
001 |
张青裁 |
1 |
|
002 |
陈刚 |
1 |
|
003 |
苏三东 |
1 |
|
学号 |
科目 |
分数 |
001 |
2 |
60 |
002 |
2 |
70 |
003 |
4 |
80 |
常用的多表连接查询
内连接(INNER JOIN)
外连接
左外连接 (LEFT JOIN)
右外连接 (RIGHT JOIN)
内连接(INNER JOIN)
内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行
示例:
结果是:
内联的写法直联的写法三表联查
左外连接:
以左边的表为主,当右边表没数值时,会返回none
题目:
查询张三发布的所有出租房屋信息,并显示房屋分布的街道和区县
连接查询子查询
题目:根据户型和房屋所在区县和街道,为至少有两个街道有出租房屋的区县制作出租房屋清单
题目:按季度统计出本年各区县各街道各种户型房屋出租数量 输出2016年从1月1日起至今的全部出租房屋数量、各区县出租房屋数量及各街道、户型出租房屋数量
临时表
注意:临时表只在当前连接可见,连接关闭自动删除,修改临时表数据不影响原表数据
语法:
CREATE TEMPORARY TABLE 表名(查询语句);