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;

相关推荐
2501_926227943 小时前
.Net程序员就业现状以及学习路线图(五)
学习·.net
朗迹 - 张伟3 小时前
Golang安装笔记
开发语言·笔记·golang
BillKu5 小时前
推荐 Eclipse Temurin 的 OpenJDK
java·ide·eclipse
Morri35 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode
悟能不能悟5 小时前
eclipse怎么把项目设为web
java·eclipse
乂爻yiyao5 小时前
java 代理模式实现
java·开发语言·代理模式
2301_770373735 小时前
Java集合
java·开发语言
哈喽姥爷5 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
siy23336 小时前
[c语言日记] 数组的一种死法和两种用法
c语言·开发语言·笔记·学习·链表