SQL语句
任何一条sql语句以";"结尾
sql语句不区分大小写
标准sql语句中要求字符串使用单引号括起来
完整的DQL语句:
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
1.简单查询语句(DQL)
1)select 字段名1,字段2,字段3,......from 表名;
mysql> select EMPNO,ENAME from emp;
2)查询员工的年薪(字段可以参与数学运算)
mysql> select ename,sal*12 from emp;
3)给查询结果的列重命名
select ename,sal*12 as yearsal from emp;
或select ename,sal*12 as '年薪’ from emp;
2.条件查询
分类:
=、<>或!=、<、<=、>、>=、between……and……、is null、and、or、in、not、like
select 字段1,字段2,...... from 表名 where 条件;
执行顺序:先from,然后where,最后select
如:1)查询工资等于5000的员工姓名
mysql> select ename from emp where sal=5000;
2)查询SMITH的工资
mysql> select sal from emp where ename='smith'; //字符串需要用单引号括起来
3)找出工资高于3000的员工
mysql> select ename from emp where sal>3000;
4)找出工资在1000和3000之间的员工
mysql> select ename from emp where sal between 1000 and 3000;
between……and……是闭区间(必须左小右大)
或mysql> select ename from emp where sal>=1000 and sal<=3000;
5)找出哪些人没有津贴
mysql> select ename from emp where comm is null;
注:
在数据库中NULL不是一个值,代表什么也没有,为空
必须使用is null 或者is not null
6)找出哪些人津贴不为null
mysql> select ename from emp where comm is not null;
7)找出哪些人没有津贴
mysql> select ename from emp where comm is null or comm=0;
8)找出薪资大于1000的并且部门编号是20或30部门的员工
mysql> select ename,sal,deptno from emp where sal>1000 and (deptno=20 or deptno=30);
注:
and的优先级大于or
当运算符的优先级不确定的时候加小括号
9)找出工作岗位是manager和salesman的员工
mysql> select ename,job from emp where job='manager' or job='salesman';
mysql> select ename,job from emp where job in('manager','salesman');
注:
in等同于or
in后面括号里的参数是具体的值,不是区间
10)找出名字中含有o的
mysql> select ename from emp where ename like '%o%';
注:
%代表任意多个字符,_代表任意一个字符
11)找出名字中第二个字母是A的
mysql> select ename from emp where ename like '_a%';
12)找出名字中有下划线的
mysql> select name from t_user where name like '%\_%';
注:
\表示转义字符
13)找出名字中最后一个字母是t的
mysql> select name from t_user where name like '%t';
3.排序查询
1)按照工资升序,找出员工名和薪资
mysql> select ename,sal from emp order by sal;
或mysql> select ename,sal from emp order by sal asc;
注:
默认升序,asc表示升序,desc表示降序
2)按照工资降序排序,当工资相同的时候再按名字的升序排序
mysql> select ename,sal from emp order by sal desc,ename asc;
注:
越靠前的字段越能起到主导作用,只有当前面字段无法完成排序时,才启用后面字段
3)找出工作岗位是salesman的员工,并且要求按照薪资的降序排列
mysql> select ename,sal,job from emp where job='salesman' order by sal desc;
4.分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注:
所有的分组函数都是对“某一组”数据进行操作的
分组函数自动忽略null
SQL语句中,分组函数不可以直接使用在where中
1)找出工资总和
mysql> select sum(sal) from emp;
2)找出最高工资
mysql> select max(sal) from emp;
3)找出总人数
mysql> select count(ename) from emp;
或mysql> select count(*) from emp;
4)找出工资高于平均工资的员工
mysql> select ename,(sal+ifnull(comm,0))*12 as yealsal from emp;
//mysql> select ename,(sal+ifnull(comm,0))*12 as yealsal from emp;
出现以上错误信息:无效的使用了分组函数
原因:SQL语句中,分组函数不可以直接使用在where中
解释:
因为group by是在where执行之后才会执行
解决:
第一步:mysql> select avg(sal) from emp;
第二步:mysql> select ename,sal from emp where sal>2073.214286;
或 mysql> select ename,sal from emp where sal>(select avg(sal) from emp);
5)count(*)和count(具体的某个字段)的区别
count(*):不是统计某个字段中数据的个数,而是统计总记录条数(和某个字段无关)
count(comm):表示统计comm字段中不为null的数据总数量
5.单行处理函数
注:
只要有null参与的运算,结果一定是null,所有数据库都是这样规定的
1)计算每个员工的年薪
mysql> select ename,(sal+ifnull(comm,0))*12 as yealsal from emp;
注:
ifnull(可能为null的数据,被当作什么处理):属于单行处理函数
6.group by 和 having
group by:按照某个字段或者某个字段进行分组
having:对分组过后的数据进行再次过滤
注:
当一条语句包含group by,select后面只能跟参加分组的字段以及分组函数
如:1)找出每个工作岗位的最高薪资
mysql> select max(sal) from emp group by job;
注:
分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因
并且任何一个分组函数都是在group by语句执行结束之后才会执行
当一条SQL语句没有group by时,整张表的数据会自成一组
2)找出每个工作岗位的平均薪资
mysql> select job,avg(sal) from emp group by job;
3)找出每个部门不同工作岗位的最高薪资
mysql> select deptno,job,max(sal) from emp group by deptno,job;
4)找出每个部门的最高薪资,要求显示薪资大于2900的数据
第一步:mysql> select deptno,max(sal) from emp group by deptno;
第二步:mysql> select deptno,max(sal) from emp group by deptno having max(sal)>2900; //效率低
或 mysql> select deptno,max(sal) from emp where sal>2900 group by deptno; //效率高
5)找出每个部门的平均薪资,要求显示薪资大于2000
mysql> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;