1.子查询简介

数据表的初始化:

-- 创建数据表CREATE TABLE IF NOT EXISTS tdb_goods(goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,goods_name  VARCHAR(150) NOT NULL,goods_cate  VARCHAR(40)  NOT NULL,brand_name  VARCHAR(40)  NOT NULL,goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,is_show     BOOLEAN NOT NULL DEFAULT 1,is_saleoff  BOOLEAN NOT NULL DEFAULT 0);-- 写入记录INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )','台式机','宏碁','3699',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
-- 查看数据表 列信息
show columns from tdb_goods;-- set names gbk 只是让工具(比如cmd)支持显示中文,根本解决还是要在配置文件或者建表时候指定编码方式
set names gbk;

子查询是指在另一个查询语句中的SELECT子句。

例句:

  SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

其中,SELECT * FROM t1 …称为Outer Query[外查询](或者Outer Statement),

SELECT column1 FROM t2 称为Sub Query[子查询]。

所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。

子查询必须出现在圆括号之间。子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY,LIMIT,函数等。子查询的外层查询可以是:SELECT,INSERT,UPDATE,SET或DO。

子查询支持与不支持:

  • select a,b,c —OK,只能存放单行子查询,不能使多行子查询
  • from tab1 —OK 可以有子查询
  • where col in(em1,em2) —可以有子查询
  • group by … —不可以有子查询
  • having …. —可以有子查询
  • order by … —不可以有子查询

2.由比较运算符引发的子查询

子查询:

  • 使用比较运算符的子查询
  • -
-- 求所有电脑产品的平均价格,并且保留两位小数,AVG,MAX,MIN、COUNT、SUM为聚合函数SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;-- 查询所有价格大于平均价格的商品,并且按价格降序排序SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC;-- 使用子查询来实现SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods)
ORDER BY goods_price DESC;

用ANY、SOME或ALL修饰的比较运算符(ANY、SOME等价,符合其中一个就行,ALL是必须全部符合)

-- 查询类型为“超记本”的商品价格SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本';-- 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')ORDER BY goods_price DESC;   

3.由[NOT] IN/EXISTS引发的出子查询

=ANY运算符与IN等效。
!=ALL或<>ALL运算符与NOT IN等效。

-- = ANY 或 = SOME 等价于 IN(因为子查询中返回的不止一个值,这时候就需要使用ANY、SOME或ALL了)SELECT goods_id,goods_name,goods_price FROM tdb_goods
WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
ORDER BY goods_price DESC; 

4.使用INSERT…SELECT插入记录

-- 创建“商品分类”表(随着数据增多,为了防止数据重复过多,需要建立另外一张表)CREATE TABLE IF NOT EXISTS tdb_goods_cates(cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cate_name VARCHAR(40)
);-- 查询tdb_goods表的所有记录,并且按"类别"分组
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;-- 将分组结果写入到tdb_goods_cates数据表(cate_name是类别,此处INSERT SELECT是从另外一张表插入tbd_goods_cates表中)
INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

5.多表更新

A表中的产品名被分了出去,B表中列是id个产品名称,此时就需要根据B表中的产品名称修改A表中的产品名,改成对应的B表中的id,所以此时需要多表关联更新。

UPDATE table_references
SET col_name1 = {expr1|DEFAULT}
[,col_name2 = {expr2|DEFAULT}]...
[WHERE where_condition]-- 表的参照关系(为了表的连接)
table_reference
{ [INNER|CROSS] JOIN| {LEFT|RIGHT} [OUTER] JOIN }
table_reference
ON conditional_expr-- 连接类型MySQL中,JOIN,CROSS JOIN和INNER是等价的。
LEFT [OUTER] JOIN,左外连接
RIGHT [OUTER] JOIN,右外连接-- 通过tdb_goods_cates数据表来更新tdb_goods表UPDATE tdb_goods INNER JOIN tdb_goods_cates
ON goods_cate = cate_name  -- 连接条件
SET goods_cate = cate_id ; -- 更新数据

6.多表更新之一步到位

上一节更新表通过了三步:创建B表;B表插入数据;更新A表。

-- 通过CREATE...SELECT来创建数据表并且同时写入记录-- SELECT brand_name FROM tdb_goods GROUP BY brand_name;CREATE TABLE tdb_goods_brands (brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,brand_name VARCHAR(40) NOT NULL
)SELECT brand_name FROM tdb_goods GROUP BY brand_name;-- 通过tdb_goods_brands数据表来更新tdb_goods数据表(错误)UPDATE tdb_goods  INNER JOIN tdb_goods_brands ON brand_name = brand_name
SET brand_name = brand_id;-- Column 'brand_name' in field list is ambigous-- 正确UPDATE tdb_goods AS  g  INNER JOIN tdb_goods_brands AS b
ON g.brand_name = b.brand_name
SET g.brand_name = b.brand_id;-- 查看tdb_goods的数据表结构DESC tdb_goods;-- 通过ALTER TABLE语句修改数据表结构ALTER TABLE tdb_goods  CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;-- 分别在tdb_goods_cates和tdb_goods_brands表插入记录INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');-- 在tdb_goods数据表写入任意记录INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

7.连接的语法结构

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

在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等价的。

LEFT [OUTER] JOIN ,左外连接

RIGHT [OUTER] JOIN,右外连接

table_reference
{[INNER|CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr
-- 数据表参照
table_reference
tbl_name [[AS] alias] | table_subquery [AS] alias

数据表可以使用tbl_name AS alias_name 或 tbl_name alias_name 赋予别名。

table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名。

8.内连接INNER JOIN

使用ON关键字来设定连接条件,也可以使用WHERE来代替。

通过使用ON关键字来设定连接条件,使用WHERE关键字进行结果集的过滤。

内连接显示两表公共的部分。

-- 查询所有商品的详细信息(通过内连接实现)SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS gINNER JOIN tdb_goods_cates AS c
ON g.cate_id = c.cate_idINNER JOIN tdb_goods_brands AS b
ON g.brand_id = b.brand_id\G;

9.外连接OUTER JOIN

-- 查询所有商品的详细信息(通过左外连接实现)SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS gLEFT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_idLEFT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;-- 查询所有商品的详细信息(通过右外连接实现)SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS gRIGHT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_idRIGHT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

10.多表连接

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS gINNER JOIN tdb_goods_cates AS c
ON g.cate_id = c.cate_idINNER JOIN tdb_goods_brands AS b
ON g.brand_id = b.brand_id\G;

11.关于连接的几点说明

A LEFT JOIN B join_condition

数据表B的结果集依赖数据表A。

数据表A的结果集根据左外连接条件依赖所有数据表(在没有指定WHERE条件的情况下)。

如果数表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行。

如果使用内连接查找的记录在连接数据表中部存在,并且在WHERE子句中尝试一下操作:col_name IS NULL时,如果col_name被定义为NOT NULL,MySQL将在找到符合连接条件的记录后停止搜索更多的行。

12.无限级分类表设计

13.多表删除

与MySQL零距离—子查询与连接相关推荐

  1. MYSQL基础八--子查询和连接

    1.子查询是出现在其他SQL语句内的SELECT子句. 子查询指嵌套在查询内部,且必须始终出现在圆括号内. 子查询可以包含多个关键字或条件,如DISTINCT,GROUP BY,ORDER BY,LI ...

  2. mysql左连接代码,mysql多表子查询与左连接的代码

    摘要 腾兴网为您分享:mysql多表子查询与左连接的代码,字体配置,邮币在线,英语字典,携程抢票等软件知识,以及cad弱电,adobe全套2018,万能格式转换器,360dns优选,音频制作app,上 ...

  3. mysql的查询、子查询及连接查询(商城查询常用)

    mysql的查询.子查询及连接查询 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) 1.whe ...

  4. any在mysql语句中用法,MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...

    MySQL中,子查询中可以使用运算符ANY,它表示的意思是______. 答:至少一个值满足条件 According to your textbook, the main purpose of a s ...

  5. mysql 什么是子查询_MySQL 子查询

    什么是子查询 为什么要使用子查询 子查询的分类 怎样使用子查询 关联子查询 要使用的数据表 image.png 1. 什么是子查询? 子查询顾名思义就是在正常查询之前先查询出来一条数据或者一个表. 子 ...

  6. mysql update from 子查询

    2019独角兽企业重金招聘Python工程师标准>>> mysql update from 子查询 mssql 子查询更新 update log set uin= b.uin fro ...

  7. 子查询 和 连接查询谁快

    子查询 和 连接查询 可以达到同样的效果 即 相同的结果集,但是谁快谁慢?一般连接查询如果后期添加条件 需要改原来SQL,为了不改原来SQL,我一般会用子查询来做,这样意思比较明确且不动原来sql,但 ...

  8. MySQL入门 (九) : 子查询 Subquery

    1 一个叙述中的查询叙述 子查询(subquery)是一种很常见的应用,不论是查询.新增.修改或删除都有可能出现. 子查询是一个放在左右刮号中的「SELECT」叙述,而这个查询叙述会放在另一个SQL叙 ...

  9. MySQL中嵌套子查询删除出错解决方案

    MySQL中嵌套子查询做删除操作会出错,例如下面的SQL: delete from table1 where number in (select number from table2) 执行提示: Y ...

最新文章

  1. 你不知道的JavaScript系列(一)—— 类型
  2. 《微软飞行模拟》用AI还原全球15亿建筑,玩家发现bug:白金汉宫变成写字楼
  3. ThinkPHP多应用/多模块配置
  4. neo4j设置节点或者边的显示,包括颜色、属性、大小
  5. JZOJ 5460. 【NOIP2017提高A组冲刺11.7】士兵训练
  6. webpack(2)--开发环境基本配置
  7. python 抽奖器_兄弟连学python (02) ----简易抽奖器
  8. c++分割字符串方法
  9. 富文本 NSAttributedString
  10. [Python Study Notes]pandas.DataFrame.plot()函数绘图
  11. 示波器探头的 x1x10衰减、补偿校准手法
  12. 线性回归 西瓜数据集 Python--sklearn
  13. red5简介及基础知识
  14. 西南交通大学计算机应用基础第1次作业,西南交通大学计算机应用基础第一次作业答案.doc...
  15. 使用AD16画板步骤
  16. 做柜员还是程序员_放弃月薪2万的程序员,被爸妈喊回家干公务员,看到工资悔不当初...
  17. VS下同一个solution下不同project之间头文件的相互调用
  18. oracle11gwin8,win8_oracle11g_64位连接32位PLSQL_Developer
  19. 《校园墙》小程序可行性分析
  20. elasticsearch查询之图书智能推荐

热门文章

  1. 中国艺术《世外山》孙溟㠭篆刻
  2. 配置linux主机开启telnet服务
  3. linux教程试卷_linux基础教程试卷及答案
  4. 十大经典排序算法之堆排序(Java代码实现)
  5. 最新《IOS系统就业培训课程》
  6. stew() setfill()
  7. linux编译忽略warning,忽略警告@SuppressWarnings的用法
  8. 基于axios的二次封装
  9. Java并发编程:线程池的使用
  10. qgis 空间连接_QGIS空间连接简介