基本查询
数据插入进数据库以后就可以进行查询操作了,查询主要使用select语句,但是语法略多,下面先介绍最基本最简单的一种查询方式:
select * from emp;
星号表示要把所有的字段都查询出来.
select ename,hiredate from emp;
也可以用逗号分隔开不同的字段,上面的语句表示只查询ename和hiredate两个字段.
查询不重复的记录
有时候需要对查询的记录去重,这时可以用distinct关键字来实现。为了显示出效果,我们先插入一条重复数据。
insert into emp values ('peter','2001-02-02',8000,1);
现在数据有这些,那么我们对部门编号去重,语句如下:
select distinct deptno from emp;
显示结果如下:
可以看到明明有两个部门编号是1的,现在只显示了1,2,3.
条件查询
有时用户并不需要所有的数据,而是按照一定条件筛选过后的数据,使用where关键字可以实现这样的操作。比如查询部门编号等于1的记录。
select * from emp where deptno=1;
这样就只显示出来了部门编号为1的记录。另外运算符中除了=以外还有其他的比如 > , < , >= , <= , != 等等,多个条件还可以用or,and这些逻辑运算来连接,比如:
select * from emp where deptno=1 and sal>6000;
只显示出一条记录了。
排序和限制
如果需要对数据的某个字段进行排序,那么需要用到order by关键字, 比如说按照工资从低到高排序。
select * from emp order by sal;
如果需要反过来从高到低排序:
select * from emp order by sal desc;
如果对于排序后的结果只需要显示出一部分的话,可以用limit关键字;比如显示出工资最高的两个人。
select * from emp order by sal desc limit 2;
聚合操作
很多情况下,用户需要进行一些汇总操作,比如我们下面先统计下公司整个的人数。
select count(*) from emp;
可以看到目前公司里只有可怜的4个人。那么进一步,想知道每个部门有多少人的话,输入下面的语句:
select deptno,count(*) from emp group by deptno;
可以看到一号部门有俩人,其他的都是一个人撑起一个部门。
如果既要统计各部门人数,又要统计总人数的话:
select deptno,count(*) from emp group by deptno with rollup;
统计人数大于1的部门。
select deptno,count(*) from emp group by deptno having count(*) >1;
统计公司所有人的薪水总额,最高,最低工资。
select sum(sal),max(sal),min(sal) from emp;
表连接
目前为止我们所有的查询都是集中在单个表中,那么如果需要将两张表联系在一起查询的话,需要用到表连接,大体分为内连接和外连接,外连接里面又有左外连接和右外连接,常用的是内连接和左外连接两种方式。内连接顾名思义,只选择出两张表中互相匹配的交集部分,外连接会选择其他不匹配的部分,具体的通过下面的例子来看,首先我们先插入一条数据到emp表中:
insert into emp values ('jack','2008-09-01','8500',4);
然后新建一张表,部门表,并且插入一些数据:
create table dept (deptno int(2),deptname varchar(10));
insert into dept (1,'tech'),(2,'sale'),(3,'hr');
操作过后目前两张表的数据如下:
先来看内连接:
select ename,hiredate,sal,deptname from emp,dept where emp.deptno=dept.deptno;
这样子就利用部门编号这个两个表中共有的字段将两张表连接在了一起,查看到了所有的数据,但是会发现emp里面的jack这个人并没有显示出来,这是因为他的部门编号为4,是一个非法的,不存在于dept表中的数据,所以只显示交集。
下面是另一个有用的连接方式,左外连接:
select ename,hiredate,sal,deptname from emp left join dept on emp.deptno=dept.deptno;
和内连接的区别就在于这次jack也选择了出来,因为是左外连接,数据选择的时候以左边的表里的数据为准,即使这行数据对应不到第二张表中。
子查询
进行查询时需要的条件是另外一个select语句的结果,这样的查询叫子查询,说白了就是把两个语句结合到了一起使用。比如说下面的例子:
select * from emp where deptno in (select deptno from dept);
如果子查询记录数唯一,还可以用=代替in
select * from emp where deptno = (select deptno from dept limit 1);
OK,简单的查询语句就先总结这么多!