MySQL-----多表查询(二)

目录

一.子查询概述:

二:标量子查询:

 三:列子查询:

四:行子查询:

五:表子查询:

六:练习部分:


写在之前:本文承接上文MySQL-----多表查询(一)-CSDN博客

一.子查询概述:

首先引出子查询的概念:子查询指一个查询语句嵌套在另一个查询语句内部的查询,即SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。

如下面这种形式: 

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

 子查询分类:

  • A. 标量子查询(子查询结果为单个值)
  • B. 列子查询(子查询结果为一列)
  • C. 行子查询(子查询结果为一行)
  • D. 表子查询(子查询结果为多行多列)

查询位置可分为:

  • A. WHERE之后
  • B. FROM之后
  • C. SELECT之后

接着,基于上面的概述,相信你对子查询有了一定了解了,首先我们导入要查询的数据,下面在根据子查询的分类一个一个说明:(在查询之前,我们先导入数据(建立表以及表之间的关系)

-- 创建部门表
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';
 
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');
-- 创建员工表
create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';
-- 设置外键约束
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);
-- 插入数据
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',4800, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

创建好后的表中数据及其对应关系:

 

二:标量子查询:

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。 常用的操作符:= <> > >= < <=

 案例演示(A,B表示查询例子,后面跟着的是查询步骤,后续一样,不再说明):

# 标量子查询:
-- A: 查询“销售部”的所有员工信息:

-- 第一步:查询销售部门id
select id from dept where name = '销售部';

-- 第二步:根据销售部门id,查询员工信息:
select * from emp where dept_id = (select id from dept where name = '销售部');

-- B: 查询在 "方东白" 入职之后的员工信息:

-- 第一步:查询 方东白 的入职日期:
select entrydate from emp where name = '方东白';

-- 第二步:查询指定入职日期之后的员工信息:
select * from emp where entrydate > (select entrydate from emp where name = '方东白');

查询结果(根据上述例A与例B展示)对比上述员工表与部门表可知,查询无误: 

 三:列子查询:

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL:

案例演示:

# 列子查询:

-- A: 查询“销售部”和“市场部”的的所有员工信息:

-- 第一步:查询“销售部”和“市场部”的部门id
select id from dept where name = '销售部' or name = '市场部';

-- 第二步:根据部门id,查询员工信息:
select * from emp where dept_id in (select id from dept 
where name = '销售部' or name = '市场部');

-- B: 查询比 财务部 所有人工资都高的员工信息:

-- 第一步:查询所有 财务部 人员工资:
select id from dept where name = '财务部';

select salary from emp where dept_id = (select id from dept where name = '财务部');

-- 第二步:比 财务部 所有人工资都高的员工信息:
select * from emp where salary > all (select salary from emp where
 dept_id = (select id from dept where name = '财务部'));
 
 -- C:查询比研发部其中任意一人工资高的员工信息:
 
 -- 第一步:查询研发部所有人工资:
 select id from dept where name = '研发部';
 
 select salary from emp where dept_id = ( select id from dept where name = '研发部');
 
 -- 第二步:根据部门id查询比研发部任意一人工资都高的员工信息:
 select * from emp where salary > any( select salary from emp where 
 dept_id = ( select id from dept where name = '研发部'));

查询结果(根据上述例A与例B例C展示):

四:行子查询:

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。 常用的操作符:= 、<> 、IN 、NOT IN

案例演示:

 # 行子查询:
 
 -- A. 查询与 "张无忌" 的薪资及直属领导相同的员工信息:
 
 -- 第一步:查询 "张无忌" 的薪资及直属领导:
 select salary , managerid from emp where name = '张无忌';
 
 -- 第二步:查询与 "张无忌" 的薪资及直属领导相同的员工信息:
 select * from emp where (salary,managerid) = (select salary , managerid
	from emp where name = '张无忌');

查询结果:

五:表子查询:

子查询返回的结果是多行多列,这种子查询称为表子查询。 常用的操作符:IN

案例演示:


 #  表子查询:
 
 -- A:查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

-- 第一步:查询 "鹿杖客" , "宋远桥" 的职位和薪资:
select job , salary from emp where name = '鹿杖客' or name = '宋远桥';

-- 第二步:查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息:
select * from emp where (job,salary) in (select job , salary from emp 
where name = '鹿杖客' or name = '宋远桥');

-- B:查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息:

-- 第一步: 入职日期是 "2006-01-01" 之后的员工信息:
select * from emp where entrydate > '2006-01-01';

-- 第二步: 查询这部分员工信息及其对应的部门信息:
select e.*,d.* from (select * from emp where entrydate > '2006-01-01')
e left join dept d on e.dept_id = d.id;

查询结果:

通过上面的学习,我们对多表查询有了一定认识,接下来练习一下加深印象:

六:练习部分:

此部分就不给出运行结果了,有需要可以自己尝试运行:

# 综合练习:

-- 1). 查询员工的姓名、年龄、职位、部门信息 (隐式内连接):
select e.name , e.age , e.job , d.name from emp e , dept d where e.dept_id = d.id;

-- 2). 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接):
select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id =
d.id where e.age < 30;

-- 3). 查询拥有员工的部门ID、部门名称:
select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;

-- 4). 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出
来(外连接):
select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age >
40 ;

-- 	5).查询 "研发部" 员工的平均工资:
select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研发部';

-- 6). 查询低于本部门平均工资的员工信息:
select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where
e1.dept_id = e2.dept_id );


-- 7). 查询所有的部门信息, 并统计部门的员工人数:
select d.id, d.name , ( select count(*) from emp e where e.dept_id = d.id ) '人数'
from dept d;

 结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

  • 93
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 84
    评论
### 回答1: 当你需要从MySQL数据库中查询单个格的数据时,你可以使用SELECT语句。SELECT语句的基本语法如下: ``` SELECT 列名1, 列名2, ... FROM 名 WHERE 条件; ``` 其中,列名是指要查询格的列,可以是一个或多个,用逗号隔开。名是指要查询格的名称。WHERE子句是可选的,用于指定查询条件,可以根据需要添加。 例如,如果要查询名为"users"的格中年龄大于等于18岁的用户的姓名和年龄,可以使用以下语句: ``` SELECT name, age FROM users WHERE age >= 18; ``` 这将返回一个包含所有符合条件的用户姓名和年龄的结果集。 ### 回答2: MySQL数据库是一种功能强大的关系型数据库管理系统,被广泛应用于各种Web应用,尤其是对于大型数据集的处理。在MySQL中,单查询是一种非常基本的操作,也是我们在日常开发中最常见的操作之一。 单查询主要包括以下几种方式:选择数据、排序数据、分组数据、聚合数据、过滤数据等。 选择数据是指根据需求从单中选择需要的数据,可以使用SELECT语句进行查询。SELECT语句的基本语法为SELECT column_name1,column_name2,...FROM table_name WHERE condition;,其中column_name示需要查询的列名,table_name示需要查询名,condition查询条件。例如:SELECT name,age FROM student WHERE age>=18; 排序数据是指根据某个列的值进行排序,可以使用ORDER BY语句进行排序。ORDER BY语句的基本语法为ORDER BY column_name1,column_name2,...[ASC|DESC];,其中ASC示升序排列,DESC示降序排列。例如:SELECT name,age FROM student WHERE age>=18 ORDER BY age DESC; 分组数据是指将相同属性值的行放在一起,可以使用GROUP BY语句进行分组。GROUP BY语句的基本语法为GROUP BY column_name1,column_name2,...;,其中column_name示需要分组的列名。例如:SELECT COUNT(*) AS num,age FROM student WHERE age>=18 GROUP BY age; 聚合数据是指在数据集合上进行特定的计算,可以使用聚合函数进行计算。常见的聚合函数包括COUNT、SUM、AVG、MAX、MIN等。例如:SELECT COUNT(*) AS num FROM student WHERE age>=18; 过滤数据是指根据某个条件从单中筛选出需要的数据,可以使用WHERE语句进行过滤。WHERE语句的基本语法为WHERE condition;,其中condition示筛选条件。例如:SELECT name,age FROM student WHERE age>=18 AND gender='男'; 除了以上基础查询方式,MySQL还提供了更多高级查询方式和函数,包括多查询、子查询、连接查询、索引等,可以根据具体需求进行使用。 总的来说,单查询是MySQL中最基础、最常见的查询操作之一。掌握了单查询的基本语法和常用函数,可以让我们更高效地从单查询、处理数据,提高我们的开发效率。 ### 回答3: MySQL是一种关系型数据库管理系统,它可以执行各种数据库操作,包括单查询。在单查询中,我们可以通过使用MySQL中的SELECT语句查询单个格中的数据。在MySQL中,我们可以使用SELECT语句来实现以下操作: 1. 查询所有记录:我们可以使用SELECT * FROM table_name;语句来查询一个中的所有记录。这将返回一个包含所有记录的结果集。 2. 查询指定列:如果我们只需要查询一部分列,可以使用SELECT column1, column2 FROM table_name;语句来查询指定列。这个语句将只返回包含指定列的结果集。 3. 条件查询:我们可以使用WHERE子句来限制SQL语句只查询符合条件的记录。例如,SELECT column1, column2 FROM table_name WHERE condition;。 4. 排序:我们可以使用ORDER BY子句对查询结果进行排序。例如,SELECT column1, column2 FROM table_name ORDER BY column1 ASC;将按升序排列列1的值。 5. 分组:我们可以使用GROUP BY子句将结果集按照指定列进行分组。例如,SELECT column1, COUNT(column2) FROM table_name GROUP BY column1;将结果集按照列1进行分组,并计算每组中列2的计数。 6. 连接查询:如果我们需要在多个格之间进行查询,可以使用JOIN子句将多个格进行关联。例如,SELECT column1, column2 FROM table_name1 JOIN table_name2 ON table_name1.column1 = table_name2.column1;将使用列1将格1和格2进行关联,并将所有匹配的记录返回给结果集。 7. 子查询:我们可以在另一个查询的WHERE子句中使用子查询来执行条件查询。例如,SELECT column1, column2 FROM table_name1 WHERE column1 IN (SELECT column1 FROM table_name2 WHERE condition);将在一个格中搜索具有满足条件的列1的所有记录。 综上所述,MySQL数据库提供了多种灵活的单查询功能,可以帮助我们快速高效地查询数据库中的数据。我们可以根据自己的需求选择并组合这些功能实现各种复杂的查询任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 84
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值