Insert into 表名(字段,。。。。) values (值,…………)
insert into
emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
values
(9999,'zhangsan','MANAGER', null, null,3000, 500, 10);
修改数据,可以根据条件修改数据
update 表名 set 字段名称1 = 需要修改的值1, 字段名称2 = 需要修改的值2 where …….
//将job为manager的员工的工资上涨10%
update emp set sal=sal+sal*0.1 where job='MANAGER';
删除数据,可以根据条件删除数据
Delete from表名 where 。。。。。
//删除津贴为500的员工
delete from emp where comm = 500;
Select语句后面跟的是字段名称,select是关键字,select和字段名称之间采用空格隔开,from表示将要查询的表,它和字段之间采用空格隔开
查询多个字段,select中的字段采用逗号间隔即可,最后一个字段,也就是在from前面的字段不能使用逗号了。
select ename from emp;
select empno, ename from emp;
//将查询出来的字段显示为中文(别名)
//可以采用as关键字重命名表字段,其实as也可以省略
select empno as "员工编号", ename "员工姓名", sal*12 "年薪" from emp;
条件查询需要用到where语句,where必须放到from语句表的后面
运算符 | 说明 |
---|---|
= | 等于 |
<>或!= | 不等于 |
< | 小于 字符 < |
<= | 小于等于 |
> | 大于 字符 > |
>= | 大于等于 |
between … and …. | 两个值之间,等同于 >= and <= |
is null | 为null(is not null 不为空) |
and | 并且 |
or | 或者 |
in | 包含,相当于多个or(not in不在这个范围中) |
not | not可以取非,主要用在is 或in中 |
like | like称为模糊查询,支持%或下划线匹配%匹配任意个字符下划线,一个下划线只匹配一个字符 |
小于 使用字符表示 <
大于 使用字符表示 >
//查询job为MANAGER的员工
select empno, ename from emp where job="manager";
//查询薪水不等于5000的员工
select empno, ename, sal from emp where sal <> 5000;
关于between … and …,它是包含最大值和最小值的
//查询薪水为1600到3000的员工
select empno, ename, sal from emp where sal >= 1600 and sal <= 3000;
Null为空,但不是空串,为null可以设置这个字段不填值
//查询津贴为空的员工
select * from emp where comm=null;
//以上也无法查询出符合条件的数据,因为null类型比较特殊,必须使用 is来比较
select * from emp where comm is null;
and表示并且的含义,表示所有的条件必须满足
//工作岗位为MANAGER,薪水大于2500的员工
select * from emp where job='MANAGER' and sal > 2500;
只要满足条件即可,相当于包含
//查询出job为manager或者job为salesman的员工
select * from emp where job='MANAGER' or job='SALESMAN';
//查询薪水大于1800,并且部门代码为20或30的(正确的写法)
select * from emp where sal > 1800 and (deptno = 20 or deptno = 30);
in表示包含的意思,完全可以采用or来表示,采用in会更简洁一些
//查询出job为manager或者job为salesman的员工
select * from emp where job in ('manager','salesman');
//查询出薪水包含1600和薪水包含3000的员工
select * from emp where sal in(1600, 3000);
//查询出薪水不包含1600和薪水不包含3000的员工
select * from emp where sal <> 1600 and sal <> 3000;
select * from emp where not (sal = 1600 or sal = 3000);
select * from emp where sal not in (1600, 3000);
Like可以实现模糊查询,like支持%和下划线匹配
Like中%和下划线的差别?
%匹配任意字符出现的个数
下划线只匹配一个字符
Like 中的表达式必须放到单引号中|双引号中
//查询姓名以M开头所有的员工
select * from emp where ename like 'M%';
//查询姓名以N结尾的所有的员工
select * from emp where ename like '%N';
//查询姓名中包含O的所有的员工
select * from emp where ename like '%O%';
//查询姓名中第二个字符为A的所有员工
select * from emp where ename like '_A%';
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句那么order by必须放到where语句的后面,(系统默认由小到大)
如果包含where语句order by必须放到where后面,如果没有where语句order by放到表的后面
//按照薪水由小到大排序
select * from emp order by sal;
select * from emp where job='MANAGER' order by sal;
//按照多个字段排序,如:首先按照job排序,再按照sal排序
select * from emp order by job,sal;
//手动指定按照薪水由小到大排序
select * from emp order by sal asc;
//手动指定按照薪水由大到小排序
select * from emp order by sal desc;
//多个字段排序
//如果采用多个字段排序,如果根据第一个字段排序重复了,会根据第二个字段排序
//按照job和薪水倒序
select * from emp order by job desc, sal desc;
count | 取得记录数 |
---|---|
sum | 求和 |
avg | 取平均 |
max | 取最大的数 |
min | 取最小的数 |
注意:分组函数自动忽略空值,不需要手动的加where条件排除空值。
select count(*) from emp where xxx; 符合条件的所有记录总数。
select count(comm) from emp; comm这个字段中不为空的元素总数。
分组函数不能直接使用在where关键字后面
//取得所有的员工数
//Count(*)表示取得所有记录,忽略null,为null的值也会取得
select count(*) from emp;
//采用count(字段名称),不会取得为null的记录
select count(distinct job ) from emp;
//取得津贴不为null员工数
select count(comm) from emp;
Sum可以取得某一个列的和,null会被忽略
//取得薪水的合计
select sum(sal) from emp;
//取得薪水的合计(sal+comm)
select sum(sal+comm) from emp;
//以上做法不正确,原因在于comm字段有null值,所以无法计算,sum会忽略掉,正确的做法是将comm字段转换成0
select sum(sal+IFNULL(comm, 0)) from emp;
取得某一列的平均值
//取得平均薪水
select avg(sal) from emp;
取得某个一列的最大值
//取得最高薪水
select max(sal) from emp;
//取得最晚入职得员工
select max(str_to_date (hiredate, '%Y-%m-%d')) from emp;
取得某个一列的最小值
//取得最低薪水
select min(sal) from emp;
可以将这些聚合函数都放到select中一起使用
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
分组函数的执行顺序:
根据条件查询数据
分组(单独查某项)
采用having过滤,取得正确的数据
group by:
如果使用了order by,order by必须放到group by后面
//取得每个工作岗位的工资合计,要求显示岗位名称和工资合计
select job, sum(sal) from emp group by job;
having:
如果想对分组数据再进行过滤需要使用having子句
//取得每个岗位的平均工资大于2000
select job, avg(sal) from emp group by job having avg(sal) >2000;
select 字段
from 表名
where …….(条件)
group by ……..(分组查询)
having …….(就是为了过滤分组后的数据而存在的—不可以单独的出现)
order by ……..(排序)
以上语句的执行顺序
首先执行where语句过滤原始数据
执行group by进行分组
执行having对分组数据进行操作
执行select选出数据
执行order by排序
原则:能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。
表1 inner join 表2 on 关联条件
做连接查询的时候一定要写上关联条件
inner 可以省略
例:
//显示薪水大于2000的员工信息,并显示所属的部门名称
select e.ename, e.sal, d.dname from emp e join dept d on e.deptno=d.deptno where e.sal>2000;
//或
select e.ename, e.sal, d.dname from emp e inner join dept d on e.deptno=d.deptno where e.sal>2000;
//在实际中一般不加inner关键字
左外连接
表1 left outer join 表2 on 关联条件
做连接查询的时候一定要写上关联条件
outer 可以省略*右外连接
表1 right outer join 表2 on 关联条件
做连接查询的时候一定要写上关联条件
outer 可以省略
左外连接(左连接)和右外连接(右连接)的区别:
左连接以左面的表为准和右边的表比较,在左表中相等的不相等都会显示出来,右表只有符合条件的显示,不符合条件的不显示
右连接恰恰相反,以上左连接和右连接也可以加入outer关键字,但一般不建议这种写法,
例:显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来
右连接:right join
左连接:left join
//右连接:
select e.ename, e.sal, d.dname from emp e right join dept d on e.deptno=d.deptno;
//左连接:
select e.ename, e.sal, d.dname from dept d left join emp e on e.deptno=d.deptno;
//以上两个查询效果相同
distinct 去除重复行
子查询就是嵌套的select语句,可以理解为子查询是一张表
在where语句中使用子查询,也就是在where语句中加入select语句
//查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名
select empno, ename from emp where empno in(select mgr from emp where mgr is not null);
//取得大于平均薪水的员工
select empno, ename, sal from emp where sal > (select avg(sal) from emp);
在from语句中使用子查询,可以将该子查询看做一张表
//查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名
首先取得管理者的编号,去除重复的
select distinct mgr from emp where mgr is not null;
//将以上查询作为一张表,放到from语句的后面
select e.empno, e.ename from emp e join (select distinct mgr from emp where mgr is not null) m on e.empno=m.mgr;
union
union可以合并集合(相加)
合并结果集的时候,需要查询字段对应个数相同。在Oracle中更严格,不但要求个数相同,而且还要求类型对应相同。
//查询job包含MANAGER和包含SALESMAN的员工
//方式1
select * from emp where job in('MANAGER', 'SALESMAN');
//方式2,使用union
select * from emp where job='MANAGER'
union
select * from emp where job='SALESMAN'
limit
limit ,主要用于提取前几条或者中间某几行数据
//其中m是指记录开始的index,从0开始,表示第一条记录
//n是指从第m+1条开始,取n条。
select * from table limit m,n
//即取出第3条至第6条,4条记录
select * from tablename limit 2,4
//取得前5条数据
select * from emp limit 5;
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties">properties>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
settings>
<typeAliases>
<package name="com.bjpowernode.entity"/>
typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">plugin>
plugins>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.mysql.drvierClassName}">property>
<property name="url" value="${jdbc.mysql.url}">property>
<property name="username" value="${jdbc.mysql.username}">property>
<property name="password" value="${jdbc.mysql.password}">property>
dataSource>
environment>
<environment id="oracle">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED