2022-06-15 22:55阅读: 53评论: 0推荐: 0

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关键字

oracle支持

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 中国大陆许可协议进行许可。

posted @   姬雨晨  阅读(53)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起