使用某个数据库

use <数据库名称>

查询当前使用的数据库

select database()
select version() //查询版本

//\c结束一条语句
//exit 退出mysql

查看创建表的语句

会显示对应表,创建时使用的sql语句

show create table <表名称>

简单查询语句

sql语句以分号结尾,不区分大小写

select <字段名1...> from <表名>;

select * from <表名>;//实际开发中不建议使用

给查询结果的列重命名

select <字段名..>,<字段名>*12 as <重命名名称> from <表名>;

其中*12;在mysql中,可以直接进行运算返回结果

如果是字符串的话,使用''标记

条件查询

select <字段> from <表名> where <条件>

支持的运算符

=
<>或!=
<
<=
>
>=
between..and... //是闭区间
is null
and
or
in
not
like //模糊查询支持%或下划线匹配

模糊查询

找出名字中含有O的

%代表任意多个字符,_表示任意一个字符

select <字段名> from <表名> where <字段名> like '%O%'

排序

order by
	<字段名>
//asc 升序
//desc 降序,跟在字段名后面

按照工资降序排列,当工资相同的时候再按照名字的升序排列

select <字段名> from <表名> by <字段名> desc, <字段名> asc

越靠前的字段,作用越大,只有当前面字段的内容相等时,后面条件才生效

分组函数

会自动忽略NULL

count //计数
sum //求和
avg //平均值
max //最大值
min //最小值

ifnull处理空值

ifnull将NULL替换为指定内容

select ename,ifnull(comm,0) as comm from emp

替换为0

group by 和having

group by按照某个字段或者某些字段进行分组

having对分组之后的数据进行在此过滤

找出每个工作岗位的最高薪资

select <字段名> from <表名> group by <字段名>

多个字段联合分组

找出每个部门不同工作岗位的最高薪资

select deptno,job,max(sal) from emp group by deptno,job;

找出每个部门的最高薪资,要求显示薪资大于2900的数据

select max(sal),deptno from emp group by deptno having max(sal) > 2900;
//where 更好
select max(sal),deptno from emp where sal> 2900 group by deptno ;

去除重复记录

select distinct job from emp; 

连接查询

连接分类

内连接:

  • 等值连接
  • 非等值连接
  • 自连接

外连接:

  • 左外连接
  • 右外连接

全连接

等值连接 inner

查询每个员工的部门名称,要求显示员工名和部门名

select e.name,d.dname from emp e join dept d on e.deptno = d.deptno

...join ... on ... 后面接连接条件

非等值连接

特点:连接条件中的关系是非等量关系

找出每个员工的工资等级,要求显示员工名,工资,工资等级

select e.name,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s. hisal;

自连接

找出每个员工的上级领导,要求显示员工名和对应领导名

select a.ename as '员工名' ,b.ename as '领导名'
from emp a
inner join emp b
on a.mgr = b.empno

外连接

内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的

外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带查询副表。

select a.ename '员工',b.ename '领导'
from emp a
left join emp b
on a.mgr = b.empno

特点:主表的数据,无条件的全部查找出来

三表连接查询,找出每个员工的部门名称以及工资等级。

select e.name,d.name,s.grade
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal;

嵌套子查询

找出每个部门平均薪水的薪资等级

select t.*,s.grade
from (select deptno,avg(sal) as avgsal from emp group by deptno) t
join salgrade s
on t.avgsal between s.losal and hisal;

找出每个员工所在的部门名称,要求显示员工名和部门名

select e.name
	(select d.dname from dept d where e.deptno = d.deptno) as dname
from emp e;

union

可以将查询结果集相加

找出工作岗位是SALESMAN 和 MANAGER的员工

第一种:
select ename,job from emp where job = 'MANAGER' or job='SALESMAN';
第二种:
select ename,job from emp where join in('MANAGER','SALESMAN');
第三种:
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job='SALESMAN';

limit(分页查询)

mysql``特有的``,Oracel中使用rownum

limit取结果中的部分数据,这是他的作用

语法机制:

limit startIndex,length
//startIndex表示起始位置
//length表示取几个

案例:
取出工资前五名的员工

select ename,sal from emp order by sal desc limit 0,5;

找出工资排名第4到第9名的员工

select ename,sal from emp order by sal desc limit 3,6;

通用的标准分页sql

每页显示三条数据

第一页:0,3;

第二页:3,3;

第三页:6,3;

第四页:9,3;

第五页:12,3;

每页显示pagesize条记录:
第pageNo页:(pageNo-1)*pageSize,pageSize

pageSize是什么?是每页显示多少条记录

pageNo是什么?显示第几页