-- 子查询,在查询语句中可以包含其他查询语句。包含其他查询的查询叫做父查询,被包含的查询叫做子查询
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;