数据库分类
- 关系型数据库:oracle, mysql, db2, sql server, sqllite等
非关系型数据库:redis, hbase等
- DBMS:
- database management system
- 数据库管理系统
- RDBMS:
- relational database management system
- 关系型数据库管理系统
简单查询
emp表如下
empno | ename | job | mgr | hiredate | sal | comm | deptno |
---|---|---|---|---|---|---|---|
7369 | SMITH | CLERK | 7902 | 1980/12/17 | 800.00 | 20 | |
7499 | ALLEN | SALESMAN | 7698 | 1981/2/20 | 1600.00 | 300.00 | 30 |
7521 | WARD | SALESMAN | 7698 | 1981/2/22 | 1250.00 | 500.00 | 30 |
7566 | JONES | MANAGER | 7839 | 1981/4/2 | 2975.00 | 20 | |
7654 | MARTIN | SALESMAN | 7698 | 1981/9/28 | 1250.00 | 1400.00 | 30 |
7698 | BLAKE | MANAGER | 7839 | 1981/5/1 | 2850.00 | 30 | |
7782 | CLARK | MANAGER | 7839 | 1981/6/9 | 2450.00 | 10 | |
7788 | SCOTT | ANALYST | 7566 | 1987/4/19 | 3000.00 | 20 | |
7839 | KING | PRESIDENT | 1981/11/17 | 5000.00 | 10 | ||
7844 | TURNER | SALESMAN | 7698 | 1981/9/8 | 1500.00 | 0.00 | 30 |
7876 | ADAMS | CLERK | 7788 | 1987/5/23 | 1100.00 | 20 | |
7900 | JAMES | CLERK | 7698 | 1981/12/3 | 950.00 | 30 | |
7902 | FORD | ANALYST | 7566 | 1981/12/3 | 3000.00 | 20 | |
7934 | MILLER | CLERK | 7782 | 1982/1/23 | 1300.00 | 10 |
查询表中所有信息
select * from emp;
查询单个列信息
姓名,生日,部门
select ename,hiredate,deptno from emp;
条件查询
not
取反
查看工资大于2000和小于2000的员工姓名
select ename from emp where sal>2000;
select ename 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 * from emp where exists(select 1,2,3,4 from dual);
all和any
后面跟一个集合或者子查询
all,any不能直接用等号,只能用<= | >=
选项 | 描述 |
---|---|
>all | 表示大于集合中最大的元素 |
<all | 表示小于集合中最小的元素 |
>any | 表示大于集合中最小的元素 |
<any | 表示小于集合中最大的元素 |
查询员工信息要求,要求比下列工资都少(2000,1500,3000)
比列表中最少的还少
select * from emp where sal<all(2000,1500,3000);
条件连接符号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 ename,empno,sal,job,deptno
from emp
order by deptno,job;
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