SQL 语句
SQL 语句主要分为五类
- DQL(数据查询语言): 查询语句,凡是 select 语句都是 DQL。
- DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
- DDL(数据定义语言):create drop alter,对表结构的增删改。
- TCL(事务控制语言):commit 提交事务,rollback 回滚事务。(TCL 中的 T 是 Transaction)
- DCL(数据控制语言): grant 授权、revoke 撤销权限等。
查询 (DQL)
基础查询
SELECT
字段1, 字段2, 字段3, ...
FROM
表名;
查询员工的年薪?
-- 字段可以参与数学运算
SELECT
ename,
sal * 12
FROM
emp;
-- 可以使用 as 关键字取别名, as 可以省略
SELECT
ename '姓名',
sal * 12 AS '年薪'
FROM
emp;
条件查询
SELECT
字段1, 字段2, 字段3, ...
FROM
表名
WHERE
条件;
-- 执行顺序:先from,然后where,最后select
查询工资等于 5000 的员工姓名?
SELECT
ename
FROM
emp
WHERE
sal = 5000;
查询 SMITH 的工资?
SELECT
sal
FROM
emp
WHERE
ename = 'SMITH';
-- 字符串使用单引号括起来。
找出工资在 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]
找出哪些人津贴为 NULL?
-- 在数据库当中NULL不是一个值,代表什么也没有,为空。
-- 空不是一个值,不能用等号衡量。
-- 必须使用 is null或者is not null
SELECT
ename,
sal,
comm
FROM
emp
WHERE
comm IS NULL;
-- 找出哪些人津贴不为NULL?
SELECT
ename,
sal,
comm
FROM
emp
WHERE
comm IS NOT 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';
SELECT
ename,
job
FROM
emp
WHERE
job IN ( 'SALESMAN', 'MANAGER' );
-- not in 不包括
模糊查询like
% 代表任意多个字, _ 代表任意1个字符
找出名字当中含有 O 的?
SELECT
ename
FROM
emp
WHERE
ename LIKE '%O%';
找出名字中第二个字母是 A 的?
SELECT
ename
FROM
emp
WHERE
ename LIKE '_A%';
找出名字中最后一个字母是 T 的?
SELECT
ename
FROM
emp
WHERE
ename LIKE '%T';
找出名字中有下划线的?
SELECT NAME
FROM
t_user
WHERE
NAME LIKE '%\_%';
排序
按照工资升序,找出员工名和薪资?
SELECT
ename,
sal
FROM
emp
ORDER BY
sal;
-- 默认是升序。 asc表示升序,desc表示降序。
SELECT
ename,
sal
FROM
emp
ORDER BY
sal DESC;
找出工作岗位是 SALESMAN 的员工,并且要求按照薪资的降序排列。
SELECT
ename,
job,
sal
FROM
emp
WHERE
job = 'SALESMAN'
ORDER BY
sal DESC;
分组函数
count 计数 sum 求和 avg 平均值 max 最大值 min 最小值
所有的分组函数都是对”某一组”数据进行操作的。
-- 找出工资总和?
SELECT
sum( sal )
FROM
emp;
-- 找出最高工资?
SELECT
max( sal )
FROM
emp;
-- 找出最低工资?
SELECT
min( sal )
FROM
emp;
-- 找出平均工资?
SELECT
avg( sal )
FROM
emp;
-- 找出总人数?
SELECT
count(*)
FROM
emp;
SELECT
count( ename )
FROM
emp;
分组函数一共 5 个。 分组函数还有另一个名字:多行处理函数。 多行处理函数的特点:输入多行,最终输出的结果是 1 行。 分组函数自动忽略 NULL。
查询补助合计?
SELECT
sum( comm )
FROM
emp;
-- 等价
SELECT
sum( comm )
FROM
emp
WHERE
comm IS NOT NULL;
-- 不需要额外添加这个过滤条件。sum函数自动忽略NULL。
找出工资高于平均工资的员工?
SELECT
ename,
sal
FROM
emp
WHERE
sal > ( SELECT avg( sal ) FROM emp );
-- where 后面不可以直接使用分组函数 因为group by是在where执行之后才会执行的
SQL 语句 执行顺序
SELECT 5
.. FROM 1
.. WHERE 2
.. GROUP BY 3
.. HAVING 4
.. ORDER BY 6
..
count(*)和count(具体的某个字段),他们有什么区别?
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)count(comm): 表示统计 comm 字段中不为 NULL 的数据总数量。
单行处理函数
计算每个员工的年薪?
SELECT
ename, ( sal + comm )* 12 AS yearsal
FROM
emp;
-- 以上查询语句错误 所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
SELECT
ename,(
sal + ifnull( comm, 0 ))* 12 AS yearsal
FROM
emp;
-- ifnull() 空处理函数?
-- ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
GROUP BY 和 HAVING
GROUP BY: 按照某个字段或者某些字段进行分组。HAVING:having是对分组之后的数据进行再次过滤。
找出每个工作岗位的最高薪资。
SELECT
max( sal ),
job
FROM
emp
GROUP BY
job;
注意:分组函数一般都会和 group by 联合使用,这也是为什么它被称为分组函数的原因。 并且任何一个分组函数(count sum avg max min)都是在 group by 语句执行结束之后才会执行的。 当一条 sql 语句没有 group by 的话,整张表的数据会自成一组。 当一条语句中有 group by 的话,select 后面只能跟分组函数和参与分组的字段。
每个工作岗位的平均薪资?
SELECT
job,
avg( sal )
FROM
emp
GROUP BY
job;
找出每个部门不同工作岗位的最高薪资。
SELECT
deptno,
job,
max( sal )
FROM
emp
GROUP BY
deptno,
job;
找出每个部门的最高薪资,要求显示薪资大于 2900 的数据。
SELECT
max( sal ),
deptno
FROM
emp
WHERE
sal > 2900
GROUP BY
deptno;
-- 建议能够使用where过滤的尽量使用where。
找出每个部门的平均薪资,要求显示薪资大于 2000 的数据。
SELECT
deptno,
avg( sal )
FROM
emp
GROUP BY
deptno
HAVING
avg( sal ) > 2000;