4.union合并查询

案例:查询工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’;
select ename,job from emp where job in(‘MANAGER’,‘SALESMAN’);

1
2
3
4
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';

union 可以减少匹配的次数

注意事项:

错误的:union在进行结果集合并的时候,要求两个结果集的列数相同。

5、limit(非常重要)

limit作用:

将查询结果集的一部分取出来。通常使用在分页查询当中。

例子:百度默认:一页显示10条记录。分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差。可以一页一页翻页看。

完整用法:

limit startIndex, length,startIndex是起始下标,length是长度。起始下标从0开始。

注意⚠️:

mysql当中limit在order by之后执行!

1
2
3
4
limit
2, 3;
2表示起始位置从下标2开始,就是第三条记录。
3表示长度。

每页显示3条记录
第1页:limit 0,3 [0 1 2]
第2页:limit 3,3 [3 4 5]
第3页:limit 6,3 [6 7 8]
第4页:limit 9,3 [9 10 11]

第pageNo页:limit (pageNo - 1) * pageSize , pageSize

1
2
3
4
5
6
7
8
9
10


public static void main(String[] args){
// 用户提交过来一个页码,以及每页显示的记录条数
int pageNo = 5; //第5页
int pageSize = 10; //每页显示10条

int startIndex = (pageNo - 1) * pageSize;
String sql = "select ...limit " + startIndex + ", " + pageSize;
}

6、关于DQL语句的大总结:

​ select
​ …
​ from
​ …
​ where
​ …
​ group by
​ …
​ having
​ …
​ order by
​ …
​ limit
​ …

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
select e.deptno, avg(e.sal) as ag
from emp e
join dept t
on e.deptno = t.deptno
group by deptno
order by ag desc
limit 1;

select d.dname, s.grade, t.*
from
(select e.deptno as dd, avg(e.sal) as ag
from emp e
group by dd) t
join dept d
on t.dd = d.deptno
join salgrade s
on t.ag between s.losal and s.hisal;


9.
select ename ,sal
from emp
order by sal desc
limit 5,5;
11.
select ename, hiredate from emp order by hiredate desc limit 5;

12.
select e.ename, e.sal, s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;

select s.grade ,count(*)
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
group by s.grade;

13、面试题:
3 个表 S(学生表),C(课程表),SC(学生选课表)
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1,找出没选过“黎明”老师的所有学生姓名。
select sname
from s
where sno not in (
select sno
from sc
where cno in(
select cno
from c
where cteacher = '黎明'
)
);
2,列出 2 门以上(含2 门)不及格学生姓名及平均成绩。
select sname, avg(scgrade)
from s
join sc on s.sno = sc.sno
where scgrade < 60 ;
group by s.sno
having count(*) >= 2;
3,即学过 1 号课程又学过 2 号课所有学生的姓名。

select sname
from s
join sc s1 on s.sno = s1.sno
join sc s2 on s.son = s2.sno
where s1.cno = '1' and s2.cno ='2';

14.
select a.ename , b.ename
from emp a
left join emp b
on a.mgr = b. empno;
15.
select e.empno, e.ename '员工名字', e.hiredate, b.ename '领导名字', b.hiredate, d.dname
from emp e
join emp b on e.mgr = b.empno and e.hiredate < b.hiredate
join dept d on d.deptno = e.deptno;

16、 列出部门名称和这些部门的员工信息, 同时列出那些没有员工的部门:这种一般都是用左连接,有连接

1
2
3
4
5
6
7
8
执行顺序?
1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit..