Mysql数据库-子查询和连接

新建一张表:create table tdb_goods(

同时插入数据 -> goods_id smallint(5) unsigned not null 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.000,

     -> is_show tinyint(1) nut null default 1,

          -> is_saleoff tinyint(1) not null default 0

       -> );

1.子查询:出现在其他sql语句内的select子句,嵌套在查询内部,而且必然出现再()

select * from t1 where col1= (select col2 from t2);

外层查询                      内层查询

子查询可以包含多个关键字。

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

比较运算符的子查询:=  >  <  >=  <=  <>  !=  <=>

select round(avg(goods_price),2) from tdb_goods; //查询平均价格并保留2位小数

    select goods_id,goods_name,goods_price from tdb_goods where goods_price>=5000.00;

查询goods_price字段值大于5000.00的几个字段。

 

将上述两个语句合并,就是子查询语句:

select goods_id,goods_name,goods_price from tdb_goods where goods_price>=(select round(avg(goods_price),2) from tdb_goods);

 

如果子查询返回多个结果,使用any  some (符合部分)   all(符合全部)

select goods_id,goods_name,goods_price from tdb_goods where goods_price>any (select goods_price from tdb_goods where goods_cate='超极本');

查询价格大于(goods_cate=超极本的价格idnameprice

--------------------------------------------------

[not] in (子查询语句

[not] exists :如果子查询返回值,是true,否则是false

2.使用insert...select插入记录:insert [into] tbl_name [(col_name,...)] select...

新建另外一张表: create table if not exists tdb_goods_cates(

     -> cate_id smallint unsigned primary key auto_increment,

    -> cate_name varchar(40) not null

     -> );

 并查看按某字段的分类:select goods_cate from tdb_goods group by goods_cate;

(查看数据表结构:desc tdb_goods_cates;)

 

依据查询条件插入记录: 

insert tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate;

3.多表更新:(接下来,参照分类表来更新商品表)

update table_references set col_name1={expr1|default} [,col_name2={expr2|default}]... [where where_condition]

示例:update tdb_goods inner join tdb_goods_cates on goods_cate=cate_name

    -> set goods_cate=cate_id;

inner join是内连接,将两张表以字段goods_catecate_name相等为条件,并设置cate=id值。

tdb_goods的所有goods_cate字段的值,将被替换成表tdb_goods_catescate_id值。

4.多表更新:一步到位-- 建表+查询+写数据(将查询结果写入新建的数据表中)

create table [if not exists] tbl_name [(creat_definition,...)] select_statement

示例: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,并设置有两个字段,并将查询结果直接插入表。

接下来仍是多表更新,主表根据副表的字段相应修改:

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;

这里as是给表起一个别名,使系统可以认出代表的是哪张表。

多表更新之后,记得要把主表的字段进行更新:

alter table tdb_goods

    -> change brand_name brand_id smallint unsigned not null;

5.两表连接: 

table_reference {[inner | cross] join | {left |right} [outer] join} table_reference on conditional_expr

内连接:inner joincross joinjoin是等价的; //显示左表与右表的交集部分

select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id;

查询goods_id3个字段,从两张表(以内连接方式),查询条件是这两个字段值相等。

左外连接:left [outer] join //显示左表的全部记录及右表符合条件的记录

右外连接:right [outer] join //显示右表的全部记录及左表符合条件的记录

使用on设定连接条件,使用where关键字进行结果集记录的过滤。

6.多表连接:

select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g 

    -> inner join tdb_goods_cates as c on g.cate_id=c.cate_id

    -> inner join tdb_goods_brands as b on g.brand_id=b.brand_id;

三张表共同inner join

7.无限级分类表设计:

新建一张表: CREATE TABLE tdb_goods_types(

      type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

         type_name VARCHAR(20) NOT NULL,

      parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0

   ); 

其中type_name存储分类,parent_id显示父类id(type_id).

比如id2name是电脑,parent_id0(本身是父类)

id9name是电脑整机,parent_id2.(父类是id2的电脑)

查询的时候,需要与本身做连接,查询所有子类及其父类

 select s.type_id,s.type_name,p.type_name from tdb_goods_types as s 

left join tdb_goods_types as p on s.parent_id=p.type_id;

左侧p为父表,右侧s为子表。

 

查询所有父类及其子类

select p.type_id,p.type_name,s.type_name from tdb_goods_types as p 

left join tdb_goods_types as s on s.parent_id=p.parent_id; 

对查询结果按p.type_name进行分组,并按p.type_id进行排序:

select p.type_id,p.type_name,s.type_name from tdb_goods_types as p left join tdb_goods_types as s on s.parent_id=p.parent_id group by p.type_name order by p.type_id; 

8.多表删除:delete tbl_name[.*] [,tbl_name[.*]]... From table_references [where where_condition]

将删除重复的记录,只保留id号较小的记录:

delete t1 from tdb_goods as t1 left join (select goods_id,goods_name from tdb_goods group by goods_name having count(goods_name)>=2) as t2 on t1.goods_name=t2.goods_name where t1.goods_id>t2.goods_id;

()内的查询出的表作为t2

 

 

 

 

 

 

 

 

一直在http://www.imooc.com/ 学习,感觉不错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limaning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值