2019年12月19日 | 标签:

标题:mysql进修第11天right join inner join用法

——————————————————————————————————————————-

时辰:2012/4/28 13:03:09

——————————————————————————————————————————-

内容:

create table boy
(name varchar(10),flower varchar(10)) character set utf8;
insert into boy
values
(‘谢霆锋’,’菊花’),
(‘吴宗宪’,’梅花’),
(‘刘德华’,’桃花’),
(‘周润发’,’玫瑰’),
(‘小沈阳’,’没钱花’);

 

create table girl
(name varchar(10),flower varchar(10)) character set utf8;

insert into girl
values
(‘张柏芝’,’菊花’),
(‘张静初’,’玫瑰’),
(‘邱淑贞’,’桃花’),
(‘张柏芝’,’玫瑰’),
(‘空姐’,’菊花’),
(‘小泽玛莉亚’,’玫瑰’),
(‘范冰冰’,’茉莉’);

select boy.*,girl.* from boy left join girl on boy.flower=girl.flower;

select boy.*,girl.* from boy right join girl on boy.flower=girl.flower;

select boy.*,girl.* from boy inner join girl on boy.flower=girl.flower;

 

 

解读一个误区 left join不是excel的 vlookup

若是是主表在附表有2行以上婚配的时辰 他会全数列出来 主表会反复

比方主表10行数据 附表10个行数 最初的表的数据大于即是10行 主表没配对上的留空

主表多配对的列出来多有配对的环境

inner join便是删掉了不配对的环境

create table boy
(name varchar(10),flower varchar(10)) character set utf8;
insert into boy
values
(‘谢霆锋’,’菊花’),
(‘吴宗宪’,’梅花’),
(‘刘德华’,’桃花’),
(‘周润发’,’玫瑰’),
(‘小沈阳’,’没钱花’);

 

create table girl
(name varchar(10),flower varchar(10)) character set utf8;

insert into girl
values
(‘张柏芝’,’菊花’),
(‘张静初’,’玫瑰’),
(‘邱淑贞’,’桃花’),
(‘张柏芝’,’玫瑰’),
(‘空姐’,’菊花’),
(‘小泽玛莉亚’,’玫瑰’),
(‘范冰冰’,’茉莉’);

select boy.*,girl.* from boy left join girl on boy.flower=girl.flower;

select boy.*,girl.* from boy right join girl on boy.flower=girl.flower;

select boy.*,girl.* from boy inner join girl on boy.flower=girl.flower;

 

 

解读一个误区 left join不是excel的 vlookup

若是是主表在附表有2行以上婚配的时辰 他会全数列出来 主表会反复

比方主表10行数据 附表10个行数 最初的表的数据大于即是10行 主表没配对上的留空

主表多配对的列出来多有配对的环境

inner join便是删掉了不配对的环境

 

 

标题:mysql 进修第12天 left join嵌套操纵和列操纵

——————————————————————————————————————————-

时辰:2012/4/30 1:18:25

——————————————————————————————————————————-

内容:

create table goods
(goods_id int primary key auto_increment,
goods_name varchar(20),cate_id int,brand_id int,price decimal(7,2) not null default 0.01);

 

建立一个goods表 里面的主键是goods_id 这里的auto_increment不要拼写毛病
包罗商品称号商品id 品牌id 产物范例id价钱 根基因此数字为住 便利疾速查问同类商品(where cateid=3 比where catename=手机 效力要快良多)和分类 节俭空间 用数字代表长的字符串
点窜商品分类信息 只用去挪用的信息里点窜便能够 不影响主表 出格是主表数据几万条 我只用点窜id对应的称号便可 不必update几万条数据

insert into goods
(goods_name,cate_id,brand_id,price)
values
(‘遐想手机’,1,1,1334.44),
(‘三星手机’,1,2,2334.44),
(‘苹果电脑’,2,3,7334.44),
(‘苹果手机’,1,3,5334.44);

给商品表信息加一些数据

create table category
(cate_id int,cate_name varchar(20));
insert into category
values
(1,’手机’),
(2,’电脑’);

建立一个种别称号表 给商品表挪用

create table brand
(brand_id int,brand_name varchar(20));
insert into brand
values
(1,’遐想’),
(2,’三星’),
(3,’苹果’);
建立一个品牌称号表 便利挪用品牌名

select * from goods left join category on cate_id=category.cate_id;
我此刻要按照商品表 主表里的信息查找对应的商品种别称号  这里面的cate-id要指明 要不会分校不清晰

select * from (select goods_id,goods_name,brand_id,goods.cate_id,category.cate_name from goods left join category on goods.cate_id=category.cate_id) as temp left join brand on temp.brand_id=brand.brand_id;
我这里要做一个2次挪用 嵌套链接 把后面的成果就地一个姑且表 而后用as 给他起个名字 再用这个姑且的temp表和品牌表一路做左链接 挪用

select * from goods left join category on goods.cate_id=category.cate_id left join brand on goods.brand_id=brand.brand_id;

或间接在后面写 由于mysql计较挨次的时辰 起首是计较from后面的获得原始数据 再装置select去除响应的列
再用where判定 以是我不必带括号间接 left join 再接一个left join

对于列点窜
增添列是
alter table tablename add colomnname int after|first
来定位新增添的列
比方
alter table goods add test int first;

点窜列
alter table goods test stock int;

删除
alter table goods drop stock;

create table goods
(goods_id int primary key auto_increment,
goods_name varchar(20),cate_id int,brand_id int,price decimal(7,2) not null default 0.01);

 

建立一个goods表 里面的主键是goods_id 这里的auto_increment不要拼写毛病
包罗商品称号商品id 品牌id 产物范例id价钱 根基因此数字为住 便利疾速查问同类商品(where cateid=3 比where catename=手机 效力要快良多)和分类 节俭空间 用数字代表长的字符串
点窜商品分类信息 只用去挪用的信息里点窜便能够 不影响主表 出格是主表数据几万条 我只用点窜id对应的称号便可 不必update几万条数据

insert into goods
(goods_name,cate_id,brand_id,price)
values
(‘遐想手机’,1,1,1334.44),
(‘三星手机’,1,2,2334.44),
(‘苹果电脑’,2,3,7334.44),
(‘苹果手机’,1,3,5334.44);

给商品表信息加一些数据

create table category
(cate_id int,cate_name varchar(20));
insert into category
values
(1,’手机’),
(2,’电脑’);

建立一个种别称号表 给商品表挪用

create table brand
(brand_id int,brand_name varchar(20));
insert into brand
values
(1,’遐想’),
(2,’三星’),
(3,’苹果’);
建立一个品牌称号表 便利挪用品牌名

select * from goods left join category on cate_id=category.cate_id;
我此刻要按照商品表 主表里的信息查找对应的商品种别称号  这里面的cate-id要指明 要不会分校不清晰

select * from (select goods_id,goods_name,brand_id,goods.cate_id,category.cate_name from goods left join category on goods.cate_id=category.cate_id) as temp left join brand on temp.brand_id=brand.brand_id;
我这里要做一个2次挪用 嵌套链接 把后面的成果就地一个姑且表 而后用as 给他起个名字 再用这个姑且的temp表和品牌表一路做左链接 挪用

select * from goods left join category on goods.cate_id=category.cate_id left join brand on goods.brand_id=brand.brand_id;

或间接在后面写 由于mysql计较挨次的时辰 起首是计较from后面的获得原始数据 再装置select去除响应的列
再用where判定 以是我不必带括号间接 left join 再接一个left join

对于列点窜
增添列是
alter table tablename add colomnname int after|first
来定位新增添的列
比方
alter table goods add test int first;

点窜列
alter table goods test stock int;

删除
alter table goods drop stock;

不批评 (894 views)
2019年12月18日 | 标签:

标题:mysql进修第9 天 where和from子查问的用法

——————————————————————————————————————————-

时辰:2012/4/26 1:04:30

——————————————————————————————————————————-

内容:

起首看一个数据吧

 name  score
 cotine  53
 cotine  43
 stephen  75
 stephen  63

很简略很通俗的分数表

cotine的人 有门作业是53有门是43

stephen的人 有门75 有门63

我想晓得分数低于50的人的均匀分

再处理这个题目之前 咱们要进修下from的子查问

select * from  where抒发式 大师都晓得

实在这个抒发式能够是一个子句

便是 select * from student where score between 0 and 50,

where便是里面的查问成果是作为里面的挑选前提

from 便是里面的零时表便是里面的挪用的 而后操纵from 必然要谨慎 嵌套的时辰 零时表必然要起个体名 要不然不能挪用的

 

起首看一个数据吧

 name  score
 cotine  53
 cotine  43
 stephen  75
 stephen  63

很简略很通俗的分数表

cotine的人 有门作业是53有门是43

stephen的人 有门75 有门63

我想晓得分数低于50的人的均匀分

再处理这个题目之前 咱们要进修下from的子查问

select * from  where抒发式 大师都晓得

实在这个抒发式能够是一个子句

便是 select * from student where score between 0 and 50,

where便是里面的查问成果是作为里面的挑选前提

from 便是里面的零时表便是里面的挪用的 而后操纵from 必然要谨慎 嵌套的时辰 零时表必然要起个体名 要不然不能挪用的

标题:mysql 进修第10天 exist用户和where in的区分

——————————————————————————————————————————-

时辰:2012/4/26 18:08:17

——————————————————————————————————————————-

内容:

有一个表1 叫TA 记实汶川地动时辰捐钱信息放着捐钱国民和金额和名字

 name  donate
 stephen  100
 hou  200
 zhang  200
 zheng  200
xiao  200

有一个表2 叫TB 记实玉树地动时辰捐钱信息放着捐钱国民和金额和名字

 name  donate
 xiao  100
 hou  200
 zhu  200
 ben  200
wu  200

此刻我须要晓得在玉树地动捐钱的名单中 谁在汶川地点的时辰已捐过了

能够用where in来做

select * from TB where name in (select name from TA),

where in履行方式是先做内查问的  获得零时表的成果集

而后对tb表中每户数据停止判定 是否是在这个成果集合

那末计较方式是插手a表有a行 b表有b行 计较量是

1,掏出颠末挑选的a行数据—-2,对b行的每行数据在a行数据中对照 找到就复合前提 比拟A*B次  就获得成果

总的计较量是  读取(A)次+比拟(A*B)次

也能够用 exists 做

select * from TB where exists (select 1 from TA TB.name=TA.name)

exists履行方式是 掏出表面的每行数据 代入到 外部中停止比拟, 若是存在 就获得结算

那末我门来算下这类方式的计较量

读取B行+ 比拟(A*B)次

那末很较着 若是a比拟小的时辰 用in 也便是说先计较的表比拟小时辰用in

若是b小的时辰用exists  也是读取小表用

 

那末简略了 甚么时辰用exists 甚么操纵用in呢

 

当我手上拿着一张小表 我要去大表里找小表中反复的数据我用exsit

若是手上是大表 我要小表中找反复的数据我用in

 

 

有一个表1 叫TA 记实汶川地动时辰捐钱信息放着捐钱国民和金额和名字

 name  donate
 stephen  100
 hou  200
 zhang  200
 zheng  200
xiao  200

有一个表2 叫TB 记实玉树地动时辰捐钱信息放着捐钱国民和金额和名字

 name  donate
 xiao  100
 hou  200
 zhu  200
 ben  200
wu  200

此刻我须要晓得在玉树地动捐钱的名单中 谁在汶川地点的时辰已捐过了

能够用where in来做

select * from TB where name in (select name from TA),

where in履行方式是先做内查问的  获得零时表的成果集

而后对tb表中每户数据停止判定 是否是在这个成果集合

那末计较方式是插手a表有a行 b表有b行 计较量是

1,掏出颠末挑选的a行数据—-2,对b行的每行数据在a行数据中对照 找到就复合前提 比拟A*B次  就获得成果

总的计较量是  读取(A)次+比拟(A*B)次

也能够用 exists 做

select * from TB where exists (select 1 from TA TB.name=TA.name)

exists履行方式是 掏出表面的每行数据 代入到 外部中停止比拟, 若是存在 就获得结算

那末我门来算下这类方式的计较量

读取B行+ 比拟(A*B)次

那末很较着 若是a比拟小的时辰 用in 也便是说先计较的表比拟小时辰用in

若是b小的时辰用exists  也是读取小表用

 

那末简略了 甚么时辰用exists 甚么操纵用in呢

 

当我手上拿着一张小表 我要去大表里找小表中反复的数据我用exsit

若是手上是大表 我要小表中找反复的数据我用in

 

标题:mysql进修第10天union用法和左链接

——————————————————————————————————————————-

时辰:2012/4/28 0:37:01

——————————————————————————————————————————-

内容:

union用法

讲一个和多个表结合在一个新表中

默许有去除反复行的特色 加上union all能够加疾速率 不让归并

union 后排序首要要加括号 请求union的2个或多个表列的数目不异便可 范例能够差别

可是行的元素完整一样 后面的省略

 

左链接用法

类是excel的vlookup

左侧是我的主表 我对主表某一行的数据须要到右侧去查找对应的值 以是要

select biao1.lie1,biao1.lie2, from biao1 left join biao2 on biao1.lie1.biao2.lie1

 

用处便是表1列的一个数值 去表而中查问找到了就前往这一行的全数数据

union用法

讲一个和多个表结合在一个新表中

默许有去除反复行的特色 加上union all能够加疾速率 不让归并

union 后排序首要要加括号 请求union的2个或多个表列的数目不异便可 范例能够差别

可是行的元素完整一样 后面的省略

 

左链接用法

类是excel的vlookup

左侧是我的主表 我对主表某一行的数据须要到右侧去查找对应的值 以是要

select biao1.lie1,biao1.lie2, from biao1 left join biao2 on biao1.lie1.biao2.lie1

 

用处便是表1列的一个数值 去表而中查问找到了就前往这一行的全数数据

不批评 (442 views)
2019年12月18日 | 标签:

标题:mysql进修第7天查问子句详解where 和group详解

——————————————————————————————————————————-

时辰:2012/4/22 18:03:57

内容:

select * from table where

where 后面是抒发式
在这今后上抒发式是否是至心
select * from table where 1=1 就全数行
select * from table where id>100
select * from table where id>parentid
where 共同算术抒发式
<,>,>=,<=,<>,!=,=,
在值的规模内大于100小于10
between 10 and 100,
详细值举例 值是a,b,c,d都算复合
包罗in (a,b,c,d)
也能够用逻辑抒发式
大于10小于100
where id<100 and id<10
where id between 10 and 100;
not !
and  &&
or  ||
恍惚查问
like
%肆意字符
_ 单个字符
比方查ab开首的
ab%
比方查3位字符a开首的
a__
group语法
max min sum count 总行数
avg
max(price)
把列名字当参数看

select * from table where

where 后面是抒发式
在这今后上抒发式是否是至心
select * from table where 1=1 就全数行
select * from table where id>100
select * from table where id>parentid
where 共同算术抒发式
<,>,>=,<=,<>,!=,=,
在值的规模内大于100小于10
between 10 and 100,
详细值举例 值是a,b,c,d都算复合
包罗in (a,b,c,d)
也能够用逻辑抒发式
大于10小于100
where id<100 and id<10
where id between 10 and 100;
not !
and  &&
or  ||
恍惚查问
like
%肆意字符
_ 单个字符
比方查ab开首的
ab%
比方查3位字符a开首的
a__
group语法
max min sum count 总行数
avg
max(price)
把列名字当参数看

标题:mysql进修第8天having用法以where区分

——————————————————————————————————————————-

时辰:2012/4/24 18:41:05

——————————————————————————————————————————-

内容:

后面已学会了操纵select from where 抒发式

比方我要选成就不合格的师长教师名单
select name,score from class where sroce<60
咱们还能够停止多前提查问
比方在下面的再加个限定前提只需男师长教师的不合格的名单 必经女生爱体面嘛
select name,score from class where sroce<60 and sex like ‘f%’
可是若是先停止了计较师长教师成了一列 再对这个重生成的列停止赛选 where就力有未逮了
比方
select name,avg(math_score,yuwen_sroce,english_sorcre) as  avg_score from class where avg_score<60
这句话便是错的 报错是 avg_score是不晓得的列,缘由是 where的履行挨次优先与avg,以是当咱们用where avg_score还没降生  由于咱们一旦操纵了where 语句先会对每行停止判定 是否是合适
若是合适 在停止后面的运算,以是没法 就要用having ,这样咱们间接对成果停止挑选 而不是先挑选 再计较
where和having的区分是
where是先从硬盘读取数据在赛选 再结算 列出
having是先计较 在再选
对一行数据停止计较 重生成一列 须要用列名加标记比方语文分数+数学分数+英语分数
对一列数据忘性计较便能够用公式 sum(语文分数+数学分数+英语分数)乃至是
select socre<100,name,id 如许也能够的

后面已学会了操纵select from where 抒发式

比方我要选成就不合格的师长教师名单
select name,score from class where sroce<60
咱们还能够停止多前提查问
比方在下面的再加个限定前提只需男师长教师的不合格的名单 必经女生爱体面嘛
select name,score from class where sroce<60 and sex like ‘f%’
可是若是先停止了计较师长教师成了一列 再对这个重生成的列停止赛选 where就力有未逮了
比方
select name,avg(math_score,yuwen_sroce,english_sorcre) as  avg_score from class where avg_score<60
这句话便是错的 报错是 avg_score是不晓得的列,缘由是 where的履行挨次优先与avg,以是当咱们用where avg_score还没降生  由于咱们一旦操纵了where 语句先会对每行停止判定 是否是合适
若是合适 在停止后面的运算,以是没法 就要用having ,这样咱们间接对成果停止挑选 而不是先挑选 再计较
where和having的区分是
where是先从硬盘读取数据在赛选 再结算 列出
having是先计较 在再选
对一行数据停止计较 重生成一列 须要用列名加标记比方语文分数+数学分数+英语分数
对一列数据忘性计较便能够用公式 sum(语文分数+数学分数+英语分数)乃至是
select socre<100,name,id 如许也能够的标题:mysql进修第9天order by limit用法

——————————————————————————————————————————-

时辰:2012/4/25 1:09:05

——————————————————————————————————————————-

内容:

排序就不必多说了

order by 字段名 asc降序 默许是升序desc
能够多字段排序 后面的优先
limit是限定成果数目 limit 2,4 是省略后面2个 起头限定4个
这个是分页用的比拟多 间接省略后面n页*每行个数
order by能够停止计较 先select 再order by 和where不一样的
以是能够用order by colo A减clo b
不像后面用where不行要用having

排序就不必多说了

order by 字段名 asc降序 默许是升序desc
能够多字段排序 后面的优先
limit是限定成果数目 limit 2,4 是省略后面2个 起头限定4个
这个是分页用的比拟多 间接省略后面n页*每行个数
order by能够停止计较 先select 再order by 和where不一样的
以是能够用order by colo A减clo b
不像后面用where不行要用having
不批评 (764 views)