Mysql中的级联查询
2016-01-12 00:00
615 查看
摘要: 今天要分享的是Mysql中的级联查询,复杂查询,用inner join , left join , right join
我的所有的表都是没有关联关系的,解耦
一共是四个表 tb_user 用户表
CREATE TABLE `tb_user` (
`id` int(100) NOT NULL AUTO_INCREMENT COMMENT 'Id',
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`age` double(255,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
tb_order 订单表
CREATE TABLE `tb_order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`price` double(255,0) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
tb_goods 商品表
CREATE TABLE `tb_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`weight` double(11,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
他们的关系是 用户表和订单表是一对多,一个用户可以创建多个订单,
订单和商品是多对多,一个订单可以拥有多个商品,当然一个商品也可以拥有多个订单,这里的商品是类级别的商品
他们是多对多关系所以说必须拥有一个中间表,也就是tb_order_goods
CREATE TABLE `tb_order_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`goods_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
中间表就是用来关联Order和User的
这个是我所有的表
SELECT*from tb_goods;
SELECT*from tb_order;
SELECT*from tb_order_goods;
SELECT*from tb_user;
现在我们根据用户ID查询用户所有的订单,和订单相关的信息
分析可以知道现在求的是交集,
inner join 和 left join ,right join的关系就是交集,和补集的关系
这个表很直观,刚刚的需求也就是要交集
所以现在开始写sql
这个sql就是说的是获取user_id =1 购买的所有商品
其他两个的话是求补给
现在让那个我们来试一试,看看结果咯
现在我们看看right join ,其实很简单,高中数学好的话,基本没有问题,有问题肯定是智商问题
看图
这个就是咯,现在看sql 语句咯,其实很简单的啦,设计数据库的时候最好不要有管理关系,这样迁移还有拓展不好,你懂得
这个是结果
我的所有的表都是没有关联关系的,解耦
一共是四个表 tb_user 用户表
CREATE TABLE `tb_user` (
`id` int(100) NOT NULL AUTO_INCREMENT COMMENT 'Id',
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`age` double(255,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
tb_order 订单表
CREATE TABLE `tb_order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`price` double(255,0) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
tb_goods 商品表
CREATE TABLE `tb_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`weight` double(11,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
他们的关系是 用户表和订单表是一对多,一个用户可以创建多个订单,
订单和商品是多对多,一个订单可以拥有多个商品,当然一个商品也可以拥有多个订单,这里的商品是类级别的商品
他们是多对多关系所以说必须拥有一个中间表,也就是tb_order_goods
CREATE TABLE `tb_order_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`goods_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
中间表就是用来关联Order和User的
这个是我所有的表
SELECT*from tb_goods;
SELECT*from tb_order;
SELECT*from tb_order_goods;
SELECT*from tb_user;
现在我们根据用户ID查询用户所有的订单,和订单相关的信息
分析可以知道现在求的是交集,
inner join 和 left join ,right join的关系就是交集,和补集的关系
SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
这个表很直观,刚刚的需求也就是要交集
所以现在开始写sql
SELECT g. NAME FROM tb_order o INNER JOIN tb_order_goods og ON o.id = og.order_id INNER JOIN tb_goods g ON og.order_id = g.id WHERE o.user_id = 1
这个sql就是说的是获取user_id =1 购买的所有商品
其他两个的话是求补给
现在让那个我们来试一试,看看结果咯
SELECT * FROM tb_order o LEFT JOIN tb_order_goods og ON og.order_id = o.id LEFT JOIN tb_goods g ON g.id = og.goods_id WHERE o.user_id = 1
现在我们看看right join ,其实很简单,高中数学好的话,基本没有问题,有问题肯定是智商问题
看图
这个就是咯,现在看sql 语句咯,其实很简单的啦,设计数据库的时候最好不要有管理关系,这样迁移还有拓展不好,你懂得
SELECT * FROM tb_order o RIGHT JOIN tb_order_goods og ON og.order_id = o.id RIGHT JOIN tb_goods g ON g.id = og.goods_id WHERE o.user_id = 1
这个是结果
相关文章推荐
- Mysql5.5中实现createTime和updateTime自动更新
- mysql开启远程访问
- mysql ERROR 1045 (28000): Access denied for user解决方法
- mysql的查询、子查询及连接查询
- Mysql几种索引类型的区别及适用情况
- mysql 索引
- MySQL - 主从复制及读写分离原理
- MySQL数据库
- MySQL高级十三——通过索引优化SQL
- MySql从零开始(四)常见运算符
- mac 下删除mysql
- mysql中的find_in_set的使用
- mysql中的find_in_set的使用
- MySQL高级十二——索引
- 用bat批处理脚本登录mysql
- MySQL高级十一——慢查询
- 原来mysql只能显示1000条数据
- Mac 10.10 下修改 MySQL 5.6 的密码
- 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的陷阱
- mysql 自增列 AUTO_INCREMENT