Java全栈学习笔记33

-- 子查询,在查询语句中可以包含其他查询语句。包含其他查询的查询叫做父查询,被包含的查询叫做子查询

use empdb;

-- 查询工作地点是芝加哥的员工信息

-- 程序每次访问数据库都需要占用资源

select deptno from dept where loc = "CHICAGO"

select * from emp where deptno = 30;

-- 把SMITH的工资修改为ALLEN的工资

-- 查询结果做虚拟表

update emp set sal = (select * from (

select sal from emp where ename = "ALLEN") a) where ename = "SMITH"

-- 查询结果保存在数据库表

create table empinfo

as

select * from emp;

create table t_saltotal

as

select sum(sal),MONTH(now()) - 1 as month from emp

insert into t_saltotal(sal,month)

select sum(sal),MONTH(now()) - 2 as month from emp

select * from t_saltotal

use studb;

-- 查询和杨菲菲系别相同的学生信息

select * from student where class = (select class from student where studname = '杨菲菲')

-- 从成绩管理系统的学生表中查询入学成绩高于张宏的学生的姓名和入学成绩

select studname,ingrade

from student

where ingrade > (

select ingrade from student where studname = "张宏"

) order by ingrade desc

-- 查询和杨菲菲性别不同的学生信息

select * from student where studsex != (

select studsex from student where studname = "杨菲菲"

)

-- 总结:使用比较运算符时,子查询只能返回一个单值(单行单列)

-- 查询杨菲菲考了91分的课程的名称

select coursename from course

where courseid = (

select courseid from grade where grade = 91 and studid =

(

select studid from student where studname = "杨菲菲"

)

)

-- 查询成绩在90分以上的学生姓名,不分科目

select studname from student

where studid not in (select studid from grade where grade > 90)

-- 从成绩管理系统中查询"VB"考了90分以上的学生的姓名

select studname from student

where studid in

(

select studid from grade where grade > 90 and courseid = (

select courseid from course where coursename = "VB"

)

)

-- 查询其他系中比信息系所有学生的入学成绩低的学生姓名,入学成绩和系别

select studname,ingrade,class from student where ingrade < (

select min(ingrade) from student where class = "信息系")

select studname,ingrade,class from student where ingrade <all(

select ingrade from student where class = "信息系"

)

-- 查询其他系中比信息系某一学生的入学成绩低的学生姓名

select studname,ingrade,class from student where ingrade < (

select max(ingrade) from student where class = "信息系"

) and class != "信息系"

select studname,ingrade,class from student where ingrade <any(

select ingrade from student where class = "信息系"

) and class != "信息系"

use studb;

select * from student where exists(select * from student where class = '信息')

-- 在成绩管理系统中查询所有选修了"01"号课程的学生姓名。

select studname from student where exists(

select * from grade where courseid = "01" and studid = grade.studid

);

-- 连接查询,当前的数据显示需要多张表中的内容

use empdb;

-- 查询员工姓名,员工工资,岗位,入职日期,部门名称

select ename,sal,job,hiredate from emp,dept;

select ename,sal,job,hiredate from emp cross join dept;

-- 上述语句中没有条件。计算两张表中的笛卡尔积。

-- 连接查询是把不同的表中的内容,通过条件匹配,组合成一行数据

-- 为了数据的合理性,添加连接条件

select ename,sal,job,hiredate,emp.deptno,dname from emp,dept where emp.deptno = dept.deptno

and sal > 2000

use studb

-- 查询学生姓名,学生系别,以及选了01号课程的成绩

select studname,class,grade

from student,grade

where student.studid = grade.studid and courseid = "01"

-- 等值连接,内联接(inner join ... on 连接条件)

-- select studname,class,grade

-- from (

-- select * from student

-- ) student inner join (select * from grade where courseid = "04") grade

-- where student.studid = grade.studid

-- 表别名

select stu.studid,studname,class,grade

from student stu,grade g

where stu.studid = g.studid and g.courseid = "04"

select max(ingrade) maxIngrade from student group by class

select studname,class,grade

from student s join grade g

on s.studid = g.studid

where g.courseid = "04"

-- 查询所有学生的姓名,系别,考试成绩

select s.studid,studname,class,grade

from student s join grade g

on s.studid = g.studid

-- 外联 左外连接 右外连接 left/right outer join

select s.studid,studname,class,ifnull(grade,0)

from grade g left join student s

on s.studid = g.studid

-- 自己连接自己

-- 使用自联接在学生表中查询和"杨菲菲"性别相同的学生信息

select a.* from

student a,student b

where a.studsex = b.studsex and b.studname = "杨菲菲"

-- 查询学生信息,及学生选课的课程成名称,及分数

select s.*,c.courseid,coursename,grade

from student s join grade g

on s.studid = g.studid

join course c

on c.courseid = g.courseid

select s.*,c.courseid,coursename,grade

from student s,grade g,course c

where s.studid = g.studid and c.courseid = g.courseid

select s.*,c.courseid,coursename,grade

from student s left join grade g

on s.studid = g.studid

left join course c

on c.courseid = g.courseid;

-- 查询各个系别中的最高入学成绩

select max(ingrade),class from student group by class;

-- 查询各个系别中入学成绩由高到低排序的前两名 row number over()

select * from (

select studname,ingrade,class,row_number() over(PARTITION by class order by ingrade desc) rb from student) rb where rb < 3;

-- 查询学号,课程号,成绩,课程名称

select studid,courseid,grade,

(

select coursename from course where courseid = grade.courseid

) as coursename

from grade

use empdb;

-- 查询各个部门当中的最大工资以及这个工资的员工姓名

select emp.sal,ename

from emp,(select max(sal) sal,deptno from emp group by deptno) maxsal

where emp.sal = maxsal.sal and emp.deptno = maxsal.deptno;

select * from (

select ename,sal,

row_number() over(partition by deptno order by sal desc,ename asc) rb

from emp) rb where rb.rb = 1;

相关推荐
非优秀程序员4 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
Godspeed Zhao4 小时前
从零开始学AI25——无监督学习之层次聚类
学习·机器学习·聚类
知已难寻5 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊7 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang8 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪8 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息9 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼9 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff10 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff11 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc