Oracle基础(六)增删改查

65 篇文章 0 订阅
64 篇文章 0 订阅
本文介绍了SQL的基础知识,包括查询、条件语句、时间类型比较、排序、分组以及去重。重点讲解了Oracle中的查询语法,如`WHERE`、`LIKE`、`BETWEEN`、`ORDER BY`、`GROUP BY`和`HAVING`子句,并给出了实例,如按部门编号和工资升序排序,以及如何过滤出平均工资高于特定值的部门。
摘要由CSDN通过智能技术生成
SQL 基础

SQL(Structured Query Language , 结构化的查询语言),用来实现关系运算中的查询.
只要是关系型数据库SQL语言就是一套标准的语言

SQL语言分类
1.查询语言
用于检索数据库中存储的行,可以使用SQL中的Select语句编写查询
2.数据操作语言(DML)
insert 添加
update 修改
delete 删除
merge 合并
3.数据定义语言(DDL)
create 创建数据结构的时候使用
alter 修改数据库结构
drop 删除数据库结构
rename 修改表名
truncate 截断表(删除表中所有数据)
4.数据控制语言(DCL)
grant 授予其他用户/角色 数据结构的操作权限
revoke 收回权限
5.事物控制(TCL)
将修改的数据永久的保存到表中
commit 永久性保存
rollback 回滚 取消所做的修改
savepoint 设置保存点,可以回滚到指定位置

编写SQL语句的规则
1.SQL关键字不区分大小写
2.对象名和列名不区分大小写
3.列中的值区分大小写

SCOTT用户

SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
DEPT部门表
EMP 员工表
BONUS
SALGRADE
SQL> desc dept;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- --------------------
 DEPTNO                                    NOT NULL NUMBER(2) 		部门编号
 DNAME                                              VARCHAR2(14)	部门名称
 LOC                                                VARCHAR2(13)	部门地址
SQL> desc emp
 名称                                      是否为空? 类型
 ----------------------------------------- -------- --------------
 EMPNO                                     NOT NULL NUMBER(4)		员工编号
 ENAME                                              VARCHAR2(10)	第三方
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)
select * from table_name;

		select : 用于指定要检索的列(用于展示的列)
		* : 表示所有列
		from : 用于指定检索的表
		table_name : 查询的表名

	SQL> select * from dept;

	    DEPTNO DNAME          LOC
		---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

where : 用于指定条件语句,如果条件语句返回为true,返回当前行数据,如果为false,这不会显示
expression : 表示条件语句
=
<>,!=
>=
<=
<
between…and : 在两个值之间
in 匹配列表中的值
like 模糊查询
null 检查空

时间类型比较
1.以Oracle默认时间格式查询(dd-MM月-yy)

SQL> select ename,sal,hiredate from emp where hiredate> '01-1月-82';

ENAME             SAL HIREDATE
---------- ---------- --------------
SCOTT            3000 19-4月 -87
ADAMS            1100 23-5月 -87
MILLER           1300 23-1月 -82

2.时间转换将字符串转换成时间格式
to_date(‘1982-01-01’,‘yyyy-MM-dd’) 将字符串转换成时间类型

SQL> select ename,sal,hiredate from emp where hiredate >to_date('1982-01-01','yyyy-MM-dd');
	
	ENAME             SAL HIREDATE
	---------- ---------- --------------
	SCOTT            3000 19-4月 -87
	ADAMS            1100 23-5月 -87
	MILLER           1300 23-1月 -82

	between...and...
	SQL> select ename,sal,hiredate from emp where sal between 1100 and 3000;

	ENAME             SAL HIREDATE
	---------- ---------- --------------
	ALLEN            1600 20-2月 -81
	WARD             1250 22-2月 -81
	JONES            2975 02-4月 -81
	MARTIN           1250 28-9月 -81
	BLAKE            2850 01-5月 -81
	CLARK            2450 09-6月 -81
	SCOTT            3000 19-4月 -87
	TURNER           1500 08-9月 -81
	ADAMS            1100 23-5月 -87
	FORD             3000 03-12月-81
	MILLER           1300 23-1月 -82
	
	已选择11行。

	SQL> select ename,sal,hiredate from emp where sal >= 1100 and sal<= 3000;

	ENAME             SAL HIREDATE
	---------- ---------- --------------
	ALLEN            1600 20-2月 -81
	WARD             1250 22-2月 -81
	JONES            2975 02-4月 -81
	MARTIN           1250 28-9月 -81
	BLAKE            2850 01-5月 -81
	CLARK            2450 09-6月 -81
	SCOTT            3000 19-4月 -87
	TURNER           1500 08-9月 -81
	ADAMS            1100 23-5月 -87
	FORD             3000 03-12月-81
	MILLER           1300 23-1月 -82
	
	已选择11行。



	like "%": 0个到多个字符 "_"单个字符

	SQL> select ename,sal,hiredate from emp where ename like 'S%';
	
	ENAME             SAL HIREDATE
	---------- ---------- --------------
	SMITH             800 17-12月-80
	SCOTT            3000 19-4月 -87

	SQL> select ename,sal,hiredate from emp where ename like '__A%';

	ENAME             SAL HIREDATE
	---------- ---------- --------------
	BLAKE            2850 01-5月 -81
	CLARK            2450 09-6月 -81
	ADAMS            1100 23-5月 -87
逻辑操作符
1.and : 条件都为true才为true 否则都为false
2.or : 如果任意一个条件为true都为true,否则返回false
3.not : 条件是false,返回true,如果条件是true就返回false
如果在select 语句中同时包含group by,having 以及order by,则必须将order by 放在最后

查询部门编号20 工种为CLERK

SQL> select ename,job,deptno from emp where deptno = 20 and job='CLERK';
	
	ENAME      JOB           DEPTNO
	---------- --------- ----------
	SMITH      CLERK             20
	ADAMS      CLERK             20

	岗位,MANAGER 工资高于2500

	SQL> select ename,job,deptno from emp where sal>2500 or job='MANAGER';
	
	ENAME      JOB           DEPTNO
	---------- --------- ----------
	JONES      MANAGER           20
	BLAKE      MANAGER           30
	CLARK      MANAGER           10
	SCOTT      ANALYST           20
	KING       PRESIDENT         10
	FORD       ANALYST           20
	
	已选择6行。

工种为CLERK,部门编号不是10,30,40


	SQL> select ename,sal,hiredate from emp where deptno not in(10,30,40) and job = 'CLERK'
	  2  ;
	
	ENAME             SAL HIREDATE
	---------- ---------- --------------
	SMITH             800 17-12月-80
	ADAMS            1100 23-5月 -87

Order By 子句,对行进行排序
select <cloumn1,…> from table_name
where expression
order by column1[,column2…] [asc | desc]
order by : 表示按列名进行排序
asc 升序(默认)
desc 降序

查询部门编号30,安装工资升序排序

SQL> select ename,sal,comm from emp where deptno = 30 order by sal asc;

	ENAME             SAL       COMM
	---------- ---------- ----------
	JAMES             950
	WARD             1250        500
	MARTIN           1250       1400
	TURNER           1500          0
	ALLEN            1600        300
	BLAKE            2850
	
	已选择6行。

多行排序

SQL> select ename,sal,comm from emp where deptno = 30 order by sal asc,comm desc;
	
	ENAME             SAL       COMM
	---------- ---------- ----------
	JAMES             950
	MARTIN           1250       1400
	WARD             1250        500
	TURNER           1500          0
	ALLEN            1600        300
	BLAKE            2850
	
	已选择6行

如果在select语句中同时包含group by,having以及order by ,则必须将order by 放在最后
group by 分组
select <cloumn1,…> from table_name
group by column1[,column2…]

多列分组

SQL> select job,deptno,count(1) from emp group by job,deptno order by deptno;
	
	JOB           DEPTNO   COUNT(1)
	--------- ---------- ----------
	CLERK             10          1
	MANAGER           10          1
	PRESIDENT         10          1
	ANALYST           20          2
	CLERK             20          2
	MANAGER           20          1
	CLERK             30          1
	MANAGER           30          1
	SALESMAN          30          4
	
	已选择9行。
	
	   	EMPNO	ENAME	JOB	MGR	HIREDATE	SAL	COMM	DEPTNO
	1	7369	SMITH	CLERK	7902	1980-12-17	800		20
	2	7499	ALLEN	SALESMAN	7698	1981-2-20	1600	300	30
	3	7521	WARD	SALESMAN	7698	1981-2-22	1250	500	30
	4	7566	JONES	MANAGER	7839	1981-4-2	2975		20
	5	7654	MARTIN	SALESMAN	7698	1981-9-28	1250	1400	30
	6	7698	BLAKE	MANAGER	7839	1981-5-1	2850		30
	7	7782	CLARK	MANAGER	7839	1981-6-9	2450		10
	8	7788	SCOTT	ANALYST	7566	1987-4-19	3000		20
	9	7839	KING	PRESIDENT		1981-11-17	5000		10
	10	7844	TURNER	SALESMAN	7698	1981-9-8	1500	0	30
	11	7876	ADAMS	CLERK	7788	1987-5-23	1100		20
	12	7900	JAMES	CLERK	7698	1981-12-3	950		30
	13	7902	FORD	ANALYST	7566	1981-12-3	3000		20
	14	7934	MILLER	CLERK	7782	1982-1-23	1300		10
								
	部门编号分组					
	10		20	JOB		30		
	CLARK		SMITH	CLERK		ALLEN		
	KING		JONES	MANAGER		WARD		
	MILLER		SCOTT	ANALYST		MARTIN		
			ADAMS	CLERK		BLAKE		
			FORD	ANALYST		TURNER		
						JAMES		
								
								
								
								
		根据部门编号工种分组				
								
		20	JOB					
		SMITH	CLERK	ADAMS	CLERK			
		JONES	MANAGER					
		SCOTT	ANALYST	FORD	ANALYST	

**having 子句过滤组 **
显示平均工资高于2000的部门编号,平均工资,最高工资…

SQL> select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
	
	    DEPTNO   AVG(SAL)
	---------- ----------
	        20       2175
	        10 2916.66667

只保留工资大于1000的行,根据部门分组,保留部门平均工资高于2000的行

SQL> select deptno,avg(sal) from emp where sal > 1000 group by deptno having avg(sal)>2000 order by deptno;
	
	    DEPTNO   AVG(SAL)
	---------- ----------
	        10 2916.66667
	        20    2518.75

使用 distinct 来检索唯一的列值
去除列中的重复值

SQL> select job,count(1) from emp group by job;

	JOB         COUNT(1)
	--------- ----------
	CLERK              4
	SALESMAN           4
	PRESIDENT          1
	MANAGER            3
	ANALYST            2
	
	SQL> select distinct job from emp;
	
	JOB
	---------
	CLERK
	SALESMAN
	PRESIDENT
	MANAGER
	ANALYST

使用运算符:
(+,-,*,/)

SQL> select ename,sal*(1.2) from emp;

	ENAME       SAL*(1.2)
	---------- ----------
	SMITH             960
	ALLEN            1920
	WARD             1500
	JONES            3570
	MARTIN           1500
	BLAKE            3420
	CLARK            2940
	SCOTT            3600
	KING             6000
	TURNER           1800
	ADAMS            1320
	
	ENAME       SAL*(1.2)
	---------- ----------
	JAMES            1140
	FORD             3600
	MILLER           1560
	
	已选择14行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值