mysql子查询语句怎么写
小编给大家分享一下mysql子查询语句怎么写,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
mysql子查询语句是指在另一个查询语句中的SELECT子句,例句如“SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);”。
本文操作环境:Windows7系统、mysql5.7版、Dell G3电脑。
mysql 子查询语句:
1.子查询是指在另一个查询语句中的SELECT子句。
例句:
SELECT*FROMt1WHEREcolumn1=(SELECTcolumn1FROMt2);
其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),
SELECT column1 FROM t2 称为Sub Query[子查询]。
所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。
子查询必须出现在圆括号之间。
行级子查询
SELECT*FROMt1WHERE(col1,col2)=(SELECTcol3,col4FROMt2WHEREid=10);SELECT*FROMt1WHEREROW(col1,col2)=(SELECTcol3,col4FROMt2WHEREid=10);
行级子查询的返回结果最多为一行。
优化子查询
-- 创建数据表
CREATETABLEIFNOTEXISTStdb_goods(goods_idSMALLINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,goods_nameVARCHAR(150)NOTNULL,goods_cateVARCHAR(40)NOTNULL,brand_nameVARCHAR(40)NOTNULL,goods_priceDECIMAL(15,3)UNSIGNEDNOTNULLDEFAULT0,is_showBOOLEANNOTNULLDEFAULT1,is_saleoffBOOLEANNOTNULLDEFAULT0);
-- 写入记录
INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('R510VC15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('Y400N14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('G150TH15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('X550CC15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('X240(20ALA0EYCD)12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('U330P13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('SVP13226SCB13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('iPadminiMD531CH/A7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('iPadAirMD788CH/A9.7英寸平板电脑(16GWiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('iPadminiME279CH/A配备Retina显示屏7.9英寸平板电脑(16GWiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('IdeaCentreC34020英寸一体电脑','台式机','联想','3499',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('Vostro3800-R1206台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('iMacME086CH/A21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('AT7-7414LP台式电脑(i5-3450四核4G500G2G独显DVD键鼠Linux)','台式机','宏碁','3699',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('Z220SFFF4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('PowerEdgeT110II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('MacProMD878CH/A专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('HMZ-T3W头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('X3250M4机架式服务器2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('玄龙精英版笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('HMZ-T3W头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);INSERTtdb_goods(goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff)VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
-- 求所有电脑产品的平均价格,并且保留两位小数,AVG,MAX,MIN、COUNT、SUM为聚合函数
SELECTROUND(AVG(goods_price),2)ASavg_priceFROMtdb_goods;
-- 查询所有价格大于平均价格的商品,并且按价格降序排序
SELECTgoods_id,goods_name,goods_priceFROMtdb_goodsWHEREgoods_price>5845.10ORDERBYgoods_priceDESC;
-- 使用子查询来实现
SELECTgoods_id,goods_name,goods_priceFROMtdb_goodsWHEREgoods_price>(SELECTROUND(AVG(goods_price),2)ASavg_priceFROMtdb_goods)ORDERBYgoods_priceDESC;
-- 查询类型为“超记本”的商品价格
SELECTgoods_priceFROMtdb_goodsWHEREgoods_cate='超级本';
-- 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列
SELECTgoods_id,goods_name,goods_priceFROMtdb_goodsWHEREgoods_price=ANY(SELECTgoods_priceFROMtdb_goodsWHEREgoods_cate='超级本')ORDERBYgoods_priceDESC;
-- = ANY 或 = SOME 等价于 IN
SELECTgoods_id,goods_name,goods_priceFROMtdb_goodsWHEREgoods_priceIN(SELECTgoods_priceFROMtdb_goodsWHEREgoods_cate='超级本')ORDERBYgoods_priceDESC;
-- 创建“商品分类”表
CREATETABLEIFNOTEXISTStdb_goods_cates(cate_idSMALLINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,cate_nameVARCHAR(40));
-- 查询tdb_goods表的所有记录,并且按"类别"分组
SELECTgoods_cateFROMtdb_goodsGROUPBYgoods_cate;
-- 将分组结果写入到tdb_goods_cates数据表
INSERTtdb_goods_cates(cate_name)SELECTgoods_cateFROMtdb_goodsGROUPBYgoods_cate;
-- 通过tdb_goods_cates数据表来更新tdb_goods表
UPDATEtdb_goodsINNERJOINtdb_goods_catesONgoods_cate=cate_nameSETgoods_cate=cate_id;
-- 通过CREATE...SELECT来创建数据表并且同时写入记录
--SELECTbrand_nameFROMtdb_goodsGROUPBYbrand_name;CREATETABLEtdb_goods_brands(brand_idSMALLINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,brand_nameVARCHAR(40)NOTNULL)SELECTbrand_nameFROMtdb_goodsGROUPBYbrand_name;
-- 通过tdb_goods_brands数据表来更新tdb_goods数据表(错误)
UPDATEtdb_goodsINNERJOINtdb_goods_brandsONbrand_name=brand_nameSETbrand_name=brand_id;--Column'brand_name'infieldlistisambigous
-- 正确
UPDATEtdb_goodsASgINNERJOINtdb_goods_brandsASbONg.brand_name=b.brand_nameSETg.brand_name=b.brand_id;
-- 查看tdb_goods的数据表结构
DESCtdb_goods;
-- 通过ALTER TABLE语句修改数据表结构
ALTERTABLEtdb_goodsCHANGEgoods_catecate_idSMALLINTUNSIGNEDNOTNULL,CHANGEbrand_namebrand_idSMALLINTUNSIGNEDNOTNULL;--分别在tdb_goods_cates和tdb_goods_brands表插入记录INSERTtdb_goods_cates(cate_name)VALUES('路由器'),('交换机'),('网卡');INSERTtdb_goods_brands(brand_name)VALUES('海尔'),('清华同方'),('神舟');
-- 在tdb_goods数据表写入任意记录
INSERTtdb_goods(goods_name,cate_id,brand_id,goods_price)VALUES('LaserJetProP1606dn黑白激光打印机','12','4','1849');
-- 查询所有商品的详细信息(通过内连接实现)
SELECTgoods_id,goods_name,cate_name,brand_name,goods_priceFROMtdb_goodsASgINNERJOINtdb_goods_catesAScONg.cate_id=c.cate_idINNERJOINtdb_goods_brandsASbONg.brand_id=b.brand_id\G;
-- 查询所有商品的详细信息(通过左外连接实现)
SELECTgoods_id,goods_name,cate_name,brand_name,goods_priceFROMtdb_goodsASgLEFTJOINtdb_goods_catesAScONg.cate_id=c.cate_idLEFTJOINtdb_goods_brandsASbONg.brand_id=b.brand_id\G;
-- 查询所有商品的详细信息(通过右外连接实现)
SELECTgoods_id,goods_name,cate_name,brand_name,goods_priceFROMtdb_goodsASgRIGHTJOINtdb_goods_catesAScONg.cate_id=c.cate_idRIGHTJOINtdb_goods_brandsASbONg.brand_id=b.brand_id\G;
-- 无限分类的数据表设计
CREATETABLEtdb_goods_types(type_idSMALLINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,type_nameVARCHAR(20)NOTNULL,parent_idSMALLINTUNSIGNEDNOTNULLDEFAULT0);INSERTtdb_goods_types(type_name,parent_id)VALUES('家用电器',DEFAULT);INSERTtdb_goods_types(type_name,parent_id)VALUES('电脑、办公',DEFAULT);INSERTtdb_goods_types(type_name,parent_id)VALUES('大家电',1);INSERTtdb_goods_types(type_name,parent_id)VALUES('生活电器',1);INSERTtdb_goods_types(type_name,parent_id)VALUES('平板电视',3);INSERTtdb_goods_types(type_name,parent_id)VALUES('空调',3);INSERTtdb_goods_types(type_name,parent_id)VALUES('电风扇',4);INSERTtdb_goods_types(type_name,parent_id)VALUES('饮水机',4);INSERTtdb_goods_types(type_name,parent_id)VALUES('电脑整机',2);INSERTtdb_goods_types(type_name,parent_id)VALUES('电脑配件',2);INSERTtdb_goods_types(type_name,parent_id)VALUES('笔记本',9);INSERTtdb_goods_types(type_name,parent_id)VALUES('超级本',9);INSERTtdb_goods_types(type_name,parent_id)VALUES('游戏本',9);INSERTtdb_goods_types(type_name,parent_id)VALUES('CPU',10);INSERTtdb_goods_types(type_name,parent_id)VALUES('主机',10);
-- 查找所有分类及其父类
SELECTs.type_id,s.type_name,p.type_nameFROMtdb_goods_typesASsLEFTJOINtdb_goods_typesASpONs.parent_id=p.type_id;
-- 查找所有分类及其子类
SELECTp.type_id,p.type_name,s.type_nameFROMtdb_goods_typesASpLEFTJOINtdb_goods_typesASsONs.parent_id=p.type_id;
-- 查找所有分类及其子类的数目
SELECTp.type_id,p.type_name,count(s.type_name)ASchildren_countFROMtdb_goods_typesASpLEFTJOINtdb_goods_typesASsONs.parent_id=p.type_idGROUPBYp.type_nameORDERBYp.type_id;
-- 为tdb_goods_types添加child_count字段
ALTERTABLEtdb_goods_typesADDchild_countMEDIUMINTUNSIGNEDNOTNULLDEFAULT0;
-- 将刚才查询到的子类数量更新到tdb_goods_types数据表
UPDATEtdb_goods_typesASt1INNERJOIN(SELECTp.type_id,p.type_name,count(s.type_name)ASchildren_countFROMtdb_goods_typesASpLEFTJOINtdb_goods_typesASsONs.parent_id=p.type_idGROUPBYp.type_nameORDERBYp.type_id)ASt2ONt1.type_id=t2.type_idSETt1.child_count=t2.children_count;
-- 复制编号为12,20的两条记录
SELECT*FROMtdb_goodsWHEREgoods_idIN(19,20);
-- INSERT ... SELECT实现复制
INSERTtdb_goods(goods_name,cate_id,brand_id)SELECTgoods_name,cate_id,brand_idFROMtdb_goodsWHEREgoods_idIN(19,20);
-- 查找重复记录
SELECTgoods_id,goods_nameFROMtdb_goodsGROUPBYgoods_nameHAVINGcount(goods_name)>=2;
-- 删除重复记录
DELETEt1FROMtdb_goodsASt1LEFTJOIN(SELECTgoods_id,goods_nameFROMtdb_goodsGROUPBYgoods_nameHAVINGcount(goods_name)>=2)ASt2ONt1.goods_name=t2.goods_nameWHEREt1.goods_id>t2.goods_id;
看完了这篇文章,相信你对“mysql子查询语句怎么写”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。