数据库基础知识整理-连接表操作
表连接
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 操作符
有时候,你可能需要将多个表的数据合并为一个综合数据集。但可能出现相同的数据,就需要同数据库或跨数据库、甚至跨服务器上合并相似的数据。要完成此操作, 就得使用
UNION
和UNION ALL
操作符。
UNION ALL
比UNION
快,因为它不会对数据集执行重复删除操作。
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_demo1
和users_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 | +----+-----------+----------------+------------+
提示:
UNION
内部的每个SELECT
语句必须拥有相同数量的列。- 每个列必须拥有相同或相似的数据类型。
- 每个
SELECT
语句中的列的顺序必须相同。- 如果你的列在所有查询中不完全匹配,可以使用其他值代替(例如NULL)。