文档章节

mysql零距离接触-子查询和连接

小疯子的逆时光
 小疯子的逆时光
发布于 2016/12/23 11:52
字数 1206
阅读 16
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

一,概念

(1)子查询指嵌套在查询内部,且必须始终出现在圆括号内。
(2)子查询可以包含多个关键字或条件,如:
DISTINCT / GROUP BY / ORDER BY / LIMIT / 函数等。
(3)子查询的外层查询可以是:SELECT, INSERT, UPDATE , SET 或DO
(4)子查询可以返回标量、一行、一列或子查询。

二,MySQL 子查询分类

上面演示了一个简单的子查询例子,根据子查询的返回数据形式(如上例中返回的 uid 序列),可以分为如下几类:

    - 标量子查询:返回单一值的标量,最简单的形式。

    - 列子查询:返回的结果集是 N 行一列。

    - 行子查询:返回的结果集是一行 N 列。

    - 表子查询:返回的结果集是 N 行 N 列。

子查询操作符

在主查询中,可以使用比较操作符以使用操作符来对子查询返回的结果进行比较,从而确定查询的条件。如上面例子使用了 IN 操作符。

可以使用的操作符有:= > < >= <= <> ANY IN SOME ALL EXISTS ,我们将在本节余下的教程中学习这些操作符在子查询中的使用方法。

三,具体

标量子查询

标量子查询是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。

可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较

SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)

列子查询

列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。

一个列子查询的例子如下:

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)

列子查询中使用 IN、ANY、SOME 和 ALL 操作符(= ANY 或 = SOME 等价于 IN)

由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。在列子查询中可以使用 IN、ANY、SOME 和 ALL 操作符:

    - IN:在指定项内,同 IN(项1,项2,…)。

    - ANY:与比较操作符联合使用,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。

    - SOME:ANY 的别名,较少使用。

    - ALL:与比较操作符联合使用,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。

行子查询

行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集。

一个行子查询的例子如下:

SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2)

在该例子中,在保证子查询返回单一行数据的前提下,如果 column1=1 且 column2=2 ,则该查询结果为 TRUE。

MySQL 行构造符

在上面的例子中,WHERE 后面的 (1,2) 被称为行构造符,也可以写作 ROW(1,2)。行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。

表子查询

表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据。

SELECT * FROM article WHERE (title,content,uid) IN (SELECT title,content,uid FROM blog)

四,insert使用子查询

INSERT [INTO] tbl_name [(col_name,...)] SELECT ...将查询结果写入数据表

INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

五,多表更新

UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]... [WHERE where_condition]

table_references 变成:

table_references {[INNER|CROSS] JOIN } | {[LEFT|RIGHT] [OUTER] JOIN} table_references ON conditional_exp

如:

update tdb_goods inner join tdb_goods_cates on goods_cate=cate_name set goods_cate=cate_id;

六,连接

MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作。

table reference A
{[INNER|CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN}
table_reference B
ON condition_expr

使用ON设定连接条件,也可以用WHERE代替
· ON:设定连接条件
· WHERE:进行结果集记录的过滤

内连接:
在MySQL中JOIN,INNER JOIN,CROSS JOIN是等价的


外连接:

LEFT JOIN左外连接;RIGHT JOIN右外连接

多表连接:

多表的连接跟两张表的连接一样
表的连接实质就是外键的逆向约束

七,无限分类

即在同一张表中既有父类,又有子类

自身连接:自己与自己连接,通过别名的方式将一张物理表,变成两张逻辑表来实现,然后拼接出一张逻辑表!

八,多表删除

(1)INSERT ... SELECT实现复制
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);
(2)查找重复记录
SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;
(3) 删除重复记录
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

小疯子的逆时光
粉丝 0
博文 31
码字总数 30892
作品 0
程序员
私信 提问
加载中
请先登录后再评论。
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
数据库代码辅助工具--MaoCaiJun.Database

MaoCaiJun.DataBase 是一个用于 Microsoft Visual Studio 的数据库代码生成组件。它是基于 xml 文件的代码创建工具,支持sql2000,sql2005,sql2008,access, SQLite MaoCaiJun.Database 数据库...

mccj
2013/02/06
2.2K
1
数据库表单生成器--SQLScreens

SQLScreens 是一个使用 Tcl/TK 编写的简单关系型数据库表单生成工具。可让你快速创建查询界面,并指定相应的表和字段。支持多种数据库,包括:MySQL, SQLite, and INFORMIX, and ODBC for o...

匿名
2013/02/17
851
0
开源数据访问组件--Smark.Data

Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL...

泥水佬
2013/03/12
2.5K
0
超快的css selector引擎--kquery 2.0

kquery是一款基于javascript完整实现css3选择器引擎. 兼容所有主流浏览器ie6+/chrome/firefox/opera/safari, 压缩和gzip之后仅8kb大小。智能编译引擎优化去除不必要的逻辑, 查询速度远胜于...

aaron.xiao
2012/10/23
633
0

没有更多内容

加载失败,请刷新页面

加载更多

Smartbi数据分析工具处理大数据性能如何?

为什么需要跨库整合能力 Smartbi支持多种数据源轻松接入,基本涵盖了市面上所有主流的数据库。无可否认多元的数据连接能力使Smartbi能快速连接现有数据源,构建统一的数据分析平台。但在项目...

osc_w0uxg75l
25分钟前
0
0
深入Vue 底层原理以及运行机制

Vue,React 这样的框架可以说是现在前端的必备技能,一个刚入门两三个月的前端都是要会Vue的,而且随着Vue3.0发布日程的推进,使用的人群变得多了,开始想去了解它。 Vue这么受大众接受,那么...

五月君
今天
13
0
好用的Excel大数据分析工具

为什么需要Excel分析 自助BI使得BI不再是高管领导的专利,促成了BI的平民化,更是BI的发展趋势。但自助BI工具的选择却并不简单,很多厂商推出了自己的自助分析工具,但在企业的使用过程中,实...

osc_vuza8uho
26分钟前
6
0
企业玩转DevOps转型:由弱到强,只需7步

【摘要】 在参考业界方法并总结客户成功故事的基础上,本文提出了“七步法”路线图,希望能帮助更多的企业顺利进行DevOps转型。 从2009年诞生,DevOps已经悄然走过了10多个年头。Gartner在技...

华为云开发者社区
27分钟前
0
0
浙江日报丨AI赋能,如何抢占“智”高点

  今天在杭州市余杭区秒优服饰智能工厂,机器人将订单所需的面料辅料精准送到各个吊挂生产线,每台机器、每个工人的具体任务、实时进度等都化为大数据,显示在工厂的大屏幕上。作为一家今年...

osc_wfvuuuju
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部