MySQL之查询语句的基本操作 (4)

创建表与插入数据准备

#建表 create table dep2( id int, name varchar(20) ); create table emp2( id int primary key auto_increment, name varchar(20), sex enum(\'male\',\'female\') not null default \'male\', age int, dep_id int ); #插入数据 insert into dep2 values (200,\'技术\'), (201,\'人力资源\'), (202,\'销售\'), (203,\'运营\'); insert into emp2(name,sex,age,dep_id) values (\'tank\',\'male\',17,200), (\'egon\',\'female\',48,201), (\'kevin\',\'male\',38,201), (\'jason\',\'female\',28,202), (\'owen\',\'male\',18,200), (\'sean\',\'female\',18,204); mysql> select * from dep2; +------+--------------+ | id | name | +------+--------------+ | 200 | 技术 | | 201 | 人力资源 | | 202 | 销售 | | 203 | 运营 | +------+--------------+ 4 rows in set (0.00 sec) mysql> select * from emp2; +----+-------+--------+------+--------+ | id | name | sex | age | dep_id | +----+-------+--------+------+--------+ | 1 | tank | male | 17 | 200 | | 2 | egon | female | 48 | 201 | | 3 | kevin | male | 38 | 201 | | 4 | jason | female | 28 | 202 | | 5 | owen | male | 18 | 200 | | 6 | sean | female | 18 | 204 | +----+-------+--------+------+--------+ # 指到了如何根据表关系对字段进行拆分,目的是为了更好的管理,表数据都存放在硬盘中,存不是目的,目的是为了取,所以我们将数据从硬盘读到内存中,接下来我们因应该将他们拼成一张表来查询更加合理; # 注意: 将拆分的表,再拼接到一起进行查询, 可以通过一张表查另一张表的数据; 1.关联查询 # 左表的一条记录与右表的一条记录都对应一遍称之为 --> "笛卡尔积" PS: 百度科普 # 将所有的数据都对应了一遍,虽然不合理但是其中有合理的数据,现在我们需要做的就是找出合理的数据 举例:通过之前准备的数据进行多表操作 1、查询 员工 以及所在 部门 的信息; # 通过where 约束条件 select * from emp2, dep2 where emp2.dep_id = dep2.id; 2、查询 部门 为 技术部 的 员工 及 部门信息 select * from emp2, dep2 where emp2.dep_id = dep2.id and dep2.name = \'技术\'; 联表查询: -内链接:只去两张表有对应关系的记录 select * from emp2 inner join dep2 on emp2.dep_id = dep2.id; mysql> select * from emp2 inner join dep2 on emp2.dep_id = dep2.id; +----+-------+--------+------+--------+------+--------------+ | id | name | sex | age | dep_id | id | name | +----+-------+--------+------+--------+------+--------------+ | 1 | tank | male | 17 | 200 | 200 | 技术 | | 2 | egon | female | 48 | 201 | 201 | 人力资源 | | 3 | kevin | male | 38 | 201 | 201 | 人力资源 | | 4 | jason | female | 28 | 202 | 202 | 销售 | | 5 | owen | male | 18 | 200 | 200 | 技术 | +----+-------+--------+------+--------+------+--------------+ 5 rows in set (0.05 sec) 2、left join # 2、左连接: 在内连接的基础上保留左表没有对应关系的记录(以null补全) select * from emp2 left join dep2 on emp2.dep_id = dep2.id; mysql> select * from emp2 left join dep2 on emp2.dep_id = dep2.id; +----+-------+--------+------+--------+------+--------------+ | id | name | sex | age | dep_id | id | name | +----+-------+--------+------+--------+------+--------------+ | 1 | tank | male | 17 | 200 | 200 | 技术 | | 5 | owen | male | 18 | 200 | 200 | 技术 | | 2 | egon | female | 48 | 201 | 201 | 人力资源 | | 3 | kevin | male | 38 | 201 | 201 | 人力资源 | | 4 | jason | female | 28 | 202 | 202 | 销售 | | 6 | sean | female | 18 | 204 | NULL | NULL | +----+-------+--------+------+--------+------+--------------+ # 3、右连接: 在内连接的基础上保留右表没有对应关系的记录 select * from emp2 right join dep2 on emp2.dep_id = dep2.id; mysql> select * from emp2 right join dep2 on emp2.dep_id = dep2.id; +------+-------+--------+------+--------+------+--------------+ | id | name | sex | age | dep_id | id | name | +------+-------+--------+------+--------+------+--------------+ | 1 | tank | male | 17 | 200 | 200 | 技术 | | 2 | egon | female | 48 | 201 | 201 | 人力资源 | | 3 | kevin | male | 38 | 201 | 201 | 人力资源 | | 4 | jason | female | 28 | 202 | 202 | 销售 | | 5 | owen | male | 18 | 200 | 200 | 技术 | | NULL | NULL | NULL | NULL | NULL | 203 | 运营 | +------+-------+--------+------+--------+------+--------------+ 6 rows in set (0.00 sec) - 全连接: union # 4、全连接: 在内连接的基础上 保留左、右表没有对应关系的记录 select * from emp2 left join dep2 on emp2.dep_id = dep2.id union select * from emp2 right join dep2 on emp2.dep_id = dep2.id; 2.子查询 # 子查询就是将一个查询语句的结果用括号括起来,当做另一个查询语句的条件去用 # 查询部门是技术或者人力资源的员工信息 \'\'\' 先获取技术部和人力资源的id号,再去员工表里根据前面的id筛选出符合要求的员工信息; \'\'\' select * from emp2 where dep_id in (select id from dep2 where name=\'技术\' or name=\'人力资源\'); # 2.每个部门最新入职的员工 思路:先查每个部门最新入职的员工,再按部门对应上联表查询 # 查第一张emp表 # 第四步 select t1.id, t1.name, t1.hire_date, t2.* from # 第二步 # 拼接了 t1(emp) 与 t2(各部门最新入职的员工数据虚拟表)表的数据 emp as t1 inner join # 第一步 # 子查询获取emp表中的 部门名称与最新入职的时间字段值 生成一张虚拟表 (select post, max(hire_date) as max_date from emp group by post) as t2 on # 若 t1.post 的值与 t2.post 条件成立,则拼接对应的记录; t1.post = t2.post # 第三步 where t1.hire_date = t2.max_date;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfwgj.html