当前位置: 首页 > news >正文

查询练习:连接查询

准备用于测试连接查询的数据:

CREATE DATABASE testJoin;CREATE TABLE person (id INT,name VARCHAR(20),cardId INT
);CREATE TABLE card (id INT,name VARCHAR(20)
);INSERT INTO card VALUES (1, '饭卡'), (2, '建行卡'), (3, '农行卡'), (4, '工商卡'), (5, '邮政卡');
SELECT * FROM card;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 饭卡      |
|    2 | 建行卡    |
|    3 | 农行卡    |
|    4 | 工商卡    |
|    5 | 邮政卡    |
+------+-----------+INSERT INTO person VALUES (1, '张三', 1), (2, '李四', 3), (3, '王五', 6);
SELECT * FROM person;
+------+--------+--------+
| id   | name   | cardId |
+------+--------+--------+
|    1 | 张三   |      1 |
|    2 | 李四   |      3 |
|    3 | 王五   |      6 |
+------+--------+--------+

分析两张表发现,person 表并没有为 cardId 字段设置一个在 card 表中对应的 id 外键。如果设置了的话,person 中 cardId 字段值为 6 的行就插不进去,因为该 cardId 值在 card 表中并没有。

内连接

要查询这两张表中有关系的数据,可以使用 INNER JOIN ( 内连接 ) 将它们连接在一起。

-- INNER JOIN: 表示为内连接,将两张表拼接在一起。
-- on: 表示要执行某个条件。
SELECT * FROM person INNER JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id   | name   | cardId | id   | name      |
+------+--------+--------+------+-----------+
|    1 | 张三   |      1 |    1 | 饭卡      |
|    2 | 李四   |      3 |    3 | 农行卡    |
+------+--------+--------+------+-----------+-- 将 INNER 关键字省略掉,结果也是一样的。
-- SELECT * FROM person JOIN card on person.cardId = card.id;

注意:card 的整张表被连接到了右边。

左外连接

完整显示左边的表 ( person ) ,右边的表如果符合条件就显示,不符合则补 NULL 。

-- LEFT JOIN 也叫做 LEFT OUTER JOIN,用这两种方式的查询结果是一样的。
SELECT * FROM person LEFT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id   | name   | cardId | id   | name      |
+------+--------+--------+------+-----------+
|    1 | 张三   |      1 |    1 | 饭卡      |
|    2 | 李四   |      3 |    3 | 农行卡    |
|    3 | 王五   |      6 | NULL | NULL      |
+------+--------+--------+------+-----------+

右外链接

完整显示右边的表 ( card ) ,左边的表如果符合条件就显示,不符合则补 NULL 。

SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id   | name   | cardId | id   | name      |
+------+--------+--------+------+-----------+
|    1 | 张三   |      1 |    1 | 饭卡      |
|    2 | 李四   |      3 |    3 | 农行卡    |
| NULL | NULL   |   NULL |    2 | 建行卡    |
| NULL | NULL   |   NULL |    4 | 工商卡    |
| NULL | NULL   |   NULL |    5 | 邮政卡    |
+------+--------+--------+------+-----------+

全外链接

完整显示两张表的全部数据。

-- MySQL 不支持这种语法的全外连接
-- SELECT * FROM person FULL JOIN card on person.cardId = card.id;
-- 出现错误:
-- ERROR 1054 (42S22): Unknown column 'person.cardId' in 'on clause'-- MySQL全连接语法,使用 UNION 将两张表合并在一起。
SELECT * FROM person LEFT JOIN card on person.cardId = card.id
UNION
SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id   | name   | cardId | id   | name      |
+------+--------+--------+------+-----------+
|    1 | 张三   |      1 |    1 | 饭卡      |
|    2 | 李四   |      3 |    3 | 农行卡    |
|    3 | 王五   |      6 | NULL | NULL      |
| NULL | NULL   |   NULL |    2 | 建行卡    |
| NULL | NULL   |   NULL |    4 | 工商卡    |
| NULL | NULL   |   NULL |    5 | 邮政卡    |
+------+--------+--------+------+-----------+
http://www.lryc.cn/news/61695.html

相关文章:

  • 【mmdeploy】【TODO】使用mmdeploy将mmdetection模型转tensorrt
  • 德赛西威上海车展重磅发布Smart Solution 2.0,有哪些革新点?
  • 戴尔服务器是否需要开启cpupower.service
  • day02_第一个Java程序
  • 【华为OD机试真题 】1011 - 第K个排列 (JAVA C++ Python JS) | 机试题+算法思路+考点+代码解析
  • 基于php的校园校园兼职网站的设计与实现
  • django部署
  • OpenCV 图像处理学习手册:1~5
  • 深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras
  • Ceph入门到精通-Cephadm安装Ceph(v17.2.5 Quincy)全网最全版本
  • BIOS与POST自检
  • 交友项目【查询好友动态,查询推荐动态】实现
  • 24个强大的HTML属性,建议每位前端工程师都应该掌握!
  • 前端--移动端布局--2移动开发之flex布局
  • 【移动端网页布局】移动端网页布局基础概念 ① ( 移动端浏览器 | 移动端屏幕分辨率 | 移动端网页调试方法 )
  • 无线洗地机哪款性价比高?高性价比的洗地机分享
  • 精通 Python OpenCV4:第三、四部分
  • 在现成的3D打印机上进行实验理论:一种数据孪生的攻击探测框架
  • 网络通信之传输层协议
  • 短视频app开发:如何提高视频播放稳定性
  • 软件测试,想找一份20k以上的工作需要掌握哪些知识?
  • PostgreSQL标准复制方案
  • AOD实践,modis数据下载,modis数据处理
  • 常见的注册中心Nacos、Eureka
  • 逆向思维书籍推荐
  • centos系统简析
  • 「SQL面试题库」 No_43 只出现一次的最大数字
  • TEB算法详解 参数详解
  • JavaSE学习进阶day05_03 泛型(进阶)
  • Flutter 布局探索 | 如何分析尺寸和约束