2019独角兽企业重金招聘Python工程师标准>>>
一、单表查询
1、基本SELECT语句
1)、查看表结构用desc
desc dual;
2)、空表dual,最常用的空表
select2 * 4from dual;
selectsysdatefrom dual;
3)、在使用中我们可以将取到的字段起别名
Selectsysdate日期from dual;
双引号能保持格式
如:selectsysdate “toDay 日期” from dual;
4)、查看表所属用户
select owner from dba_tables where table_name='表名';
注:system.tb_booktype 表tb_booktype属于system用户
为了后续我们使用,我们现在创建“图书类型表—tb_booktype”和“图书信息表— tb_bookinfo”
2、比较运算符
1)、 =、<、>、>=、<=、<> 、!=
在图书类别表查看到ID等于2的数据
select* from tb_booktype t where t.id='2'
在图书类别表查看到ID大于2的数据
select* from tb_booktype t where t.id >'2'
在图书类别表查看到ID小于2的的数据
select* from tb_booktype t where t.id<'2'
在图书类别表查看到ID小于等于2的数据
select* from tb_booktype t where t.id<='2'
在图书类别表查看到ID大于等于2的数据
select* from tb_booktype t where t.id>='2'
在图书类别表查看到ID不等于等于2的数据
select* from tb_booktype t where t.id<>'2'
select* from tb_booktype t where t.id!='2'
2)、in、not in
in(是满足一个字段的多个值)
在图书类别表查看类别名称等于自然和人文的数据
select* from tb_booktype t where t .typename in ('自然','人文')
在图书类别表查看类别名称等于自然和人文的数据且;并且类别ID等于1和2
select* from tb_booktype t where t .typename in ('自然','人文')and t.id notin ('1','2')
3)、like ,not like
like模糊
在图书类别表查看类别名称包含“文”的数据
select* from tb_booktype t where t.typename like'%文'
注意:百分号的位置不同查出的数据也不相同!
select* from tb_booktype t where t.typename like'文%'
select* from tb_booktype t where t.typename like'%文%'
4)、is null、is not null
在图书类别表查看类别名称为空的数据
select* from tb_booktype t where t.typename isnull
3、逻辑运算符
1)and
and(就是和的意思,必须同时满足条件)
在图书类别表查看到ID大于2的且小于45的数据
select* from tb_booktype t where t.id>'2'and t.id<'45'
2)、or
or(是或者的意思,两个或者多个条件满足一个就可以)
在图书类别表查看到ID大于2的或类别名称等于自然的数据
select* from tb_booktype t where t.id>'2'or t.typename='自然'
4、order by 子句
orderby、asc(升序),desc(降序)
在图书类别查看数据,按降序排序
select* from tb_booktype t orderby t.id desc
二、多表查询
1、子查询
求部门分组后工资最高的员工信息
select emp.ename, emp.sal, emp.deptno from emp, (selectmax(sal) max_sal, deptno from emp groupby deptno) t where emp.sal = t.max_sal and emp.deptno = t.deptno;
求部门平均工资等级
select s.grade, t.deptno, t.avg_sal from scott.salgrade s, (select deptno, avg(sal) avg_sal from emp groupby deptno) t where t.avg_sal > s.losal and t.avg_sal < s.hisal;(between)
2、连接查询
innerjoin(等值连接) 只返回两个表中联结字段相等的行
leftjoin(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
rightjoin(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
fulljoin()取到的除了左右两边都匹配上的记录数,对于左边表与右边表没有匹配的,用null补上作为右边表匹配的数据;右边表与左边表没有匹配的,用null补上作为左边表匹配的数据。总记录数=左边未匹配记录数+右边未匹配记录数+左右都匹配上的记录数
查询出图书类型,和图书名称
select t.typename,tb.bookname from tb_booktype t, tb_bookinfo tb where t.id = tb.typeid
1)inner join(等值连接)
select t.typename,tb.bookname from tb_booktype t
innerjoin tb_bookinfo tb on t.id=tb.typeid
2)left join(左联接)
select t.typename,tb.bookname from tb_booktype t leftjoin tb_bookinfo tb on t.id=tb.typeid
3)right join(右联接)
select t.typename,tb.bookname from tb_booktype t rightjoin tb_bookinfo tb on t.id=tb.typeid
4)full join
select t.typename,tb.bookname from tb_booktype t fulljoin tb_bookinfo tb on t.id=tb.typeid
3、交集、并集、割集查询
1)union
--并集:不带重复数据
select t.id from tb_booktype t
union
select tb.typeid from tb_bookinfo tb;
2)union all
--并集:带重复数据
select t.id from tb_booktype t
unionall
select tb.typeid from tb_bookinfo tb;
3)minus
--割集,显示不同部分(指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第一个 SQL 语句所产生的结果内,那这笔资料就被抛弃)
select t.id from tb_booktype t
minus
select tb.typeid from tb_bookinfo tb;
4)intersect
--交集。
select t.id from tb_booktype t
intersect
select tb.typeid from tb_bookinfo tb;
4、条件表达式——decode 函数和CASE表达式
1)、decode 函数用法
含义解释:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
该函数的含义如下:
IF条件=值1 THEN
RETURN(翻译值1)
ELSIF条件=值2 THEN
RETURN(翻译值2)
......
ELSIF条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
ENDIF
decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多
例子:在图书类型表中查询,当图书类型等于“人文”的时候那么它属于‘百科类’,期他图说类型属于“其他类”
select decode(t.typename,'人文','百科类','其他类') , t.typename name
from tb_booktype t
2)、select case when的一些用法
概述:
sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作。
首先,让我们看一下CASE的语法。在一般的SELECT中,其语法格式如下:
SELECT
CASE <单值表达式>
when <表达式值> then
when <表达式值> then
...
when <表达式值> then
END
应用CASE语句可以让SQL变得简洁高效,从而大大提高了执行效率。而且,CASE的使用一般不会引起性能(相比没有用CASE的语句)低下,反而增加了操作的灵活性
有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
显示格式:
语文 数学 英语
及格 优秀 不及格
------------------------------------------
select
(casewhen语文>=80then'优秀'
when语文>=60then'及格'
else'不及格') as语文,
(casewhen数学>=80then'优秀'
when数学>=60then'及格'
else'不及格') as数学,
(casewhen英语>=80then'优秀'
when英语>=60then'及格'
else'不及格') as英语,
fromtable
三、函数
1、大小写控制函数lower、upper
select lower(‘abcABC’) from dual;
select upper(‘abcABC’) from dual;
substr(target, startIndex, length)
select substr(‘abcABC’, 1, 3) from dual;
2、数字函数trunc、round、substr
1)TRUNC
语法: TRUNC(x[,y])
功能: 计算截尾到y位小数的x值. y缺省为0,结果变为一个整数值.如果y是一个负数,那么就截尾到小数点左边对应的位上.TRUNC()函数截取时不进行四舍五入,一般用于日期的截取上
select trunc(123.458) from dual --123
select trunc(123.458,0) from dual --123
select trunc(123.458,1) from dual --123.4
select trunc(123.458,-1) from dual --120
select trunc(123.458,-4) from dual --0
select trunc(123.458,4) from dual --123.458
select trunc(123) from dual --123
select trunc(123,1) from dual --123
select trunc(123,-1) from dual --120
用在日期类型上,就是截取到日或时间
SELECT TRUNC(SYSDATE) FROM DUAL;
默认是截取系统日期到日,得到2012-12-19
比如值为"2012-12-19 14:30:50"的日期变量
TRUNC(SYSDATE)得到2012-12-19 , 和TRUNC(SYSDATE,'DD')一样
TRUNC(SYSDATE,'YYYY'),得到2012-1-1
TRUNC(SYSDATE,'MM'),得到2012-12-1
TRUNC(SYSDATE,'DD'),得到2012-12-19
TRUNC(SYSDATE,'HH')或HH24,得到2012-12-1914:00:00
TRUNC(SYSDATE,'MI'),得到2012-12-1914:30:00
TRUNC(SYSDATE,'SS'),是会报错的,直接用SYSDATE不用TRUNC
另外说明一下,截取后得到的仍为date数据类型
2)Round 函数
(四舍五入)
描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果。
SELECT ROUND( number, [ decimal_places ] ) FROM DUAL
参数:
number : 欲处理之数值
decimal_places : 四舍五入 , 小数取几位 ( 预设为0 )
例:select round(123.456, 0) from dual; 得到:123
3)Substr
取得字符串中指定起始位置和长度的字符串,
格式:substr( string, start_position, [ length ] )
参数:start_position---正数从左边开始,负数从右边开始
length -----取得的位数
如: substr('This is a test', 6, 2) 得到'is'
substr('This is a test', 6) 得到'is a test'
substr('TechOnTheNet', -3, 3) 得到'Net'
substr('TechOnTheNet', -6, 3) 得到'The'
例:select substr('Thisisatest', -4, 2) valuefrom dual
--得到当前的那年那月
select substr(sysdate,1,6) valuefrom dual
3、通用函数——nul
nvl可以将某个字段的空值转换成指定的值
nvl(字段名,0),就是当你选出来的时候,这个字段虽然为空,但是显示的是0,当然这个0也可以换成其他东西,如:1,2,3……
在图书类别表查看数据类别名称为空的补零
select nvl(t.typename,0),t.id from tb_booktype t
4、组函数—min、max、avg、sum、count
1)max
在图书信息表查看最高的价格
selectmax(tb.price) from tb_bookinfo tb
2)min
在图书信息表查看最低的价格
selectmin(tb.price) from tb_bookinfo tb
3)avg
在图书信息表查看平均的价格
selectavg(tb.price) from tb_bookinfo tb
4)sum
在图书信息表算出表中所有价格的和
selectsum(tb.price) from tb_bookinfo tb
5)count
在图书信息表中价格不为空的数据条数
selectcount (tb.price) from tb_bookinfo tb
在图书信息表中价格不相同的数据条数
selectcount(distinct tb.price) from tb_bookinfo tb
6)distinct 关键字
去掉重复数据distinct
在图书类别表中查出有几类图书,但是表中有重复如何查询呢?,
这里我们用到了 distinct去掉重复数据
selectdistinct(t.typename) from tb_booktype t
拓展:
Oracle比较一列的最大值或者最小值,我们会用MAX和MIN函数,但是对于比较一行的最大值或最小值呢?是不是日常用的少,很多人都不知道有ORACLE也有内置函数实现这个功能:COALESCE / GREATEST /LEAST
1. COALESCE返回该表达式列表的第一个非空value。
格式:COALESCE(value1, value2, value3, ...)
含义:返回value列表第一个非空的值。
value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。
EXAMPLE: selectcoalesce (1, null, 2 ) from dual ; -- 返回1
selectcoalesce ( null, 2, 1 ) from dual ; -- 返回2
selectcoalesce (t.empno, t.mgr ) from scott.emp t ; -- 效果类似 NVL( t.empno, t.mgr )
2. GREATEST 返回值列表中最大值
格式: GREATEST(value1, value2, value3, ...)
含义:返回value列表最大的值。
value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。
当value值列表中有一个为NULL,则返回NULL值。
EXAMPLE: select greatest (1, 3, 2 ) from dual ; -- 返回3
select greatest ( 'A', 'B', 'C' ) from dual ; -- 返回C
select greatest (null, 'B', 'C' ) from dual ; -- 返回null
select greatest (t.empno, t.mgr ) from scott.emp t ; -- 返回empno和mgr 较大值
3. LEAST 返回值列表中最小值
格式: LEAST(value1, value2, value3, ...)
含义:返回value列表最小的值。
value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。
当value值列表中有一个为NULL,则返回NULL值。
EXAMPLE: select least (1, 3, 2 ) from dual ; -- 返回1
select least ( 'A', 'B', 'C' ) from dual ; -- 返回A
select least (null, 'B', 'C' ) from dual ; -- 返回null
select least (t.empno, t.mgr ) from scott.emp t ; -- 返回empno和mgr 较小值
5、数据分组
1)group by 分组
查询图书信息表中的”图书数量”按”图书类型id”进行分组;
select tb.typeid,count(tb.bookname) from tb_bookinfo tb
groupby tb.typeid;
2)having 对分组数据进行过滤
having用法
groupby后面是要跟着的select中所有不是聚合函数的字段。
注释:聚合函数:聚合函数对一组值执行计算并返回单一的值。聚合函数忽略空值。聚合函数经常与SELECT语句的GROUPBY子句一同使用
例1: selectcount(*) from emp;
//只是查询总总数 emp这张表里一共有多少条记录所以不用group by
例2: selectcount(*) , deptno from emp groupby deptno;
// 根据deptno 分组,查到的数据就是 列出不同部门记录总数
selectcount(*) , deptno , comm from emp groupby deptno , comm;
// 根据deptno 和 comm 分组 以此类推
groupby后面是要跟着的select中所有不是聚合函数的字段 否则会报错。
having相当于where与where的唯一区别是当查询语句中有聚合函数的时候就不能用where了只能用having
求图书平均工资大于30的数据:
select * from(
selectavg(tb.price) price,tb.typeid
from tb_bookinfo tb
groupby tb.typeid
)
where price>40
selectavg(tb.price) price,tb.typeid
from tb_bookinfo tb
groupby tb.typeid
havingavg(tb.price)>40
6、日期型函数
常用日期数据格式(该段为摘抄)
Y或YY或YYY 年的最后一位,两位或三位Select to_char(sysdate,’YYY’) from dual;002表示2002年
SYEAR或YEAR SYEAR使公元前的年份前加一负号Select to_char(sysdate,’SYEAR’) from dual; -1112表示公元前111 2年
Q 季度,1~3月为第一季度Select to_char(sysdate,’Q’) from dual;2表示第二季度①
MM 月份数Select to_char(sysdate,’MM’) from dual;12表示12月
RM 月份的罗马表示Select to_char(sysdate,’RM’) from dual; IV表示4月
Month用9个字符长度表示的月份名Select to_char(sysdate,’Month’) from dual; May后跟6个空格表示5月
WW 当年第几周Select to_char(sysdate,’WW’) from dual;24表示2002年6月13日为第24周
W 本月第几周Select to_char(sysdate,’W’) from dual;2002年10月1日为第1周
DDD 当年第几, 1月1日为001,2月1日为032 Select to_char(sysdate,’DDD’) from dual;3632002年1 2月2 9日为第363天
DD 当月第几天Select to_char(sysdate,’DD’) from dual;0410月4日为第4天
D 周内第几天Select to_char(sysdate,’D’) from dual;52002年3月14日为星期一
DY 周内第几天缩写Select to_char(sysdate,’DY’) from dual; SUN 2002年3月24日为星期天
HH或HH12 12进制小时数Select to_char(sysdate,’HH’) from dual;02午夜2点过8分为02
HH24 24小时制Select to_char(sysdate,’HH24’) from dual;14下午2点08分为14
MI 分钟数(0~59) Select to_char(sysdate,’MI’) from dual;17下午4点17分
SS 秒数(0~59) Select to_char(sysdate,’SS’) from dual;2211点3分22秒
提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。
1)Sysdate 当前日期和时间
SQL> Selectsysdatefrom dual;
2)Last_day 本月最后一天
SQL> Select last_day(sysdate) from dual;
3)Add_months(d,n) 当前日期d后推n个月
用于从一个日期值增加或减少一些月份
date_value:=add_months(date_value,number_of_months)
函数可以得到某一时间之前或之后n个月的时间
如select add_months(sysdate,-6) from dual;
该查询的结果是当前时间半年前的时间
如select add_months(sysdate,6) from dual;
该查询的结果是当前时间半年后的时间
SQL> Select add_months(sysdate,2) from dual;
4)Months_between(f,s) 日期f和s间相差月数
SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;
5)NEXT_DAY(date,char)
date参数为日期型,
char:为1~7或Monday/Mon~Sunday/
指定时间的下一个星期几(由char指定)所在的日期,
char也可用1~7替代,1表示星期日,2代表星期一。。。。
还可以是星期一、星期二。。。星期日
Sql代码
select next_day(sysdate,'星期日') from dual;
返回由"char "命名的,在变量"date "指定的日期之后的第一个工作日的日期。参数"char "必须为该星期中的某一天。
SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual;