mysql与mybatis

mysql

新增

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;
1.1 between and ***…***操作符

关于between … and …,它是包含最大值和最小值的

//查询薪水为1600到3000的员工
select empno, ename, sal from emp where sal >= 1600 and sal <= 3000;
is null

Null为空,但不是空串,为null可以设置这个字段不填值

//查询津贴为空的员工
select * from emp where comm=null;
//以上也无法查询出符合条件的数据,因为null类型比较特殊,必须使用 is来比较
select * from emp where comm is null;
and

and表示并且的含义,表示所有的条件必须满足

//工作岗位为MANAGER,薪水大于2500的员工
select * from emp where job='MANAGER' and sal > 2500;
or

只要满足条件即可,相当于包含

//查询出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

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);
not
//查询出薪水不包含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中%和下划线的差别?

%匹配任意字符出现的个数

下划线只匹配一个字符

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
//取得所有的员工数
//Count(*)表示取得所有记录,忽略null,为null的值也会取得
select count(*) from emp;
//采用count(字段名称),不会取得为null的记录
select count(distinct job ) from emp;
//取得津贴不为null员工数
select count(comm) from emp;
sum

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;
avg

取得某一列的平均值

//取得平均薪水
select avg(sal) from emp;
max

取得某个一列的最大值

//取得最高薪水	
select max(sal) from emp;
//取得最晚入职得员工
select max(str_to_date (hiredate, '%Y-%m-%d')) from emp;
min

取得某个一列的最小值

//取得最低薪水
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语句总结

select 字段
from 表名
where …….(条件)
group by ……..(分组查询)
having …….(就是为了过滤分组后的数据而存在的—不可以单独的出现)
order by ……..(排序)

以上语句的执行顺序

  1. 首先执行where语句过滤原始数据

  2. 执行group by进行分组

  3. 执行having对分组数据进行操作

  4. 执行select选出数据

  5. 执行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;

mybatis

mysql核心配置


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

你可能感兴趣的:(数据库,mybatis,mysql,数据库)