到目前为止,mysql命令行系列里用到查询语句都是针对一个表,在这一节里我们要学习:
如何在多个表里查询?
关系型数据库管理系统(RDBMS)的优点在于可以把不同表里的数据关联起来。如果两个表是关联的那么它们比较具备至少一个相关的列。例如:employee_data表的emp_id列和employee_per的e_id列是相关的。我们可以利用这个相关性,从employee_data里查询员工的名字,同时在employee_per里把对于的员工配偶的名字查找出来,如下:
select CONCAT(f_name, " ", l_name) AS Name,
s_name as 'Spouse Name' from
employee_data, employee_per
where m_status = 'Y' AND
emp_id = e_id;
+-----------------+-----------------+
| Name | Spouse Name |
+-----------------+-----------------+
| Manish Sharma | Anamika Sharma |
| John Hagan | Jane Donner |
| Ganesh Pillai | Sandhya Pillai |
| Anamika Sharma | Manish Sharma |
| John MacFarland | Mary Shelly |
| Alok Nanda | Manika Nanda |
| Paul Simon | Muriel Lovelace |
| Arthur Hoopla | Rina Brighton |
| Kim Hunter | Matt Shikari |
| Danny Gibson | Betty Cudly |
| Mike Harper | Stella Stevens |
| Monica Sehgal | Edgar Alan |
| Peter Champion | Ruby Richer |
+-----------------+-----------------+
13 rows in set (0.00 sec)
注意:这里我们用到SELECT f_name, l_name, s_name, 但是没有指明f_name或者s_name是那个表里的列。之所以可以这么写是因为f_name,l_name,s_name都是独一无二的列名,所以mysql知道它们指的是那个表里的值。但是在实际运用中,不同的表常常具有相同的列名。为了避免混淆,我们通常要用到标识,如下:
select CONCAT(employee_data.f_name, " ", employee_data.l_name)
AS Name, employee_per.s_name AS 'Spouse Name'
from employee_data, employee_per
where employee_per.m_status = 'Y'
AND employee_data.emp_id = employee_per.e_id;
注意:上述例子里employee_data.f_name指的是employee_data这个表里的f_name列;同理empoyee_per.s_name指的是employee_per表里的s_name列。此外还有另外一种相对简单的写法:
select CONCAT(a.f_name, " ", a.l_name)
AS Name, b.s_name AS 'Spouse Name'
from employee_data a, employee_per b
where a.m_status = 'Y'
AND a.emp_id = b.e_id;
注意:这个我们把employee_data用a来标识,employee_per用b来标识,这样就可以用a.f_name来表示employee_data这个表里的f_name列,是不是要简单许多?
标签: mySQL, mysql命令行