本文主要是介绍MySQL-Join,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境准备
三个table:书籍信息book、作者信息author、出版社信息publish。
create database temp;
use temp;
create table book (id int not null auto_increment, name varchar(20) not null, author int not null, pub int not null, price int default 0, primary key (id));
create table author (id int not null auto_increment, name varchar(20) not null, age int, primary key (id));
create table publish (id int not null auto_increment, name varchar(20) not null, city varchar(20), primary key (id));
增加测试数据:
insert into author (name, age) values ("Tom", 20);
insert into author (name, age) values ("Jerry", 25);insert into publish (name, city) values ("PUB Tigger", "BJ");
insert into publish (name, city) values ("PUB Lion", "SH");
insert into publish (name, city) values ("PUB Rabbit", "SZ");insert into book (name, author, pub, price) values ("Good Mood", 1, 1, 110);
insert into book (name, author, pub, price) values ("Rainy Day", 2, 3, 230);
insert into book (name, author, pub, price) values ("On the Road", 2, 2, 220);
验证:
MariaDB [temp]> select * from book;
+----+-------------+--------+-----+-------+
| id | name | author | pub | price |
+----+-------------+--------+-----+-------+
| 1 | Good Mood | 1 | 1 | 110 |
| 2 | Rainy Day | 2 | 3 | 230 |
| 3 | On the Road | 2 | 2 | 220 |
+----+-------------+--------+-----+-------+
3 rows in set (0.00 sec)MariaDB [temp]> select * from author;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | Tom | 20 |
| 2 | Jerry | 25 |
+----+-------+------+
2 rows in set (0.00 sec)MariaDB [temp]> select * from publish;
+----+------------+------+
| id | name | city |
+----+------------+------+
| 1 | PUB Tigger | BJ |
| 2 | PUB Lion | SH |
| 3 | PUB Rabbit | SZ |
+----+------------+------+
3 rows in set (0.00 sec)
Join
根据三个表,查询完整的信息;Join有两种使用方式。
MariaDB [temp]> select book.name, author.name as author, publish.name as publish, publish.city, book.price from book, author, publish where book.author=author.id and book.pub=publish.id;
+-------------+--------+------------+------+-------+
| name | author | publish | city | price |
+-------------+--------+------------+------+-------+
| Good Mood | Tom | PUB Tigger | BJ | 110 |
| Rainy Day | Jerry | PUB Rabbit | SZ | 230 |
| On the Road | Jerry | PUB Lion | SH | 220 |
+-------------+--------+------------+------+-------+
3 rows in set (0.00 sec)MariaDB [temp]> select book.name, author.name as author, publish.name as publish, publish.city, book.price from book inner join author inner join publish on book.author=author.id and book.pub=publish.id;
+-------------+--------+------------+------+-------+
| name | author | publish | city | price |
+-------------+--------+------------+------+-------+
| Good Mood | Tom | PUB Tigger | BJ | 110 |
| Rainy Day | Jerry | PUB Rabbit | SZ | 230 |
| On the Road | Jerry | PUB Lion | SH | 220 |
+-------------+--------+------------+------+-------+
3 rows in set (0.00 sec)MariaDB [temp]>
同一个table被查询两次
对上面的场景进行增强,假设一本书有两个作者。
新建一个表book_en。
create table book_en (id int not null auto_increment, name varchar(20) not null, author1 int not null, author2 int not null, pub int not null, price int default 0, primary key (id));insert into book_en (name, author1, author2, pub, price) values ("A Bad Habit", 1, 2, 1, 110);
insert into book_en (name, author1, author2, pub, price) values ("Keep Healthy", 2, 1, 3, 230);
insert into book_en (name, author1, author2, pub, price) values ("Toast", 1, 2, 2, 220);
查询:
MariaDB [temp]> select * from book_en;
+----+--------------+---------+---------+-----+-------+
| id | name | author1 | author2 | pub | price |
+----+--------------+---------+---------+-----+-------+
| 4 | A Bad Habit | 1 | 2 | 1 | 110 |
| 5 | Keep Healthy | 2 | 1 | 3 | 230 |
| 6 | Toast | 1 | 2 | 2 | 220 |
+----+--------------+---------+---------+-----+-------+
3 rows in set (0.00 sec)MariaDB [temp]> select * from author;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | Tom | 20 |
| 2 | Jerry | 25 |
+----+-------+------+
2 rows in set (0.00 sec)MariaDB [temp]> select book_en.name as name, a1.name as author1, a2.name as author2, publish.name as publish, publish.city as city, book_en.price from book_en, author a1, author a2, publish where book_en.author1=a1.id and book_en.author2=a2.id and book_en.pub=publish.id;
+--------------+---------+---------+------------+------+-------+
| name | author1 | author2 | publish | city | price |
+--------------+---------+---------+------------+------+-------+
| Keep Healthy | Jerry | Tom | PUB Rabbit | SZ | 230 |
| A Bad Habit | Tom | Jerry | PUB Tigger | BJ | 110 |
| Toast | Tom | Jerry | PUB Lion | SH | 220 |
+--------------+---------+---------+------------+------+-------+
3 rows in set (0.00 sec)MariaDB [temp]> select book_en.name as name, a1.name as author1, a2.name as author2, publish.name as publish, publish.city as city, book_en.price from book_en inner join author a1 inner join author a2 inner join publish where book_en.author1=a1.id and book_en.author2=a2.id and book_en.pub=publish.id;
+--------------+---------+---------+------------+------+-------+
| name | author1 | author2 | publish | city | price |
+--------------+---------+---------+------------+------+-------+
| Keep Healthy | Jerry | Tom | PUB Rabbit | SZ | 230 |
| A Bad Habit | Tom | Jerry | PUB Tigger | BJ | 110 |
| Toast | Tom | Jerry | PUB Lion | SH | 220 |
+--------------+---------+---------+------------+------+-------+
3 rows in set (0.00 sec)MariaDB [temp]>
上面的where可以改成on。
另外一个例子
城市city,两个城市之间的距离distance。
建表&准备测试数据
create table city (id int not null auto_increment, name varchar(20), primary key (id));
create table distance (id int not null auto_increment, from_id int not null, to_id int not null, dist int not null, primary key (id));insert into city (name) values("BJ");
insert into city (name) values("SH");
insert into city (name) values("SZ");insert into distance (from_id, to_id, dist) values (1, 2, 1200);
insert into distance (from_id, to_id, dist) values (2, 3, 2300);
insert into distance (from_id, to_id, dist) values (3, 1, 3100);
数据验证
MariaDB [temp]> select * from distance;
+----+---------+-------+------+
| id | from_id | to_id | dist |
+----+---------+-------+------+
| 1 | 1 | 2 | 1200 |
| 2 | 2 | 3 | 2300 |
| 3 | 3 | 1 | 3100 |
+----+---------+-------+------+
3 rows in set (0.00 sec)MariaDB [temp]> select * from city;
+----+------+
| id | name |
+----+------+
| 1 | BJ |
| 2 | SH |
| 3 | SZ |
+----+------+
3 rows in set (0.00 sec)
Join
MariaDB [temp]> select c1.name as city1, c2.name as city2, distance.dist dist from distance inner join city c1 inner join city c2 where distance.from_id=c1.id and distance.to_id=c2.id;
+-------+-------+------+
| city1 | city2 | dist |
+-------+-------+------+
| BJ | SH | 1200 |
| SH | SZ | 2300 |
| SZ | BJ | 3100 |
+-------+-------+------+
3 rows in set (0.01 sec)MariaDB [temp]> select c1.name as city1, c2.name as city2, distance.dist dist from city c1 inner join city c2 inner join distance on distance.from_id=c1.id and distance.to_id=c2.id;
+-------+-------+------+
| city1 | city2 | dist |
+-------+-------+------+
| BJ | SH | 1200 |
| SH | SZ | 2300 |
| SZ | BJ | 3100 |
+-------+-------+------+
3 rows in set (0.00 sec)MariaDB [temp]>
这篇关于MySQL-Join的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!