MySQL—多表查询—练习(1)

一、引言

上几篇关于多表查询的基本几个部分全部学习完了。

多表查询的基本类型的查询包括以下:

1、内连接(隐式内连接、显示内连接):... [INNER] JOIN ... ON 条件;

2、外连接(左外连接、右外连接):...LEFT/RIGHT[OUTER] JOIN ... ON 条件;

3、自连接:表 A 别名 Ajoin表 A 别名 B ON 条件 ...;

4、联合查询:UNION(去重) / UNION ALL

5、子查询(标量子查询、列子查询、行子查询、表子查询)


下面将通过12个案例来关于多表查询操作的巩固。这篇博客只有5个案例,剩下的后面博客写。

二、案例

下面这些案例涵盖了内连接、外连接、自连接、子查询以及它们的整合使用。

打开 DataGrip 工具完成以下这些需求。

(0)数据准备(员工表 emp 、部门表 dept 、薪资等级表 salgrade)

员工表:emp

部门表:dept

薪资等级表:salgrade

(下面是创建表结构、插入数据)

sql 复制代码
CREATE TABLE salgrade(
    grade INT COMMENT '薪资等级',
    losal INT COMMENT '该等级最低薪资',
    hisal INT COMMENT '该等级最高薪资'
)COMMENT '薪资等级表';

INSERT INTO salgrade VALUES (1,0,3000);
INSERT INTO salgrade VALUES (2,3001,5000);
INSERT INTO salgrade VALUES (3,5001,8000);
INSERT INTO salgrade VALUES (4,8001,10000);
INSERT INTO salgrade VALUES (5,10001,15000);
INSERT INTO salgrade VALUES (6,15001,20000);
INSERT INTO salgrade VALUES (7,20001,25000);
INSERT INTO salgrade VALUES (8,25001,30000);

涉及到的全部表的预览

(1)查询员工的姓名、年龄、职位、部门名称(隐式内连接)

用到隐式内连接,多张表用逗号隔开。要注意笛卡尔积的问题(消除无效查询)

sql 复制代码
SELECT e.name,e.age,e.job,d.name FROM emp AS e,dept AS d WHERE (e.dept_id = d.id);
(2)查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)
sql 复制代码
SELECT e.name,e.age,e.job,d.name FROM emp AS e INNER JOIN dept AS d ON e.dept_id = d.id WHERE e.age < 30;
(3)查询拥有员工的部门ID、部门名称

(注意:这里在部门表中 "人事部" 是没有员工的)

1、先查询拥有部门id的员工中的部门信息,再去重复数据。
sql 复制代码
SELECT dept.id,dept.name FROM emp,dept WHERE emp.dept_id=dept.id;
2、去除重复数据,就要用到一个关键字:distinct(DISTINCT)
sql 复制代码
SELECT DISTINCT dept.id,dept.name FROM emp,dept WHERE emp.dept_id=dept.id;
(4)查询所有年龄大于40岁的员工,及其归属的部门名称。如果员工没有分配部门,也需要展示出来

这里注意:一看就要用到外连接(避免有些字段的 NULL 影响查询的结果)

sql 复制代码
SELECT e.*,d.name FROM emp e LEFT OUTER JOIN  dept d ON e.dept_id = d.id WHERE age >40;

也可以用昨天学的子查询(表子查询)

sql 复制代码
SELECT e.*,d.name FROM (SELECT * FROM emp WHERE age>40) AS e LEFT JOIN dept AS d ON e.dept_id= d.id;
(5)查询所有员工的工资等级

涉及到两张表:员工表 emp,薪资等级表 salgrade

连接条件:salary 与 薪资的范围 losal 、hisal

(emp.salary >= salgrade.losal AND emp.salary <= salgrade.hisal )

sql 复制代码
SELECT e.*,s.grade,s.losal as '最低工资' , s.hisal as '最高工资' FROM emp e ,salgrade s WHERE e.salary >= s.losal AND e.salary <= s.hisal;

对于这题还有一种SQL语句的写法。

(用 BETWEEN ... AND....)

sql 复制代码
SELECT e.*,s.grade,s.losal as '最低工资' , s.hisal as '最高工资' FROM emp e ,salgrade s WHERE e.salary BETWEEN s.losal AND s.hisal;
后面的案例下一篇博客学习。
相关推荐
小志的博客2 分钟前
mysql——count(*)、count(1)和count(字段)谁更快?有什么区别?
mysql
独泪了无痕1 小时前
一文搞懂MyBatis中的TypeHandler
数据库·后端·mybatis
三体世界3 小时前
Mysql基本使用语句(一)
linux·开发语言·数据库·c++·sql·mysql·主键
Giser探索家4 小时前
低空智航平台技术架构深度解析:如何用AI +空域网格破解黑飞与安全管控难题
大数据·服务器·前端·数据库·人工智能·安全·架构
chillxiaohan4 小时前
GO学习记录五——数据库表的增删改查
数据库·学习·golang
快乐就是哈哈哈5 小时前
从零部署 MySQL 数据库:Linux 安装与防火墙策略全解析
linux·mysql
一颗星的征途6 小时前
java循环分页查询数据,任何把查询到的数据,分批处理,多线程提交到数据库清洗数据
java·数据库·mysql·spring cloud
NightReader8 小时前
如何解决WordPress数据库表损坏导致的错误
数据库
Warren988 小时前
MySQL,Redis重点面试题
java·数据库·spring boot·redis·mysql·spring·蓝桥杯
青鱼入云9 小时前
mysql查询中的filesort是指什么
数据库·mysql