1.SQL语句之单表的增删改查和数据备份

本文深入解析SQL查询的精髓,涵盖单表查询、字段选择、数据排序、条件筛选及函数应用,助您掌握高效数据检索的艺术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

增删改查中查是最重要的,也是内容最多的,所以单独讲

单表查询

简单SQL语句

查询表中所有数据  select * from 表名;  *表示所有

 select * from emp;

 查询表中指定字段  select 字段名1,字段名2... from 表名;

select ename,empno from emp;

 查询结果中的字段使用别名  select 字段名 别名 from 表名;          select 字段名 "别名" from 表名;
                                              select 字段名 as 别名 from 表名;     select 字段名 as "别名" from 表名;

                                           (四种均可)注意as关键字可以省略,别名中没有特殊字符双引号也可省略

select empno 员工编号,ename as "姓名" from emp;

连接符    select 字段名||'字符'||字段名||... from 表名
             ||为SQL中的字符连接符,使用在select和from之间
             字符连接符格式为 字段名||'字符'||字段名
             注意:一个拼接好的连接在结果集中作为一个新的字段显示,可以使用别名优化字段显示

select empno||'的姓名是'||ename from emp;
select empno||'的姓名是'||ename as 信息 from emp;

去除重复  select distinct 字段名1,字段名2... from 表名
               注意:去除重复的规则是按行去除的,多行数据完全相同取其一

select distinct job from emp;
select distinct job,mgr from emp;

排序

注意:可以在排序中使用别名
  单字段排序   select 字段名1,字段名2.... from 表名 order by 字段名 asc(升序排序) 不写默认升序排序
                       select 字段名1,字段名2.... from 表名 order by 字段名 desc(降序排序)

select distinct ename,empno from emp order by ename;
select distinct ename,empno from emp order by empno desc;

多字段排序   select 字段名1,字段名2.... from 表名 order by 字段名1,字段名2...
                     先按照字段名1排序,字段名1的值相同按照字段名2排序

字段的逻辑运算  select关键字和from之间的关键字可以直接进行四则运算
                           注意:1.字段与字段之间也可以进行运算
                          2.字段值需要是数值类型,才能进行运算

select empno,ename,sal*2+100,sal+comm from emp;

 where子句查询  

select 字段名1,字段名2... from 表名 where 筛选条件
单条件筛选  使用=,>,>=,<,<=,<> 单个条件中
                    注意:如果条件中的值为字符,必须使用单引号括起来

select * from emp where ename='SMITH';
select * from emp where hiredate >='01-1月-1980' order by hiredate;
--注意:oracle默认日期格式为 日-月-年 '03-1月-1980'

多条件筛选  使用and,or,like,escape,is null等关键字

--查询工资在2000-3000之间的员工信息
select * from emp where sal>=2000 and sal<3000;
select * from emp where sal between 2000 and 3000;

--查询工作为SALESMAN,ANALYST的员工信息
select * from emp where job='SALESMAN' or job='ANALYST';
select * from emp where job in('SALESMAN','ANALYST');

--查询姓名中包含S的,以S开头的,以S结尾的,第二个字符为A的用户信息
select * from emp where ename like '%S%';  --like表示姓名中包含S的,%表示任意个任意字符
select * from emp where ename not like '%S%';  --like表示姓名中不包含S的,%表示任意个任意字符
select * from emp where ename like 'S%';  --以S开头的
select * from emp where ename like '%S';  --以S结尾的
select * from emp where ename like '_A%';  --_表示任意一个字符

--查询名字中包含下划线'_'的用户信息
select * from emp where ename like '%A_%' escape 'A' 
--使用escape关键字将普通字符设置为转义字符,又通过转义字符将_转为普通字符

--查询有津贴的员工信息
select * from emp where comm is not null;
--查询没有津贴的员工信息
select * from emp where comm is null;

Oracle函数

主要包括单行函数,多行函数,转换函数以及其他函数

单行函数

格式:select 函数名(字段名) from 表名
注意:可以和字段直接混用,实际就是对每行数据进行修饰
字符函数 对字符串进行操作

--查询员工姓名并小写显示
select lower(ename) from emp;

其余函数见下表: 

 数值函数: 对数值类型的数据进行运算 

--查询员工工资并向下取整
select floor(sal) from emp;
--伪表:不存储数据的表,为了方便进行数据的验证而临时存在的表,表名为dual
select abs(-1) from dual;

其余函数见下表: 

日期函数: 对日期进行查找运算的函数

--获取系统当前时间
select sysdate from dual;
select months_between('18-9月-2011','21-12月-2015') from dual;

其余函数见下表:

多行函数 

max(),min(),avg(),sum(),count()
注意:多行函数不能和字段直接混用,除非分组,实际是对查询的数据进行统计

select max(sal) from emp;
select ename,max(sal) from emp;  --错误,很明显前面是14行后面是1行
select count(*) from emp;  --查询表的记录数
select count(comm) from emp;  --查询字段值的数量,null会自动过滤不计
select count(distinct *) from emp;  --查询公司有多少工作种类

转换函数

to_number(数值类型字符):将字符转换为数值
to_char(数值或日期):将数值或日期转换为字符
to_date(日期格式字符):将字符转换为日期

字符转数字  char-->number

select to_number('123') from dual;

数字转字符  number-->char
    指定显示格式
        9表示位置占位,例如999,999,999会将数字按照三个一组使用逗号隔开
        0也可以进行占位分组,但是如果真是数据位数不足,会使用0进行补位
        $表示美元符号  ¥表示人民币符号

select to_char(123) from dual;
select to_char(123456789,'$999,999,999');

字符转换为日期 char-->date
    使用to_date('要转换的字符',日期格式)函数将字符转换为日期
    注意:1.字符必须符合日期格式
               2.oracle默认的转换格式为日月年,例如(01-1月-2015)
               3.常用日期格式:  yyyy-mm-dd      yyyy/mm/dd

select * from emp where hiredate>'01-1月-1980';  --默认格式
select * from emp where hiredate>to_date('1980-01-01','yyyy-mm-dd');
select * from emp where hiredate>to_date('1980-01-01','yyyy/mm/dd');

日期转字符  date-->char
    使用to_char('要转换的日期')

select to_chat(hiredate) from emp  --使用默认格式将日期转换为字符
select to_chat(hiredate,'yyyy-mm-dd') from emp  --使用指定格式将日期转换为字符
select to_chat(hiredate,'yyyy/mm/dd') from emp  --使用指定格式将日期转换为字符
select to_chat(hiredate,'yyyy"年"mm"月"dd"日"') from emp  --使用指定格式将日期转换为字符

其他函数

nvl() : 如果字段值不为null,返回该字段的值。如果为null则返回新的值
        格式:nvl(字段名,新的值)
nvl2() 如果字段不为null,执行处理1,否则执行处理2
        格式:nvl2(字段名,处理1,处理2) 
decode():如果字段中的值和decode中的条件值相同执行对象的处理。如果都没有执行公共处理
        格式:decode(字段名,值1,处理1,值2,处理2,,...公共处理)

--查询员工工资信息
select ename,job,sal from emp
--查询员工薪水(工资加奖金)
select ename,job,sal+nvl(comm,0) from emp;
select ename,job,nvl2(comm,sal+com,sal) from emp;
--显示员工职称
select ename,job,decode(job,'MANAGER','经理','PRESIDENT','董事长','普通员工') from emp;

分组查询和分组筛选

关键字:group by 分组字段名
      注意1.使用了分组后,在select语句中只允许出现分组字段和多行函数
              2.如果是多字段分组,则先按照第一字段分组,后按照第二字段分组,一次类推
              3.在where子句中不允许出现多行函数

分组筛选
    关键字:having
        作用:针对分组进行分组后的数据筛选,允许使用多行函数
        注意:having关键字必须和group by一块使用,不能单独使用
        where和having的比较:
            where子句不允许出现多行函数,having子句允许出现多行函数
            where子句和having子句都可以使用普通字段进行筛选,但是where效率高于having
            where执行顺序:from-->where-->group by-->select-->order by
            having执行顺序:from-->group by-->select-->having-->order by

        结论:在分组语句中,使用where进行字段筛选,使用having进行多行函数筛选

--查询不同部门的最高工资
select deptno,max(sal) group by deptno;
--查询不同工作岗位员工数
select job,count(*)from emp group by job;
--查询不同工作部门不同岗位工作人数
select deptno,job,count(*) from emp group by deptno,job order by deptno;

--查询不同部门的不同工作岗位的并且人数大于1的信息
select deptno,job,count(*)from emp group by deptno,job having count(*)>1 order by deptno;
--查询部门号大于10的不同部门的不同工作岗位的人数
select deptno,job,count(*) from emp where deptno>10 group by deptno,job order by deptno;
select deptno,job,count(*)from emp group by deptno,job having deptno>1 order by deptno;

单表增删改

数据库增删改&数据备份 
    注意:增删改的数据SQL语句执行完毕后,不会立马进行数据的写入。
          还需要手动对数据进行提交,如果数据有问题还可以回滚

    主键:在一张表中,某个字段的值是非空唯一的,将此字段设置为主键
         作用:唯一的标识一条数据

增加数据

 insert into 表名(字段名1,字段名2,...) values(值1,值2,...)
    注意1:主键必须赋值,允许为空的字段可以不赋值
            2.插入语句表名后跟的字段名为要赋值的字段,值和字段必须一一对应
           3.如果是全字段插入,可以省略字段名

--在部门中新增一个新的部门信息 编号:50 名称:哈哈 地址:北京
insert into dept(deptno,dname,loc) values (50,'哈哈','北京');
insert into dept values (60,'哈哈','北京');

删除数据

delete from 表名 (删除表中所有数据)
truncate table 表名 删除表中所有数据,效率高于delete
delete from 表名 where 条件  (删除符合条件数据)

--删除刚才添加的一条信息
delete from dept where deptno=60;

更新数据

update 表名 set 字段名1=新值1,字段名2=新值2...  (表中所有数据全部更改)
update 表名 set 字段名1=新值1,字段名2=新值2...where 条件 (符合条件的数据更改)

--将添加的数据名称改为嘿嘿 地址改为上海
update dept set where dname='嘿嘿',loc='上海' where deptno=50;

数据的备份

注意:只会备份表结构和表数据,约束不会备份

表级别备份

全部备份:create table 新表名 as select * from 要备份的表名;
部分备份:create table 新表名 as select 字段名1,字段名2... from 要备份的表名;

create table deptBak as select * from dept;

数据整体插入

insert into 插入表名 select * from 表名;
注意:查询语句结果的字段数据必须和插入表名的字段数量一致,类型一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值