MySQL入门实践(三)
复杂查询
多表查询
常常我们需要从多个表中提取信息,这时候FROM
一个表已经无法满足要求。MySQL为此允许FROM
来源于多个表,格式如下:
SELECT 列名 FROM 表1,表2;
子查询嵌套
为了满足复杂的查询操作,MySQL允许SELECT
中嵌套SELECT
查询语句进行查询。
例如从employee表和和project表中查询name
为“Tom”的员工所在部门和所做过的项目数:
SELECT of_dpt,COUNT(proj_names) AS count_project FROM project WHERE of_dpt IN (SELECT in_dpt FROM employee WHERE name="Tom");
结果:
连接查询
MySQL中有INNER JOIN
,LEFT JOIN
,RIGHT JOIN
,UNION
四种常用的连接操作。
内连接(INNER JOIN)
我们以数学上的集合来示意,INNER JOIN
类似于集合的交运算,将两个表都具有的部分进行连接:
例如从表employee和表department,查询employee.in_dpt
等于department.dpt_name
的员工的id
,name
,people_num
属性,并以id
从小到大排序:
SELECT id,name,people_num FROM employee INNER JOIN department ON employee.in_dpt = department.dpt_name ORDER BY id;
结果:
左连接(LEFT JOIN)和右连接(RIGHT JOIN)
LEFT JOIN
与RIGHT JOIN
的形式和意义基本类似,都是以某一个表为基准(左边或者右边)然后进行匹配,对于没有匹配成功的,填充NULL
。
例如:
SELECT id,name,people_num FROM employee RIGHT JOIN department ON employee.in_dpt = department.dpt_name ORDER BY id;
结果:
从结果上可以看到id
和name
都出现了两行结果为NULL
,这是因为department.dpt_name
中存在dpt_5
和 dpt_6
两个值在employee.in_dpt
中未出现。
交叉连接(CROSS JOIN)
CROSS JOIN
是交叉连接,得到两个表的笛卡尔积
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
在MySQL中实际上CROSS JOIN
和INNER JOIN
的结果是一样的。
并连接(UNION)
这里仍然以数学上的集合来示意,UNION
类似于集合的并运算,将两个表按照一定的列合并,例如从表empolyee和表user中按照id
来合并属性name
,age
,id
:
SELECT id,name,age FROM employee UNION (SELECT id,name,age FROM user);
参考资料
http://www.cnblogs.com/chiangchou/p/mysql-3.html
http://www.cnblogs.com/BeginMan/p/3754322.html
https://www.shiyanlou.com/courses/9/labs/2414/document