数据库分类
- 关系型数据库:oracle, mysql, db2, sql server, sqllite等
非关系型数据库:redis, hbase等
- DBMS:
- database management system
- 数据库管理系统
- RDBMS:
- relational database management system
- 关系型数据库管理系统
简单查询
查询表中所有信息
select * from emp;
查询单个列信息
姓名,入职时间,部门
select ename,hiredate,deptno from emp;
条件查询
not
取反
查看工资大于2000和小于2000的员工姓名
select ename,sal from emp where sal>2000;
select ename,sal from emp where not sal>2000;
like和not like
模糊匹配字符串
占位符
- % 表示零个或者若干个任意字符
- _ 表示一个任意字符
查询名字以S开头的所有员工信息
select * from emp where ename like 'S%';
not like 会取相同的值
select * from emp where ename not like 'S%';
查询名字中,第三个字符是A的员工信息
select * from emp where ename like '__A%';
查看名字长度是6的员工信息
select * from emp where ename like '______';
escape定义转义字符
查询名字中带有_的员工信息
select * from emp where ename like '%\_%' escape '\';
占位符在使用时,应该尽量避免在字符串的前面和后面都使用%
is null和is not null
查询字段值是空值的数据
查看有佣金的员工信息
select * from emp where comm is not null;
查看没有上级的员工信息
select * from emp where mgr is null;
in和not in
后面跟一个集合或者子查询,用来查询条件列值是否在后面集合中
in表示如果在集合或者子查询中,条件是成立的,否则不成立
not in正相反
- 表示一个简单的集合
-
(元素,元素,...,元素)
注意这种形式只能表示单个元素值的集合
-
查询部门是10号或者20号的员工信息
select * from emp where deptno in(10,20);
select * from emp where deptno not in(10,20,50);
exists和not exists
后面跟子查询,它可以和in,not in相互转换
exists如果子查询的sql语句能查询出结果,那么条件成立.查不出则不成立
not exists相反
语法: exists|not exists(select 语句)
- select 1,2,3,4 from dual正常查询,则为真,会执行select * from emp这条语句.
- select 1,2,3,4 from dual不能正常查询,则为假,不会执行前面的语句
select ename from emp where exists(select 1,2,3,4 from dual);
all和any
后面跟一个集合或者子查询
all,any不能直接用等号,只能用<= | >=
选项 | 描述 |
---|---|
>all | 表示大于集合中最大的元素 |
<all | 表示小于集合中最小的元素 |
>any | 表示大于集合中最小的元素 |
<any | 表示小于集合中最大的元素 |
比列表中最少的还少
select ename,sal from emp where sal<all(2000,1500,3000);
比列表中最多的还多
select ename,sal from emp where sal>all(2000,1500,3000);
比列表中最少的还多
select ename,sal from emp where sal>any(2000,3500,3000);
比列表中最多的还少
select ename,sal from emp where sal<any(2000,1500,1000);
条件连接符号and,or
-
and:并且
- 用它连接的两个条件,必须两个都成立时,整个条件才成立
- 只要有一个不成立,条件就不成立
-
or:或者
- 用它连接的两个条件,只要有一个成立,整个条件就是成立的
- 只有当两个条件都不成立时,整体条件才不成立
-
between .. and ..
- 这个属于一个特殊的条件连接符
- 一般只用在数字和日期上
- 表示某个列的值在两个值之间
- 小值在前,大的在后.用它表示的条件是包含边界值的
- 相当于
列>=min and 列<=max
列 in(10,20,30)
等价于 (列=10 or 列=20 or 列=30)
列 not in(10,20,30)
等价于 列!=10 and 列!=20 and 列!=30
order by
排序
- asc:表示升序,默认排序方式,从小到大
- desc:表示降序
工资升序
select * from emp order by sal;
工资降序
select * from emp order by sal desc;
多列排序
如果出现两个或者两个以上的列 排序时,先按第一个列进行排序,如果第一列的值相等,那么安装下一个排序列进行排序
查询员工信息,按照部门编号升序排序,如果部门相同按照工资降序排序
select * from emp order by deptno,sal desc;
聚合函数
注意所以聚合函数,只能单独使用,或者配合group by来使用
聚合函数是将一组数据聚合到一条数据
聚合函数 | 描述 |
---|---|
count | 数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
count
查看所有员工数量
select count(*) from emp;
如果()中的值为列名mgr时,会记录mgr列不为空的数量
select count(mgr) from emp;
max
查询emp表中的最高工资
select max(sal) from emp;
min
查询emp表中的最低工资
select min(sal) from emp;
sum
查询emp表中的工资和
select sum(sal) from emp;
avg
查询emp表中的平均工资
select avg(sal) from emp;
注意:对数字列求平均值时,如果这个列有空值,那么avg函数是不会再去计算空值
也就是有数值的才会再进行求平均值
distinct 去重,
在使用时,只能写在所有列的前面
如果distinct后面跟多个列时,表示这几个列的值同时相等时,才算是重复数据
查看员工表emp中一共有多少组
select distinct deptno from emp;
分组
根据分组列,将分组列值相同的数据,分为一组,它的查询结果每一组只能有一条数据
分组就是将某个列中值相同的字段分为一组语法
select 列,列,...,列
from 表
where 条件
group by 分组列,分组列
order by 排序列
按照不同的组号来分组,并统计每组人数,最高工资和最低工资等信息
select deptno,count(*),sum(sal),avg(sal),max(sal),min(sal)
from emp
group by deptno;
多列分组
多列分组时,多个分组列的值同时相等时,才属于同一个组
select deptno,job,count(*),max(sal)
from emp
group by deptno,job;
having
having和where的区别
having
- 后面跟条件表达式
- having是对分组后的数据进行筛选
- 后面可以跟聚合函数,它比where后执行
where
- 条件表达式,它后面可以跟普通函数,不能使用聚合函数,它是分组前对数据的筛选,优先执行
能写在where中的条件都可以写在having里面(但是不要这样去写)
条件能写where里面就写在where里面,huving里能不写就不要去写
查询各个部门的部门人数,和平均工资,要求部门的平均工资大于2000
select deptno,count(*),avg(sal)
from emp
group by deptno
having avg(sal)>2000;
查询的执行顺序
where > group by >having > order by