一、无条件查询:
语法:
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子句。