mysql学习第9-12 天 where和from子查询的用法
标题: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列的一个数值 去表而中查询找到了就返回这一行的整个数据