当前位置: 首页 > news >正文

MySQL基础(三)DQL(Data Query Language,数据查询语言)

目录

五、DQL操作(重要)

5.1 数据库表的基本结构

5.2 基本查询

5.2.1 查询部分列

5.2.2 查询所有列

5.2.3 对列中的数据进行运算

5.2.4 列的别名

5.2.5 查询结果去重

5.3 排序查询

5.4 条件查询

5.4.1 等值判断(=)

5.4.2 不等值判断(<、>、<=、>=、!=、<>)

5.4.3 逻辑判断(and,or,not)

5.4.4 区间查询(between 数值 and 数值)

5.4.5 NULL 值判断(is null、is not null)

5.4.6 字段多值判断(in)

5.4.7 模糊查询(like)

5.4.8 分支结构查询(case when then else end)

5.4.9 逻辑判断(if、ifnull)

5.5 时间函数查询

5.6 字符串函数查询

5.7 聚合函数查询

5.8 分组查询

5.9 分组过滤查询

5.10 限定查询

5.11 子查询

5.11.1 子查询作为查询字段某个值

5.11.2 子查询作为 字段多值判断的值

5.11.3 子查询作为 一张表操作。

5.11.4 子查询的ALL、ANY(了解)

5.12 合并查询(了解)

5.13 表连接查询

5.14 常见错误


五、DQL操作(重要)

5.1 数据库表的基本结构

关系结构数据库的是以表格(Table)进行数据的存储,表格由 组成。

这里提供了一套test库的表和测试数据,后面操作都基于这几张表来玩。

构建好test库,将课程资料中提供的test.sql文件,直接拖拽到表的位置

image.png

导入之后,关闭,需要在表的位置按F5,刷新一波。

image.png

5.2 基本查询

语法:SELECT 列名 FROM 表名

关键字描述
SELECT指定要查询的列
FROM指定要查询的表

5.2.1 查询部分列

-- 查询员工表中的员工id,名称,邮件。
-- MySQL中可以忽略列名的大小写,表名也可以忽略。
SELECT  employee_id,first_name,last_name,email
FROM t_employees;

image.png

5.2.2 查询所有列

在公司中开发的过程中,哪怕你有200个列,需要查询200个,你也必须写200个列。 在自己玩的时候,为了提升学习的速度,可以通过 * 来代表所有的列。

*这个关键字,可以放在SELECT的后面,代表所有的列。

-- 查询全部的列
SELECT * 
FROM t_employees;

5.2.3 对列中的数据进行运算

查询员工表中,员工的名称,以及所有员工的年薪是多少(12个月的薪资)

-- 查询员工表中,员工的名称,以及所有员工的年薪是多少(12个月的薪资)
SELECT first_name,last_name,salary * 12
FROMt_employees;
算术运算符描述
+两列做加法运算
-两列做减法运算
*两列做乘法运算
/两列做除法运算

Ps:%符号,不是取模,在MySQL中,%属于一个通配符。

5.2.4 列的别名

查询员工表中,员工的名称,以及所有员工的年薪是多少(12个月的薪资),同时给返回的虚拟表的列设置中文名称

可以在查询的列后面,追加上as关键字,然后指定返回的列的别名

也可以简写,不写as,直接在查询的列后面追加列的别名

SELECT first_name as "名",  last_name as "姓", salary * 12 年薪
FROMt_employees;

5.2.5 查询结果去重

通过员工表,查询部门ID。

-- 通过员工表,查询部门ID
SELECTdepartment_id
FROM t_employees

image.png

通过员工表,查询部门ID,不查看重复数据,去重。

DISTINCT放在所有列名的最前面,会帮你把数据重复的行,去掉。

-- 通过员工表,查询部门ID,不查看重复数据,去重.
SELECTDISTINCT department_id
FROM t_employees

5.3 排序查询

在执行SELECT查询后,查询到的结果一般是跟表中的结果顺序一致的。

如果需要基于一些列做排序,可以使用MySQL提供的order by 操作

语法: SELECT 列名 FROM 表名 ORDER BY 排序列 [排序规则] , 排序列 [排序规则] …………

排序规则描述
ASC(默认规则)对前面排序列做升序排序
DESC对前面排序列做降序排序

查询员工的编号,姓,薪资。 按照薪资的高低做降序排序

# 查询员工的编号,姓,薪资。 按照薪资的高低做降序排序
SELECT employee_id,last_name, salary
FROM t_employees
ORDER BY salary DESC

查询员工的姓,工资,入职时间。 优先按照工资做降序,再根据入职时间做升序

-- 查询员工的姓,工资,入职时间。 优先按照工资做降序,再根据入职时间做升序
-- 运行选中的SQL的快捷键 ,Ctrl + Shift + R
SELECTlast_name 姓, salary 工资, hire_date 入职时间
FROMt_employees
ORDER BYsalary DESC,hire_date

5.4 条件查询

语法:select 列明 from 表名 where 条件

关键字描述
where在查询结果中,筛选符合条件的查询结果,条件为布尔表达式

5.4.1 等值判断(=)

注意:与Java不中,Java中是==,而在MySQL中是=

查询薪资是11000的员工信息。(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary
from t_employees
where salary = 11000;

5.4.2 不等值判断(<、>、<=、>=、!=、<>)

其中,前四个没啥说的,常规的大于,小于之类的判断。

其中 != 和 <> 都代表不等于的意思。

查询薪资是大于11000员工信息。(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary
from t_employees
WHEREsalary > 11000;

5.4.3 逻辑判断(and,or,not)

类似Java中的 && ,|| ,!

其中 and 左右的条件都需要满足才可以。

其中 or 左右的条件,满足其一就可以查询到。

其中 not 会将条件取反

查询薪资是11000大洋,并且提成是0.3的员工信息(查询员工的编号,名称,薪资,提成)

select employee_id,first_name ,salary ,commission_pct
from t_employees
where salary = 11000 and commission_pct = 0.3;

5.4.4 区间查询(between 数值 and 数值)

这个between and其实就相当于 用大于等于和小于等于的组合。

包含边界的。

需要指定好字段值的边界。并且需要左侧的数值小,右侧的数值大。不然无法查询到结果。

查询员工的薪资在5000~10000之间的员工信息。(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary
from t_employees
where salary between 5000 and 10000;

5.4.5 NULL 值判断(is null、is not null)

当对某个列判断是否是NULL值时,不能使用 = 或者 != 之类的方式。

必须采用 字段 is null 、 字段 is not null 的方式

查询没有提成的员工信息(查询员工的编号,名称,薪资,提成)

select employee_id,first_name ,salary,commission_pct
from t_employees
wherecommission_pct is not null;

5.4.6 字段多值判断(in)

正常如果涉及到了某一个字段,可以为多个值的匹配条件时。

正常可能需要 字段 = xxx or 字段 = yyy or 字段 = zzz。 写着成本太高。

可以采用in来实现。

字段 in (xxx,yyy,zzz)

查询员工属于60,70,80,90号部门的员工信息。(查询员工的编号,名称,薪资,部门编号)

select employee_id,first_name ,salary,department_id
from t_employees
where department_id in (60,70,80,90);

5.4.7 模糊查询(like)

模糊查询一般是来匹配字符串的。

其中有两个关键字。 % _

字段 like 's%' :查询出这个字段中以s开头的数据。

字段 like 's_' :查询出s开头,并且后面只有一个字符

%:代表任意长度的任意字符

_:代表单个任意字符

Ps:这两个特殊字符只能配合like使用

查询名字以L开头的员工信息(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary
from t_employees
where first_name like 'L%'

查询名字以L开头,但是名字长度为4个字符的员工信息(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary
from t_employees
where first_name like 'L___'

5.4.8 分支结构查询(case when then else end)

语法:这里的分支结构查询一般是放在select后面的特殊操作。

case when 条件1 then 结果1when 条件2 then 结果2when 条件3 then 结果3………………else 结果
end

可以认为是case开头,end结尾,中间写when then的内容

就是类似Java中的switch

查询员工信息,并根据薪资范围,体现出员工的薪资等级

salary 0 ~ 4000 = E

salary 4000 ~ 6000 = D

salary 6000 ~ 8000 = C

salary 8000 ~ 10000 = B

salary 10000 ~ …… = A

select employee_id,first_name ,salary ,  case when salary >= 0 and salary < 4000 then 'E'when salary >= 4000 and salary < 6000 then 'D'when salary >= 6000 and salary < 8000 then 'C'when salary >= 8000 and salary < 10000 then 'B'else 'A'end as salary_level
from t_employees;

5.4.9 逻辑判断(if、ifnull)

这里的if,和ifnull类似于Java中调用方法实现某个功能。

if(条件表达式,结果1,结果2):条件表达式为true,返回结果1,否则返回结果2

ifnull(值,结果):如果值为NULL,返回结果,如果值不为NULL,返回值本身。

查询员工信息,如果薪资大于10000,返回小康生活,否则,返回勉强生存(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary,if(salary > 10000,'小康生活','勉强生存')
fromt_employees;

查询员工号信息,如果有提成,返回提升的比例,如果没有,返回吃底薪。(查询员工的编号,名称,薪资)

select employee_id,first_name ,salary,ifnull(commission_pct,'吃底薪')
fromt_employees;

5.5 时间函数查询

这里是针对MySQL中的时间类型提供的一些函数以及操作。

下面会玩一些关于时间函数的操作。

时间函数描述
sysdate()返回当前系统时间,返回年-月-日 时:分:秒
now()返回当前系统时间,返回年-月-日 时:分:秒
curdate()返回当前系统的年月日
curtime()返回当前系统的时分秒
week(date)返回指定日期是今年的第几周
year(date)返回指定日期的年
month(date)返回指定日期的月
day(date)返回指定日期的日
hour、minute、second(date)返回指定日期的时、分、秒

5.6 字符串函数查询

针对字符串的一些函数。

函数描述
concat(str1,str2,str...)将多个字符串拼接到一起……
upper、lower(str)upper是将字符串切换为大写、lower将字符串切换为小写
substring(str,num,len)将字符串从num位置开启截取len个内容,num从1开始
insert(str,pos,len,newstr)将str中指定的pos位置开始len长度的内容替换为newStr
replace(str,from_str,to_str)将str中所有的from_str,替换为to_str
date_format(date,format)将时间类型date,根据format的格式转换为varchar
str_to_date(str,format)将字符串类varchar,根据format的格式转换为date

format:%Y-%m-%d %H:%i:%s 表示 yyyy-MM-dd HH:mm:ss

5.7 聚合函数查询

针对多行数据做的一个统计。

一般有五种需要咱们掌握

语法: select 聚合函数(列名) from 表名;

函数名描述
sum(列名)统计当前列所有数据的总和
max(列名)获取到当前列中的最大值
min(列名)获取到当前列中的最小值
avg(列名)获取到当前列中所有数据的平均值
count(列名)获取当前数据的总条数

基于上述的聚合函数,针对薪资做一个统计,分别统计薪资总和,薪资最大值,薪资最小值,薪资的平均值,当前员工的个数。

一般都是针对数值类型的字段做具体的统计,几乎不会对字符串做什么统计操作,count除外。

select sum(salary) 薪资总和, max(salary) 薪资最大值, min(salary) 薪资最小值,avg(salary) 薪资平均值, count(*) 员工的个数
fromt_employees;

5.8 分组查询

语法:select 列名 from 表名 where 条件 group by 列名

查询各部门的人数(查询部门编号,部门对应的人数)

select department_id 部门编号, count(*) 部门人数
from t_employees
group by department_id;

查询各个部门的平均工资(查询部门编号,部门的平均工资)

selectdepartment_id 部门编号, avg(salary) 平均工资
from t_employees
group by department_id;
​

查询各个部门、各个岗位的人数(部门编号,岗位信息,人数)

1、根据department_id分组。

2、根据job_id分组

3、做count统计查询

select department_id 部门编号, job_id 岗位信息, count(*) 人数
fromt_employees
group by department_id,job_id;
​
# 查询各个部门、各个岗位,薪资大于5000的人数(部门编号,岗位信息,人数)
select department_id 部门编号, job_id 岗位信息, count(*) 人数
fromt_employees
wheresalary > 5000 
group by department_id,job_id;

5.9 分组过滤查询

如果需要在做过分组之后,再次对接过做二次筛选,需要使用having的方式编写条件

语法: select 列名 from 表名 where 条件 group by 列名 having 条件 order by 列名

查询各个部门、各个岗位的人数(部门编号,岗位信息,人数),只查看人数大于10个的

select department_id 部门编号, job_id 岗位信息, count(*) 人数
fromt_employees
group by department_id,job_id
having 人数 > 10;

查询各个部门中,平均薪资大于10000的部门信息(部门编号,平均薪资)

select department_id 部门编号,avg(salary) avg_salary
fromt_employees
group by department_id
having avg_salary > 10000;
​
# 查询各个部门中,所有员工平均薪资大于10000的部门信息(部门编号,平均薪资),在根据平均薪资做排序
select department_id 部门编号,avg(salary) avg_salary
fromt_employees
group by department_id
having avg_salary > 10000
order by avg_salary asc;

5.10 限定查询

比如查询时,查询到了上千条的数据,但是暂时只需要前5条,可以基于limit只获取前5条数据返回。

采用limit帮助咱们实现。 limit是MySQL特有的一个关键字。

语法:select 列名 from 表名 where 条件 group by 列名 having 条件 order by 列名 limit 起始行,行数

起始行(offset):你返回的数据,从第几行开始, 从第0行开始。

行数(size):一共返回几行数据

limit 0,5:从第一行数据开始,往下一共返回5条。

limit的第一个offset可以省略不写,不写代表写的是0。

image.png

查询表中薪资最高的前5名员工的所有信息。

  • 薪资最高的话,需要基于salary做降序排序。

  • 基于limit,只返回前5条数据。

select * 
from t_employees
order by salary desc 
limit 0,5

查询表中薪资最高的6~10名员工的所有信息。

select * 
from t_employees
order by salary desc 
limit 5,5

limit很多时候可以同于分页操作,比如需要分页时

image.png

可以采用limit,在数据库中查询到不同页数的数据,给页面返回,让页面展示数据即可。

5.11 子查询

查询语句返回的结果,可以再次看成一张表去操作。

select 列名 from 表名 where 条件(子查询操作替代一些值)

select 列名 from (子查询的结果集) where 条件

5.11.1 子查询作为查询字段某个值

查询薪资和Bruce工资一致的员工信息。

通过查询可以得到Bruce的工资信息

再基于另一个查询,将前面的Bruce的薪资结果作为条件判断的一环,从而实现利用子查询得到结果

1、查询Bruce的工资信息,返回 单列单行

select salary from t_employees where first_name = 'Bruce';

2、基于Bruce的工资信息查询与其薪资一致的员工信息

select * 
from t_employees 
where salary = (select salary from t_employees where first_name = 'Bruce');

5.11.2 子查询作为 字段多值判断的值

因为字段多值判断是采用in的方式去做条件筛选。 一个字段需要多个值。

在利用子查询时,应当返回 单列多行 数据。

查询last_name为King同一部门的员工信息

1、查询last_name为King的部门信息。

select department_id from t_employees where last_name = 'King';

2、基于上述查询返回的结果,查看同部门的员工信息

select * 
from t_employees
where department_id in (select department_id from t_employees where last_name = 'King');

5.11.3 子查询作为 一张表操作。

可以直接基于子查询返回的结果集做二次筛选。

查询员工表中,工资排名前5名的员工。

这个查询可以直接使用order by 排序,然后基于limit做筛选。

就为了使用,搞两个SQL实现,利用子查询来玩。

1、查询员工的信息,基于salary做降序排序。

select * from t_employees order by salary desc;

2、将上述的结果基于limit筛选出前5条。

select * 
from (select * from t_employees order by salary desc) as temp
limit 5

5.11.4 子查询的ALL、ANY(了解)

之前在给字段做=判断时,子查询必须返回单列单行的数据,不然报错。

其实在做=判断时,即便返回了单列多行数据,也可以采用ALL、ANY关键字解决问题。

查询工资高于60部门员工的,所有人的信息。

select salary from t_employees where department_id = 60;

1、查询比60部门所有员工薪资都高的员工信息。

select * 
from t_employees
where salary > ALL (select salary from t_employees where department_id = 60);

2、查询比60部门任意一名员工薪资高的员工信息。

select * 
from t_employees
where salary > ANY (select salary from t_employees where department_id = 60);

5.12 合并查询(了解)

将两个select操作的结果整合为一个结果集返回。一般是为了规避掉一些查询方式导致的效率较低,可以采用合并查询来提升效率。

语法:select 列名 from 表名1 union select 列名 from 表名2; (会去重)

语法:select 列名 from 表名1 union all select 列名 from 表名2; (不会去重)

在使用union 或者 union all时,需要保证两个select的列的个数是一致的。

哪怕两次Select的列不是一个东西,但是个数一致,那就基于第一个select的列,作为返回的基准,将结果合并到一起。

5.13 表连接查询

表连接可以将多张表关联到一起,返回需要的内容

语法:select 列名 from 表1 连接方式 表2 on 连接条件 连接方式 表3 on 连接条件 …………

内连接语法: select 列名 from 表1 inner join 表2 on 连接条件

外连接:

  • 左外连接:select 列名 from 表1 left [outer] join 表2 on 连接条件

  • 右外连接:select 列名 from 表1 right [outer] join 表2 on 连接条件

内连接查询操作。

内连接查询,针对哪些 连接条件 无法满足的数据,会直接筛选掉。

查询当前员工名称以及对应的部门名称。

# 显示内连接
select 
e.first_name , e.last_name , d.department_name
from 
t_employees as e 
inner join t_departments as d on e.department_id = d.department_id;
​
# 隐示内连接
select 
e.first_name , e.last_name , d.department_name
from 
t_employees e, t_departments d
where 
e.department_id = d.department_id;

查询员工的名称,部门的名称,部门所在国家的信息(三张表联查)

# 查询员工的名称,部门的名称,部门所在国家的信息(三张表联查)
# 显示内连接
select 
e.first_name , e.last_name ,d.department_name,l.city 
from 
t_employees e 
inner join t_departments d on e.department_id = d.department_id 
inner join t_locations l on l.location_id = d.location_id;
​
# 隐示内连接
select 
e.first_name , e.last_name ,d.department_name,l.city 
from 
t_employees e , t_departments d ,t_locations l
where 
e.department_id = d.department_id 
and d.location_id = l.location_id;

外连接查询

还是基于前面玩的查询,查询当前员工名称以及对应的部门名称。

因为之前用的内连接的方式,导致一个员工

image.png

发现,最后的部门Id是一个NULL,导致后续查询时,并没有这个员工的信息返回。

现在可以采用外链接的方式,来解决这个问题。

外链接前面说过左外的语法,和右外的语法。

其实就是将左边的表,或者是右边的表作为基准表,基准表回返回全部的数据,无论连接条件是否满足。

# 查询当前 所有 员工名称以及对应的部门名称。
select 
e.first_name , e.last_name ,d.department_name
from 
t_employees e left outer join t_departments don e.department_id = d.department_id;

注意,左外和右外是指定哪张表是基准表,基准表的数据会全部返回,匹配不到内容的位置,会用NULL填充上。

5.14 常见错误

image.png


image.png


image.png


image.png


image.png


image.png


image.png


image.png


image.png

相关文章:

  • vue+elementui 网站首页顶部菜单上下布局
  • 七、数据库的完整性
  • keysight是德科技N9923A网络分析仪
  • 【NLP中向量化方式】序号化,亚编码,词袋法等
  • vb监测Excel两个单元格变化,达到阈值响铃
  • Excel 发现此工作表中有一处或多处公式引用错误。请检查公式中的单元格引用、区域名称、已定义名称以及到其他工作簿的链接是否均正确无误。弹窗
  • ArcGIS安装时输入localhost不被识别
  • Vue在线预览excel、word、ppt等格式数据。
  • 96. 2017年蓝桥杯省赛 - Excel地址(困难)- 进制转换
  • Halcon提取车牌字符
  • 浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的
  • Web 架构之缓存策略实战:从本地缓存到分布式缓存
  • PHP语言核心技术全景解析
  • ADI的BF609双核DSP怎么做开发,我来说一说(五)LAN口测试
  • 湖北理元理律师事务所:构建科学债务优化体系的四重维度
  • React从基础入门到高级实战:React 实战项目 - 项目四:企业级仪表盘
  • Android设备推送traceroute命令进行网络诊断
  • 三十三、面向对象底层逻辑-SpringMVC九大组件之HandlerExceptionResolver接口设计
  • 【深度学习新浪潮】RoPE对大模型的外推性有什么影响?
  • [蓝桥杯]兰顿蚂蚁
  • 怎么增加网站访问量/东莞企业网站排名优化
  • 怎么做分销平台/优化防控举措
  • 怎么把网站做成软件/推广竞价托管公司
  • 网站建设价格标准/营销网站建设多少钱
  • 外贸自助建站/外贸网站建站平台
  • 安溪网站开发/公司如何在百度宣传