一、sql简单查询
1、简单查询语法
select 列名,列名 from 表明;
select ...from:查询语句的关键字;(select后面跟是你要从数据库里取的数据,from后面跟表名,表示你要从哪张中读取这些数据)
例子:
--查询emp表中员工的编号、姓名、工作、工资
select empno,ename,job,sal from emp;
--查询emp表中所有列的信息
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;
2、注释
单行注释:--
多行注释:以/* 开始,以*/结尾
3、别名
别名语法:
对象名 as 别名
对象名 别名
例子:
select empno as 员工编号,ename 姓名,job 工作,mgr 上级编号,hiredate 入职日期,sal 工资,comm 佣金,deptno 部门编号 from emp;
注意:给表、视取别名时不能加as图
4、带条件的查询
select...from...where...
where:条件关键字,后面跟条件表达式,这个条件一般是和数据库中列相关
举例:
--查询工资大于1500的员工信息
select * from emp where sal>1500;
--查询名字叫SMITH的员工的信息
select * from emp where ename='SMITH';
注意:在oracle数据库中,数字类型直接写就可以,字符串类型的数据要用单引号括起来
举例:--查询不是10号部门的员工的信息
select * from emp where deptno!=10;
select * from emp where deptno<>10;
in:后面跟一个集合或者子查询
oracle中表示一个简单的集合 ,(元素,元素,元素,... 元素) 例如 (1,2,3,4,5) ('a','b','c','d')
--查询emp表中,工资是800,1600,或者3000的员工信息
select * from emp where sal in(800,1600,3000);
not in:和in是相反的
like:它只用在字符串列,表示对字符串进行模糊匹配
有两个点位符:
%:表示在这个%出现的地方可以有0个或者多个字符
_: 表示在_出现的地方有且只能一个任意字符
--查询员工姓名S结尾的员工信息
select * from emp where ename like '%S';
--查询emp表中员工姓名的第二个字符是L的员工信息
select * from emp where ename like '_L%';
--查询emp表中员工姓名第三个字符是A的员工信息
select * from emp where ename like '__A%';
--查询员工姓名中有S的员工信息
select * from emp where ename like '%S%';
not like:和like相反
like中的转义字符:\
在新版的oracle中,使用转义字符需要手动去定义 定义 escape '\'
转义字符,它会把紧跟在它后面的字符当作一个普通的字符去处理
select * from emp where ename like '%\_%' escape '\';
select * from emp where ename like '___\_%' escape '\';
select * from emp where ename like '%a%%' escape 'a';
all、any:后面都跟一个集合或者子查询
>all : 表示大于集合中最大的元素 >all(1,2,3,4,5) 等价于 >5
<all : 表示小于集合中最小的元素 <all(1,2,3,4,5) 等价于 <1
>any : 表示大于集合中最小的元素 >any(1,2,3,4,5) 等价于 >1
<any : 表示小于集合中最大的元素 <any(1,2,3,4,5) 等价于 <5
exists:它不和任何列一起使用,后面跟的是一个子查询(查询语句select语句),如果子查询能查出结果,那么这个条件就是成立的,查不出结果条件不成立
not exists:和exists相反
条件连接符
and:表示并且,当and连接的两个条件同时成立时,总条件才算成立,只要有一个条件不成立,整体不成立
or:表示或者,当or连接的两个条件有一个条件成立,整体条件成立,只有两个条件都不成立时,整体才不成立
between value1 and value2:value1的值比value2值小,value1和value2一般是数字类型,还可以是日期,表示值在value1和value2之间
is null:表示这个值是空时条件成立
is not null:表示值不为空间条件成立
select * from emp where comm is null;
select * from emp where comm is not null;
dual表:它是oracle内置的一个单行表,
select 1 from dual;
select 'abc' from dual;
select 2*3 from dual;
select 1,2,3,4 from dual;
--查询员工的年薪
select sal*12 from emp;
二、排序分组
1、排序
select 列名,列名,..,列名 from 表名 where 条件表达式 order by 排序列的列名 asc|desc;
asc|desc: asc表示升序,desc表示降序
举例:--查询员工信息,按照员工的工资升序排序
select * from emp order by sal asc; ---如果是升序排序,asc可以省略
select * from emp order by sal;
order by :后面可以跟多个排序列,跟多个排序列时,
它的含义:按照第一排序列(紧跟前order by 关键字的列)排序,
如果第一个排序字段的值相同时,它会按照第二个排序字段进行排序
--查询员工信息,按照部门编号升序排序,如果部门编号相同时,按照工资的升序排序
select * from emp order by deptno asc,sal asc;
注意:order by 后面除了可以跟表中的列名外,还可以跟select 和from之间查询结果的序号
select empno,ename,job,sal,deptno from emp order by 5,4 desc;
2、聚合函数
聚合函数:对一组值执行计算,并返回单个值
count(列名|*|常数):它求记录数(数据条数)
max(列名):取最大值
min(列名):取最小值
avg(列名):取平均值
sum(列名):求和
举例:--查询员工表中的员工人数
select count(empno) from emp;
select count(*) from emp;
select count(1) from emp;
distinct:去重关键字,跟在列的最前面
举例:select count(distinct deptno) from emp;
注意:distinct后面跟多个列时,判断重复数据,所有列的值完全相同时,它才会认为是重复数据
3、分组
select 列名,列名,...,列名 from 表名
where 条件
group by 分组列
order by 排序列 asc|desc
group by:分组的关键字,后面跟分组列名,可以是一个分组列,也可以是多个列
举例:
--查询各个部门的部门编号和部门的平均工资
select deptno,avg(sal) from emp group by deptno;
select empno,min(sal),max(sal),avg(sal),sum(sal),count(*) from emp group by empno;
--查询各个部门的员工人数
select deptno,count(empno) from emp group by deptno;
select job,deptno,count(*) from emp group by job,deptno;
注意:group by 后面跟多个列时,只有当多个列的值同时相等时,它才会分为同一个组;
4.having
select col_name,col_name,...,col_name
from 表名
where 条件
group by 分组列
having 条件
order by 排序列
having:它是对分组后的数据进行筛选,条件表达式中可以使用聚合函数
举例:--查询各个部门的部门编号和部门的平均工资
select deptno,avg(sal) from emp group by deptno;
--求平均工资大于2000的部门编号和平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
where和having的异同:
where:条件,where后面跟的条件比having后的条件先执行,条件中不允许使用聚合函数。
having:条件中可以使用聚合函数,一般having和group by联用。