MySQL 子查询

news/2025/2/2 8:35:29/

创建数据库

创建数据表
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);
查看列
mysql> SHOW COLUMNS FROM tdb_goods;
+-------------+------------------------+------+-----+---------+----------------+
| Field       | Type                   | Null | Key | Default | Extra          |
+-------------+------------------------+------+-----+---------+----------------+
| goods_id    | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
| goods_name  | varchar(150)           | NO   |     | NULL    |                |
| goods_cate  | varchar(40)            | NO   |     | NULL    |                |
| brand_name  | varchar(40)            | NO   |     | NULL    |                |
| goods_price | decimal(15,3) unsigned | NO   |     | 0.000   |                |
| is_show     | tinyint(1)             | NO   |     | 1       |                |
| is_saleoff  | tinyint(1)             | NO   |     | 0       |                |
+-------------+------------------------+------+-----+---------+----------------+
7 rows in set
SET NAMES utf8;设置编码格式为utf8,不乱码!
查看数据
mysql> select * from tdb_goods;
+----------+-----------------------+------------+------------+-------------+---------+------------+
| goods_id | goods_name            | goods_cate | brand_name | goods_price | is_show | is_saleoff |
+----------+-----------------------+------------+------------+-------------+---------+------------+
|        1 | R510VC 15.6英寸笔记本 | 笔记本     | 华硕       | 3399.000    |       1 |          0 |
+----------+-----------------------+------------+------------+-------------+---------+------------+
1 row in set

子查询(Subquery)

指出现在其他SQL语句内的SELECT子句。

例如:

SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);
其中SELECT*FROM t1,称为Outer Query/Outer Statement外层查询
SELECT col2 FROM t2,称为SubQuery子查询

嵌套在查询内部,且必须始终出现在圆括号内。
可以包含多个关键字或条件:

如DISTINCT、GROUP BY、ORDER BY,LIMIT函数等。

外层查询可以是:SELECT,INSERT,UPDATE,SET或DO。
子查询可以返回标量、一行、一列或子查询。

使用比较运算符的子查询

=、>、<、>=、<=、<>、!=、<=>

语法结构

operand comparison_operator subquery

mysql>  SELECT ROUND(AVG(goods_price), 2) FROM tdb_goods;   // 查询商品价格的平均值(保留两位小数)
+----------------------------+
| ROUND(AVG(goods_price), 2) |
+----------------------------+
| 3399.00                    |
+----------------------------+
1 row in set
mysql> SELECT goods_id, goods_name, goods_price FROM tdb_goods WHERE goods_price >= (SELECT ROUND(AVG(goods_price), 2) FROM tdb_goods);  # >=后面的括号为子查询
+----------+----------------------------------+-------------+
| goods_id | goods_name                       | goods_price |
+----------+----------------------------------+-------------+
|        5 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000   |
|        8 |  HMZ-T3W 头戴显示设备            | 69999.000   |
+----------+----------------------------------+-------------+
2 rows in set
用ANY、SOME或ALL修饰的比较运算符

operand comparison_operator ANY(subquery)
 operand comparison_operator SOME(subquery)
 operand comparison_operator ALL(subquery)

在这里插入图片描述

mysql> SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本';
+-------------+
| goods_price |
+-------------+
| 7999.000    |
+-------------+
1 row in set
mysql> SELECT goods_id, goods_name, goods_price FROM tdb_goods WHERE goods_price >= ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本');   # >= ANY 为子查询结果的最小值
+----------+----------------------------------+-------------+
| goods_id | goods_name                       | goods_price |
+----------+----------------------------------+-------------+
|        2 | G150TH 15.6英寸游戏本            | 8499.000    |
|        3 | SVP13226SCB 13.3英寸触控超极本   | 7999.000    |
|        4 | iMac ME086CH/A 21.5英寸一体电脑  | 9188.000    |
|        5 | Mac Pro MD878CH/A 专业级台式电脑 | 28888.000   |
|        8 |  HMZ-T3W 头戴显示设备            | 69999.000   |
+----------+----------------------------------+-------------+
5 rows in set

使用 [NOT] IN的子查询

语法结构

operand comparison_operator [NOT]IN(subquery)

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

使用[NOT]EXISTS的子查询

如果子查询返回任何行,EXISTS将返回TRUE;否则为FALSE。
上表中品牌栏中都是固定的几个词条中的一个,能否用数字存储,对应关系用另一张表加以存储,以减少存储量?
创建tdb_goods_cates表 存储品牌信息
mysql> CREATE TABLE IF NOT EXISTS tdb_goods_cates(cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cate_name VARCHAR(40) NOT NULL
);
Query OK, 0 rows affected
查看tdb_goods中的goods_cate都有哪些?
mysql> SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
+------------+
| goods_cate |
+------------+
| 一体机     |
| 台式机     |
| 头戴设备   |
| 显示器     |
| 服务器     |
| 笔记本     |
| 超级本     |
+------------+
7 rows in set

INSERT…SELECT

将查询结果写入数据表

INSERT [INTO] tbl_ name [ (col_name…) ]
SELECT……

mysql>  DESC tdb_goods_cates;
+-----------+----------------------+------+-----+---------+----------------+
| Field     | Type                 | Null | Key | Default | Extra          |
+-----------+----------------------+------+-----+---------+----------------+
| cate_id   | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| cate_name | varchar(40)          | NO   |     | NULL    |                |
+-----------+----------------------+------+-----+---------+----------------+
2 rows in setmysql> INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;  # 查询结果写入数据表
Query OK, 7 rows affected
Records: 7  Duplicates: 0  Warnings: 0-> SELECT * FROM tdb_goods_cates;
+---------+-----------+
| cate_id | cate_name |
+---------+-----------+
|       1 | 一体机    |
|       2 | 台式机    |
|       3 | 头戴设备  |
|       4 | 显示器    |
|       5 | 服务器    |
|       6 | 笔记本    |
|       7 | 超级本    |
+---------+-----------+
7 rows in set

多表更新

UPDATE table_ references
SET col_name1 = { expr1 DEFAULT }
[, col_name2 = { expr2 | DEFAULT } ]……
[ WHERE where_condition ]

用 tdb_goods 去更新 tdb_goods_cates 的内容:
mysql> UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;
Query OK, 8 rows affected
Rows matched: 8  Changed: 8  Warnings: 0mysql> SELECT * FROM tdb_goods;
+----------+----------------------------------+------------+------------+-------------+---------+------------+
| goods_id | goods_name                       | goods_cate | brand_name | goods_price | is_show | is_saleoff |
+----------+----------------------------------+------------+------------+-------------+---------+------------+
|        1 | R510VC 15.6英寸笔记本            | 6          | 华硕       | 3399.000    |       1 |          0 |
|        2 | G150TH 15.6英寸游戏本            | 6          | 华硕       | 8499.000    |       1 |          0 |
|        3 | SVP13226SCB 13.3英寸触控超极本   | 7          | 华硕       | 7999.000    |       1 |          0 |
|        4 | iMac ME086CH/A 21.5英寸一体电脑  | 1          | 华硕       | 9188.000    |       1 |          0 |
|        5 | Mac Pro MD878CH/A 专业级台式电脑 | 2          | 华硕       | 28888.000   |       1 |          0 |
|        6 | HMZ-T3W 头戴显示设备             | 3          | 华硕       | 6999.000    |       1 |          0 |
|        7 | X3250 M4机架式服务器 2583i14     | 5          | 华硕       | 6888.000    |       1 |          0 |
|        8 |  HMZ-T3W 头戴显示设备            | 4          | 华硕       | 69999.000   |       1 |          0 |
+----------+----------------------------------+------------+------------+-------------+---------+------------+
8 rows in set

CREATE……SELECT 创建时写入

创建数据表同时将查询结果写入到数据表

CREATE TABLE [ IF NOT EXISTS ] tbl_name
[ (create_definition, …) ]
select_statement

mysql> SELECT brand_name FROM tdb_goods GROUP BY brand_name;
+------------+
| brand_name |
+------------+
| 华硕       |
| 宏碁       |
| 惠普       |
| 戴尔       |
| 神州       |
| 索尼       |
| 联想       |
| 苹果       |
+------------+
8 rows in setmysql> 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;
Query OK, 8 rows affected
Records: 8  Duplicates: 0  Warnings: 0mysql> SELECT * FROM tdb_goods_brands;
+----------+------------+
| brand_id | brand_name |
+----------+------------+
|        1 | 华硕       |
|        2 | 宏碁       |
|        3 | 惠普       |
|        4 | 戴尔       |
|        5 | 神州       |
|        6 | 索尼       |
|        7 | 联想       |
|        8 | 苹果       |
+----------+------------+
8 rows in setmysql> SELECT * FROM tdb_goods;
+----------+----------------------------------+------------+------------+-------------+---------+------------+
| goods_id | goods_name                       | goods_cate | brand_name | goods_price | is_show | is_saleoff |
+----------+----------------------------------+------------+------------+-------------+---------+------------+
|        1 | R510VC 15.6英寸笔记本            | 6          | 华硕       | 3399.000    |       1 |          0 |
|        2 | G150TH 15.6英寸游戏本            | 6          | 联想       | 8499.000    |       1 |          0 |
|        3 | SVP13226SCB 13.3英寸触控超极本   | 7          | 宏碁       | 7999.000    |       1 |          0 |
|        4 | iMac ME086CH/A 21.5英寸一体电脑  | 1          | 惠普       | 9188.000    |       1 |          0 |
|        5 | Mac Pro MD878CH/A 专业级台式电脑 | 2          | 戴尔       | 28888.000   |       1 |          0 |
|        6 | HMZ-T3W 头戴显示设备             | 3          | 神州       | 6999.000    |       1 |          0 |
|        7 | X3250 M4机架式服务器 2583i14     | 5          | 索尼       | 6888.000    |       1 |          0 |
|        8 |  HMZ-T3W 头戴显示设备            | 4          | 苹果       | 69999.000   |       1 |          0 |
+----------+----------------------------------+------------+------------+-------------+---------+------------+
8 rows in set
上面多表更新并没有修改表的结构
mysql> SHOW COLUMNS FROM tdb_goods;
+-------------+------------------------+------+-----+---------+----------------+
| Field       | Type                   | Null | Key | Default | Extra          |
+-------------+------------------------+------+-----+---------+----------------+
| goods_id    | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
| goods_name  | varchar(150)           | NO   |     | NULL    |                |
| goods_cate  | varchar(40)            | NO   |     | NULL    |                |
| brand_name  | varchar(40)            | NO   |     | NULL    |                |
| goods_price | decimal(15,3) unsigned | NO   |     | 0.000   |                |
| is_show     | tinyint(1)             | NO   |     | 1       |                |
| is_saleoff  | tinyint(1)             | NO   |     | 0       |                |
+-------------+------------------------+------+-----+---------+----------------+
7 rows in set
修改表结构
mysql> ALTER TABLE tdb_goods-> CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,-> CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
Query OK, 23 rows affected (0.04 sec)
Records: 23  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM tdb_goods;
+-------------+------------------------+------+-----+---------+----------------+
| Field       | Type                   | Null | Key | Default | Extra          |
+-------------+------------------------+------+-----+---------+----------------+
| goods_id    | smallint(5) unsigned   | NO   | PRI | NULL    | auto_increment |
| goods_name  | varchar(150)           | NO   |     | NULL    |                |
| goods_cate  | varchar(40)            | NO   |     | NULL    |                |
| brand_name  | varchar(40)            | NO   |     | NULL    |                |
| goods_price | decimal(15,3) unsigned | NO   |     | 0.000   |                |
| is_show     | tinyint(1)             | NO   |     | 1       |                |
| is_saleoff  | tinyint(1)             | NO   |     | 0       |                |
+-------------+------------------------+------+-----+---------+----------------+
7 rows in set

http://www.ppmy.cn/news/156035.html

相关文章

打开”潘多拉“宝盒 ---携住酒店AI管家

今天的主人翁,不是这个潘多拉宝盒,而是一个来自携住酒店的AI管家----潘多拉。 在我看来,这个所谓的AI管家,实际上就是一个打通了酒店PMS的语音机器人而已。 这个管家设备是由云知声帮其打造的,设备的硬件没有拆解,但是从系统的分析来看,就是一个带了屏幕的Android平板,…

c语言程第三次实验报告,C语言程序设计第三次实验报告

C程序设计实验报告 实验项目&#xff1a;分支结构实验 姓名&#xff1a;胡俊 实验地点&#xff1a;家 实验时间2020.3.25 一、实验目的与要求 1、掌握C语言逻辑值的表示方法(0代表”假”&#xff0c;1代表"真") 2、学会正确地使用关系表达式和逻辑表达式 3、掌握各种…

Mini CFA 考试练习题 Microeconomics

微观经济学部分一共61道题目&#xff0c;第一次刷题正确率66%。 Q. Economics is the study of: an economy as a whole. choices in the presence of limited or scarce resources. how individuals and companies make decisions to allocate limited resources. B是对的。…

洗衣机原材料上行、价格却下行!有何猫腻?

文 | 曾响铃 来源 | 科技向令说&#xff08;xiangling0815&#xff09; 洗衣机是一款常见的家用必备电器&#xff0c;随着科技水平的不断进步&#xff0c;消费者对于洗衣机的要求早已迈出“洗衣”这个范畴。按理说行业竞争多围绕技术层面展开&#xff0c;然而今年随着大宗原材…

价格操控:大数据“杀熟”和算法合谋

投中网&#xff08;https://www.chinaventure.com.cn&#xff09; 编者按&#xff1a;“杀熟”的渊源可以追溯到5年前开始兴起的“千人千面”。原文地址 2017年12月&#xff0c;一名中国网友在微博上讲述了自己遭遇大数据“宰客”的经历。他经常通过某旅行网站预订某酒店的房间…

HP 2029 HP46墨盒和佳能G1800 原装墨水耐久性短测

最近弄了俩便宜货 顺便打了些片子 发现这个瓶装水的耐光真的是很一般啊。。。。一分钱一分货啥时候都合适啊 HP46 这个是器材城买的 一共用了两个彩盒 一个50元 一个彩盒可以打印80-90张 6寸的照片&#xff0c;然后某个颜色就没有了。。。于是出现了浪费。。。 说耐久性。。。三…

打印机清洁墨盒的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

本文研究全球与中国市场打印机清洁墨盒的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析打印机清洁墨盒的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…

惠普打印机墨盒更换教程_惠普打印机安装步骤 打印机墨盒加墨方法

惠普打印机在家装和办公区域非常受欢迎,因为在诸多打印机品牌中,惠普打印机口碑和体验度非常好,打印质量清晰,速度快。打印机购买回来要怎么对打印机进行安装呢?大家可以了解一下相关惠普打印机安装步骤,以及打印机墨盒加墨方法和惠普打印机多少钱一台。 1、网络模式 a、…