本文介绍MySQL经常用到的数据查询语言。数据查询语言(DQL):用于查询数据库表中的记录,是业务分析人员最常用的语言类型,贯穿信息获取、数据获取、数据理解、数据清洗等多个环节,其主体结构为select <字段名> from <表或视图名> where <查询条件>。
数据查询语言
一、单表查询
1、基础查询语句
(1)打印常量值
-- 单独使用select,打印一行1 |
(2)公式使用
-- 单独使用select,打印一行2 |
(3)表达式使用
-- 1+1=3不成立,返回0 |
(4)打印字段
-- 查询empty表中员工及其工资 |
(5)去重
-- 单字段去重,查询emp表中的部门 |
(6)设置别名
-- 查询每位员工调整后的薪资(基本工资+1000) |
2、条件查询
(1)单一条件查询
-- emp表中的领导岗位员工 |
(2)多条件查询
-- 查询10号部门和20号部门中sal低于2000的员工信息 |
(3)连续范围查询
-- 查询基本工资大于或等于2000且小于或等于3000的员工信息 |
(4)空值查询
-- 找出emp 表中的最高领导人(没有更高的上级员工) |
(5)模糊查询
-- 查询姓名不以a开头的员工信息 |
3、查询结果排序
-- 查询部门10的员工信息并按sal降序显示 |
4、限制数量
-- 查询基本工资最高的前5位员工 |
5、聚合函数
-- 查询 emp 表中员工的最高工资、最低工资、平均工资及工资总和 |
6、分组查询
组内聚合:
-- 查询公司内部不同奖金档位的获得人数 |
分组后筛选:
-- 查询各部门 clerk 的平均工资 - 用 having 子句筛选 |
二、多表查询
1、纵向合并查询
纵向合并并不需要指明连接条件,而是单纯地把多个结果集进行纵向追加,因此被合并的多个结果集的字段数量、顺序必须完全一致,而其数据类型必须可以兼容。
-- union 去重 |
2、横向连接查询
(1)内连接
内连接会按照连接条件,返回两个表中满足条件的记录,本质上是对两个表中记录取交集。
查询manager的姓名、所属部门名称和入职日期:
select ename,dname,job,hiredate from emp |
(2)左外连接
左外连接会按照连接条件,返回两个表中满足条件的记录,包括左表中的所有记录,右表匹配不到则显示null。左外连接左表作为主表。
查询每位员工的ename,dname,sal:
select ename,dname,sal from emp |
(3)右外连接
右外连接会按照连接条件,返回两个表中满足条件的记录,包括右表中的所有记录,左表匹配不到则显示null。右外连接右表作为主表。
查询各地区的员工数量:
select loc,count(empno) 员工数 from emp |
(4)全外连接
全外连接会返回两个表中全部的记录,本质上是对两个表中的记录取并集。匹配不到null填充。
select * from t1 left join t2 on t1.公共字段1=t2.公共字段2 |
(5)自连接查询
-- 查询所有员工的姓名及指数领导的姓名 |
(6)多表连接
-- 查询入职日期早于指数领导的员工的姓名及所属部门 |
(7)交叉连接
M*N条记录。
select * from t1,t2; |
三、子查询
在日常业务中,分析人员要想获得最终分析所需的数据,需要对企业数据库中的数据进行多次处理,因此经常会遇到 单次查询无法找出某些需要的数据或者查询逻辑异常复杂的情况 。此时我们可以将单次完整查询所返回的虚拟结果集视为一个临时表,并对这个临时表进行再次的查询和处理,这就是子查询的作用。子查询又称为嵌套查询,指在一个查询语句中包含另一个或多个完整的查询语句。
1、子查询的语法规则
(1)子查询必须用圆括号括起来。
(2)子查询最多可以嵌套到255层(个别查询可能会不支持255层的嵌套)。
(3)执行顺序由内到外,先执行内部的子查询,再执行外部的主查询。
(4)若子查询返回的结果集在主查询中作为一个表,则必须添加表别名;若需要引用表子查询中的计算字段,则必须添加列别名才可以引用。
2、子查询分类
按照子查询返回的结果不同,子查询可分为 标量子查询 (返回的结果是一个单行单列的数据)、 行子查询 (返回的结果是一条有多个字段的记录)、 列子查询 (返回的结果是包含多条记录的单个字段)及 表子查询 (返回的结果是一个拥有多个字段和多条记录的临时表)。
子查询根据需求的不同,可以搭配不同子句使用,如果需要将子查询返回的结果作为主查询的计算字段,那么可以将子查询放在select子句中;如果需要将子查询返回的结果作为主查询的筛选条件,那么可以将子查询放在where或having子句中;如果需要将子查询返回的结果作为主查询的一个表,那么可以将子查询放在 from 或 join 子句中。
3、select子查询
查询各部门员工人数占比:
-- 第1步,查询整体员工数量 |
4、from/join子查询
查询各部门最高工资的员工:
-- 第1步,查询各部门最高工资 |
5、where或having子查询
(1)比较操作字符
查询基本工资高于公司平均工资的员工信息:
-- 第1步,查询公司所有员工的平均工资 |
查询和smith同部门、同职位的员工:
-- 第1步,查询smith的部门和职位 |
(2)in关键字
-- 查询各部门最高工资的员工 |
查询普通员工的工资等级:
-- 第1步,查询那些人不是普通员工,即领导的工号 |
(3)exists关键字
select* from emp where exists (select * from dept where deptno=20) and deptno =20; |
需要强调的是,exists后接的子查询并不对数据进行筛选,只决定外查询执不执行。
(4)any/some关键字
查询基本工资高于30号部门员工的员工信息:
-- 第1步,查询30号部门所有员工的基本工资 |
(5)all关键字
查询基本工资高于30号部门所有员工的员工信息:
-- 第1步,查询30号部门所有员工的基本工资 |