MySQL学习(十)
要做:商城的留言板
一般情况,做留言板的显示很容易,直接select查询,再显示出来,但eschop中的留言板难点在于留言数据来自2张表,feedback表和comment表,我们需要把两张表中的内容都取出来,显示。
思路: 从业务逻辑层,用php来解决这个问题
1 先取出feedback表,循环取出数据,放入一个数组
2 再取出comment表,循环取出数据,放入一个数组
3 把取出两个数组合并
4 循环合并后的大数组整理
union关键字,可以给出多条select语句,并将他们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个select语句之间使用union或union all关键字分隔。union不使用all,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字all的作用是不删除重复行也不对结果进行自动排序。
mysql> select s_id,f_name,f_price
-> from fruits
-> where f_price < 9.0
-> union all
-> select s_id,f_name,f_price
-> from fruits
-> where s_id in(101,103);
结果如下

能否从2张表查询在union那?
答:可以,union合并的是”结果集“,不区分来自那张表。
union后的结果集,能否再排序
答:可以
mysql> select goos_id,goods_name,shop_price from goods
-> where
-> shop_price < 100
-> union all
-> select goos_id,goods_name,shop_price from goods
-> where
-> shop_price > 4000
-> order by shop_price asc;
用union取出第4个栏目的商品和第5个栏目的商品,并按价格升序排列
mysql> select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 4
-> union all
-> select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 5
-> order by shop_price asc;
sql1 union sql2 order by 字段
注意:order by是针对合并后的结果集排的序
使用odrer by的注意事项
mysql> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 4
-> order by shop_price desc)
-> union
-> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 5
-> order by shop_price desc);

内层的order by语句没用起作用
mysql> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 4
-> order by shop_price desc)
-> union
-> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 5
-> order by shop_price desc)
-> order by shop_price asc;

外层语句还要对最终结果再次排序,因此内层的语句排序就没用意义。因此,内层的order by语句单独使用,,不会影响结果集,仅排序,在执行期间,就被MySQL的代码优化器给优化掉了。内层的order by必须能够影响结果集时才有意义,比如配合limit使用。
问题:查出第3个栏目下,价格前3高的商品和第4个栏目下,价格前2高的商品
mysql> (select goos_id,cat_id,goods_name,shop_price from goods
-> where cat_id = 4
-> order by shop_price desc limit 2)
-> union all
-> (select goos_id,cat_id,goods_name,shop_price from goods
-> where cat_id = 3
-> order by shop_price desc limit 3);

这一次,内层的order by发挥了作用,因为有limit,order by会影响
一道面试题
建立两张表,插入如下数据,

要求结果如下

思路1 左连 union 右连 ,在子查询,如果遇到问题,查if null函数
思路2
mysql> select id,sum(num) from (
-> select * from a
-> union all
-> select * from b) as temp
-> group by id;

注意 如果不用 union all 结果会不正确
MySQL学习(十)的更多相关文章
- MySQL学习(十五)
索引的概念 索引是数据的目录,能快速定位数据的位置.索引提高了查询速度,降低了增删改的速度.并非加的越多越好. 一般在查询频率高的列上加,而且在重复度低的列上加效果更好.如在性别列上不用加索引,但是身 ...
- MySQL学习(十六)
MySQL高级部分 触发器 触发器是一类特殊的事务,可以监视某种数据操作(insert/update/delete),并触发相关的操作(insert/update/delete) 触发器创建语法之4要 ...
- MySQL学习(十四)
utf8的bom问题 在xp下,用记事本创建utf8文件的时候,前面多了3个字节,这3个字节不用来显示,是用来辨识编码用的,EF BB BF告诉记事本,这是utf8编码. 存储引擎和事务简单介绍 引擎 ...
- MySQL学习(十二)
视图 view 在查询中,我们经常把查询结果当成临时表来看, view是什么?view可以看成一张虚拟表,是表通过某种运算得到的一个投影. 表的变化会影响到视图 既然视图只是表的某种查询的投影,所以主 ...
- 我的MYSQL学习心得(十) 自定义存储过程和函数
我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...
- 我的MYSQL学习心得(十二) 触发器
我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...
- 我的MYSQL学习心得(十四) 备份和恢复
我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- 我的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
随机推荐
- SVN更新无数次后仍显示Out of date
理器相集成的TortoiseSVN更是方便. 但有时候在提交修改后的文件时,却莫名其妙的出现out of date错误,导致工程无法commit,即使将新文件删了重新update,然后再在旧文件上作修 ...
- Spring Boot(十二):spring boot如何测试打包部署
Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...
- windows 7/10 安装u盘制作
今天,在拷贝数据时,发现那台丢在那两三年的pc密码忘了,故计划重装,因为从来都是公司信息中心管这事,至少都七八年没有自己装机了,故整理过程如下: 1.从itellyou.cn下载原版镜像: 2.准备一 ...
- collectd 检测cpu使用率
环境配置 1. install epel https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/ 2 ...
- ps -ef|grep详解
ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 grep命令是查找,是一种强大的文本搜索工具, ...
- CAN通信工作原理个人心得
CAN总线结构示意图: 说明: 1:CAN收发器(示意图中的单元)根据两总线CAN_H和CAN_L的电位差来判断总线电平: 2:实际中CAN_H与CAN_L由双绞线组成: 3:数据传递终端的电阻器,是 ...
- freeswitch源码安装
1.源码--安装依赖: yum install -y http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm epel-releas ...
- Python3 tkinter基础 Canvas create_text 在画布上添加文字
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Restful framework【第七篇】权限组件
基本使用 -写一个类: class MyPer(BasePermission): message='您没有权限' def has_permission(self, request, view): # ...
- vue学习【第三篇】:vue之node.js的简单介绍
什么是node.js 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 安装node.js node.js的特性 - 非阻塞IO模型 - 时 ...