MySQL子查询与链接

 

 

 

 

 

 

 

 

 

——MySQL子查询与链接
一、set names gbk: 设置客户端的显示形式为gbk(若是以前设置是utf-8编码则显示出来文字不能识别)
二、子查询指嵌套在查询内部,必须在圆括号里使用,返回值是一个标量、一行也开始是一个数据表
三、子查询是指在另外一个查询里面的select子句
四、在进行数据表的写入时,默认是不容许写入汉字的,所以须要修改一下编码格式:
show full columns from phplamp; 检查数据表全部字段的状态
alter table phplamp change address address varchar(100) character set utf8 collate utf8_unicode_ci not null; 修改成utf8编码格式
set names gbk;将客户端修改成gbk来显示数据字段
五、子查询语句:
select avg(goods_price)from tdb_goods;求取某一列的平均值
select round(avg(goods_price),2) from tdb_goods;求取某一列的平均值,保留两位小数
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=5636.36;查找价格大于平均值的商品的id,name和price
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=(select round(avg(goods_price),2) from tdb_goods);子查询方式
select goods_price from tdb_goods where goods_cate="超级本"; 选择输出超极本笔记本的价格
select * from tdb_goods where goods_cate="超级本"\G;列显示超极本笔记本的基本信息
六、一些子查询关键字any/some/all/not in/in/
select goods_id,goods_name,goods_price from tdb_goods where goods_price>=any(select goods_price from tdb_goods where goods_cate="超级本");若是子查询返回并不是一列多个值时须要添加any,all,some
select goods_id,goods_name,goods_price from tdb_goods where goods_price=any/some(select goods_price from tdb_goods where goods_cate="超级本");大于等于,小于等于可使用any和all,可是等于只能够用some/any
select goods_id,goods_name,goods_price from tdb_goods where goods_price not in(select goods_price from tdb_goods where goods_cate="超级本")\G;not in和!=all是等效的
select goods_cate from tdb_goods group by goods_cate;使用group by函数进行结果的分类统计
insert tdb_goods_cate(cate_name) select goods_cate from tdb_goods group by goods_cate; insert-select语句查询
七、多表更新函数
多步更新:
update tdb_goods inner join tdb_goods_cate on goods_cate=cate_name set goods_cate =cate_id; 内链接更新方式,多步更新—创键表-经过insert-select写入记录-表的更新
一步更新方式:crested select函数:
create table tdb_goods_band(
-> band_id smallint unsigned primary key auto_increment,
-> brand_name varchar(50)character set utf8 collate utf8_unicode_ci not null) 编码方式为utf8汉字可输入型
-> select brand_name from tdb_goods group by brand_name;
更新结束以后咱们须要将数据列的名称和属性一块儿修改:
alter table tdb_goods
-> change goods_cate cate_id smallint unsigned not null,
-> change brand_name brand_id smallint unsigned not null;
将字符型修改成数字型,缩小占用空间
八、多表链接
内链接:只显示两个表符合链接条件的记录
select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
左外链接:显示左边所有记录以及右边符合条件的记录
select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
右外链接:链接右表的所有记录以及左表符合条件的记录
select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cate on tdb_goods.cate_id=tdb_goods_cate.cate_id;
多个表之间的链接(和两个表链接是类似的)
select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g inner join tdb_goods_cate as c on g.cate_id=c.cate_id inner join tdb_goods_band as b on g.brand_id=b.band_id;
九、无线级分类表的设计(子结构链接)
CREATE TABLE tdb_goods_types(
type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(20) character set utf8 collate utf8_unicode_ci not null,
parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
);
自身链接方式-相互嵌套
select s.type_id,s.type_name,count(p.type_name) from tdb_goods_types as s left join tdb_goods_types as p on s.parent_id=p.type_id;左表为子表
select p.type_id,p.type_name,count(s.type_name) from tdb_goods_types as p left join tdb_goods_types as s on s.parent_id=p.type_id group by p.type_name order by p.type_id;右表为父表
十、多表删除
(1)记录重复合并操做:
select goods_id,goods_name from tdb_goods group by goods_name; 以goods_name做为重复合并的字段
(2)多表删除-对照删除
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;php

相关文章
相关标签/搜索