SQL条件查询 where

条件查询 where

语法:select 数据 from 数据源 where 进行过滤条件

select * from emp;
select ename,sal,comm,job from emp; 当需要查询的字段不多的时候 建议写出字段名 方便后期操作。
select * from emp where 1=1 and 条件1 and 条件2 and ...;  建议构面跟 where 1=1  方便以后添加条件

where 后条件符:!=取反

​ = 等于

​ <>不等于 <20> 不等于20 的

​ >= 大于等于

​ <=小于等于

条件与条件之间的连接符

1). and 与,

条件1 and 条件2 既满足条件1 也要满足 条件2

​ 1和2 的交集

**例:**工资在1000~2000之间的员工所有信息

​ 条件 :

​ 员工信息表;工资1000~2000; 员工所有信息

select * from emp where sal>=1000 and sal<=2000;
2). or

条件1 or 条件2 满足条件1 或者 条件2

​ 1和2 并集 【and 交集】

**例:**工资小于1000 或者 大于2000 的所有员工信息。 两个条件集的合并

条件:

​ 员工信息表;工资小于1000 工资大于2000

select * from emp where sal>2000 or sal<1000;
3). not 条件取反

not 语法:

例: 1.部门编号不是20的

select * from emp where not deptno=20;

​ 2.没有奖金的所有员工信息

​ 【 null 的判断

​ 1. null没有赋值

​ 2.不能用= 或者 != 判断

​ 3. null 用 is 连接】

select * from emp where not comm is null;
select * from emp where comm is not null;

【注意:不能用中式英语 老外不承认 】

select * from emp where comm not is null;  --错误:中式英语, 奖金不是空 
4). between(值1)and(值2) 区间

**例:**工资在1000~2000的所有员工信息

select * from emp where sal between 1000 and 2000;

查询语句的执行流程

from–> where–>select

**1.**先从from后表格中拿出数据一条条的

​ 用where 判定

​ 再输出到查询结果select

**2.**where 后面不能使用字段名

: 查询年薪大于15000的员工信息

分析条件 :员工信息表; 员工年薪; 大于15000:

​ 【查询所得 员工年薪 的结果集

​ 把结果集当做数据源头

​ ,先运算再过滤】

select ename,empno,job,mgr,sal,comm,(sal+nvl(comm,0))*12 年薪 from emp;

select ename, empno, job, mgr, sal, comm, 年薪
  from 
  		(select ename,empno,job, mgr, sal,comm, (sal + nvl(comm, 0)) * 12 年薪 
         from 
         emp)
 where 年薪 > 1500;

some(值列表) all()any()

**1.**some(值1,值2,值3) 3 个值得并集

例:

select * from emp sal>some(1250,5000,3000); 最后显示为大于1250 的所有员工信息

**2. ** any( 值1,值2,值3) 满足任何一个就行 三个值的并集

select * from emp sal>any(1250,5000,3000); 最后显示为大于1250 的所有员工信息

3. all(值1,值2,值3) 满足任何一个 三个值并集

select * from emp sal>all(1250,5000,3000); 最后显示为大于1250 的所有员工信息

集合操作

Union、Union All、Intersect、Minus

Union 并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;

Union All 全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;

Intersect 交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

Minus 差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序

select * from emp where deptno>10;
intersect    --(union|union all|intersect|minus)
select * from emp where sal>1000;

排序 order by (可以给多个)

语法:select 数据 from 数据源 where 行过滤条件 order by(有排序需求写) 字段名 desc(降序)|asc(默认升序);

【执行流程:from–>where–>select–>order by】

所有员工信息,工资按降序排列 工资一样的按奖金的降序排名

select * from emp where 1=1 order by sal desc,comm desc;

​ 所有的员工信息,奖金按降序排名,没有奖金的放在前面

select * from emp where 1=1 order by comm desc nulls first; --null放在前面
select * from emp where 1=1 order by comm desc nulls last; --null放在后面

子查询: 查询语句 嵌套 查询语句

查询KING同部门员工信息

分析条件

  1. 查询KING所在的部门
select deptno from emp where name='KING';
  1. 查询KING所在部门的员工所有信息 嵌套
select * from emp where deptno=(select deptno from emp where name='KING');
  1. 查询年薪大于15000的员工的所有信息

    ​ 条件分析-- 查询所有员工的年薪 和所有信息

    select empno,ename,job,sal,comm,(sal+nvl(comm,0))*12 年薪 from emp;
    
     																							**【以上作为一个新的结果集,数据源】**
    

    ​ 查询年薪大于15000 的员工所有信息

select empno, ename, job, sal, comm, 年薪
  from (select empno, ename, job, sal, comm, (sal + nvl(comm, 0)) * 12 年薪
          from emp)
 where 年薪 > 15000;

in 的便用

例: 查询 10 .20 部门的员工信息

  1. or.或
select * from emp where deptno=10 or deptno=20;

and 和

select * from emp where deptno=10 and deptno=20;

条件符号,

select * from emp where deptno<=20;
  1. 集合操作 【上面有详细集合,此处用了一个】
select * from emp where deptno=20
union
select * from emp where deptno=10;
  1. in ( 值1,值2 ,值3) 条件等于in里的值

    select * from emp where deptno in(10,20);
    

【注意:= 与 in 的区别

= 只可以等于一个值

in 可以是多个值 或者一个值】

like 模糊匹配

like: 模糊匹配 效率低 where like ’ ’ 单引号

配合 : --> % _ 百分号 下划线使用

%: --> 任意个数任意字符 使用

_ : --> 一个任意字符

= :精确匹配

例: 1.查询名字里有A的

select * from emp where ename like '%A%';
		2.  查询名字里 A开头的
select * from emp where ename like 'A%';

3.查询名字里第二个字母为A的

select * from emp where ename like '_A%';

4.查询名字里倒数第二个字母为A的

select * from emp where ename like '%A_';

函数

函数分为系统内置函数 自定义函数

根据函数的返回值分为:1.单行函数,一条记录返回一个结果

2.多行函数 ,多行函数 组函数 聚合函数 (重点) :多条记录 返回一个结果 (重点)

单行函数

日期

sysdate/current_date 以date类型返回当前的日期
add_months(d,x) 返回加上x月后的日期d的值
LAST_DAY(d) 返回的所在月份的最后一天
months_between(date1,date2) 返回date1和date2之间月的数目
next_day(sysdate,星期一) 下一个即将要到来的星期一的日期

查看今年日日期 sysdate

select sysdate from dual;

select current_date from dual;

日期可以进行 加减 ± sysdate+90

select sysdate+90 from dual;--注意2月天数不确定,三个月后日期于今天不同

月份的加减 ± 解决2月份的不确定天数

​ 转正日期 add_months( hiredate(开始计算的日期),+3(需要增加的月数))

select add_months( hiredate,+3) 转正 from emp;

某个月最后一天 last_day( 时间)

select last_day(sysdate) from dual;

两个日期之间有多少月 months_between(date1,date2)

​ 【注意:算法date1-date2=所得值 避免负数】

select months_between(sysdate,hiredate) 入职月份 from emp;
select months_between(sysdate,hiredate)/12 入职年份 from emp;

即将要过得星期几 next_day(日期,‘星期几’ )

​ 【注意:星期三,汉语三; 老外不承认周几 或者礼拜几】

select next_day(sysdate,'星期三') 下周三 from dual;

to_char to_date

to_char(日期对象,‘格式模板’) : 日期转为字符串

to_date(‘字符串’,‘格式模板’) : 字符串转为日期**

​ 【字符串,模板样式 都需要单引号】

select to_date('1997-07-07 08:30:30','yyyy-mm-dd hh:mi:ss' ) 日期 from dual;


/*
字符串的小时为24时  转化格式hh需要添加24  24小时制
以上无效的数字  日期转字符串 必须表格自己的日期
*/
select to_char('1997-07-07 13:30:30','yyyy-mm-dd hh:mi:ss' ) 日期 from dual;
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss' ) 日期 from dual;
  
--年 月 日 需要用双引号"原封不动"保留   24必须在hh后 
select to_char(sysdate,'yyyy"年"-mm"月"-dd"日" hh24"时":mi"分":ss"秒"' ) 日期 from dual;
select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24"时":mi"分":ss"秒"' ) 日期 from dual;
select to_char(sysdate,'yyyymmdd hh24miss' ) 日期 from dual;  
--输出为19970707 133030
select to_char(sysdate,'yyyymmddhh24miss' ) 日期 from dual; 
--输出为19970707133030

判断函数

nvl( 值1,值2) 判定null : 当值1 为null的时候输出值2;

​ 当值1 不是null的时候,直接输出值1 ,不考虑值2;

decode(可变的值,定值case1,case1的结果,定值case2,case2 的结果, 默认结果)

可变的值与case进行判断:是否相等 【注意不能做多值或区间判断】

​ case与case的结果为一对 当可变的值等于定值case1 则输出case1 的结果

​ 当可变的值等于定值case2 则输出case2 的结果

**例:**将部门编号 改为汉字编号

select deptno,ename,empno,decode(deptno,10,'十',20,'二十',30,'三十','四十') 部门编号汉化 from emp;

decode= 【 case when then else end】 中间没有逗号,用空格分开

​ (case 可变的值

​ when当可变值为什么时 then 则输出什么

​ when当可变值为什么时 then 则输出什么

​ else什么都不是则输出这个值

​ end结束)

select deptno,(case deptno when 10 then '十' when 20 then '二十'  when 30 then '三十' else '四十' end) 汉化 from emp;

例:

将部门编号汉化 并且 10部门的工资十倍 20部门的100倍 30部门的1000倍 其他部门不变

select ename,
       deptno,
       decode(deptno, 10, sal * 10, 20, sal * 100, 30, sal * 1000, sal * 1) 工资翻倍,
       (case deptno
         when 10 then
          '十'
         when 20 then
          '二十'
         when 30 then
          '三十'
         else
          '四十'
       end) 汉化
  from emp;

多行函数

多行函数| 组合函数| 聚合函数

count(求个数) sum(求和) avg(求平均) max(求最大) min(求最小)

语法:select count( 字段名 ) from emp

​ ename

​ comm 【null不参与运算】

​ * 【代表一条数据的所有字段】

select count(deptno) from emp;
select count(distinct deptno) from emp;

【注意:select 后面一旦出现组函数只能与其他组函数 或分组字段(group by ) 一起使用

三十’
else
‘四十’
end) 汉化
from emp;


## 多行函数

多行函数|  组合函数|  聚合函数

**count(求个数)   sum(求和)  avg(求平均)   max(求最大)  min(求最小)**

  语法:select  count(      字段名    ) from emp

​						                    ename

​							                comm    【null不参与运算】

​								          	 *          【代表一条数据的所有字段】

```sql
select count(deptno) from emp;
select count(distinct deptno) from emp;

【注意:select 后面一旦出现组函数只能与其他组函数 或分组字段(group by ) 一起使用

		where 后面不能出现组函数】
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值