MySQL DML数据查询篇(三)

基本查询语句 

数据插入到数据库中后,就可以用 SELECT 命令进行各种各样的查询,使得输出的结果符合 我们的要求。由于 SELECT 的语法很复杂,所有这里只介绍基本的语法

select * from emp;

其中“*”表示要将所有的记录都选出来,也可以用逗号分割的所有字段来代替,例如,以 下两个查询是等价的

 select deptno,username from emp;

如果遇到重复数据应该怎么办呢?

有时需要将表中的记录去掉重复后显示出来,可以用distinct 关键字来实现: 

select distinct deptno from emp;

条件查询。 在很多情况下,用户并不需要查询所有的记录,而只是需要根据限定条件来查询一部分数据, 用 where 关键字可以来实现这样的操作。 

例如,需要查询所有 deptno 为 1 的记录: 

select * from emp where deptno=1;

结果集中将符合条件的记录列出来。上面的例子中,where 后面的条件是一个字段的‘=’ 比较,除了‘=’外,还可以使用>、<、>=、<=、!=等比较运算符;多个条件之间还可以使 用 or、and 等逻辑运算符进行多条件联合查询,

select * from emp where deptno=1 and sal<3000;

排序和限制

我们经常会有这样的需求,取出按照某个字段进行排序后的记录结果集,这就用到了数据库 的排序操作,用关键字 ORDER BY 来实现

其中,DESC 和 ASC 是排序顺序关键字,DESC 表示按照字段进行降序排列,ASC 则表示升序 排列,如果不写此关键字默认是升序排列。ORDER BY 后面可以跟多个不同的排序字段,并 且每个排序字段可以有不同的排序顺序。 

select * from emp order by sal;

如果deptno相同,可以使用多条件排序,以工资倒序进行排序。

select * from emp order by deptno,sal desc; 

对于排序后的记录,如果希望只显示一部分,而不是全部,这时,就可以使用 LIMIT 关键字 来实现

select * from emp order by sal limit 3;

select * from emp order by sal limit 1,3;

聚合函数

统计emp表中统计公司的总人数

 

select count(1) from emp;   

在此基础上,要统计各个部门的人数

select deptno,count(1) from emp group by deptno;

更细一些,既要统计各部门人数,又要统计总人数

select deptno,count(1) from emp group by deptno with rollup; 

统计人数大于 1 人的部门

select deptno,count(1) from emp group by deptnno having count(1) >1;

后统计公司所有员工的薪水总额、高和低薪水

 select sum(sal),max(sal),min(sal) from emp;

表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。 从大类上分,表连接分为内连接和外连接,它们之间的主要区别是內连接仅选出两张表中 互相匹配的记录,而外连接会选出其他不匹配的记录。我们常用的是内连接。 例如,查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表 emp 和 dept 中,因此,需要使用表连接来进行查询

内连接用法:

 select username,deptname from emp,dept where emp.deptno=dept.deptno;

外连接有分为左连接和右连接,具体定义如下。

• 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录

• 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录 

左连接写法:

select username,deptname from emp left join dept  on  emp.deptno=dept.deptno;

右连接写法

 select username,deptname from emp right join dept  on  emp.deptno=dept.deptno;

子连接

某些情况下,当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就 要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等。 

select * from emp where deptno in(select deptno from dept); 

如果子查询记录数唯一,还可以用=代替 in: 

 select * from emp where deptno =(select deptno from dept);

注意:

   子查询和表连接之间的转换主要应用在两个方面: 
    MySQL 4.1 以前的版本不支持子查询,需要用表连接来实现子查询的功能 
   表连接在很多情况下用于优化子查询 

记录联合

我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并 到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能,具体语 法如下:

UNION 和 UNION ALL 的主要区别是 UNION ALL 是把结果集直接合并在一起,而 UNION 是将 UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果。 

去掉重复数据

select deptno from emp union select deptno from dept;

select deptno from emp union all select deptno from dept;

相关文章推荐 

MySQL DDL数据操作篇(一)

MySQL DML数据查询篇(二)

MySQL 数据类型篇(四)

以上内容希望可以帮助到大家,后面会继续更新MySQL文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值