基本查询语句
数据插入到数据库中后,就可以用 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文档。