mysql与配偶同性_mysql 左,右,内连接
左右連接
全相乘方法(效率很低)
mysql> select * from test10;
+------+-------+
| id ? | sname |
+------+-------+
| ? ?1 | 云彩 ? ? |
| ? ?2 | 月亮 ? ? ?|
| ? ?3 | 星星 ? ? ?|
+------+-------+
3 rows in set (0.00 sec)
mysql> select * from test11;
+--------+-------+
| cat_id | cname |
+--------+-------+
| ? ? 95 | 猴子 ? ? ?|
| ? ? 96 | 老虎 ? ? |
+--------+-------+
2 rows in set (0.00 sec)
數(shù)據(jù)庫中實現(xiàn)兩表*的效果
mysql> select * from test10,test11;
+------+-------+--------+-------+
| id ? | sname | cat_id | cname |
+------+-------+--------+-------+
| ? ?1 | 云彩 ? ? | ? ? 95 | 猴子 ? ? ?|
| ? ?1 | 云彩 ? ? | ? ? 96 | 老虎 ? ? |
| ? ?2 | 月亮 ? ? ?| ? ? 95 | 猴子 ? ? ?|
| ? ?2 | 月亮 ? ? ?| ? ? 96 | 老虎 ? ? |
| ? ?3 | 星星 ? ? ?| ? ? 95 | 猴子 ? ? ?|
| ? ?3 | 星星 ? ? ?| ? ? 96 | 老虎 ? ? |
+------+-------+--------+-------+
6 rows in set (0.03 sec)
分析:
test10看成集合有三個元素
test11看成集合有兩個元素
test10*test11得到新集合是有六個元素
行 兩個表行數(shù)相乘
列 兩個表列數(shù)相加(可以重復)
多表查詢時候列名重復的情況時候,需要明確指出取得是那個表
mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category limit 3;
+----------+--------+--------------------+--------+----------+
| goods_id | cat_id | goods_name ? ? ? ? | cat_id | cat_name |
+----------+--------+--------------------+--------+----------+
| ? ? ? ?1 | ? ? ?4 | KD876 ? ? ? ? ? ? ?| ? ? ?1 | 手機類型 ? ? ? ?|
| ? ? ? ?4 | ? ? ?8 | htcN85原裝充電器 ? ? ? ? ? | ? ? ?1 | 手機類型 ? ? ? ?|
| ? ? ? ?3 | ? ? ?8 | 諾基亞原裝5800耳機 ? ? ? ? ? ?| ? ? ?1 | 手機類型 ? ? ? ?|
+----------+--------+--------------------+--------+----------+
技巧 :創(chuàng)建一個同樣結(jié)構(gòu)的表 ?create table [新表名] like [舊表名]
create table minigoods like goods;
復制一部分表的內(nèi)容
mysql> insert into minigoods
-> select * from goods limit 3;
取得有意義的兩個表的對應 minigoods.cat_id=category.cat_id
mysql> select goods_id,minigoods.cat_id,goods_name,category.cat_id,cat_name from minigoods,category where minigoods.cat_id=category.cat_id ;
+----------+--------+--------------------+--------+----------+
| goods_id | cat_id | goods_name ? ? ? ? | cat_id | cat_name |
+----------+--------+--------------------+--------+----------+
| ? ? ? ?1 | ? ? ?4 | KD876 ? ? ? ? ? ? ?| ? ? ?4 | 3G手機 ? ? ?|
| ? ? ? ?4 | ? ? ?8 | htcN85原裝充電器 ? ? ? ? ? | ? ? ?8 | 耳機 ? ? ? ? |
| ? ? ? ?3 | ? ? ?8 | 諾基亞原裝5800耳機 ? ? ? ? ? ?| ? ? ?8 | 耳機 ? ? ? ? |
+----------+--------+--------------------+--------+----------+
3 rows in set (0.00 sec)
左連接語法
a表在左,不動
b表在右,動
a表和b表通過一個關系(自己設定),來篩選a所需要的b的行
a left join b on [條件] ?----條件為真,取出b的行
a left join b on [條件] 結(jié)果集也可以看成表(假設為c表),可以對其再查詢
mysql> select goods_id,goods_name,cat_name
-> from
-> (minigoods left join category on minigoods.cat_id=category.cat_id);
+----------+--------------------+----------+
| goods_id | goods_name ? ? ? ? | cat_name |
+----------+--------------------+----------+
| ? ? ? ?1 | KD876 ? ? ? ? ? ? ?| 3G手機 ? ? ?|
| ? ? ? ?4 | htcN85原裝充電器 ? ? ? ? ? | 耳機 ? ? ? ? |
| ? ? ? ?3 | 諾基亞原裝5800耳機 ? ? ? ? ? ?| 耳機 ? ? ? ? |
+----------+--------------------+----------+
[minigoods left join category on minigoods.cat_id=category.cat_id 看做c表]
驗證:就是后面依然可以使用where 等等過濾條件
mysql> select goods_id,goods_name,cat_name from
(minigoods left join category on minigoods.cat_id=category.cat_id )
where 1 order by goods_id desc limit 2;
+----------+--------------------+----------+
| goods_id | goods_name ? ? ? ? | cat_name |
+----------+--------------------+----------+
| ? ? ? ?4 | htcN85原裝充電器 ? ? ? ? ? | 耳機 ? ? ? ? |
| ? ? ? ?3 | 諾基亞原裝5800耳機 ? ? ? ? ? ?| 耳機 ? ? ? ? |
+----------+--------------------+----------+
2 rows in set (0.00 sec)
可以多張表左連接,就是把結(jié)果看成表
看做一張表
{{a left join b on [條件]} ?left join c on [條件]}
mysql> select goods.goods_id,goods.goods_name,goods.cat_id,cat_name
-> from
-> minigoods left join category on minigoods.cat_id=category.cat_id
-> left join goods on minigoods.cat_id=4 limit 4;
+----------+--------------------+--------+----------+
| goods_id | goods_name ? ? ? ? | cat_id | cat_name |
+----------+--------------------+--------+----------+
| ? ? ? ?1 | KD876 ? ? ? ? ? ? ?| ? ? ?4 | 3G手機 ? ? ?|
| ? ? ? ?4 | htcN85原裝充電器 ? ? ? ? ? | ? ? ?8 | 3G手機 ? ? ?|
| ? ? ? ?3 | 諾基亞原裝5800耳機 ? ? ? ? ? ?| ? ? ?8 | 3G手機 ? ? ?|
| ? ? ? ?5 | 索愛原裝M2卡讀卡器 ? ? ? ? ? ? ? | ? ? 11 | 3G手機 ? ? ?|
+----------+--------------------+--------+----------+
左右連接的區(qū)別===================================================================================================
a left join b on 意思是查詢的時候以a為基準查詢
a right join b on 意思是查詢的時候以b為基準查詢
a left join b on ?等同于 b right join a (都是以a為基準查詢)
技巧:處于移植兼容性和理解上來說,最好一律使用左連接實現(xiàn)
create table boy(
bname varchar(20),
other char(1)
)engine myisam charset utf8;
insert into boy
values
('屌絲','A'),
('李四','B'),
('王五','C'),
('高富帥','D'),
('鄭七','E');
create table girl(
gname varchar(20),
other char(1)
)engine myisam charset utf8;
insert into girl
values
('空姐','B'),
('大S','C'),
('阿嬌','D'),
('張柏芝','D'),
('林黛玉','E'),
('寶釵','F');
取出所有男生的配偶(左連接)
select boy.*,girl.* from
boy left join girl on
boy.other=girl.other;
+--------+-------+--------+-------+
| bname ?| other | gname ?| other |
+--------+-------+--------+-------+
| 屌絲 ? ? ?| A ? ? | NULL ? | NULL ?|
| 李四 ? ? ? | B ? ? | 空姐 ? ? ?| B ? ? |
| 王五 ? ? ? | C ? ? | 大S ? ? ?| C ? ? |
| 高富帥 ? ? | D ? ? | 阿嬌 ? ? ? | D ? ? |
| 高富帥 ? ? | D ? ? | 張柏芝 ? ? | D ? ? |
| 鄭七 ? ? ?| E ? ? | 林黛玉 ? ? ? | E ? ? |
+--------+-------+--------+-------+
取出所有女生的配偶(左連接)
mysql> select girl.*,boy.* from
-> girl left join boy on
-> boy.other=girl.other;
+--------+-------+--------+-------+
| gname ?| other | bname ?| other |
+--------+-------+--------+-------+
| 空姐 ? ? ?| B ? ? | 李四 ? ? ? | B ? ? |
| 大S ? ? ?| C ? ? | 王五 ? ? ? | C ? ? |
| 阿嬌 ? ? ? | D ? ? | 高富帥 ? ? | D ? ? |
| 張柏芝 ? ? | D ? ? | 高富帥 ? ? | D ? ? |
| 林黛玉 ? ? ? | E ? ? | 鄭七 ? ? ?| E ? ? |
| 寶釵 ? ? ? | F ? ? | NULL ? | NULL ?|
+--------+-------+--------+-------+
取出所有女生的配偶(右連接,和上面左連接一致)
mysql> select girl.* ,boy.* from
-> boy right join girl on
-> boy.other=girl.other;
+--------+-------+--------+-------+
| gname ?| other | bname ?| other |
+--------+-------+--------+-------+
| 空姐 ? ? ?| B ? ? | 李四 ? ? ? | B ? ? |
| 大S ? ? ?| C ? ? | 王五 ? ? ? | C ? ? |
| 阿嬌 ? ? ? | D ? ? | 高富帥 ? ? | D ? ? |
| 張柏芝 ? ? | D ? ? | 高富帥 ? ? | D ? ? |
| 林黛玉 ? ? ? | E ? ? | 鄭七 ? ? ?| E ? ? |
| 寶釵 ? ? ? | F ? ? | NULL ? | NULL ?|
+--------+-------+--------+-------+
內(nèi)連接===================================================================================================
取出有配偶的
select girl.*,boy.* from
boy inner join girl on
boy.other=girl.other;
+--------+-------+--------+-------+
| gname ?| other | bname ?| other |
+--------+-------+--------+-------+
| 空姐 ? ? ?| B ? ? | 李四 ? ? ? | B ? ? |
| 大S ? ? ?| C ? ? | 王五 ? ? ? | C ? ? |
| 阿嬌 ? ? ? | D ? ? | 高富帥 ? ? | D ? ? |
| 張柏芝 ? ? | D ? ? | 高富帥 ? ? | D ? ? |
| 林黛玉 ? ? ? | E ? ? | 鄭七 ? ? ?| E ? ? |
+--------+-------+--------+-------+
內(nèi)連接是左右連接的交集
(外連接是左右連接的并集,mysql不支持)可以使用用union實現(xiàn)
左連接應用===================================================================================================
create table match_t(
match_id int primary key auto_increment,
host_team_id int,
guest_team_id int,
match_result varchar(20),
match_time date
)engine myisam charset utf8;
insert into match_t
values
(1,1,2,'2:0','2006-05-21'),
(2,2,3,'1:2','2006-06-21'),
(3,3,1,'2:5','2006-07-21'),
(4,1,1,'3:2','2006-08-21');
create table team_t(
team_id int primary key auto_increment,
team_name varchar(20)
)engine myisam charset utf8;
insert into team_t
values
(1,'恒大'),
(2,'國安'),
(3,'申花'),
(4,'大連');
mysql> select * from match_t;
+----------+--------------+---------------+--------------+------------+
| match_id | host_team_id | guest_team_id | match_result | match_time |
+----------+--------------+---------------+--------------+------------+
| ? ? ? ?1 | ? ? ? ? ? ?1 | ? ? ? ? ? ? 2 | 2:0 ? ? ? ? ?| 2006-05-21 |
| ? ? ? ?2 | ? ? ? ? ? ?2 | ? ? ? ? ? ? 3 | 1:2 ? ? ? ? ?| 2006-06-21 |
| ? ? ? ?3 | ? ? ? ? ? ?3 | ? ? ? ? ? ? 1 | 2:5 ? ? ? ? ?| 2006-07-21 |
| ? ? ? ?4 | ? ? ? ? ? ?4 | ? ? ? ? ? ? 1 | 3:2 ? ? ? ? ?| 2006-08-21 |
+----------+--------------+---------------+--------------+------------+
mysql> select * from team_t;
+---------+-----------+
| team_id | team_name |
+---------+-----------+
| ? ? ? 1 | 恒大 ? ? ? ? ?|
| ? ? ? 2 | 國安 ? ? ? ? ?|
| ? ? ? 3 | 申花 ? ? ? ?|
| ? ? ? 4 | 大連 ? ? ? ? ?|
+---------+-----------+
技巧 :善與給表其別名
2006-06-21日期之后 把表中對戰(zhàn)換成隊名
select host_t.team_name,guest_t.team_name,match_result,match_time from
match_t left join (team_t as host_t) on match_t.host_team_id=host_t.team_id
left join (team_t as guest_t) on match_t.guest_team_id=guest_t.team_id
where match_time>='2006-06-21';
+--------------+-----------+---------------+-----------+--------------+------------+
| host_team_id | team_name | guest_team_id | team_name | match_result | match_time |
+--------------+-----------+---------------+-----------+--------------+------------+
| ? ? ? ? ? ?1 | 恒大 ? ? ? ? ?| ? ? ? ? ? ? 2 | 國安 ? ? ? ? ?| 2:0 ? ? ? ? ?| 2006-05-21 |
| ? ? ? ? ? ?2 | 國安 ? ? ? ? ?| ? ? ? ? ? ? 3 | 申花 ? ? ? ?| 1:2 ? ? ? ? ?| 2006-06-21 |
| ? ? ? ? ? ?3 | 申花 ? ? ? ?| ? ? ? ? ? ? 1 | 恒大 ? ? ? ? ?| 2:5 ? ? ? ? ?| 2006-07-21 |
| ? ? ? ? ? ?4 | 大連 ? ? ? ? ?| ? ? ? ? ? ? 1 | 恒大 ? ? ? ? ?| 3:2 ? ? ? ? ?| 2006-08-21 |
+--------------+-----------+---------------+-----------+--------------+------------+
總結(jié)
以上是生活随笔為你收集整理的mysql与配偶同性_mysql 左,右,内连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c 串转string_c++ 中
- 下一篇: 国库券怎么兑换