MySQL入门实践(三)

来源:互联网 发布:js字符串去空格转数组 编辑:程序博客网 时间:2024/06/08 01:32

MySQL入门实践(三)

复杂查询

多表查询

常常我们需要从多个表中提取信息,这时候FROM一个表已经无法满足要求。MySQL为此允许FROM来源于多个表,格式如下:

SELECT 列名 FROM1,表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 JOINLEFT JOINRIGHT JOINUNION四种常用的连接操作。

内连接(INNER JOIN)

我们以数学上的集合来示意,INNER JOIN类似于集合的交运算,将两个表都具有的部分进行连接:
这里写图片描述

例如从表employee和表department,查询employee.in_dpt等于department.dpt_name的员工的idnamepeople_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 JOINRIGHT JOIN的形式和意义基本类似,都是以某一个表为基准(左边或者右边)然后进行匹配,对于没有匹配成功的,填充NULL

例如:

SELECT id,name,people_num FROM employee RIGHT JOIN department ON employee.in_dpt = department.dpt_name ORDER BY id;

结果:
这里写图片描述

从结果上可以看到idname都出现了两行结果为NULL,这是因为department.dpt_name 中存在dpt_5dpt_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 JOININNER JOIN的结果是一样的。

并连接(UNION)



这里仍然以数学上的集合来示意,UNION类似于集合的并运算,将两个表按照一定的列合并,例如从表empolyee和表user中按照id来合并属性nameageid
这里写图片描述

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

0 0
原创粉丝点击