MySQL的多表查询(交叉连接,内连接,外连接)
来源:互联网 发布:安倍经济学 知乎 编辑:程序博客网 时间:2024/05/20 00:38
MySQL的多表查询
多表的查询方式:
(假设有两张表A,B)
交叉连接
语法:SELECT * FROM A,B;
总结:得到的查询结果是两张表的笛卡尔积,也就是用A表中的每条数据都去匹配B表中的所有数据,获得的结果往往不是我们需要的,一般很少使用交叉连接。
内连接(inner join ,inner 可以省略)
- 显示内连接
语法:SELECT * FROM A INNER JOIN B ON 条件;
- 隐示内连接
语法:SELECT * FROM A,B WHERE 条件;
总结:显示内连接和隐示内连接获得的查询结果是一样的,都是A表和B表的交集(例:A.id = B.id),但是只能查到有关系的信息,如果A表的一条数据的与B表关联的字段(如:A.id = null),即:这条数据在B表中没有对应的信息,则无法获得。
外连接(outer join,outer可以省略)
- 左外链接(left outer join,outer可以省略)
语法:SELECT * FROM A LEFT OUTER JOIN B ON 条件;
总结:左外连接获得的查询结果是左边的表A的全部信息和A,B两张表的交集,左边A表的全部包含A表中在B表中没有对应关系的信息。
- 右外连接(right outer join,outer可以省略)
语法:SELECT * FROM A RIGHT OUTER JOIN B ON 条件;
总结:右外连接获得的查询结果是右边的表B的全部信息和A,B两张表的交集,右边B表的全部包含B表中在A表中没有对应关系的信息。
辨别内连接和外连接的小技巧:没有省略的情况下很好辨别(inner,outer),省略的时候只要(join)的是内连接,有(left,right)的是(左/右)外连接。
例子:
一对多关系表:
CREATE DATABASE test; # 创建test数据库CREATE TABLE emp ( # 创建员工表 eid INT PRIMARY KEY AUTO_INCREMENT, # 员工id ename VARCHAR(32) NOT NULL, # 员工姓名 did INT, FOREIGN KEY (did) REFERENCES dept(did) # 设置外键);CREATE TABLE dept ( # 部门表 did INT PRIMARY KEY AUTO_INCREMENT, # 部门id dname VARCHAR(20) # 部门名称);INSERT INTO emp VALUES (NULL,'张三',1);INSERT INTO emp VALUES (NULL,'李四',1);INSERT INTO emp VALUES (NULL,'王五',2);INSERT INTO emp VALUES (NULL,'赵六',2);INSERT INTO emp VALUES (NULL,'老王',NULL);INSERT INTO dept VALUES (NULL,'人事部');INSERT INTO dept VALUES (NULL,'宣传部');INSERT INTO dept VALUES (NULL,NULL);
交叉连接:
SELECT * FROM emp , dept;
结果:
内连接:
- 显示内连接
SELECT * FROM emp e INNER JOIN dept d ON e.did = d.did;
- 隐示内连接
SELECT * FROM emp e,dept d WHERE e.did = d.did;
结果:
外连接:
- 左外连接
SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.did = d.did;
结果:
- 右外连接
SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.did = d.did;
多对多关系表:
CREATE DATABASE test; # 创建test数据库CREATE TABLE goods ( # 创建商品表 g_no INT PRIMARY KEY AUTO_INCREMENT, # 商品编号 gname VARCHAR(20) NOT NULL # 商品名);CREATE TABLE goods_orders ( # 商品表格订单表的关系表 id INT PRIMARY KEY AUTO_INCREMENT, # 主键 g_no INT , o_no INT );ALTER TABLE goods_orders ADD FOREIGN KEY (g_no) REFERENCES goods(g_no);ALTER TABLE goods_orders ADD FOREIGN KEY (o_no) REFERENCES orders(o_no);CREATE TABLE orders ( # 创建订单表 o_no INT PRIMARY KEY AUTO_INCREMENT, # 订单编号 oremark VARCHAR(100) # 订单的备注);INSERT INTO goods VALUES (NULL,'手机');INSERT INTO goods VALUES (NULL,'零食');INSERT INTO goods VALUES (NULL,'键盘');INSERT INTO goods VALUES (NULL,'鼠标');INSERT INTO goods_orders VALUES (NULL,1,1);INSERT INTO goods_orders VALUES (NULL,2,1);INSERT INTO goods_orders VALUES (NULL,2,2);INSERT INTO goods_orders VALUES (NULL,3,2);INSERT INTO goods_orders VALUES (NULL,NULL,NULL);INSERT INTO orders VALUES (NULL,'好贵。。');INSERT INTO orders VALUES (NULL,'快点发货。。');INSERT INTO orders VALUES (NULL,'修改送货地址。。');
交叉连接:
SELECT * FROM goods,orders,goods_orders;
结果:
内连接:
- 显示内连接
SELECT * FROM emp e INNER JOIN dept d ON e.did = d.did;
- 隐示内连接
SELECT * FROM goods g,goods_orders go,orders o WHERE g.g_no = go.g_no AND o.o_no = go.o_no;
结果:
外连接:
- 左外连接
SELECT * FROM goods g LEFT OUTER JOIN goods_orders go ON g.g_no = go.g_no LEFT OUTER JOIN orders o ON o.o_no = go.o_no;
结果:
- 右外连接
SELECT * FROM goods g RIGHT OUTER JOIN goods_orders go ON g.g_no = go.g_no RIGHT OUTER JOIN orders o ON o.o_no = go.o_no;
注意:如果先使用了左外连接,然后使用了右外连接,得到的查询结果是先执行左外连接得到查询结果,再将得到的结果执行右外连接,反之亦然。
阅读全文
1 0
- MySQL的多表查询(交叉连接,内连接,外连接)
- 多表查询的分类,连接查询,内连接,外连接,交叉连接,子查询
- 多表连接查询(内,外,交叉连接)
- 多表连接查询(内,外,交叉连接)
- 4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)
- 关于mysql的内连接,外连接,交叉连接
- 深入理解MySQL的外连接、内连接、交叉连接
- MySQL 学习教程(八)【整理】-连接查询(内连接/ 外链接 / 自然连接/ 交叉连接)
- Mysql 内连接、外连接、全连接和交叉连接
- 数据库表查询的内连接、外连接、交叉连接实现方式
- 数据库中查询的各种连接(左连接,右连接,全连接,内连接,交叉连接,自连接)
- 数据库中查询的各种连接(左连接,右连接,全连接,内连接,交叉连接,自连接)
- 表间的内连接、外连接、交叉连接
- MySQL连接查询 内连接和外连接的区别
- 内连接,外连接,交叉连接--数据库查询语句学习
- Mysql连表查询(内连接、外连接)
- 连接查询_内连接/外连接/交叉连接_区别(转载)
- SQL连接查询 内连接,左外连接,右外连接,全连接,交叉连接
- JAVA-----乱码的处理 乱码的解决方法总结
- Android性能优化
- python高阶进程4--多线程
- unity Scene.isDirty属性返回问题
- BZOJ 4521 [CQOI2016]手机号码
- MySQL的多表查询(交叉连接,内连接,外连接)
- leaflet加载百度地图
- Vue.js的computed和watch用法及区别
- 图解ARP协议(二)ARP攻击原理与实践
- leaflet加载百度地图(矫正篇
- Android 插件化基础——ClassLoader 源码解析
- MySQL事件(Event)
- Hibernate08_映射关系---OneToMany单向
- 【Python 学习笔记】文件写入时遇到 TypeError 报错