mysql的dql_MySQL-DQL篇

DQL定义

对表的记录的查询

一.基本查询

1.字段(列)控制

1) 查询所有列

SELECT *FROM 表名;//查询该表的所有数据 *号就是该表中所有字段的意思

0818b9ca8b590ca3270a3433284dd417.png

2) 查询指定列

SELECT 指定列1... FROM 表名;//可以和查询所有列互相理解

0818b9ca8b590ca3270a3433284dd417.png

3) 完全重复的记录只一次

当查询结果中的多行记录一模一样时 可以用关键字DISTINCT避免

比如我们查询表emp中的不重复的deptno

0818b9ca8b590ca3270a3433284dd417.png

SELECT DISTINCT 字段1... FROM 表名;

4)列运算

数量类型的列可以做加,减,乘,除

0818b9ca8b590ca3270a3433284dd417.png

这里处理其他数字加上NULL结果会等于NULL 下面会处理的

同样的字符串类型可以做连续运算

0818b9ca8b590ca3270a3433284dd417.png

处理NULL值

如果在做数量类型的列中存在着NULL要先进行处理 一般把NULL转换为0

0818b9ca8b590ca3270a3433284dd417.png

给列起别名

SELECT 字段1 AS 列名 FROM 表名;//其中AS可以省略

0818b9ca8b590ca3270a3433284dd417.png

2.条件控制

1.条件查询

与前面介绍的UPDATE和DELETE语句一样 SELECT语句也可以使用WHERE字句来控制记录

查询魂力大于50并且deptno不为NULL的人所有信息

0818b9ca8b590ca3270a3433284dd417.png

查询魂力在50-70之间的人所有信息

0818b9ca8b590ca3270a3433284dd417.png

查询deptno在集合中的人所有信息

0818b9ca8b590ca3270a3433284dd417.png

2.模糊查询

当你想查询姓张,并且姓名一共两个字

SELECT *FROM 表名 WHERE 姓名字段 LIKE '张_';//_表示一个字符 %表示0-N字符

我们查询姓舞的并且姓名一共三个字的

0818b9ca8b590ca3270a3433284dd417.png

SELECT *FROM 表名 WHERE 字段 LIKE '%张%';//注意千万不要这是查询中间带有张字的。这是查询含有张字的!

SELECT *FROM 表名 WHERE 字段 LIKE '%';//这个条件等同与不存在 但如果值为NULL的查询不出来

0818b9ca8b590ca3270a3433284dd417.png

所以这里empno=12那行并没有查询出来

二.排序

SELECT *FROM 表名 ORDER BY 某字段 排序方式;(默认升序)

1.升序

SELECT *FROM 表名 ORDER BY 某字段 ASC;//ASC可以省略 因为默认是升序

按魂力升序排列

0818b9ca8b590ca3270a3433284dd417.png

2.降序

SELECT *FROM 表名 ORDER BY 某字段 DESC;//ASC可以省略 因为默认是升序

按魂力降序排列

0818b9ca8b590ca3270a3433284dd417.png

3.使用多列作为排序条件

SELECT *FROM 表名 ORDER BY 字段1 排序方式,字段2 排序方式...;

先按魂力排名 再按精神力排名

0818b9ca8b590ca3270a3433284dd417.png

4.limit语句(MySQL方言)

如果只想只显示数据的一部分 可以使用LIMIT关键字 此乃MYSQL特有

按魂力降序排序并且只显示前3条

0818b9ca8b590ca3270a3433284dd417.png

LIMIT同样也可以指定显示区间 不过其中下标是从0开始的

但此区间不是普通区间 比如下面的0,3 并不是0-3的数据 而是从0开始显示3行数据

0818b9ca8b590ca3270a3433284dd417.png

三.聚合函数

1.COUNT

SELECT COUNT(*) FROM 表名;//计算表中所有列都不是NULL的值 不过很多书上写

SELECT COUNT(1) FROM 表名更快

0818b9ca8b590ca3270a3433284dd417.png

SELECT COUNT(字段) FROM 表名;//计算表中该字段列有多少个不是NULL的值

我们来计算字段deptno有多少个不是NULL的值 结果确实如此 12个数据 有1个是NULL

0818b9ca8b590ca3270a3433284dd417.png

2.MAX

SELECT COUNT(字段) FROM 表名;//查询该字段列中数据最大的值

查询表emp中魂力最大的值

0818b9ca8b590ca3270a3433284dd417.png

3.MIN

SELECT COUNT(字段) FROM 表名;//查询该字段列中数据最小的值

查询表emp中魂力最小的值

0818b9ca8b590ca3270a3433284dd417.png

4.SUM

SELECT SUM(字段) FROM 表名;//查询该字段下所有列的数据和

查询表emp中的魂力和

0818b9ca8b590ca3270a3433284dd417.png

5.AVG

SELECT AVG(字段) FROM 表名;//查询该字段下所有列数据和的平均值

查询表emp中的魂力平均值

0818b9ca8b590ca3270a3433284dd417.png

四.分组查询

1.单层分组

SELECT 分组字段,聚合函数 FROM 表名 group by 分组字段;

比如我们查询以tid分组 每个分组各自的人数

0818b9ca8b590ca3270a3433284dd417.png

2.多层分组

SELECT 分组字段1,分组字段2,...聚合函数 FROM 表名 group by 分组字段1,分组字段2,...;

比如我们查询以tid和deptno两个分组 仍然显示每个分组各自的人数

0818b9ca8b590ca3270a3433284dd417.png

当然你想在多层分组中想让它显示单层的效果可以在最后加上WITH ROLLUP

0818b9ca8b590ca3270a3433284dd417.png

3.分组前条件

SELECT 分组字段,聚合函数 FROM 表名 WHERE ... group by 分组字段;

比如我们查询以deptno分组 deptno并且不为NULL 仍然显示每个分组各自的人数

0818b9ca8b590ca3270a3433284dd417.png

4.分组后条件

SELECT 分组字段,聚合函数 FROM 表名 group by 分组字段 having ...;

比如我们查询以ename分组 并且deptno不为NULL 仍然显示每个人的精神力 并且要求魂力小于50的除外并以魂力降序排列

0818b9ca8b590ca3270a3433284dd417.png

5.注意使用顺序

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

五.表连接

表连接大致分为内连接和外连接 区别是内连接要依靠两表或多表相同的字段来连接

1.内连接

现在有另一个表dept 如下:

0818b9ca8b590ca3270a3433284dd417.png

查询表emp在表dept中对应的部门

0818b9ca8b590ca3270a3433284dd417.png

注意:借助的是两表中相同字段 假如一个人的数据在另一个表中没有就不会查出来 比如上面图中只有11个数据

2.外连接

外连接分为左连接和右连接

a.左连接

包含所有的左边表中的记录甚至是右边表没有与之匹配的记录

select ... FROM 表名1 left join 表名2 on 表名1.表名中字段=表名2.表名中字段

0818b9ca8b590ca3270a3433284dd417.png

b.右连接

包含所有的右边表中的记录甚至是左边表没有与之匹配的记录

select ... FROM 表名1 right join 表名2 on 表名1.表名中字段=表名2.表名中字段

0818b9ca8b590ca3270a3433284dd417.png

3.全外连接

数据库还有个全外连接 但是MySQL不支持 但可以用union模拟

SELECT 字段名1 FROM 表1 UNION SELECT 字段名2 FROM 表2

0818b9ca8b590ca3270a3433284dd417.png

如果查询的有重复值时 要在UNION后面加上ALL 即

SELECT 字段名1 FROM 表1 UNION ALL SELECT 字段名2 FROM 表2

六.子查询

1.子查询的定义

子查询允许把一个查询嵌套在另一个查询当中

子查询的关键字 in,not in,=,!=,exists,not exists等

a.in

比如SELECT deptno FROM dept; 是查询的表dept中的deptno

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

相当于SELECT *FROM emp WHERE deptno in (10,20,30);

b.=

如果子查询记录数是唯一 可以用=代替in 如下

0818b9ca8b590ca3270a3433284dd417.png

c.!=

0818b9ca8b590ca3270a3433284dd417.png

d.not in

0818b9ca8b590ca3270a3433284dd417.png

e.exists

select i1 from t1 where exists(select * from t2 where t1.i1=t2.i2);

简单的说就是查询t1表有 t2表也有的数据

0818b9ca8b590ca3270a3433284dd417.png

f.not exists

select i1 from t1 where not exists(select * from t2 where t1.i1=t2.i2);

简单的说就是查询t1表有 t2表不存在的数据

0818b9ca8b590ca3270a3433284dd417.png

子查询和表连接之间的转换主要在两个方面 MYSQL4.1以前的版本都不支持子查询 需要用表连接来实现 表连接在很多情况下用于优化子查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值