sql-3-DQL-单表查询
select [distint]* 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 页面大小
基础查询
1. 查询多个列(控制列)
-- 查询指定列
select 字段名1,字段名2... from 表名;
-- 查询所有列
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; -- 方式1 列出所有列名
select * from emp; -- 方式2 可以使用*来替代字段列表。
2. 对列进行计算
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
select empno,ename,sal,sal*12 from emp;
empno ename sal sal*12
7369 SMITH 800 9600
3. 起别名:as
select ename as "姓名",job as "工作" from emp;
-- as也可以省略
select ename "姓名",job "工作" from emp;
select ename 姓名 ,job 工作 from emp;
select ename "from" ,job 工作 from emp; -- 不推荐,不要起名为sql关键字
4. 去除重复:distinct
select distinct job as 工作,deptno as 部门编号 from emp ;
条件查询 where
范围查询
关系运算符
关系运算符 > < >= <= = !=(或<>)
逻辑运算
mysql 中的逻辑运算符 and(或 &&) or(或 ||) not(或 !)
oracle 逻辑运算符 and or not
select * from emp where empno=7788 or empno=7369;
select * from emp where deptno=20 and job ='CLERK';
select * from emp where not ( empno=7788 or empno=7369 );
注意:||
被oracle用于字符串拼接
select 'hello'||'123' from dual ;
BETWEEN ... AND ...
between 小 and 大,(数字和日期)
数字
select * from emp where sal between 2000 and 3000
日期
mysql:日期默认格式 'yyyy-MM-dd'(datetime)
select * from emp where hiredate between '1981-1-01' and '1981-11-10';
oracle:日期默认格式 '01-1月-81'(date)
select * from emp where hiredate between '01-1月-81' and '10-11月-81' ;
IN/not in
select * from emp where comm in (0,300,500);
如果集合有null,可以in, 不能not in,错误示例: where deptno not in (10,20,null)
模糊查询 like
占位符(通配符)
_
:单个任意字符%
:多个任意字符 0-N
-- 查询姓名中 第二个字母是M的员工
select * from emp where ename like '_M%' ;
-- 查询姓名长度>=6的员工。
select * from emp where ename like '______%' ;
转义符:
如果要匹配的ename就是A_B
,就需要使用转义符
select * from emp where ename like 'A\_B' escape '\' ;
关于null的计算与比较!!!
null的计算
null参与运算时,结果永远为null
select ename,sal,comm,sal*12+comm from emp;
mysql的解决方案
ifnull(表达式1,表达式2)
如果 表达式1 为null,则使用 表达式2 替换。
oracle的解决方案
- nvl (相当于 if)
- nvl2 (相当于 if…else…),
nvl2(a,b,c)
当a=null时候,返回c;否则返回b
select ename,sal,comm,sal*12+nvl(comm,0) from emp;
select ename,sal,comm,sal*12+nvl2(comm,comm,0) from emp;
判断null
判断null 不能 !=null
;而必须使用 is not null
/is null
select * from emp where comm=null; -- 错误
select * from emp where comm < 400 or comm IS NULL;
排序查询 order by
order by 排序字段1 排序方式1, 排序字段2 排序方式2
排序字段可以是 字段名|别名|表达式|数字
排序方式:
- ASC:升序,默认的。
- DESC:降序。
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
null排序
select * from emp ORDER BY comm asc;
在MySQL中 null最小,升序时 排在最前面
在Oracle中 null最大,升序时 排在最后面
如果排序存在null:在Oracle中Null最大。如果需要null排在最后,使用nulls last ;
…order by common nulls last;
分组查询:group by ... having ...
group by 分组字段 having 筛选组
GROUP BY 子句:
-
GROUP BY用于将数据根据一个或多个列进行分组。这在你需要对每组应用组函数(或者叫聚合函数,多行函数)(如COUNT, SUM, AVG, MIN, MAX)时非常有用。
-
分组后的查询结果只能包含分组字段和组函数(或者叫聚合函数,多行函数)。不在组函数(或者叫聚合函数,多行函数)中的列,必须在group by后面。
HAVING 子句:
-
HAVING用于在GROUP BY分组后对组进行筛选。它与WHERE子句类似,但WHERE应用于单行记录,而HAVING应用于分组。
-
因为HAVING是在分组后应用的,所以它可以使用组函数(或者叫聚合函数,多行函数)来过滤结果。这在WHERE子句中是不允许的,因为WHERE在聚合之前执行。
-- 查询每个部门的人数
SELECT deptno, COUNT(*) AS employee_count
FROM emp
GROUP BY deptno;
-- 只查询人数大于5的组
SELECT deptno, COUNT(*) AS employee_count
FROM emp
GROUP BY deptno
HAVING COUNT(*) > 5;
-- 可多个列分组,先按部门分组,再按job分组,计算平均工资
SELECT deptno, job, AVG(sal) AS avg_salary
FROM emp
GROUP BY deptno, job;
where 和 having 的区别?
- where :筛选 行;where 在分组之前进行限定,如果不满足条件,则不参与分组;
- having :筛选 组;having在分组之后进行限定,如果不满足结果,则不会被查询出来;
- where 后不可以跟聚合函数,having可以进行聚合函数的判断。
本文作者:jiyuchen1
本文链接:https://www.cnblogs.com/jiyuchen1/p/16380202.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步