一、视图1.视图创建练习

course表
CREATE VIEW 每个学生课程平均分(学号,平均分)
as select 学号,AVG(成绩)
from course
GROUP BY 学号;

运行结果

视图可以看作定义在MYSQL上的的临时表,是另一种查看数据的入口。视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询来定义的临时表 。视图就如同一张表一样,对表能够进行的操作都可以应用于视图。例如增、删、改、查,但插入、修改、删除等的操作其实对于原始数据表的操作。视图中的数据会随着原始数据表的改变而改变。2.视图的作用
1.视图可以简化数据操作:在使用查询时,在很多时候要使用聚合函数,同时还要显示其它字段的信息,这时写的语句可能会很长,如果这个动作频繁发生的话,则可以创建视图。如上图,我们如果要使用,只需要 select * from 每个学生课程平均分;就可以了。

2.视图可以使原始表中的数据更安全:因为视图是临时的,只是存储了数据的集合,故可以将原始表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改和删除,可以保证数据的安全性。

3.使用视图的注意事项1.避免在视图上再创建视图:多重视图会降低SQL的效率和性能。
2.不能往视图里面插入数据。二、子查询练习:1.找出每个课程里成绩最低的学号

course表
SELECT课程号,学号 AS 成绩最低学号,成绩
FROMcourse
WHERE(课程号,成绩) IN (SELECT课程号,MIN(成绩)FROMcourseGROUP BY 课程号);

运行结果

2.哪些学生的成绩比课程0003的全部成绩里的任意一个高。

SELECT学号
FROMcourse
WHERE成绩 > ANY (SELECT成绩FROMcoursewhere 课程号='0003');

运行结果

2.哪些学生的成绩比课程0001的全部成绩里都高。

SELECT学号
FROMcourse
WHERE成绩 > ALL (SELECT成绩FROMcourseWHERE课程号 = '0001');

运行结果

三、标量子查询练习1.大于平均成绩的学生学号和成绩。

course表
SELECT学号,成绩
FROMcourse
WHERE成绩 >  (SELECTAVG(成绩)FROMcourse);

运行结果

注意标量子查询返回单一值
四、关联子查询
(每个组里比较)
练习:查找出每个课程中大于对应课程平均成绩的学生

course表
SELECT 课程号,学号
from course
WHERE 成绩>
(SELECT AVG(成绩)
from course
GROUP BY 课程号);

结果报错,原因在于后面子查询返回了3个值,如图:

这时需要用关联子查询

SELECTm.课程号,学号,成绩,n.平均成绩
FROM(SELECT课程号,学号,成绩FROMcourse AS c1WHERE成绩 > (SELECTAVG(成绩) AS 平均成绩FROMcourse AS c2WHEREc2.课程号 = c1.课程号GROUP BY课程号)) m
JOIN (SELECT课程号,AVG(成绩) AS 平均成绩FROMcourseGROUP BY课程号
) n ON m.课程号 = n.课程号;

需要注意的是关联子查询的执行逻辑完全不同于正常的SELECT语句
正常SQL语句的执行顺序为
FROM ——WHERE——GROUP BY——HAVEING——SELECT——ORDER BY按照我们正常的select语句执行顺序,应该从括号内的子查询开始,子查询也是一个SELECT语句,应该这样开始执行:
1.FROM course :获取数据(course)。

2.WHERE c2.课程号 = c1.课程号。
第二步看起来是必然的。
实际上这时关联子查询,关联子查询的执行顺序和正常的SELECT语句执行顺序完全不同。
执行顺序应该为:
-- 1.
SELECT 课程号,学号,成绩
FROM
course

-- 2
接着再将第一行的c1.课程号代入子查询where中,关联子查询实际起判断作用。此时再运行子查询语句,
WHERE  c2.课程号 ='0001',AVG(成绩)为一个值

-- 3 .接着将子查询的值返回主查询,然后再执行主查询。然后再第二行课程号去作判断,以此类推。

sqlzoo练习题

SELECT within SELECT

/*1.列出每個國家的名字 name,當中人口 popul
ation 是高於俄羅斯'Russia'的人口。*/
SELECT name FROM worldWHERE population >(SELECT population FROM worldWHERE name='Russia');
/*2.列出歐州每國家的人均GDP,當中人均GDP要高於英國'United Kingdom'的數值。*/
SELECT name FROM worldWHERE continent='Europe'AND gdp/population >(SELECT gdp/population FROM worldWHERE name='United Kingdom');
/*3.在阿根廷Argentina 及 澳大利亞 Australia所在的洲份中,列出當中的國家名字 name 及洲分 continent 。按國字名字順序排序*/
SELECT name,continent
FROM world
WHERE continent IN
(SELECT continent FROM world WHERE name IN ('Argentina' ,'Australia') ) ORDER BY name;
/*4.哪一個國家的人口比加拿大Canada的多,但比波蘭Poland的少?列出國家名字name和人口population 。*/
SELECT name,population FROM world
WHERE population > (SELECT population FROM world WHERE name= 'Canada') AND population <
(SELECT population FROM world WHERE name= 'Poland');
/*5.顯示歐洲的國家名稱name和每個國家的人口population。以德國的人口的百分比作人口顯示。*/
SELECT name,CONCAT(ROUND(population*100/(SELECT population FROM world WHERE name='Germany'),0),'%')
FROM world WHERE continent='Europe';
/*6.哪些國家的GDP比Europe歐洲的全部國家都要高呢? [只需列出 name 。] (有些國家的記錄中,GDP是NULL,沒有填入資料的。)*/
SELECT nameFROM worldWHERE gdp > ALL(SELECT gdpFROM worldWHERE gdp>0 AND continent='Europe')
/*7.在每一個州中找出最大面積的國家,列出洲份 continent, 國家名字 name 及面積 area。 (有些國家的記錄中,AREA是NULL,沒有填入資料的。*/
SELECT continent, name, area FROM world xWHERE area >= ALL(SELECT area FROM world yWHERE y.continent=x.continent
GROUP BY continentAND area>0);
/*8.列出洲份名稱,和每個洲份中國家名字按子母順序是排首位的國家名。(即每洲只有列一國)*/
SELECT continent, name
from world a
where name = (SELECT name from world b
where b.continent=a.continent
group by continent
order by name limit 1);
/*9.找出洲份,當中全部國家都有少於或等於 25000000 人口. 在這些洲份中,列出國家名字name,continent 洲份和population人口。*/
SELECT name, continent, population
FROM world as a
WHERE 25000000 > ALL(SELECT population
from world as b
where b.continent = a.continent
and population > 0)
/*10.有些國家的人口是同洲份的所有其他國的3倍或以上。列出 國家名字name 和 洲份 continent。*/
SELECT name,continent
from world a
where population/3>=all (select population from world b where
b.continent=a.continent and population >0  AND a.population <> b.population)

select查询中@作用_SQL学习第四关:复杂查询相关推荐

  1. 子查询dinstinct放哪_第四关 复杂查询

    1 创建视图 视图创建如下: as后面放的是SQL查询语句 视图调用方法:创建视图后,右键视图,刷新 直接在from后面写上视图的名称就可以直接调用了 视图的注意事项: 1.不要在视图中国再次创建视图 ...

  2. MySQL学习(四、子查询)

    一.子查询 子查询指的就是在一个查询之中嵌套了其他的若干查询,在使用select语句查询数据时,有时候会遇到这样的情况,在where查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果 ...

  3. 数据库查询求小于_SQL学习笔记(二)简单查询

    本篇主要学习如何通过简单查询获取想要的数据. 从零学会SQL:简单查询​www.zhihu.com 基本的查询语句 从数据库中查找数据时要使用select子句,select子句是sql中使用最多.最基 ...

  4. mysql text 查询速度_数据库学习之让索引加快查询速度(四)

    数据库学习之让索引加快查询速度 目录 索引简介 mysql的索引分类 创建索引 添加与删除索引 索引简介 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构. ...

  5. 经典SQL学习笔记 (四)-子查询

    子查询 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命令的WHERE子句中.子查询是一个 SELECT 语句,它嵌 ...

  6. mysql查询职位大于3_mysql学习第四天(高级查询)

    -- 第七章 -- 1.查询入职日期最早和最晚的日期 select min(hiredate),max(hiredate) from emp -- 2.查询职位以SALES开头的所有员工平均工资,最低 ...

  7. SQL学习(四)条件查询(字符串类型属性筛选)

    本节主要使用WHERE语句筛选字符串类型的属性. 概述 LIKE(模糊查询) 和 %(通配符)是字符串相关查询的两个关键字. 条件查询语句还是WHERE语句 SELECT column, anothe ...

  8. mysql查询中使用别名_如何在MySQL选择查询中使用别名?

    要在MySQL中设置别名或替代名称,您需要使用AS关键字.让我们首先创建一个表-mysql> create table DemoTable ( Name varchar(100) ); 使用插入 ...

  9. oracle查询grant信息,Oracle学习笔记(四)

    一.控制用户存取 1.创建修改用户Creating Users Create/alter user new_user identified by password; 例:create user use ...

最新文章

  1. Keil进入仿真,窗口不显示程序运行箭头
  2. Sonya and Queries CodeForces - 714C
  3. oracle vm virtualbox右ctrl切换显示模式
  4. Binder实用指南(一) - 理解篇
  5. hyperworks2017安装教程
  6. OpenCV序列化功能的实例(附完整代码)
  7. OpenGL 投光物Light casters
  8. 前端学习(2324):angular初步使用
  9. duilib vs2015 安装_FFmpeg视频播放器开发-FFmpeg简介与项目环境搭建(一)
  10. java stringutils api_StringUtils工具类常用api 转
  11. luogu P2018 消息传递
  12. 十大经典排序算法(附代码、动画及改进方案)
  13. 【Oracle】创建概要文件
  14. 粗略写了使用GD2制作文字图像demo
  15. CentOS7 安装ffmpeg
  16. 修改美化pycharm主题
  17. php 表格自动适应页面,h5纯css实现表格的自适应布局
  18. 程序员 开发人员 在线工具箱
  19. 植物大战僵尸用户存档修改(单机版)
  20. NOI OJ 1.3 15:苹果和虫子 C语言

热门文章

  1. 伪官宣:Envoy 中文指南新鲜出炉
  2. 采集Nginx日志的几种方式
  3. 轻量级人脸属性Slim-CNN
  4. reid 数据集 行人重拾别
  5. 开源OCR文本检测器,基于TextBoxes++和RetinaNet
  6. python已停止工作
  7. 英伟达开源行人生成/重识别代码
  8. 阿里开源自主研发的 DFSMN 语音识别模型,引谷歌论文引用
  9. pyqt 多线程使用
  10. pycharm调试显示图片