本文主要介绍数据库之间表的连接。
====================================================================================================================================
- AS
AS可以用来设置表或者列的别名。
当数据库中的表越来也越多时,如果碰巧要操作两个相似的表或者列,为了更好地对其进行区分,可以采用设置别名的方式增加SQL语句的可读性,帮助理解。
<pre name="code" class="sql">SELECT a.field1, b.field1, from your_table1 AS a NATURAL JOIN your_table2 AS b; #表your_table1设置别名为a,给表your_table2设置别名为b #为了简化操作AS关键字其实也可以省略 SELECT a.field1, b.field1, from your_table1 a NATURAL JOIN your_table2 b;
AS关键字还有一个用法,即可以将select语句查询出的内容填充进新的列里。
<pre name="code" class="sql">CREAT TABLE new_table( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, profession VARCHAR(10) ) AS SELECT profession FROM table_exists; #可将从表table_exists中查询到的profession列直接填充到表new_table中的profession列 将上表的查询语句进行适当修改,令其更加规范 CREAT TABLE new_table( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, prof VARCHAR(10) ) AS SELECT te.prof AS prof FROM table_exists AS te;
- 连接
交叉连接(Cross Join)俗称笛卡尔积,该连接方法返回表中所有行的相乘的结果。若存在表A和表B分表储存了人的姓名和鞋履的品牌。
表A |
|
表B | ||
id(主键) |
姓名 |
|
鞋子id(主键) |
品牌 |
1 |
王五 |
|
1 |
耐科 |
2 |
陈琪 |
|
2 |
锐不 |
3 |
邱钢 |
|
3 |
阿迪达是 |
4 |
斯研 |
|
4 |
特不 |
<pre name="code" class="sql">SELECT A.姓名, B.品牌 FROM A CROSS JOIN B; #交叉连接关键字为CROSS JOIN #上述查询将返回如下结果
返回结果 | |
姓名 |
品牌 |
王五 |
耐科 |
王五 |
锐不 |
王五 |
阿迪达是 |
王五 |
特不 |
陈琪 |
耐科 |
陈琪 |
锐不 |
陈琪 |
阿迪达是 |
陈琪 |
特不 |
。。。 |
。。。 |
内连接(Inner Join)考虑到了具体的查询条件从而对个别列进行了筛选和移除之后的结果。若存在表A和表B分别表示个人信息以及车牌信息。
表A |
|
表B | |||
姓名 |
注册人id(主键) |
|
注册人id(外键) |
车牌号码 |
车牌id |
王五 |
1 |
|
1 |
1234 |
1 |
陈琪 |
2 |
|
1 |
1231 |
2 |
邱钢 |
3 |
|
2 |
2343 |
3 |
斯午 |
4 |
|
3 |
4532 |
4 |
<pre name="code" class="sql">SELECT A.姓名, B.车牌号码 FROM A INNER JOIN B WHERE A.注册人id = B.注册人id; #内连接关键字为INNER JOIN, WHERE关键字也可以换成ON, 同时可以采用其他比较运算符如>,<,>=,<= #上述查询将返回如下结果
返回结果 | |
姓名 |
车牌号码 |
王五 |
1234 |
王五 |
1231 |
陈琪 |
2343 |
邱钢 |
4532 |
自然链接(Natural Join)属于一种特殊的内连接,只有在所要连接的两个表拥有相同名称的列时才会有用。若存在表A和表B分别表示个人信息以及车牌信息,且两个表中同时存在相同的字段名称“注册人id”。
表A |
|
表B | |||
姓名 |
注册人id(主键) |
|
注册人id(外键) |
车牌号码 |
车牌id(主键) |
王五 |
1 |
|
1 |
1234 |
1 |
陈琪 |
2 |
|
1 |
1231 |
2 |
邱钢 |
3 |
|
2 |
2343 |
3 |
斯午 |
4 |
|
3 |
4532 |
4 |
<pre name="code" class="sql">SELECT A.姓名, B.车牌号码 FROM A NATURAL JOIN B; #省略了WHERE/ON关键字后面的内外键比较部分 #且上述查询将返回和之前的内连接一样的结果
返回结果 | |
姓名 |
车牌号码 |
王五 |
1234 |
王五 |
1231 |
陈琪 |
2343 |
邱钢 |
4532 |
外连接(Outter Join)返回某张表的所有行,并且带有来自另外一张表的条件相符的行。外连接对数据表有严格的位置放置要求,且分为左外连接和右外连接。外连接和内连接相比一定会提供相应的数据行,无论其在另一个表中是否能找到相匹配的内容,若不存在相匹配内容则会返回NULL。若存在表A和表B分别表示个人信息以及车牌信息,且两个表中同时存在相同的字段名称“注册人id”。
表A |
|
表B | |||
姓名 |
注册人id(主键) |
|
注册人id(外键) |
车牌号码 |
车牌id(主键) |
王五 |
1 |
|
1 |
1234 |
1 |
陈琪 |
2 |
|
1 |
1231 |
2 |
邱钢 |
3 |
|
2 |
2343 |
3 |
斯午 |
4 |
|
3 |
4532 |
4 |
SELECT A.姓名, B.车牌号码 FROM A LEFT OUTER JOIN B ON A.注册人id=B.注册人id;
<pre name="code" class="sql">#左外连接,左表比右表,没有找到对应斯午的车牌号码,所以返回NULL
返回结果 | |
姓名 |
车牌号码 |
王五 |
1234 |
王五 |
1231 |
陈琪 |
2343 |
邱钢 |
4532 |
斯午 |
NULL |
SELECT A.姓名, B.车牌号码 FROM A RIGHT OUTER JOIN B ON A.注册人id=B.注册人id;
<pre name="code" class="sql"> #右外连接,右表比左表,右表中没有注册人id为4的车牌号,所以不会返回任何和注册人id为4有关的信息
返回结果 | |
姓名 |
车牌号码 |
王五 |
1234 |
王五 |
1231 |
陈琪 |
2343 |
邱钢 |
4532 |
自连接(Self-Join)即表自身与自身连接,比如存在表A描述某公司员工层级情况。王五为最高级别了领导,直属手下是邱钢和李去,这两个人各自又带有部分雇员。
表A | ||
id |
姓名 |
领导id |
1 |
王五 |
1 |
2 |
陈琪 |
3 |
3 |
邱钢 |
1 |
4 |
斯午 |
3 |
5 |
科右 |
3 |
6 |
李去 |
1 |
7 |
南迪 |
6 |
8 |
凡勇 |
6 |
9 |
博伊 |
6 |
SELECT A1.姓名, A2.姓名 AS 领导姓名 FROM A AS A1 INNER JOIN A AS A2 ON A2.领导id.= A1.id; #表A1,A2其实都是表A本身
返回结果 | |
姓名 |
领导姓名 |
王五 |
1234 |
王五 |
1231 |
陈琪 |
2343 |
邱钢 |
4532 |
* 联合(UNION)/交集(INTERSECT)/差集(EXCEPT)(MySQL中无后面两项)这三个概念基本上参照数学上的集合和韦恩图的概念即可,不做过多解释,UNION还有一个可选项是UNION ALL(和UNION相比剔除了“过滤重复值”的功能)。