SQL-Subquery-萌新指导
如何使用Subquery
1. 什么是Subquery
在一般的SQL查询中,我们会使用:
select ****** from table
的格式 用于简单的表格查找
然而,当我们需要实现稍微复杂的功能时Subquery就变得非常高效了。
比如说在一个表格中,有城市和城市面积。
我们需要建立一个表格包含查询与‘巴黎’这个城市面积相同的其他城市
这个时候用简单的select … from 语句显然是不可以的
那么怎么处理里这样的表格呢?
SELECT *
FROM city
WHERE area=(SELECT area FROM city
WHERE name = ‘Paris’)
括号中的(SELECT … FROM city WHERE name = ‘Paris’)就是Subquery
so easy!
1.1 使用规则
- 一个subquery必须出现在()括号中;
- 你可以在一个query中嵌入另外一个subquery,这个层级没有限制
- orderby clause不允许在subquery中出现
- subquery可以被用在where, having, from和select clause中
- a subquery can have only one column in the select clause if used in where clause
2. Subquery的分类
"Non-correlated" subquery 指的是()中的sunquery 是可以单独成立的。简单的理解就是把这个subquery单独拎出来,仍然可以执行。
请看举例:
SELECT name
FROM city
WHERE population <(
SELECT population FROM city
WHERE name = ‘Madrid’
);
我们将会得到人口比马德里小的城市。 如果单独使用subquery语句中的
SELECT population FROM city
WHERE name = ‘Madrid’ 我们就得到了马德里市的人口
这样的subquery语句,就是 “Non-correlated” subqueryCorrelated subquery
在说明什么是Correlated subquery之前,我们先来复习一下什么是join即把两个表格通过相关数据联系起来
同样的,Subquery也可以实现两个表格的查询功能。
Correlated subquery,这种子查询包含着outer query的value的引用,因此无法脱离outer query而单独执行
请看举例:
SSELECT * FROM country
WHERE population = (
SELECT MIN(population) from city
WHERE city.country_id = country.id);
上面的查询不容易理解-
怎么会有国家人口等于这个国家最小城市的人口了
这样的结果显然是不存在的 不过我们可以执行这样不可能存在的语句来查找错误数据
哦哦哦,原来还可以这样!
并且,想要执行subquery 中的语句是不可能的,因为没有外层的select … from country,subquery 中,WHERE city.country_id = country.id 的成立就不存在任何意义!!!!
3. Subquery的进阶使用-啥也不说直接练
例题 1 (1-17)-有用的筛选(不使用group by)
Select the hiking trip with the longest distance (column length) for every mountain.
SELECT * FROM
hiking_trip main_hiking_trip
WHERE length >= ALL(
SELECT length FROM
hiking_trip sub_hiking_trip
WHERE main_hiking_trip.mountain_id = sub_hiking_trip.mountain_id);
例题 2 (1-18)-有用的筛选(不使用group by)
Select those trips which last shorter than any hiking_trip with the same price.
SELECT * FROM trip
WHERE days < ANY(
SELECT days FROM hiking_trip
WHERE trip.price = hiking_trip.price);
例题 3 (1-19)
Show mountains together with their countries. The countries must have at least 50,000 residents.
SELECT *
FROM mountain,
(SELECT * FROM country
WHERE country.population > 50000)AS high_population
WHERE high_population.id = mountain.country_id;
特别注意:为什么针对于country人口的限制放在了subquery里面而不是放在了outer layer。
这是也许是大家的疑问地方-原因就条件查找的限定条件不同因为country是用来制约mountain的,所以country放在了subquery里面。同样的,人口是修饰country的,所以把人口也放在了subquery里。
如果这里的修饰条件改成了与mountain有关的,则where 放在outer layer里面
例题 4 (1-21)
Show each mountain name together with the number of hiking trips to that mountain (name the column count).
SELECT name,
(SELECT count(mountain_id)
FROM hiking_trip
WHERE hiking_trip.mountain_id = mountain.id)
AS count FROM mountain;
例题5 (2-20)
For each instrument, show its type, maker, the owner’s name, the corresponding orchestra name, and the number of concerts (name this column as concert_number) in which the owner played from 2013 to 2016. Take into consideration only instruments produced in 2013 or earlier.
SELECT
instruments.type,
instruments.maker,
members.name,
orchestras.name,
(SELECT COUNT (concerts.orchestra_id)
FROM concerts
WHERE concerts.year BETWEEN 2013 AND 2016 AND concerts.orchestra_id=orchestras.id) AS concert_number
FROM instruments
JOIN members
ON members.id = owner_id
JOIN orchestras
ON orchestras.id = members.orchestra_id
WHERE instruments.production_year<=2013;
看懂了最后一题-就说明已经初步掌握了subquery的用法
继续加油哦
4. mysql查询优化
只获取app需要的row(使用where clause)
只获取app需要的column,避免使用select *
避免多次获取相同的数据,应该使用app的cache机制缓存需要多次使用到的数据
使用db的orderby in the select clause rather than app
将大的delete, update, insert query分解成多个小的query
所有的column使用适当的数据类型, smaller columns总是更快;
mysql query cache是case sensitive的
将所有where clause中的column都增加index (具体要看explain命令查看是否用到对应的index)
将join中用到的column都做index
table order对于innder join clause是没有关系的;
使用limit clause来实现pagination 逻辑;
SQL-Subquery-萌新指导相关推荐
- 萌新SQL基础学习1
萌新学习(捡起)数据库(其实学校学过,忘了...) SQL是什么? SQL,一种用于访问和处理数据库的标准的计算机语言. SQL,指结构化查询语言,全称是Structured Query Langua ...
- 如何系统地自学python100天_Github上发布了一个Python学习秘笈,从萌新到王者的100天Python学习之旅...
北京千锋互联科技有限公司成都分公司骆昊(jackfrued)在Github上发布了一个Python学习秘笈,从萌新到王者的100天Python学习之旅. 简单的说,Python是一个"优雅& ...
- 萌新养成 | AI科技大本营实习生招募计划
金三银四跳槽季 这个时候需要做好准备的可不仅仅只有在职或者离职的萝卜 尚未毕业的萌新也需要提早做准备了 毕竟把自己修炼成一个优秀的萝卜也不是一件容易的事 所以,放下你找对象.刷副本.世界游的想法 加入 ...
- 一篇文章指明做JavaWeb项目需要的前置知识+完整项目初解读(萌新必看,十分友好)
前言 过了web这个阶段了,项目也完成了的我想给各位后来者总结一下我整个项目从开始到结束的经验,当然,也不是一帆风顺,报错有时候折磨的要死,废话不多说,现在就开始吧. 本文一共分为两个部分:纯理论科普 ...
- 拒绝无脑试错:写给萌新的“科学炼丹”入门手册
近期在订阅号后台和文章评论区review了一下大家的问题,发现很多小伙伴现在已经把机器学习.深度学习的理论基础打好了,但是真正要解决一个现实中的算法问题的时候经常两手抓瞎,一顿毫无目的乱试,甚至认为模 ...
- html编程入门指南,给萌新HTML5 入门指南
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员 ...
- 萌新学习Python爬取B站弹幕+R语言分词demo说明
代码地址如下: http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这 ...
- 给萌新HTML5 入门指南
HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员前端技术也成了必备技能之一,本篇文章的目的是为了帮助萌新的入门指导,也同时希望能为老鸟起到一定查漏补缺的作用,那么让我们开始 ...
- ctfshow萌新赛web
文章目录 萌新赛web_萌新记忆 萌新赛web_假赛生 萌新赛web_给她 萌新赛web_萌新记忆 这道题是看了大佬的题解才做出来的,扫描可以得到admin目录 这里需要有几个过滤需要绕过 or被过滤 ...
- JAVA萌新学习day17.18天 数据库MySQL
JAVA萌新学习day17.18天 数据库MySQL基本操作 MySQLDemo // name age address 小明 18 大连 小明 18 大连 小明 18 大连/*** 1.数据库 -& ...
最新文章
- Xcode 创建.a和framework静态库(转)
- okl4 linux,Native OKL4 Android Stack
- 路由表中没有与提供的值匹配的路由
- Educational Codeforces Round 75 (Rated for Div. 2)
- android 4.2 判断桌面快捷,Android 判断桌面是否快捷方式,不存在则创建
- MFC中字符间相互转换总结
- 编译Mysql 5.5时报do_abi_check错误
- 日志钩子(JournalRecord Hook)的使用
- python 把numpy.ndarray转为图像_Python 让蔡徐坤在我的命令行里打篮球?打得还不错...
- 解码Core ML YOLO对象检测器(二)
- axios_的基本使用_使用axios()方法来发送请求---axios工作笔记004
- C# 禁止用户关掉对话框的方法
- Docker快速配置指南
- 2012/7/9Intel面试题目
- 我和linux的第十三天
- 动画图解:十大经典排序算法动画与解析
- Win10卸载skype
- 计算机专业和机械自动化哪个好,自动化和机械设计制造及其自动化有哪些区别?选哪个好呢?...
- A053_项目部署_Linux介绍_CentOS
- word批量导入试题,一键组卷,单机软件题库管家迎来1.2版本