MySQL学习笔记
1. 简单的SQL操作命令
\c
命令,用于结束一条语句
exit 或者 quit ,用于退出mysql
2. 简单的查询语句(DQL)
语法格式:
select 字段名1,字段名2,字段名3,… from 表名;
提示:
1、任何一条sql语句以“;”结尾,而在Navicat Premium中不用加“;”结尾,
2、sql语句不区分大小写。
例如:给查询员工年薪结果的列重命名
select ename,sal * 12 as yearsal from emp;
其中,as 可以省略
select ename,sal * 12 yearsal from emp;
查询所有字段:
select * from emp; // 实际开发中不建议使用*,效率较低。
3.条件查询
语法格式:
select
字段,字段…
from
表名
where
条件;
执行顺序:先from,然后where,最后select
-
查询工资等于5000的员工姓名?
select ename from emp where sal = 5000;
例如,查询SMITH的工资?
select sal from emp where ename = ‘SMITH’; // 字符串使用单引号括起来。 -
找出工资高于3000的员工?
select ename,sal from emp where sal > 3000; -
找出工资不等于3000的员工 ?
select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000; -
找出工资在1100和3000之间的员工,包括1100和3000?
select ename,sal from emp where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 3000; // between…and…是闭区间 [1100 ~ 3000],between and在使用的时候必须左小右大。 -
找出哪些人津贴为NULL?
在数据库当中NULL不是一个值,代表什么也没有,为空。
空不是一个值,不能用等号衡量。
必须使用 is null或者is not null
select ename,sal,comm from emp where comm is null -
找出哪些人没有津贴(注意和上述的区别)?
select ename,sal,comm from emp where comm is null or comm = 0; -
找出工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = ‘MANAGER’ or job = ‘SALESMAN’ -
and和or联合起来用:找出薪资大于1000的并且部门编号是20或30部门的员工。
select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno = 30; // 错误的
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30); // 正确的。
注意:当运算符的优先级不确定的时候加小括号。 -
in等同于or:找出工作岗位是MANAGER和SALESMAN的员工?
select ename,job from emp where job = ‘SALESMAN’ or job = ‘MANAGER’;
等同于select ename,job from emp where job in(‘SALESMAN’, ‘MANAGER’); -
查询薪资是800和5000的员工名字及工作岗位名称
select ename,job from emp where sal in(800, 5000); // in后面的值不是区间,是具体的值,not in: 不在这几个值当中。
模糊查询like ?
找出名字当中含有O的?
(在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_)
%代表任意多个字符,_代表任意1个字符。
select ename from emp where ename like '%O%';
找出名字中第二个字母是A的?
select ename from emp where ename like '_A%';
3. 排序(升序、降序)
- 按照工资升序,找出员工名和薪资?
select
ename,sal
from
emp
order by
sal;
注意:默认是升序。怎么指定升序或者降序?asc表示升序,desc表示降序。
select ename , sal from emp order by sal; // 升序
select ename , sal from emp order by sal asc; // 升序
select ename , sal from emp order by sal desc; // 降序。 - 按照工资的降序排列,当工资相同的时候再按照名字的升序排列。
select ename,sal from emp order by sal desc;
select ename,sal from emp order by sal desc , ename asc;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的。 - 找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。
select
ename,job,sal
from
emp
where
job = ‘SALESMAN’
order by
sal desc;
查询、条件、排序语句格式:
select
字段1,字段2...
from
表名 1
where
条件 2
order by
.... 4
order by是最后执行的。
-
分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值记住:所有的分组函数都是对“某一组”数据进行操作的。分组函数自动忽略NULL。
分组函数也称:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。
count()和count(具体的某个字段)区别:
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm): 表示统计comm字段中不为NULL的数据总数量。分组函数也能组合起来用:
select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp; -
SQL语句中有一语法规则,分组函数不可直接使用在where子句中。因为group by是在where执行之后才会执行的。
select 5 .. from 1 .. where 2 .. group by 3 .. having 4 .. order by 6 ..
-
单行处理函数
单行处理函数:输入一行,输出一行。
计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp;
重点:所有数据库都是这样规定,只要有NULL参与的运算结果一定是NULL。
使用ifnull(空处理)函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。 -
group by 和 having
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。
任何一个分组函数(count sum avg max min)和group by联合使用时,都是在group by语句执行结束之后才会执行的。 -
找出每个部门的平均薪资,要求显示薪资大于2000的数据。
第一步:找出每个部门的平均薪资
select deptno,avg(sal) from emp group by deptno;
±-------±------------+
| deptno | avg(sal) |
±-------±------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
±-------±------------+第二步:要求显示薪资大于2000的数据
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
±-------±------------+
| deptno | avg(sal) |
±-------±------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
±-------±------------+
注意:where后面不能使用分组函数,select deptno,avg(sal) from emp where avg(sal) > 2000 group by deptno; // 错误了。这种情况只能使用having过滤。