cmd操作MySQL 创建联结(日记 day 5)

cmd操作MySQL 创建联结(日记 day 5)

()__()

联结就是用来关联多个表,然后将联结在一起的表内数据输出。在之前的日记里也写过简单的联结,今天更系统的总结一下,让自己的思路更为清晰,也为日后的查找更为方便。

首先,构建好练习的数据:

+----+--------+--------+
| id | p_name | cardid |
+----+--------+--------+
|  1 | 今天   |      1 |
|  2 | 明天   |      3 |
+----+--------+--------+

+----+--------+
| id | c_name |
+----+--------+
|  1 | 建行   |
|  2 | 农行   |
|  3 | 工行   |
|  4 | 广行   |
+----+--------+

内部联结(等值联结):
查询出所有人的信用卡记录

mysql> select   person.id,p_name,card.c_name as'银行' from person,card where person.cardid=card.id;
+----+--------+--------+
| id | p_name | 银行   |
+----+--------+--------+
|  1 | 今天   | 建行   |
|  2 | 明天   | 工行   |
+----+--------+--------+

还有就是用这个关键字查询 person 表跟 card表的信息inner join 或者 join

mysql> select*from person join card on person.cardid=card.id;
+----+--------+--------+----+--------+
| id | p_name | cardid | id | c_name |
+----+--------+--------+----+--------+
|  1 | 今天   |      1 |  1 | 建行   |
|  2 | 明天   |      3 |  3 | 工行   |
+----+--------+--------+----+--------+

这个关联取的是他们的交集,只有person.cardid=card.id的那些行才会显示出来

笛卡尔积
//没有联结条件输出的表 行的数目是两个表的行的乘积,就如同小组赛,每支队伍都要打一遍

mysql> select   person.id,p_name,card.c_name as'银行' 
from person,card;
+----+--------+--------+
| id | p_name | 银行   |
+----+--------+--------+
|  1 | 今天   | 建行   |
|  2 | 明天   | 建行   |
|  1 | 今天   | 农行   |
|  2 | 明天   | 农行   |
|  1 | 今天   | 工行   |
|  2 | 明天   | 工行   |
|  1 | 今天   | 广行   |
|  2 | 明天   | 广行   |
+----+--------+--------+

使用表别名来联结 concat()函数

mysql> select  concat(person.id,'-',p_name,' (',c_name ,')') as '持有卡是哪所银行' 
from person,card where person.cardid=card.id;
+--------------------------+
| 持有卡是哪所银行         |
+--------------------------+
| 1-今天 (建行)            |
| 2-明天 (工行)            |
+--------------------------+

出现“Incorrect parameters in the call to native function 'concat' ”你可能操作失误会碰到这个错误,也许是你用了中文的符号,也许是你多打了东西,或者少打

自联结:
说的直白一点就是自己联结自己//可以用子查询但有时候子查询会比较慢,所以将同一表分成2份操作找到购买6产品的客户买的所有物品

mysql> select*from product;  //建了张产品表 有产品id跟客户id
+------+------+
| p_id | c_id |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    1 |
|    4 |    2 |
|    5 |    2 |
|    6 |    1 |
|    7 |    1 |
+------+------+
mysql> select p2.p_id from product as p1,product as p2 
where p1.p_id=6 and p2.c_id=p1.c_id;
+------+
| p_id |
+------+
|    1 |
|    3 |
|    6 |
|    7 |
+------+

自然联结:排除相同的列

外部联结:

left join/left outer join 左外部联结

//左右都是搭配on使用,去掉了where,用where的话会报错

right join/right outer join 右外部联结

为了更好的验证区别,我们再向person表插入一条数据
insert into person values(3,‘后天’,6); //6没有对应的银行

mysql> select*from person left join card on person.cardid=card.id;
+----+--------+--------+------+--------+
| id | p_name | cardid | id   | c_name |
+----+--------+--------+------+--------+
|  1 | 今天   |      1 |    1 | 建行   |
|  2 | 明天   |      3 |    3 | 工行   |
|  3 | 后天   |      6 | NULL | NULL   |
+----+--------+--------+------+--------+

把左边的表信息全部输出,如果右表没有对应的信息就输出空
右刚好反过来

mysql> select*from person right join card on person.cardid=card.id;
+------+--------+--------+----+--------+
| id   | p_name | cardid | id | c_name |
+------+--------+--------+----+--------+
|    1 | 今天   |      1 |  1 | 建行   |
|    2 | 明天   |      3 |  3 | 工行   |
| NULL | NULL   |   NULL |  2 | 农行   |
| NULL | NULL   |   NULL |  4 | 广行   |
+------+--------+--------+----+--------+

左 右外联结还能搭配union 来输出两张表的所有内容

mysql> select*from person left join card on person.cardid=card.id 
union 
select*from person right join card on person.cardid=card.id;
+------+--------+--------+------+--------+
| id   | p_name | cardid | id   | c_name |
+------+--------+--------+------+--------+
|    1 | 今天   |      1 |    1 | 建行   |
|    2 | 明天   |      3 |    3 | 工行   |
|    3 | 后天   |      6 | NULL | NULL   |
| NULL | NULL   |   NULL |    2 | 农行   |
| NULL | NULL   |   NULL |    4 | 广行   |
+------+--------+--------+------+--------+

近两天在刷《MySQL必知必会》,收获很多!

发布了12 篇原创文章 · 获赞 9 · 访问量 543

猜你喜欢

转载自blog.csdn.net/weixin_45219512/article/details/105208061
今日推荐