mysql多表查询
前提如下:
person表:----------------------------------id name dept_id salary0001 wangda 101 15000002 wanger 103 30000003 wangsan 108 40000004 wangsi 109 20000005 wangwu 101 60000006 wangliu 102 70000007 wangqi [NULL] 4000----------------------------------dept表:----------------------------------dept_id dept_name101 caiwu102 zhenggong103 wuzi108 shangwu109 renshi110[NULL]----------------------------------salary_grade表:----------------------------------salary_grade lowest_sal highest_salA 0 999B 1000 1999C 2000 2999D 3000 4999E 5000 6999F 7000 9999----------------------------------
内连接,查询两张表中的指定数据(等值)
功能:查询person表中有部门的人员的人员姓名、部门编号和部门名称
思路:人员姓名和部门编号在person表中都有。但是部门名称是在dept表中和部门编号进行对应的。
SELECTp.name,p.dept_id,d.dept_nameFROMperson p,dept dWHEREp.dept_id = d.dept_id;
结果:
name dept_id dept_namewangda 101 caiwuwangwu 101 caiwuwangliu 102 zhenggongwanger 103 wuziwangsan 108 shangwuwangsi 109 renshi
这里注意,在person表中没有部门的wangqi在这次查询中并没有出现。
内连接,查询三张表中的指定数据(不等值)
功能:查询person表中有部门的人员的人员姓名、部门编号、部门名称、薪资和薪资等级
思路:部门名称在dept表中,而薪资等级是在salary_grade表中和薪资范围相关。
SELECTp.`name`,p.dept_id,d.dept_name,p.salary,s.salary_gradeFROMperson p,dept d,salary_grade sWHEREp.dept_id = d.dept_idAND p.salary BETWEEN s.lowest_salAND s.highest_sal;
结果:
name dept_id dept_name salary salary_gradewangda 101 caiwu 1500 Bwangsi 109 renshi 2000 Cwanger 103 wuzi 3000 Dwangsan 108 shangwu 4000 Dwangwu 101 caiwu 6000 Ewangliu 102 zhenggong 7000 F
外连接,查询两张表中的指定数据(join)
功能(LEFT JOIN ON):查询person表中所有人(包括有部门和无部门的人员)的人员名称和部门名称
SELECTp. NAME,d.dept_nameFROMperson pLEFT JOIN dept d ON p.dept_id = d.dept_id;
结果:
NAME dept_namewanger wuziwangsan shangwuwangsi renshiwangwu caiwuwangliu zhenggongwangqi [NULL]
功能(RIGHT JOIN ON):查询dept表中所有部门中的人员名称、所在部门名称
SELECTp. NAME,d.dept_nameFROMperson pRIGHT JOIN dept d ON p.dept_id = d.dept_id;
结果:
NAME dept_id dept_namewangda 101 caiwuwangwu 101 caiwuwangliu 102 zhenggongwanger 103 wuziwangsan 108 shangwuwangsi 109 renshi[NULL]110[NULL]
如何同时实现左右连接(两张表的只需要一次UNION,三张表则需要三次UNION,四张表需要)
SELECT*FROMperson pLEFT JOIN dept d ON p.dept_id = d.dept_idUNIONSELECT*FROMperson pRIGHT JOIN dept d ON p.dept_id = d.dept_id;
结果:
id name dept_id salary dept_id1 dept_name0001 wangda 101 1500 101 caiwu0002 wanger 103 3000 103 wuzi0003 wangsan 108 4000 108 shangwu0004 wangsi 109 2000 109 renshi0005 wangwu 101 6000 101 caiwu0006 wangliu 102 7000 102 zhenggong0007 wangqi [NULL]4000[NULL][NULL][NULL][NULL][NULL][NULL]110[NULL]
SQL:1999
natural join 自然连接:将两表中所有相同字段全部关联(且不会产生笛卡尔集)。
SELECT*FROMpersonNATURAL JOIN dept;
结果:
dept_id id name salary dept_name1010001 wangda 1500 caiwu1010005 wangwu 6000 caiwu1020006 wangliu 7000 zhenggong1030002 wanger 3000 wuzi1080003 wangsan 4000 shangwu1090004 wangsi 2000 renshi
join using(str) 连接并指定连接用字段。和natural join相比,更加具有针对性。
SELECT*FROMpersonJOIN dept USING (dept_id);
结果:
dept_id id name salary dept_name1010001 wangda 1500 caiwu1010005 wangwu 6000 caiwu1020006 wangliu 7000 zhenggong1030002 wanger 3000 wuzi1080003 wangsan 4000 shangwu1090004 wangsi 2000 renshi
自连接:同表多别名查询
调整person表结构:
id name dept_id salary manager_id0001 wangda 101 1500 00050002 wanger 103 3000 00060003 wangsan 108 4000 00050004 wangsi 109 2000 00060005 wangwu 101 6000 00070006 wangliu 102 7000 00070007 wangqi [NULL]9000[NULL]
功能:查询wangsi的上司的姓名
SELECTe.id employee_id,e. NAME employee,m.id manager_id,m.`name` managerFROMperson e,person mWHEREe.manager_id = m.idAND lower(e. NAME)='wangsi';
结果:
employee_id employee manager_id manager0004 wangsi 0006 wangliu
浙公网安备 33010602011771号