/**
mysql 多表關聯mysql
*/sql
一對一的關聯 好比城市和區號的關聯*******************spa
先是一個city表
cid city coid
1 北京 1
2 上海 2
3 廣州 3code
再一個區號表
coid code
1 010
2 020
3 0755ci
這樣經過 cid和coid的關聯將兩張表連在一塊兒
一對一的類型 他的關聯字段能夠隨便放在兩個表中
mysql> select * from city,code where city.coid=code.coid;
+-----+------+------+------+------+
| cid | city | coid | coid | code |
+-----+------+------+------+------+
| 1 | 北京 | 1 | 1 | 010 |
| 2 | 上海 | 2 | 2 | 020 |
| 3 | 廣州 | 3 | 3 | 0755 |
+-----+------+------+------+------+it
一對N的關聯 好比說學生和班級的關聯***************
一個學生表
mysql> select * from student;
+----+------------+------+------+-------+
| id | name | sex | age | class |
+----+------------+------+------+-------+
| 1 | 小明 | 男 | 14 | 1 |
| 2 | 李雷 | 男 | 14 | 1 |
| 3 | 韓梅梅 | 女 | 20 | 1 |
| 4 | aboy | 男 | 10 | 1 |
| 6 | 小明 | 男 | 14 | 1 |
| 7 | 李大錘 | 女 | 17 | 2 |
| 8 | MrJoker | 男 | 42 | 2 |
| 9 | mingzdi | 男 | 19 | 2 |
| 10 | 新人 | 男 | 20 | 2 |
| 11 | 又一個新人 | 女 | 22 | 2 |
| 12 | newboy | 男 | 19 | 3 |
| 13 | oldboy | 男 | 19 | 1 |
| 14 | as | 男 | 17 | 3 |
+----+------------+------+------+-------+class
一個班級表
mysql> select * from class;
+-----+-----------+
| cid | classname |
+-----+-----------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+-----+-----------+百度
一對多的關聯表關聯條件給多的那一方select
查出每一個人對應的班級
select * from student,class where student.class=class.cid;方法
用內部連接的方法 inner join ******************
select * from student as s inner join class as c on s.class=c.cid;
on 是配合inner join 使用 進行條件限制
找到二班的所有同窗
select * from student as s inner join class as c on s.class=c.cid where class="2";
左關聯和右關聯****************************************
左關聯
mysql> select * from student as s left join class as c on s.class=c.cid;
+----+------------+------+------+-------+------+-----------+
| id | name | sex | age | class | cid | classname |
+----+------------+------+------+-------+------+-----------+
| 1 | 小明 | 男 | 14 | 1 | 1 | 一班 |
| 2 | 李雷 | 男 | 14 | 1 | 1 | 一班 |
| 3 | 韓梅梅 | 女 | 20 | 1 | 1 | 一班 |
| 4 | aboy | 男 | 10 | 1 | 1 | 一班 |
| 6 | 小明 | 男 | 14 | 1 | 1 | 一班 |
| 7 | 李大錘 | 女 | 17 | 2 | 2 | 二班 |
| 8 | MrJoker | 男 | 42 | 2 | 2 | 二班 |
| 9 | mingzdi | 男 | 19 | 2 | 2 | 二班 |
| 10 | 新人 | 男 | 20 | 2 | 2 | 二班 |
| 11 | 又一個新人 | 女 | 22 | 2 | 2 | 二班 |
| 12 | newboy | 男 | 19 | 3 | 3 | 三班 |
| 13 | oldboy | 男 | 19 | 1 | 1 | 一班 |
| 14 | as | 男 | 17 | 3 | 3 | 三班 |
+----+------------+------+------+-------+------+-----------+
右關聯
mysql> select * from student as s right join class as c on s.class=c.cid;
+------+------------+------+------+-------+-----+-----------+
| id | name | sex | age | class | cid | classname |
+------+------------+------+------+-------+-----+-----------+
| 1 | 小明 | 男 | 14 | 1 | 1 | 一班 |
| 2 | 李雷 | 男 | 14 | 1 | 1 | 一班 |
| 3 | 韓梅梅 | 女 | 20 | 1 | 1 | 一班 |
| 4 | aboy | 男 | 10 | 1 | 1 | 一班 |
| 6 | 小明 | 男 | 14 | 1 | 1 | 一班 |
| 13 | oldboy | 男 | 19 | 1 | 1 | 一班 |
| 7 | 李大錘 | 女 | 17 | 2 | 2 | 二班 |
| 8 | MrJoker | 男 | 42 | 2 | 2 | 二班 |
| 9 | mingzdi | 男 | 19 | 2 | 2 | 二班 |
| 10 | 新人 | 男 | 20 | 2 | 2 | 二班 |
| 11 | 又一個新人 | 女 | 22 | 2 | 2 | 二班 |
| 12 | newboy | 男 | 19 | 3 | 3 | 三班 |
| 14 | as | 男 | 17 | 3 | 3 | 三班 |
| NULL | NULL | NULL | NULL | NULL | 4 | 四班 |
+------+------------+------+------+-------+-----+-----------+
經過以上能夠看出
在左關聯時 左表student是所有顯示,而沒有人的四班是不會顯示的
右關聯時 右表class是所有顯示 沒有人的四班也會顯示出來
經過以上總結出:向哪一個表關聯則哪一個表的數據所有顯示,另外一個表所有去配合被關聯的表
統計每一個班級有多少人
mysql> select count(*),c.classname from student as s inner join class as c on s.
class=c.cid group by c.classname;
+----------+-----------+
| count(*) | classname |
+----------+-----------+
| 6 | 一班 |
| 2 | 三班 |
| 5 | 二班 |
+----------+-----------+
碰見
這個語句有三個關鍵點:
1.count(*) 是計算信息總數
2.inner join 將多表關聯起來 on設置關聯條件
3.group by 將表經過某信息分組
查找和李雷同班的同窗
分三個步驟
1.先查出李雷對應的班級
mysql> select class from student where name='李雷'; //是1
2.再查出李雷班級的全部同窗
mysql> select * from student where class="1";
3.將李雷去除
mysql> select * from student where class="1" and name !='李雷';
將以上合併成一條數據就是:
select * from student where class=(select class from student where name='李雷') and name !='李雷';
多表關聯***********************************
建立文章表 article
+-----+----------------+
| aid | title |
+-----+----------------+
| 1 | 百度上市了 |
| 2 | 明天開始放假了 |
| 3 | 週末不休息 |
| 4 | 明天上午上課 |
| 5 | 黃曉明離婚了 |
+-----+----------------+
建立中間表
+------+------+
| aid | tid |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
| 3 | 3 |
| 4 | 4 |
| 4 | 3 |
| 5 | 1 |
| 5 | 2 |
| 5 | 3 |
+------+------+
建立標籤表
+-----+-------+
| tid | tname |
+-----+-------+
| 1 | 熱門 |
| 2 | 火爆 |
| 3 | 贊 |
| 4 | 苦惱 |
| 5 | 生氣 |
+-----+-------+
三張表關聯的基本思路是 (檢索出全部文章對應的標籤名)
select * from article as a join arc_tag as at on a.aid=at.aid join tag as t on at.tid=t.tid;
檢索出文章對應的標籤名
select * from article as a join art_tag as at on a.aid=at.aid;
+-----+----------------+------+------+
| aid | title | aid | tid |
+-----+----------------+------+------+
| 1 | 百度上市了 | 1 | 2 |
| 1 | 百度上市了 | 1 | 1 |
| 1 | 百度上市了 | 1 | 3 |
| 2 | 明天開始放假了 | 2 | 2 |
| 2 | 明天開始放假了 | 2 | 3 |
| 3 | 週末不休息 | 3 | 3 |
| 4 | 明天上午上課 | 4 | 4 |
| 4 | 明天上午上課 | 4 | 3 |
| 5 | 黃曉明離婚了 | 5 | 1 |
| 5 | 黃曉明離婚了 | 5 | 2 |
| 5 | 黃曉明離婚了 | 5 | 3 |
+-----+----------------+------+------+
檢索出百度對應的標籤名
mysql> select * from article as a join arc_tag as at on a.aid=at.aid join tag as t on at.tid=t.tid where title like '%百度%';
+-----+--------------+------+------+-----+-------+
| aid | title | aid | tid | tid | tname |
+-----+--------------+------+------+-----+-------+
| 1 | 百度上市了 | 1 | 1 | 1 | 熱門 |
| 1 | 百度上市了 | 1 | 2 | 2 | 火爆 |
| 1 | 百度上市了 | 1 | 3 | 3 | 贊 |
+-----+--------------+------+------+-----+-------+
檢索出和‘百度’擁有同樣標籤的文章
先檢索出百度對應的標籤id
select at.tid from article as a join arc_tag as at on a.aid=at.aid where a.title like '%百度%';
+------+
| tid |
+------+
| 2 |
| 1 |
| 3 |
+------+
再將這個做爲條件進行查詢 順便將百度對應的文章屏蔽
mysql> select * from article as a join arc_tag as at on a.aid=at.aid join tag as t on at.tid=t.tid where at.tid in (1,2,3) and a.aid !=1;
+-----+----------------+------+------+-----+-------+
| aid | title | aid | tid | tid | tname |
+-----+----------------+------+------+-----+-------+
| 5 | 黃曉明離婚了 | 5 | 1 | 1 | 熱門 |
| 2 | 明天開始放假了 | 2 | 2 | 2 | 火爆 |
| 5 | 黃曉明離婚了 | 5 | 2 | 2 | 火爆 |
| 2 | 明天開始放假了 | 2 | 3 | 3 | 贊 |
| 3 | 週末不休息 | 3 | 3 | 3 | 贊 |
| 4 | 明天上午上課 | 4 | 3 | 3 | 贊 |
| 5 | 黃曉明離婚了 | 5 | 3 | 3 | 贊 |
+-----+----------------+------+------+-----+-------+
將以上兩條結合在一塊兒就是個完整的語句
select * from article as a join arc_tag as at on a.aid=at.aid join tag as t on t.tid=at.tid where at.tid in (select at.tid from article as a join arc_tag as at on a.aid=at.aid where a.title like '%百度%') and a.title not like '%百度%';
+-----+----------------+------+------+-----+-------+
| aid | title | aid | tid | tid | tname |
+-----+----------------+------+------+-----+-------+
| 5 | 黃曉明離婚了 | 5 | 1 | 1 | 熱門 |
| 2 | 明天開始放假了 | 2 | 2 | 2 | 火爆 |
| 5 | 黃曉明離婚了 | 5 | 2 | 2 | 火爆 |
| 2 | 明天開始放假了 | 2 | 3 | 3 | 贊 |
| 3 | 週末不休息 | 3 | 3 | 3 | 贊 |
| 4 | 明天上午上課 | 4 | 3 | 3 | 贊 |
| 5 | 黃曉明離婚了 | 5 | 3 | 3 | 贊 |
+-----+----------------+------+------+-----+-------+
檢索出每一個標籤對應文章的數量select count(*),tname from article as a join arc_tag as at on a.aid=at.aid join tag as t on t.tid=at.tid group by tname;+----------+-------+| count(*) | tname |+----------+-------+| 3 | 火爆 || 2 | 熱門 || 1 | 苦惱 || 5 | 贊 |+----------+-------+