您好,欢迎访问一九零五行业门户网

MySQL学习15:子查询(二)

二子查询 3由[not] in/exists引发的子查询 使用[not] in引发的子查询的语法结构: operand comparsion_operator [not] in (subquery)。其中, =any运算 符与in等价; !=all或all运算符与not in等价。 例子: 1)查询所有商品中价等于超级本价(任意一个)的商品
       二子查询       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 (select 
goods_price from tdb_goods where goods_cate = '超级本');
2)查询所有商品中价格不等于超级本价格(任意一个)的商品
        select goods_id,goods_name,goods_price from tdb_goods where goods_price not in (select 
goods_price from tdb_goods where goods_cate = '超级本');
使用[not] exists引发的子查询的语法结构:operand comparsion_operator [not] exists (subquery);如果子
查询返回任何行,exists将返回true;否则返回false。这种情况我们使用的比较少。
        三子查询应用        (1)insert select命令        使用insert...select插入记录的语法结构:insert [into] table_name [(col_name,...)] select ...;
        1)先来创建一个数据表tdb_goods_cates
        create table if not exists tdb_goods_cates(
              cate_id smallint unsigned primary key auto_increment,
              cate_name varchar(40) not null
        );
        2)再对数据表tdb_goods中的记录进行商品类型分类
        select goods_cate from tdb_goods group by goods_cate;
3)将查询的结果写入到数据表tdb_goods_cates
        insert tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate;
        select * from tdb_goods_cates;
4)参照商品分类表tdb_goods_cates的商品类型cate_id去更新商品表tdb_goods的商品类型(这里用到多表更新和
连接)
        update tdb_goodsinner join tdb_goods_cateson goods_cate = cate_name set goods_cate = cate_id;
        select goods_id,goods_cate from tdb_goods;
(2)多表更新        多表更新的语法结构:
        update table_references set col_name1={expr1|default} [,col_name2={expr2|default}] ... [where
 where_condition];
        上述的例子就是多表更新。
        1多表更新一步到位        我们在上面进行多表更新需要几个步骤,我们可以将其几个步骤结合在一起使用,也就是create select命
令哎创建数据表的同时将查询结果直接写入到指定的数据表中。
        创建数据表同时将查询结果写入到数据表的语法结构:
        create table [if not exists] table_name [(create_definition,...)] select_statement; 
        例子:
        1)查找数据表tdb_goods中的商品品牌(不属于步骤,只是一个简单的查询)
        select brand_name from tdb_goods group by brand_name;
2)创建数据表的同时写入记录:
        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;
        show tables;
select * from tdb_goods_brands;
3)参照数据表tdb_goods_brands中的brand_id去更新数据表tdb_goods中的brand_name的品牌类型
        update tdb_goods as ginner join tdb_goods_brands as bon g.brand_name = b.brand_name set
 g.brand_name = b.brand_id;
        select goods_id,brand_name from tdb_goods;
(3)多表更新带来的问题       到这里我们还有一个问题,就是更新了tdb_goods数据表中的goods_cate字段和brand_name字段,更新后的都
是数字类型的,而原来的是字符串型的,因此需要修改tdb_goods数据表中的那两个字段名称以及数据类型。
       1)查看tdb_goods数据表的表结构
       desc tdb_goods;
2)修改指定列的数据类型和字段名称
       alter table tdb_goods 
       change goods_cate cate_id smallint unsigned not null,
       change brand_name brand_id smallint unsigned not null;
       desc tdb_goods;
修改之后的检查操作
       3)分别在tdb_goods_cates和tdb_goods_brands表插入记录
       insert tdb_goods_cates(cate_name) values('路由器'),('交换机'),('网卡');
       insert tdb_goods_brands(brand_name) values('海尔'),('清华同方'),('神州');
4)在tdb_goods数据表中写入任意记录
       insert tdb_goods(goods_name,cate_id,brand_id,goods_price) values('laserjet pro p1606dn 黑白激光打印
机',12,4,1849);
我们看到写入记录的时候中的cate_id是12,而在数据表tdb_goods_cates中的cate_id不存在12,但是依然可以插
入记录,这是没有使用外键约束的结果。
其它类似信息

推荐信息