数据库DML语句之普通查询

一、无条件查询:

语法:

select 列1,列2,列3...列N 或 * from 表名;

查询某列:

select <列名> from <表名>;

查询所有列:

select * from <表名>

二、条件查询:

有一个emp员工表:字段如下(下面会用此表来写案例)
-- emp 员工表(empno 员工编号,ename 员工姓名,job 职位,mgr 上级编号,
-- hiredate 入职日期,sal 工资,comm 奖金,deptno 部门编号
--job(职位,工种)

1、SQL语句的执行顺序:

from子句  where子句  select子句。

-- 数据库处理表时是逐行扫描并判断。执行where句、select句时都是逐行扫描

语法:

select 列1,列2,列3...列N 或 * from 表名 where 过滤条件;

2、比较运算符:

>、<、=、!=或<>(不等于)、<=、>=  (使用比较运算符的时候两边数据类型要保持一致)

对重复的值进行处理(去重):使用 distinct 关键字

例如:显示出公司所有的工种信息 (基于emp表)

select distinct job from emp;

逻辑运算符:or、and、not:

逻辑运算符的作用:在where后面连接多个条件,优先级:()> and >or

例:查找出全部经理 和 第10号部门秘书的工种,姓名,工资,部门号 (基于emp表)

select   * from emp where job='MANAGER' or job='CLERK' and deptno=10;

3、多值比较运算符:

--字段名  between 值1 and 值2       表示在值1和值2之间 (闭区间)

--字段名 not between 值1 and 值2    表示在值1和值2之外

--字段名 in(值1,值2...)                 表示字段等于多个值

--字段名=any(值1,值2...)        和in效果相同

--字段名 not in(值1,值2...)             表示字段不等于多个值

--字段名 !=all(  值1,值2...)        和not in效果相同

使用案例:(基于emp表)

--区间运算符
--between and
--查到工资5000-8000的员工信息
select * from emp where sal between 5000 and 8000
--not between and
--查找工资在5000-8000之外的员工信息
select * from emp where sal not between 5000 and 8000
--查找全部秘书、分析员和销售员的信息
select * from emp where job = 'CLERK' or job = 'ANALYST' or job = 'SALESMAN'
--in(...) 多个值查询  = [=any(...)]
select * from emp where job in('CLERK','ANALYST','SALEMAN')
select * from emp where job=any('CLERK','ANALYST','SALEMAN')
--not in() = [!=all()]
--查找全部非秘书、分析员和销售员的信息
select * from emp where job not in('CLERK','ANALYST','SALEMAN')
select * from emp where job  !=all('CLERK','ANALYST','SALEMAN')
--查询工资分别为1500、2500、3000的分析员或推销员的信息
select * from emp where sal in (1500,2500,3500)
and (job = 'ANALYST' or job = 'SALESMAN');

4、模糊查询:like

匹配符:%  和  下划线_

% 表示匹配任意长度的字符串(包括空字符串) 

%test% 表示匹配包含test的任意长度的字符串

%test   表示匹配以test结尾的任意长度的字符串

test%   表示匹配以test开头的任意长度的字符串

_ 表示仅能匹配一个字符

o_a 表示匹配长度为3,以字母o开头,且以字母a结尾的字符串,中间一个字符为任意字符。

_oa 表示匹配长度为3,以任意字符开头,且以oa结尾的字符串

oa_ 表示匹配长度为3,以oa开头,结尾为任意一个字符的字符串

--模糊查询 like  
--:%任意个字符
--:_一个字符
--查询名字以"MA"开头的员工信息
select * from emp where ename like 'MA%'
--查询名字以“SCO”开头,并且长度为5为的员工信息
select * from emp where ename like 'SCO__'

5、空值查询:is null 或 is not null

--例:查找出emp表中上级编号(MGR)为空的职工信息。
select * from emp where mgr is null;
--PS : (不能用" =NULL "或" !=NULL "表达式)

三、排序显示查询结果

通常情况下,查询结果是以按数据在数据库表中存储的顺序显示的。若要使查询结果按某种特定顺序显示,就要使用“order by”子句。

--ascend升序、descend降序

语法:

select 列1,列2,列3...列N 或 * from 表名 where 过滤条件 order by 字段名 asc/desc ;

说明:

ASC可以省略,默认按升序排列

order by子句可以对查询结果按一个字段或多个字段进行排序。

order by 字段名1,字段名2...  按多个字段排序时,先按前面的字段排序,当字段相同时,再按下一个字段排序,以此类推,字段之间用逗号(,)隔开。

--例:计算每个销售人员的年度总报酬,并按总报酬由高到低顺序显示
select (sal+comm)*12 年度总报酬
from emp
where job='SALESMAN'
order by (sal+comm)*12 desc;   --降序

四、分组查询

1、分组函数/统计函数/聚合函数

  • count(字段名):计算指定字段为非空的行数
--  例:统计emp表中有奖金的人数?
    select count(comm) 非空行数 from emp;
--count(*):计算表中的全部行数,包括重复行和空行
--例:统计emp表中公司的总人数?
    select count(*) 总人数 from emp;	
    select count(1) 总人数 from emp;
--PS:使用count(1) 代替 count(*),统计的结果是一样的,但是count(1)的统计效率高些。
  • sum(字段名):计算指定字段的总和
     --例:计算emp表中工资的总和?
        select sum(sal) 总和 from emp;
  • avg(字段名):计算指定字段的平均值
    --例:计算emp表中工资的平均值?
    select round(avg(sal),2) 平均值 from emp;
  • max(字段名):计算指定字段的最大值
    --例:计算emp表中工资的最大值?
    select max(sal) 最大值 from emp;
  • min(字段名):计算指定字段的最小值
--例:计算emp表中工资的最小值?
select min(sal) 最小值 from emp;

2、分组查询GROUP BY子句用于对查询的结果的分组统计

分组函数是将查询所获得满足条件的记录行为作为一组,并返回一个统计值。

分组查询命令的基本格式为:

select 字段名 from 表名 where 过滤条件 group by 分组字段名 order by 字段名 asc/desc ;

--例:计算出公司支付给每个部门的总工资
select deptno,sum(sal) from emp group by deptno;

如果要将各个分组再进行划分出不同的小组,则需要在"group by"子句中指定多个列名:

group by 字段名1,字段名2....

--例:计算每个部门中每种工种各有多少职工数,并按部门号升序排
select deptno,job,count(*) 人数 from emp group by deptno,job order by deptno;

注意: 在包括"group by"子句的查询中,select子句的列名(除分组函数外)均应包含在"group by"的子句中,即select的列名只能来源于group by后的列名,否则数据库报错!

注意当select后面同时出现字段名和分组函数,就要用到group by子句进行分组

3、带条件的分组查询

利用"group by"子句将选择到的进行分组时,可以使用 having 子句用于限制选择的组,having子句的作用同where子句相似,都是指定查询条件。

不同的是where子句对所有列进行选择,检查每条记录是否满足条件,而having子句是检查分组之后的各组是否满足条件。

带条件的分组查询语句基本格式为:

select 列1,列2,列3...列N 或 * from 表名 where 过滤条件 group by 分组字段名

 having 过滤条件 order by 字段名 asc/desc ;

--例:统计各部门的人数,并显示3人以上的人数和部门号。
select deptno,count(*) from emp group by deptno having count(*)>3;

五、补充

查询的最长语句

select 列1, 列2, 列3... 列N 或 *

from 表名

[where 过滤条件]

[group by 分组字段名]

[having  分组过滤条件]

[order by 分组以后的排序字段名 asc/desc] ;

注意:

一、语句执行顺序是

1. from, where, group by, having

2. select

3. order by

二、分组原则:select句的列名、having句及order by句的列名,只能来源于group by

后的列名。(分组函数除外)

三、分组函数仅用于select子句,having子句,order by子句。

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值