加入收藏 | 设为首页 | 会员中心 | 我要投稿 武陵站长网 (https://www.50888.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL数据库教程(三)

发布时间:2022-12-03 14:34:12 所属栏目:MySql教程 来源:未知
导读: 连接查询
多个表联合起来取数据,这种跨表查询,被称为连接查询。
连接查询的分类根据年代分类
SQL92:1992年的语法
SQL99:1999年的语法
根据表连接的方式分类
内连接:
等值连接
非等值连

连接查询

多个表联合起来取数据,这种跨表查询,被称为连接查询。

连接查询的分类根据年代分类

SQL92:1992年的语法

SQL99:1999年的语法

根据表连接的方式分类

内连接:

等值连接

非等值连接

自连接

外连接:

左外连接(左连接)

右外连接(右连接)

笛卡尔积现象

在没有任何条件限制的情况下,多个表直接连接会出现笛卡尔积现象。

为了避免笛卡尔积现象,只需要在where后面加 表名.字段

1

select 字段1,字段2 from1,表2 where1.共同字段=2.共同字段;

注意:这种语法是SQL92语法。

内连接等值连接

1

select 字段1,字段2 from1 inner(可以省略) join2 on1.共同字段=2.共同字段;

注意:这是SQL99语法,并且以下也是

非等值连接

1

select 字段1,字段2 from1 inner(可以省略) join2 on1.共同字段!=2.共同字段;

自连接

1

select 字段1,字段2 from1 inner(可以省略) join1 on1.字段=1.字段;

技巧:一张表看成两张表

外连接右连接

1

select 字段1,字段2 from1 inner(可以省略) right join2 on1.共同字段=2.共同字段;

right表示将join关键字右边的表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。

左连接

1

select 字段1,字段2 from1 left join2 on1.共同字段=2.共同字段;

left表示将join关键字左边的表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询右边的表。

注意:join前面有个outer,outer可以省略,加上可读性强。

外连接查询条数一定大于等于内连接的查询条数。

多张表连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

select
字段
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
join
d
on
a和d的连接条件

注意:一条SQL语句中内连接和外连接可以混合,都可以出现。

子查询

子查询概述:select语句中嵌套select语句,被嵌套的select语句称为子查询。

子查询出现的位置:

1
2
3
4
5
6

select
(select)...
from
(select)...
where
(select)...

where中的子查询

案例:找出比最低工资高的员工姓名和工资

第一步:查询最低工资是多少

1

select min(sal) from emp;

第二步:找出大于800的

1

select ename,sal from emp where sql>800;

第三步:合并

1

select ename,sal from emp where sal > (select min(sal) from emp);

from后面的子查询

注意:from后面的子查询,可以将子查询的查询结果当做一张临时表。(技巧)

案例:找出每个岗位的平均工资的薪资等级。

第一步:找出每个岗位的平均工资(按照岗位分组求平均值)

1

select job,avg(sal) from emp group by job;(当成t表)

第二步:把以上的查询结果当做成一张真实存在的表 t 。

1

select * from salrgrade;(当成s表)

第三步:t表和s表进行表连接,条件:

1

t.avg(sal) between s.losal and s.hisal;

1
2
3
4
5
6
7
8

select
t.*,s.grade
from
(select job,avg(sal) as avgsal from emp group by job) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;

select中的子查询

案例:找出每个员工的部门名称,要求显示员工名和部门名。

1
2
3
4

select
e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from
emp e;

注意:对于select后面的子查询来说,子查询只能返回一条语句结果,多于一条,就报错

union(合并)

union:合并查询结果集

union的效率高一些

案例:查询工作岗位是MANAGER和SALESMAN的员工。

1
2
3

select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN'

注意事项:union在进行结果集合并的时候,要求列数相同。(最好数据类型也一致,在MySQL中可以不一致,但是在oracle不可以)

limit(非常重要)

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

limit的用法:

完整用法:limit startindx,length;

缺省用法:limit 5;(这是取前5)

startindx是起始下标(从0开始)

length是长度

比如:3到5

则limit 2,3;(2表示起始位置从下标2开始mysql数据库,就是第三条记录,3表示长度)

注意:MySQL中limit在order by之后执行。

通用分页

案例:每页显示三条记录。

第一页:limit 0,3 [0,1,2]

第二页:limit 3,3 [3,4,5]

第三页:limit 6,3 [6,7,8]

第四页:limit 9,3 [9,10,11]

每页显示pageSize条记录

第pageNo页:

1

limit (pageNo - 1) * pageSize , pageSize;

执行顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14

select
...
from
...
where
...
group by
...
having
...
order by
...
limit
...

执行顺序:from>>where>>group by>>having>>select>>order by>>limit

(编辑:武陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!