MySQL学习15:子查询(一)

一数据准备

(1)创建数据库

CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET gbk;

(2)创建数据表

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

);

(3)查看数据表结构

SHOW COLUMNS FROM tdb_goods;

(4)写入记录

设置MySQL数据库客户端显示的中文字符码格式:

SET NAMES gbk;

插入记录:

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);

INSERTtdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘X240(20ALA0

EYCD) 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);

INSERTtdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘SVP13226SC

B 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(‘玄龙精英版

笔记本散热器‘,‘笔记本配件‘,‘九州风神‘,‘134‘,DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(‘商务双肩背

包‘,‘笔记本配件‘,‘索尼‘,‘99‘,DEFAULT,DEFAULT);

SELECT * FROM tdb_goods\G;

二子查询

(1)子查询相关概念

1子查询

子查询(Subquery)是指出现在其他SQL语句内的(也就是另一个查询语句中的)SELECT子句。

例句:

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

其中,SELECT * FROM t1,称为Outer Query(外查询或者Outer Statement),SELECT column1 FROM t2,称

为Sub Query(子查询)。

2子查询组成

子查询指嵌套在查询内部,且必须始终出现在圆括号内。

子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT和相关函数等。

子查询的外层查询可以是:SELECT、INSERT、UPDATE、SET或DO。

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

括号之间。

3子查询返回值

子查询可以返回标量、一行、一列或子查询。

(2)三类子查询

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

比较运算符包括:=、>、<、>=、<=、<>、!=、<=>。使用比较运算符引发的子查询的语法结构为;operand

comparsion_operator subquery。

例子:

首先设置MySQL数据库客户端数据显示的编码格式:

SET NAMES gbk;

1)查询所有商品价格的平均值:

SELECT AVG(goods_price) FROM tdb_goods;

2)查询所有商品价格的平均值,并且结果保留两位小数

SELECT ROUND(AVG(goods_price),2) FROM tdb_goods;

3)查询所有商品价格中大于平均价格的商品

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= 5324.32;

4)通过子查询查询所有商品价格中大于平均价格的商品

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= (SELECT

ROUND(AVG(goods_price),2) FROM tdb_goods);

由此看出3)和4)的查询结果是一致的,这说明子查询起作用了。

5)查询商品类型是超极本的商品价格

SELECT goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘;

6)查询商品类型是超级本的商品

SELECT * FROM tdb_goods WHERE goods_cate = ‘超级本‘\G;

2使用ANY、SOME或ALL修饰的比较运算符的子查询

当子查询返回多个结果时可以使用ANY、SOME或ALL修饰的比较运算符,其中ANY和SOME是等价的,也就

是只需要符合其中一个即可,而ALL表示符合全部返回结果。其中语法结构为:

operand comparsion_operator ANY (subquery);

operand comparsion_operator SOME (subquery);

operand comparsion_operator ALL (subquery);

比较运算符使用ANY、SOME或ALL关键字的不同结果:

1)查询所有商品中价格不小于超级本价格(最小价格)的商品

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= ANY (SELECT

goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘);

2)查询所有商品中价格不小于超级本价格(最大价格)的商品

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= ALL (SELECT

goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘);

3)查询所有商品中价格等于超级本价格(任意一个)的商品

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price = ANY (SELECT

goods_price FROM tdb_goods WHERE goods_cate = ‘超级本‘);

时间: 2024-11-05 19:04:38

MySQL学习15:子查询(一)的相关文章

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su

MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)

同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作测试) 一.子查询 1.where型子查询:把内层查询的结果作为外层查询的比较条件 1.1 查询id最大的一件商品(使用排序+分页实现) :mysql> SELECT goods_id,goods_name,shop_price FROM goods ORDER BY goods_id DESC LIMIT 1; 1.2 查询id最大的一件商

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引 今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int a

MySQL里面的子查询

一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任何子句,比如:distinct. group by.order by.limit.join和union等:但是对应的外部查询必须是以下语句之一:select.insert.update.delete.set或 者do. 子查询的位置: select 中.from 后.where 中.group by 和order by

mysql update from 子查询

mssql 子查询更新 update log set uin= b.uinfrom log a,logs bwhere a.accountuin = b.accountuin mysql 不支持 update 子查询更新 找了半天资料 终于搞定了... update `log` a inner join `logs` b on a.`accountuin` = b.`accountuin`set a.`uin` = b.`uin` where a.`accountuin` = b.`accoun

MySQL学习15:子查询(二)

二子查询 3由[NOT] IN/EXISTS引发的子查询 使用[NOT] IN引发的子查询的语法结构:operand comparsion_operator [NOT] IN (subquery).其中,=ANY运算 符与IN等价:!=ALL或<>ALL运算符与NOT IN等价. 例子: 1)查询所有商品中价格等于超级本价格(任意一个)的商品 SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price IN (

详细讲述MySQL中的子查询操作 (来自脚本之家)

继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE table1 (   customer_id VARCHAR(10) NOT NULL,   city VARCHAR(10) NOT NULL,   PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CH

mysql数据类型和子查询

电脑的一个字节等于8位,也就是1Byte=8bit.字节(Byte /bait/ n. [C])是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符.bit中文名称是位,音译"比特",是用以描述电脑数据量的最小单位.计算机容量单位的换算关系是:1Byte=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB,1PB=1024TB,1EB=1024PB,1ZB=1024EB,1YB=1024ZB 二进制转

mysql 子句、子查询、连接查询

一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序.