数据库基础知识整理-连接表操作

数据库基础知识整理-连接表操作

表连接

SQL 的最有利的特征之一是能够组合来自两个或多个表的数据。
在SQL中,“表连接” 表示组合来自两个或多个表的数据。 表连接创建一个临时表,显示连接表中的数据。


SELECT 表1字段1, 表1字段2, 表2字段1..
FROM 表1,表2..
WHERE 主表.字段=附表.连接字段
-- 可选排序
--ORDER BY 主表.字段 DESC OR ASC;

-- 主表
mysql> select * from users;
+----+--------+-----------+------------+
| id | name   | password  | profession |
+----+--------+-----------+------------+
|  2 | 李四   | password2 | programer  |
|  3 | 王五   | password3 | librarian  |
|  4 | 赵六   | password4 | actor      |
+----+--------+-----------+------------+


-- 附表
mysql> select * from user;
+----+----------+------+----------+
| id | name     | age  | users_id |
+----+----------+------+----------+
|  1 | sss      |   20 |     NULL |
|  2 | 李四     |   22 |        2 |
|  4 | wangwu   |   19 |     NULL |
|  5 | 王五     |   19 |        3 |
|  6 | zhangsan |   26 |     NULL |
+----+----------+------+----------+

-- 有两个表,新增个列把他们关联上
mysql> select users.id, users.name,users.profession,user.age from users,user where users.id=user.users_id;
+----+--------+------------+------+
| id | name   | profession | age  |
+----+--------+------------+------+
|  2 | 李四   | programer  |   22 |
|  3 | 王五   | librarian  |   19 |
+----+--------+------------+------+

连接类型

  • 自定义别名

通过使用 SQL,可以为表名称或列名称指定别名,创建别名是为了让列名称的可读性更强,不会改变原有的列名。
具体的用法在 上一篇总结 中的自定义列中已有示例

  • 内连接(INNER JOIN)

INNER JOIN 与 JOIN 是相同的。

  • 左连接(LEFT JOIN)

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。

  • 右连接 (RIGHT JOIN)

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。

-- inner join
-- 相交的数据合并,两个表中name字段的数据中都有叫“李四”和“王五”的,profession是users中的数据,age是user中的数据
mysql> select users.name,users.profession, user.age from users inner join user on users.name=user.name;
+--------+------------+------+
| name   | profession | age  |
+--------+------------+------+
| 李四   | programer  |   22 |
| 王五   | librarian  |   19 |
+--------+------------+------+

-- left join
-- 1. 返回左表中所有的数据 ,右表可以没有匹配(右表中没有赵六) 2. left outer join  = left join
mysql> select users.name, users.profession,user.age from users left outer join user on users.name=user.name;
+--------+------------+------+
| name   | profession | age  |
+--------+------------+------+
| 李四   | programer  |   22 |
| 王五   | librarian  |   19 |
| 赵六   | actor      | NULL |
+--------+------------+------+

-- right join
-- 从右表返回所有的数据,左表可以没有匹配(左表中没有最后3条数据)。
mysql> select users.name, users.profession,user.age from users right join user on users.name=user.name;
+--------+------------+------+
| name   | profession | age  |
+--------+------------+------+
| 李四   | programer  |   22 |
| 王五   | librarian  |   19 |
| NULL   | NULL       |   20 |
| NULL   | NULL       |   19 |
| NULL   | NULL       |   26 |
+--------+------------+------+


UNION 操作符

有时候,你可能需要将多个表的数据合并为一个综合数据集。但可能出现相同的数据,就需要同数据库或跨数据库、甚至跨服务器上合并相似的数据。要完成此操作, 就得使用 UNIONUNION ALL 操作符。

UNION ALLUNION 快,因为它不会对数据集执行重复删除操作。

  • UNION 将多个数据集合并到单个数据集中,并删除任何现有的重复项。
  • UNION ALL 将多个数据集合并到一个数据集中,但不会删除重复的行。

-- 先创建两个表并填充一点数据
mysql> select * from users_demo1;
+----+------+-----------+------------+
| id | name | password  | profession |
+----+------+-----------+------------+
|  1 | eric | pass_eric | teacher    |
|  2 | lucy | pass_lucy | student    |
+----+------+-----------+------------+

mysql> select * from users_demo2;
+----+------+-----------+------------+
| id | name | password  | profession |
+----+------+-----------+------------+
|  1 | hans | pass_hans | engineer   |
|  2 | bill | pass_bill | salesman   |
+----+------+-----------+------------+


-- UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
mysql> select * from users_demo1 union select * from users_demo2;
+----+------+-----------+------------+
| id | name | password  | profession |
+----+------+-----------+------------+
|  1 | eric | pass_eric | teacher    |
|  2 | lucy | pass_lucy | student    |
|  1 | hans | pass_hans | engineer   |
|  2 | bill | pass_bill | salesman   |
+----+------+-----------+------------+

上面是普通的合并,那么当数据重复的时候,就可以显示出union和union all不同的地方了,现在同时往users_demo1users_demo1中添加一条相同的数据。

insert into users_demo1 values(3, 'alexander', 'pass_alexander', 'professor');
insert into users_demo2 values(3, 'alexander', 'pass_alexander', 'professor');

-- 现在再测试一下
mysql> select * from users_demo1 union select * from users_demo2;
+----+-----------+----------------+------------+
| id | name      | password       | profession |
+----+-----------+----------------+------------+
|  1 | eric      | pass_eric      | teacher    |
|  2 | lucy      | pass_lucy      | student    |
|  3 | alexander | pass_alexander | professor  |
|  1 | hans      | pass_hans      | engineer   |
|  2 | bill      | pass_bill      | salesman   |
+----+-----------+----------------+------------+

mysql> select * from users_demo1 union all select * from users_demo2;
+----+-----------+----------------+------------+
| id | name      | password       | profession |
+----+-----------+----------------+------------+
|  1 | eric      | pass_eric      | teacher    |
|  2 | lucy      | pass_lucy      | student    |
|  3 | alexander | pass_alexander | professor  |
|  1 | hans      | pass_hans      | engineer   |
|  2 | bill      | pass_bill      | salesman   |
|  3 | alexander | pass_alexander | professor  |
+----+-----------+----------------+------------+

提示:

  1. UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
  2. 每个列必须拥有相同或相似的数据类型。
  3. 每个 SELECT 语句中的列的顺序必须相同。
  4. 如果你的列在所有查询中不完全匹配,可以使用其他值代替(例如NULL)。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,718评论 0 44
  • 1. MySQL常用命令 1) mysql -h 主机名 -u 用户名 -p;登陆mysql 2) create ...
    zbcao阅读 383评论 0 0
  • SQL语言基础 本章,我们将会重点探讨SQL语言基础,学习用SQL进行数据库的基本数据查询操作。另外请注意本章的S...
    厲铆兄阅读 5,320评论 2 46
  • 基础语句 1. 创建数据库 CREATE DATABASE database_name 2. 删除数据库 drop...
    敲代码的本愿阅读 1,021评论 1 7
  • 工作了5,6年,工资好像增长,但和房价物价,和自己不断增长的物质精神消费欲望比起来,反而觉得不满足。 2工资的增长...
    熊芳菲阅读 233评论 0 0