JAVA小白数据库子查询作业问题总结

前言:本次学习笔记会和这次的作业一起发布,因为本次学习的内容中,比较重要的是分页查询和DML语法,子查询因为操作比较麻烦在真实开发环境中不太会用到,还有一个联合查询也是本次学习的新内容;

子查询:通俗来说,子查询就是使用两个selcet查询语句,使他们嵌套在一起,这样就可以完成比较复杂的语句查询,子查询一般在真实开发中比较少用,因为比较复杂,做个了解;

1:在WHERE 或者HAVING 后面进行子查询;

例如要查询一个最低工资的员工个人信息,就可以在where后面直接使用一个()里面进行第二个查询语句;

SELECT * FROM emplyees WHERE salary = (
    SELECT max(salary) FROM emplyees)

或者在having后面使用子查询时,也是同样的,但是得在分组后使用子查询

SELECT department_id,min(salary) FROM emplyees GROUP BY department_id
HAVING min(salary) > ( SELECT min(salary) FROM emplyees WHERE department_id = 6);

(还有其他两种方式分别是在select后面和在from后面进行子查询,一般比较少用做个了解)

2:相关子查询,返回的结果只有0和1;当要查询的语句是正确的时候就返回1,当要查询的语句是错误的就返回0;

3:分页查询,实现将数据分页,就是不用将全部数据都显示出来;

select [查询列表]
from 表
[连接类型join 表2 on 连接条件]
[where 筛选条件]
[group by 筛选条件]
[having 分组后筛选]
[order by 排序]
limit offset,size

这边比较需要注意的是分页查询需要记住一个公式:这边还需要注意的是分页查询类似于数组都是从0开始,需要往前偏移一个单位;

limit offest(索引的意思),size(长度)pageSize(数量)pageNum(页码)

limit=offest = (pageNum()-1) * pageSize,pageSize

4:联合查询,可以将两张表要查询的信息联合在一起,但是有个前提是必须字段数量相同,如果不同就会报错;

-- student表和teacher表没有外键关联,使用联合查询将两个结果集合并
SELECT name FROM student
UNION 
SELECT tname FROM teacher;

这边需要注意的是联合查询在查询时当有两个字段是完全相同时它会自带一个去重效果,一定要注意的是必须两个字段完全相同才有去重效果;

-- UNION会有去重效果,使用UNION ALL可以保留重复的部分
SELECT name FROM student
UNION ALL
SELECT tname FROM teacher;

5:DML语法

一:添加数据(共有三种方法,其中比较常用的是第一种和第三种);

1:insert into 表名(列名1,列名2,…) values (值1,值2,…);

这种插入方式的好处在于可以实现批量插入,当你想要插入多条信息时只需要在括号后面加上一个“,”然后就可以继续添加数据;

insert into emplyees (emplyee_name, sex) values ("张三", "男");

2:insert into 表名 set 列名1 = 值1,列名2 = 值2,…

这种方式的弊端在于不能实现批量插入;

insert into emplyees set emplyee_name = "张三", sex = "男";

3:insert into 表名 values (值一,值二,值三,...)

这种方式可以实现批量插入,但是有个缺点是必须将表里的全部数据都插入进去,没有的数据就要用null代替;

二:修改数据

1:修改单表数据:UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,… [WHERE 筛选条件] 

这里需要注意的是必须要添加筛选条件,不添加就会将整张表格的数据全部改掉;

2:修改多表数据;

update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列 = 值
where 筛选条件

三:删除数据

1:DELETE FROM 表名 WHERE 筛选条件

这里也需要添加筛选条件,要不然默认会删除整张表;

2:删除多表

DELETE 表1的别名,表2的别名
FROM 表1 别名
inner|left|right join 表2 别名
ON 连接条件
WHERE 筛选条件

子查询作业问题总结

查询与员工id为12的员工同一个部门,并且工资大于员工id为13的工资的员工信息。

这边需要解决这个问题,就要先弄清楚条件,使用子查询并且有多个条件时,可以使用AND连接两个条件;

SELECT * FROM emplyees
WHERE department_id =(SELECT department_id
 FROM emplyees
WHERE emplyee_id=12)
AND salary > (SELECT salary FROM emplyees
WHERE emplyee_id=13 )

查询出比5号部门任何员工薪资高的员工信息。

这边要求我们比5号部门任何员工工资都要高,那就可以直接先获取5号部门工资最高是多少,这样在使用一个查询,只要比这个最高工资还要高,那就完成题目要求了;

SELECT * FROM emplyees
WHERE salary > (SELECT MAX(salary) FROM emplyees WHERE department_id=5)

有哪些部门的平均工资高于5号部门的平均工资

这边就需要使用一个分组查询搭配子查询才能完成效果;先查询获取5号部门的平均工资是多少,然后在使用工资比较,最后获取哪些部门平均工资会高于5号部门;

SELECT department_id,AVG(salary) avg_s FROM emplyees
GROUP BY department_id
HAVING avg_s > (SELECT AVG(salary) FROM emplyees
WHERE department_id = 5)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值