在我们用php处理数据的时候总会遇到些比较麻烦的事情,比如:两个二维数组,一个装的是文章分类表内容,一个装的是文章列表,有关联字段,完全等值,要求在列表文章的时候同时能在标题的前面显示栏目名称,此时循环文章列表,在循环中再次循环栏目列表,对比关联字段,相同的就是这篇文章所在的栏目了,取其名称显示,这是php的做法,如果文章比较多,或者栏目较多,比如100篇文章有100个栏目,循环的数量将是一万次,这个时候呢其实可以用mysql自己进行计算的,这种做法是双表联查,基本语法如下:

Select表1.字段,表2.字段 from 表1,表2 where 表1.关联字段=表2.关联字段,做个测试自行建如下表:

栏目表结构menu

tid int(10)

name varchar(32)

文章表结构article

wid int(10)

tid int(10)

title varchar(100)

content text

执行下面语句:

SELECT `menu`.`name`, `article`.`id`,`article`.`title`

FROM `article`,`menu`

WHERE `article`.`tid` = `menu`.`tid`

我只显示了栏目名称,文章的ID 和 标题 ,如果是取这个结果输出的话。。那就省事了。一次循环就可以了。

结果如上图。

在php运算量大的时候把一些运算交给mysql处理会大大减少php的工作量,数据量大的时候mysql会明显快点的,除了双表联查,mysql还提供了另外的一种做法叫做对照查询,语法如下:

SELECT 表1.字段, 表2字段

FROM 表1

LEFT JOIN 表2 ON 表1.关联字段 = 表2.关联字段

在此使用了

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

在此使用的原理和上面的完全不同

原理是:对照查询,是以其中一表为基准。若是right则是表2为基准

而双表联查:则是按两张表的数据能关联上的时候。才视为符合查询条件。

如果用 inner join 那和双表联查的结果基本上一致了。

如果我们做的一个商城运营到一段时间后老板想知道有多少实际交易及每个用户的交易额,知道产生多少交易select count(*) from 表名但是知道多少个用户交易过,就不好算了,每个用户又分别交易多少笔呢,这个时候可以使用分组功能,关键字为group by拿之前的表测试下我们想知道每个栏目下分别有多少篇文章相当于每个用户分别产生了多少笔交易,

select `tid`,count(*) from `article` GROUP BY `tid`

分组查询,相当于把数据库中的指定字段,相同的数据叠在一起。 这个时候使用 count 的话,返回的不是一共有多少组。而是每一组有多少条数据。

如果我们手上有几篇文章的 id,如果我们手上有几篇文章的 id,比如,我们现在手上有 3 6 9 三个 id

按刚才的文章表。应该怎么查呢。 才能让它们出现在一个结果里。

估计有人会想到这个吧

select * from `article` where `wid`=3 or `wid`=6 or `wid` = 9

如果是这样的话,又会存在一个新的问题,对于 PHP 来说,要写很多 or  这个时候用in再合适不过,

in 语法格式

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

如果要查的值不是很多的话,用这种方式,是很省事的。
如果你要查的值,数据是成千上万级的。那就是另一回事。。子查询。

我先来做个假设,如果我们手上有几千个会员,我只想看前20个人的交易记录。
此时可以用对照查询,

我们查询用户表的语句大概会是这样子。

select * from `user`
where `vip` = 1

比如交易表名叫 shop 购物表,两张表都有 username 字段对应。 我们就可以用子查询。把第一个查询结果假设为一张表, 假定为表  vip

如果用刚才的对照查询。语法会是这样

select *     //返回所有字段

from `shop`  //从交易表查

right join `vip`  //以右边,也就是 VIP表为准

on `vip`.`username` = `shop`.`username`
因为只要 vip 用户的交易记录。所以,左表 shop 的数据,有些是不要的。当然是以右表为准。

select * from `user`
where `vip` = 1

右表是这条语句的查询结果

select *

from `shop`

right join

(select * from `user` where `vip` = 1) as `vip`

on `vip`.`username` = `shop`.`username`

(select * from `user` where `vip` = 1) as `vip`

把这条语句的查询结果,视为一张表,临时命名为 vip

这样一来,从 shop 表查到的交易记录。都会以 vip 这张“虚拟表”为准,选择性输出。

得到的结果,当然也就是所有 VIP 用户的交易记录了,这就是所谓的子查询,在一条查询语句里面,还有另一条查询语句。
当然,还有另外一种写法也可以做到,不用对照查询。

先准备好我们的子查询语句。所有 VIP 的用户名。

select `username` from `user` where `vip` = 1

select * from `shop` where `username` = '一个用户名' 这条语句,可以从交易表里,得到一个用户的所有交易记录, 如果两条语句合并起来呢。

select * from `shop` where `username` = (select `username` from `user` where `vip` = 1)

这是子查询的另一种用法。

这种做法,子查询返回的结果,必须只有一个字段。

select * from `article`

where `tid` in

(select `tid` from `menu` where `tid` > 1)

在数据量大的时候。。适当的选择这些“有点复杂”的 SQL 语句,让处理数据“更专业”的数据库把结果算好给我们。往往可以达到事半功倍的效果。

抱怨一句 想当好一个合格的程序员再怎么努力也不为过。。

mysql进阶1的更多相关文章

  1. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

  2. mysql进阶(二十八)MySQL GRANT REVOKE用法

    mysql进阶(二十八)MySQL GRANT REVOKE用法   MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...

  3. mysql进阶(二十七)数据库索引原理

    mysql进阶(二十七)数据库索引原理 前言   本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb.   第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础.    ...

  4. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  5. mysql进阶(十六)常见问题汇总

    mysql进阶(十六)常见问题汇总 MySQL视图学习: http://www.itokit.com/2011/0908/67848.html 执行删除操作时,出现如下错误提示: 出现以上问题的原因是 ...

  6. 【转】MySQL— 进阶

    [转]MySQL— 进阶 目录 一.视图 二.触发器 三.函数 四.存储过程 五.事务 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需 ...

  7. MySQL进阶(视图)---py全栈

    目录 mysql进阶(视图)---py全栈 一.什么是视图? 二.视图的特性 三.视图的优点 四.使用场合 五.视图基本操作 六.案例 mysql进阶(视图)---py全栈 一.什么是视图? 视图是从 ...

  8. mysql进阶练习

    一 .  MySQL进阶练习 /*==========================创建班级表=============================*/ CREATE TABLE class ( ...

  9. MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子

    /*MySQL进阶19 函数 存储过程和函数:都类似于java中的方法; 存储过程和函数通用好处: 1.提高代码的重用性 2.简化操作 好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数, ...

  10. MySQL进阶13--常见六大约束: 非空/默认/主键/唯一约束/检查约束/外键约束--表级约束 / 列级约束

    /* MySQL进阶13 常见六大约束: 1.not null 非空 2.default :默认值,用于保证该字段的默认值 ; 比如年龄:1900-10-10 3.primary key : 主键,用 ...

随机推荐

  1. Java 5种字符串拼接方式性能比较

    http://blog.csdn.net/kimsoft/article/details/3353849 import java.util.ArrayList; import java.util.Li ...

  2. CAS协议 - CAS URIs

    http://desert3.iteye.com/blog/1703449 2.CAS URIs:  CAS是一个基于HTTP的协议,这就要求其每一个组成部分可以通过特定的URIs访问到.所有相关的U ...

  3. WebSocket与Tcp连接

    最近做了一个项目,客户端为WebSocket页面,服务器端为Tcp控制台 .将代码贴出来,供需要的参考. 1.服务器端代码 其中服务器的Session使用了第三方插件,为TCP连接. 2.客户端代码如 ...

  4. NuGet的使用心得

    前言 上星期发布了NuGet的使用和服务搭建后,同时NuGet在部门里也使用了起来.经过这些天的使用,总结了些小技巧和注意点,希望和大家分享下. 问题提出 使用了NuGet的朋友们估计都知道,在签入代 ...

  5. [Webpack 2] Grouping vendor files with the Webpack CommonsChunkPlugin

    Often, you have dependencies which you rarely change. In these cases, you can leverage the CommonsCh ...

  6. PMP考试的过与只是

    我在一年多时间里參加了三次PMP考试,前两次都失败,直到第三次才成功.怎样对待失败?这是每个人都会遇到的挑战.假设我们能用正确的态度对待临时的失败,那么终于的成功也就不远了.我希望通过本文与大家分享一 ...

  7. view中的setTag和getTag方法的理解

    下面是一段自定义适配器中的getView方法,其中使用了view的一个setTag和getTag方法 View中的setTag(Onbect)表示给View添加一个格外的数据(相当于缓存),以后可以用 ...

  8. Cocos2d-X中字符串的处理

    CCString 用惯了NSString,你会严重高估自己处理字符串的能力.使用Cocos2d-X后只能用char*或者string来代替.诸如字符串的拼接,替换,查找都比NSString麻烦不少. ...

  9. c语言输入输出

    一 #include "stdio.h"int main(){ FILE *fp; int ninzu=0; char name[100]; double hsum=0.0; do ...

  10. mac 下 php 安装 中的坑

    brew Error: Formulae found in multiple taps http://www.trylife.cn/brew-error-formulae-found-in-multi ...