简单查询

时间:2024-01-25 18:30:29

数据库分类

  • 关系型数据库: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