java 数据库 查询 select 2

news/2024/4/25 18:08:35

Day2

组函数

  • 以组为操作单位,一组数据得到一个结果。

  • 在没有手动分组的前提下,整张表默认为一组数据

  1. max(列名):获取最大值

  2. min(列名):获取最小值

  3. sum(列名):获取总和

  4. avg(列名):获取平均值

  5. count(列名):统计值的个数

  • 所有组函数都会自动忽略null值

-- 查看员工的最高薪资
select max(salary) from employees
-- 查看员工的最低薪资、平均薪资、月薪资总和
select min(salary),avg(salary),sum(salary) from employees
-- 统计总共有多少名员工
select count(*) from employees
select count(employee_id) from employees
-- 统计员工表中部门的个数
-- 先对整张表的部门id进行去重,再count统计结果
select count(distinct department_id) from employees

分组

  • 在某些情况下,我们需要根据需要对表中数据进行手动分组

  • 规则:值相同的为同一组数据

select 列名 from 表名 group by 列名 

执行顺序:from-->group by-->select

先确定从哪张表进行操作-->对表中数据进行分组-->基于分组结果进行查询操作

-- 查询各个部门的平均薪资
select department_id,avg(salary) from employees group by department_id

where+group by

  • 先where,再group by

    先筛选出符合要求的数据,再对符合要求的数据进行分组时,分组的工作量会被减少,效率更高

where 条件 group by 列名
-- 查询部门id为10,20,30的部门的平均薪资
select department_id,avg(salary) 
from employees
where department_id in(10,20,30)
group by department_id
  • 执行顺序:from-->where-->group by-->select

having子句

  • 和where类似,也是用来做数据筛选,在分组之后执行

group by 列名 having 条件
-- 查询部门平均薪资>=7000的部门id
select department_id,avg(salary)
from employees
group by department_id   -- 先分组
having avg(salary)>=7000  -- 后筛选
和where子句的区别
  1. where在分组前执行,having在分组后执行

  2. where子句存在分组时不能使用组函数,但是having可以

  3. 当既可以使用where,又能使用having时,优先使用where,效率更高

limit关键字

  • 作用:限制查询结果显示的条目数,通常用于分页

select 列名.. from 表名
limit 显示的起始下标,显示的条数
  • 使用:

    1. 该关键字是基于查询的最终结果进行限制显示,所以其与其他查询关键字使用时,必须最后执行,所以一定写在最后

    2. 下标为0时,可以省略不写

-- 查询工资最高的前十名员工信息
select employee_id,salary
from employees
order by salary desc -- 先根据工资进行降序排序
limit 0,10  -- 显示前十行
​
-- 查看前十条员工信息
select * from employees limit 10
​
-- 查询部门平均薪资最高的前3个部门id
-- 分析:-- 部门平均薪资:根据部门id分组 group by -- 最高:根据平均薪资进行降序排序  order by avg(salary)-- 前三个:limit从最终查询结果中提取出前三条
select department_id,avg(salary)
from employees
group by department_id  -- 根据部门id分组
order by avg(salary) desc  -- 根据平均薪资进行降序排序
limit 3 -- 从最终查询结果中提取出前三条

查询关键字的顺序

  • select 、 from 、where 、 order by 、 group by 、 having 、 limit

语法顺序:
select 、 from 、where、 group by、having 、order by 、limit

子查询

  • 当一个SQL的执行需要借助另一个SQL的执行结果时,则需要进行SQL嵌套,该语法结构称之为子查询

select 列名... from 表名 where 列名 =|in (子SQL语句)
  • 执行顺序:优先执行小括号内的子SQL,根据子SQL的执行结果再执行外层SQL

  • 只要逻辑完整,对SQL的嵌套层数不做要求

    • 执行:从内向外执行

where单值子查询

  • 子SQL(被嵌套的SQL)返回的时一行一列的单个结果

-- 查询员工id为101号员工的领导信息
-- 先查询员工id为101号员工的直接领导的id
select manager_id from employees where employee_id=101
-- 拼装
select * from employees
where employee_id=(select manager_id from employees where employee_id=101
)
​
-- 查询员工id为100的员工所在的部门信息
-- 查询员工id为100的员工所在的部门id
select department_id from employees where employee_id=100
-- 拼装
select * from departments
where department_id =(select department_id from employees where employee_id=100)

where多值子查询

  • 子SQL返回的是多个结果

-- 查询工资>10000的员工所在的部门信息
select * from departments 
where department_id in(select department_id from employees where salary>10000) 

from子查询(了解)

  • 将子SQL的查询结果临时看作一张表进行后续操作

  • 为了符合语法要求,需要给子查询的结果起别名充当临时表的表名

-- 查询工资最高的前十名员工的总薪资
​
-- 分析:1. 把工资最高的前十名员工的薪资查出来-- 2. 对这十个工资进行求和
-- 查询SQL的基本语法:select 列名 from 表名
select sum(salary) 
from (select salary from employees order by salary desc limit 10) as e
​
-- 子SQL:把工资最高的前十名员工的薪资查出来
select salary from employees order by salary desc limit 10

表连接

关系字段:两表中有关联关系的字段

  • 什么是表连接?

    • 当我们的查询结果需要从多张表中获取时,此时应该让表之间建立连接,同时获取数据

内连接

  • 特点:同时对连接双方做约束,双方只有符合连接条件的数据才会进行显示

select 表名.列名, 表名.列名,...
from 表名1 inner join 表名2
on 连接条件  -- 两表间的关系字段
-- 查询员工的id、工资与部门名称-- 第一步:确定数据来自于哪些表-- 第二步:确定两表之间的关系字段-- 书写表连接完成查询操作
​
select  e.employee_id 员工id,e.salary 员工工资,d.department_name  -- 基于连接结果进行查询操作
from employees e inner join departments d -- 起别名,方便后续书写
on e.department_id=d.department_id -- 关系字段:员工表的部门id=部门表的部门id

from-->join on:确定数据来源

select:查询操作

左外连接

  • 特点:左表中的数据无论如何都会显示,右表中的数据只有符合连接条件才会显示

select 表名.列名, 表名.列名,...
from 左表 left outer join 右表
on 连接条件  -- 两表间的关系字段
-- 使用左外连接显示员工信息及其部门信息
select e.*,d.*
from employees e left outer join departments d -- 员工信息无论如何都会显示,部门信息符合连接条件才会显示
on e.department_id=d.department_id

右外连接

  • 特点:右表中的数据无论如何都会显示,左表中的数据只有符合连接条件才会显示

select 表名.列名, 表名.列名,...
from 左表 right outer join 右表
on 连接条件  -- 两表间的关系字段
-- 使用右外连接显示部门信息及对应员工信息
select  e.*,d.*
from employees e right outer join departments d
on e.department_id=d.department_id

连接关键字中的inner、outer可以省略

全外连接(了解)

  • 特点:对双方都不做约束

  • 作用:将两个查询结果进行合并

查询结果1 union 查询结果2
  • 使用:

    1. 合并双方字段数目、内容必须一致

    2. union关键字可以去重

    3. union all 不会对结果去重

-- 查询员工表所有信息
select employee_id,first_name,salary from employees
union all -- 合并,不去重
-- 查询员工表所有信息
select employee_id,first_name,salary from employees

自连接

  • 特点:是特殊的表连接,参与连接的是同一张表

  • 使用:

    • 表中的两个字段为关系字段,作为连接条件

      -- 按照指定要求查询员工信息:员工id,员工姓名,直接领导的id,直接领导的姓名
      select e1.employee_id 员工id,e1.first_name 员工姓名,e1.manager_id 领导id,e2.first_name 领导姓名
      from employees e1 left join employees e2 -- e1:员工信息  e2:领导信息
      on e1.manager_id=e2.employee_id  -- 连接条件:员工的领导id=领导的员工id
    • 连接双方判断同一字段,作为连接条件

      -- 查询工资相同的员工id及其工资
      select e1.employee_id,e1.salary,e2.employee_id,e2.salary
      from employees e1 left join employees e2 -- 连接参与比较的两个员工
      on e1.salary=e2.salary -- 两个员工的工资相同
      where e1.employee_id>e2.employee_id
  1. 如果查询字段来自于多张表,内连接或左外连接

  2. 如果查询字段来自于一张表并且来自同一行数据,则简单查询|子查询

  3. 如果查询字段来自于一张表但是不来自于同一行数据。则自连接

多表连接

  • 特点:同时从多张表中获取数据

select 表名.列名, 表名.列名,...
from 表1 left join 表2
on 连接条件  -- 表1和表2的关系字段
left join 表3
on 连接条件  -- 表1和表3的关系字段|表2和表3的关系字段
-- 查询员工id,员工姓名,所属部门id,部门名称,部门所在城市
select e.employee_id,e.first_name,d.department_id,d.department_name,l.city
from employees e left join departments d  -- 先让员工表和部门表建立连接
on e.department_id=d.department_id  -- 员工的部门id=部门的id
left join locations l  -- 再让地址表参与连接
on d.location_id=l.location_id  -- 部门表的地址id=地址表的id

实际开发中,不建议表连接超过3张表,否则会有性能问题


https://www.xjx100.cn/news/3092559.html

相关文章

短视频配音软件有哪些?这些常用的短视频配音软件

短视频行业近年来发展得很快,几乎闯入了我们每个现代人的生活,它以其独有的特点和乐趣,也收获了大批短视频爱好者,配音是短视频创作过程中不可或缺的环节,今天,我们就来聊聊短视频配音及好用的配音软件。 短…

【经验之谈·高频PCB电路设计常见的66个问题】

文章目录 1、如何选择PCB 板材?2、如何避免高频干扰?3、在高速设计中,如何解决信号的完整性问题?4、差分布线方式是如何实现的?5、对于只有一个输出端的时钟信号线,如何实现差分布线?6、接收端差…

MAC下MNMP应用程序mysql配置文件my.cnf放在哪里?

最近在测试远古的一段代码,有一段数据库报错代码 [Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column otp.A.id which is not functionally dependent on columns in GROUP BY clause; this is incompatible…

C 标准库 - <time.h>和<float.h>详解

目录 简介 库变量 库宏 库函数 简介 库变量 库宏 库函数 <time.h> 简介 C 标准库中的 <time.h> 头文件提供了处理时间和日期的函数和类型定义。它包含了一些结构体和函数&#xff0c;可以用于获取系统当前的日期、时间&#xff0c;以及进行日期和时间的计算…

Yii2 ActiveRecord连接OpenGauss提示表不存在table not exist

1.修改数据库连接信息 文件位置 config/db.php 添加默认Schema return [class > yii\db\Connection,dsn > pgsql:host127.0.0.1;port5432;dbnamepostgres,username > postgres,password > Pass123,charset > utf8,//enableSchemaCache > true,//表结构是否…

Vue:从本地加载json文件

作者&#xff1a;CSDN _乐多_ 本文记录了使用vue框架从本地加载json文件的代码。 文章目录 import axios from axios;try {const response await axios.get(./Apps/output.json);// this.jsonData response.data.section_list;// console.log(response, response)// consol…

红队攻防之Goby反杀

若结局非我所愿&#xff0c;那就在尘埃落定前奋力一搏。 本文首发于先知社区&#xff0c;原创作者即是本人 一、弹xss 为了方便&#xff0c;本次直接使用 PhpStudy 进行建站&#xff0c;开启的web服务要为MySQLNginx&#xff0c;这里的 PhpStudy 地址为 http://x.x.x.x&…

软件系统运维方案

1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 点击获取所有软件开发资料&#xff1a;点我获取