mysql获取多张表中的数据_mysql之多表查询
1.新建的⼀个数据库db3
create database db3 charset utf8;
2.为db3数据库创建两张表和数据
等录页面的代码(1)创建person表
create tableperon (
idint(11) not nullauto_increment,
namevarchar(50) not null,
agetinyint(4) default '0',
sex enum('男','⼥','⼈妖') not null default '⼈妖',
salarydecimal(10, 2) not null DEFAULT '250.00',
hire_date datenot null,
dept_idint(11) default null,PRIMARY KEY(id)
) ENGINE=INNODB auto_increment = 13 DEFAULT CHARSET = utf8;
(2)为person表创建数据
# 教学部insert into peron values('1', 'alex', '28', '⼈妖', '53000.00', '2010-06-21', '1');insert into peron values('2', 'wupeiqi', '23', '男', '8000.00', '2011-02-21', '1');insert into peron values('3', 'egon', '30', '男', '6500.00', '2015-06-21', '1');insert into peron values('4', 'jingnvshen', '28', '⼥', '6680.00', '2014-06-21', '1');
# 销售部insert into peron values('5', '歪歪', '20', '⼥', '3000.00', '2015-02-21', '2');insert into peron values('6', '星星', '20', '⼥',
亚马逊雨林英语'2000.00', '2018-01-30', '2');insert into peron values('7', '格格', '20', '⼥', '2000.00', '2018-02-27', '2');insert into peron
values('8', '周周', '20', '⼥', '2000.00', '2015-06-21', '2');
#市场部insert into peron values('9', '⽉⽉', '21', '⼥', '4000.00', '2014-07-21', '3');insert into peron values('10', '安琪', '22', '⼥',
'4000.00', '2015-07-15', '3');
# ⼈事部insert into peron values('11', '周明⽉', '17', '⼥', '5000.00', '2014-06-21', '4');
# ⿎励部insert into peron values('12', '苍⽼师', '33', '⼥', '1000000.00', '2018-02-21', null);
(3)创建⼀个部门表dept。 COMMENT 表⽰为字段添加注释transfer是什么意思中文
create tabledept(
didint not null COMMENT '部门id记录' auto_increment PRIMARY KEY,
dnameVARCHAR(50) not null COMMENT '部门名称') ENGINE=INNODB DEFAULT CHARSET utf8;
(4)为dept部门表,创建部门数据
# 添加部门数据INSERT INTO dept VALUES('1', '教学部');INSERT INTO dept VALUES('2', '销售部');INSERT INTO dept VALUES('3', '市场部');INSERT INTO dept VALUES('4', '⼈事部');INSERT INT
O dept VALUES('5', '⿎励部');
(5)此时部门表与⼈员表为
数的读音有几种3.多表联合查询
3.1 笛卡尔乘积(多个表的结果集相乘)。查询⼈员表和dept部门表,结果却查询出来了60条,重复的记录出现,这个笛卡尔乘积现象。两个表数据的结果集相乘。这是在多表联合查询时不加条件调导致的
select * from person, dept; --查询⼈员表和dept表
3.2 多表联合查询使⽤where条件限定。将person表的部门id和dept表的id记录相等的记录查询出来。注意:多表查询时,⼀定要到多个表的关联字段,并且将这个关联字段作为条件使⽤
select * from person as p, dept as d where p.dept_id = d.did; --person表和dept表进⾏多表联合查询,条件是⼈员表的部门dept_id 必须和部门表的did相同。
4.多表连接查询。
4.1左连接查询(左侧表为基准表,基准表去匹配右侧的表,不管匹配没匹配上,基准表的数据都会显⽰出来)
这种⽅式查询会将person表中的dept_id和dept表中的did字段相等的记录都查询出来,同时还会将person表中没匹配上dept表中的记录查询出来。如⼈员表中⼩溢这个记录没有dept_id部门字段值,但是有了左连接所以会将person⼈员表中dept_id字段没匹配上dept部门表中的did字段的记录也查询出来,左连接,左侧表中没匹配上的记录也会查询出来。
select * from person LEFT JOIN dept ON person.dept_id = dept.did; --left join关键字,连接关键字左连接
4.2右连接查询(右侧表为基准表,基准表去匹配左侧的表,不管匹配没匹配上,基准表的数据都会显⽰出来)
这种⽅式查询会将person表中的dept_id和dept表中的did字段相等的记录都查询出来,同时还会将dept表中没匹配上person表中的记录查询出来。如dept部门表did中开车部没有被person⼈员表中的dept_id部门id匹配上,但是有了右连接所以会将dept部门表中did字段没匹配上的记录也查询出来,没配上就会显⽰空值,右连接,右侧表中没匹配上的记录也会查询出来。
select * from person RIGHT JOIN dept ON person.dept_id = dept.did; --right join关键字,左连接关键字
4.3内连接查询(与多表联合查询的效果⼀样),两表匹配上的才会被查询出来
select * from person INNER JOIN dept ON person.dept_id = dept.did; -- inner为内连接关键字
4.4全连接查询(显⽰左右表的全部数据)使⽤union 可以将左右表的数据去重查询出来,union all 不会讲左右表的数据去重
(1)union,全连接查询关键字,并将左右两表数据去重
select * from person LEFT JOIN dept ON person.dept_id =dept.didUNION
select * from person RIGHT JOIN dept ON person.dept_id = dept.did;
(2)union all,全连接查询关键字,不会将左右两表的数据去重
--union all 关键不会将两表重复的数据去重
select * from person LEFT JOIN dept ON person.dept_id =dept.didUNION all
select * from person RIGHT JOIN dept ON person.dept_id = dept.did;
5.复杂条件多表查询
5.1要求查询出教学部年龄⼤于20岁,并且⼯资⼩于40000的员⼯,按⼯资时间倒序排序
bigdecimal转换为integer(1)使⽤⼦语句的⽅法查询
mysql语句多表查询select * from person where age > 20 and dept_id = (select did from dept where dname = '教学部') and salary < 40000 ORDER BY salary desc;
(2)使⽤多表联合查询的⽅法查询
select * from person as p, dept as d where p.dept_id = d.did and d.dname= '教学部' and p.age > 20 and p.salary < 40000 ORDER BY p.salary desc;
5.2查询每个部门中最⾼⼯资和最低⼯资是多少,显⽰部门名称
(1)使⽤多表连接查询的⽅法
SELECT MAX(salary), MIN(salary),dname from person LEFT JOIN dept ON person.dept_id = dept.did GROUP BY dept_id;
(2)使⽤多表联合查询的⽅法
select MAX(salary), MIN(salary),dname from person as p, dept as d where p.dept_id = d.did GROUP BY p.dept_id;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论