2.1 所需要的表

雇员表(EMP)

No

字段

类型

描述

1

EMPNO

NUMBER(4)

表示雇员编号,是唯一编号

2

ENAME

VARCHAR2(10)

表示雇员姓名

3

JOB

VARCHAR2(9)

表示工作职位

4

MGR

NUMBER(4)

表示一个雇员的领导编号

5

HIREDATE

DATE

表示雇佣日期

6

SAL

NUMBER(7,2)

表示月薪,工资

7

COMM

NUMBER(7,2)

表示奖金,或者称为佣金

8

DEPTNO

NUMBER(2)

部门编号

部门表(DEPT)

No

字段

类型

描述

1

DEPTNO

NUMBER(2)

部门编号,是唯一编号

2

DNAME

VARCHAR2(14)

部门名称

3

LOC

VARCHAR2(13)

部门位置

薪资等级表(SALGRADE)

No

字段

类型

描述

1

SALGRADE

NUMBER

工资等级

2

LOSAL

NUMBER

最低工资

3

HISAL

NUMBER

最高工资

奖金表(BONUS)

No

字段

类型

描述

1

ENAME

VARCHAR2(10)

雇员姓名

2

JOB

VARCHAR2(9)

雇员工作

3

SAL

NUMBER

雇员工资

4

COMM

NUMBER

雇员奖金(佣金)

2.2 简单查询语句

1)查询全部

SELECT * FROM 表名 [别名];

如:SELECT * FROM emp;

2)查询表中记录数

SELECT COUNT(*) FROM 表名;

如:SELECT COUNT(*) FROM emp;

3)查询指定列

SELECT 列名 FROM 表名;

如:SELECT empno,ename,job FROM emp;

4)为列起别名

SELECT 列名 别名 FROM 表名;(注意,有四则运算时,其别名不要用中文)

如:SELECT empno 编号,ename 姓名,job 工作 FROM emp;

5)去掉重复项

SELECT [DISTINCT] * | 列名 别名

FROM 表名;

如:SELECT DISTINCT job FROM emp;

6)字符串连接

固定信息要用"'"括起来,字符串间用"||"连接

如:SELECT '编号是:'||empno||',姓名是:'||ename||',工作是:'||job FROM emp;

7)四则运算

支持加减乘除,先乘除后加减

如求出每个雇员的姓名和年薪:SELECT ename,sal*12 FROM emp;

sal*12的意义不明确,可以为这个运算起一个别名,但是此时一定要回避中文

如:SELECT ename,sal*12 income FROM emp;

2.3 限定查询

1)最基本的限定查询

SELECT [DISTINCT] *|列名 [别名]

FROM 表名

[WHERE 条件(s)]

如:SELECT * FROM emp WHERE sal>1500;

2)IS(NOT) NULL

如查询每月可以得到奖金的雇员信息:SELECT * FROM emp WHERE comm IS NOT NULL;

3)AND和OR和NOT

同时满足两个条件用AND连接

如查询工资大于1500且每月可以得到奖金的雇员信息:

SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL;

满足一个条件即可的用OR连接

如查询工资大于1500或者每月可以得到奖金的雇员信息:

SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL;

用NOT取反

如查询工资不大于1500且每月不可以得到奖金的雇员信息(相当于整体的条件取反):

SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL);

这里取反的条件要加(),否则相当于只对sal>1500取反,然后连接AND,不是对整体取反

4)指定范围BETWEEN…AND…

字段 BETWEEN 最小值 AND 最大值,等价于:字段>=最小值 AND 字段<=最大值

如查询工资大于1500且小于3000的员工信息:

SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;

如查询在1981年雇佣的员工信息,即在1981年1月1日~1981年12月31日之间雇佣的雇员,注意日期表示的时候要加"'"

SELECT * FROM emp WHERE hiredate BETWEEN '01-1月-81' AND '31-12月-81';

5)范围查询IN

字段 (NOT) IN (值1,值2,…,值n)

如查询雇员编号是7369、7499、7521的雇员信息:

SELECT * FROM emp WHERE empno IN (7369,7499,7521);

如果在指定的查询范围中指定了额外的内容,不影响程序运行:

如SELECT * FROM emp WHERE ename IN ('SMITH', 'ALLEN', 'KING', '#$#$#$#$');

6)模糊查询LIKE

两种通配符:

%:可以匹配任意长度的内容

_:可以匹配一个长度的内容

如查询雇员姓名中第二个字母是M的员工信息:

SELECT * FROM emp WHERE ename LIKE '_M%';

如查询雇员姓名中包含M的员工信息(即可以在任意的位置上出现M):

SELECT * FROM emp WHERE ename LIKE '%M%';

如查询1981年雇佣的员工信息:

SELECT * FROM emp WHERE hiredate LIKE '%81%';

如查询工资中包含6的员工信息:

SELECT * FROM emp WHERE sal LIKE '%6%';

7)比较计算符号

在操作条件中可以使用:>、>=、<、<=

不等于符号有两种:<>或者!=

如查询雇员编号不是7369的员工信息:

SELECT * FROM emp WHERE empno<>7369;

SELECT * FROM emp WHERE empno!=7369;

2.4 对结果进行排序ORDER BY

SELECT [DISTINCT] *|列名 [别名]

FROM 表名 [别名]

[WHERE 条件(s)]

[ORDER BY 排序字段1 [ASC|DESC],…]

ASC升序、DESC降序,默认是升序

如查询工资降序排列的员工信息:

SELECT * FROM emp ORDER BY sal DESC;

如查询10部门的所有雇员信息,按照工资高低排序,如工资相等,按照雇佣日期从早到晚排序:

SELECT * FROM emp

WHERE deptno=10

ORDER BY sal DESC,hiredate ASC;

2.5 单行函数

function_name(column|expression,[arg1,arg2,…])

参数说明:function_name:函数名称

column:数据库列名

expression:字符串或计算表达式

arg1,arg2:在函数中使用参数

dual表是一个虚拟表,常用来进行函数功能测试

1)字符串函数

接受字符串输入并返回字符或数值

a)小写变大写UPPER()

如:SELECT UPPER('smith') FROM dual;

如用户查找时不会考虑姓名是大写还是小写,所以在查询语句中为了方笔就可以使用upper函数:

SELECT * FROM emp WHERE ename=UPPER('Smith');

b)大写变小写LOWER()

如:SELECT LOWER('HELLO WORLD') FROM dual;

c)首字母大写INITCAP()

如:SELECT INITCAP(ename) FROM emp;

仅首字母大写,其余字母均小写

d)字符串连接CONCAT()

但是此种方式不如||好用

如:SELECT CONCAT('hello', 'world') FROM dual;

e)字符串长度LENGTH()

如:SELECT LENGTH('hello') FROM dual;

f)字符串截取SUBSTR()

如:SELECT SUBSTR('hello',1,3) FROM dual;

截取点从0和1都是一样的

如显示所有雇员的姓名及姓名的后三个字符(因为雇员姓名的字符长度不一样,只能求出整个长度再减去2,进行截取)

SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;

SUBSTR可以倒着截取,只要输入的位置是负数就表示倒着进行

SELECT ename,SUBSTR(ename,-3,3) FROM emp;

-3表示从倒数第3个字符开始数,3表示要显示的字符个数,如果写2就表示显示2个字符,不写就表示显示3个,因为从倒数第三个到最后就只有3个字符

g)字符串替换REPLACE()

如:SELECT REPLACE('hello', 'l', 'x') FROM dual;

2)数值函数

接受数值输入并返回数值

a)四舍五入ROUND()

SELECT ROUND(789.536) FROM dual;

如保留两位小数:

SELECT ROUND(789.536,2) FROM dual;

如保留整数:

SELECT ROUND(789.536,-2) FROM dual;

这里的结果是800,简单理解就是从小数点位置向左数2位,就是8,四舍五入,把9换成0,就是800

b)截断小数位TRUNC()

与ROUND()不同,在TRUNC()中不会保留任何的小数,而且也不会进位

如:SELECT TRUNC(789.536) FROM dual;

通过该函数也可以指定小数点的保留位数:

SELECT TRUNC(789.536,2) FROM dual;

也可以使用负数表示位数:

SELECT TRUNC(789.536,-2) FROM dual;

这里的结果是700,简单理解就是从小数点位置向左数2位,就是8,把8和后面的数全部变为0

c)取余(取模)MOD()

如:SELECT MOD(10,3) FROM dual;

3)日期函数

对日期型数据进行操作

日期±数字=日期

日期-日期=数字(天数)

如:显示10部门雇员进入公司的星期数

首先要知道当前日期

SELECT SYSDATE FROM dual;

求出星期数:当前日期-雇佣日期=天数 天数/7=星期数

SELECT empno,ename,ROUND((SYSDATE-hiredate)/7) FROM emp;

a)MONTHS_BETWEEN()给定日期范围的月数

SELECT empno,ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp;

b)ADD_MONTHS()指定日期上加上指定月数,求出之后的日期

SELECT ADD_MONTHS(SYSDATE,4) FROM dual;

c)NEXT_DAY()下一个指定的星期几

SELECT NEXT_DAY(SYSDATE, '星期一') FROM dual;

d)LAST_DAY()求出给定七日的最后一天日期

SELECT LAST_DAY(SYSDATE) FROM dual;

4)转换函数

从一种数据类型转换为另一种数据类型

a)TO_CHAR():转换成字符串

拆分年月日:如果要将雇佣日期的年月日进行分开,就可以使用这个函数进行拆分,但是首先必须指定拆分的通配符:

年:y,年是四位的数字,所以使用yyyy表示

月:m,月是二位的数字,所以使用mm表示

日:d,日是二位的数字,所以使用dd表示

时:hh或hh24,一般使用hh24

分:mi

秒:ss

SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;

SELECT empno,ename,TO_CHAR(hiredate, 'yyyy') year,

TO_CHAR(hiredate, 'mm') months,TO_CHAR(hiredate, 'dd') day FROM emp;

日期格式转换:

Oracle中默认的日期格式:19-4月 -87

中国的格式:1987-04-19

SELECT empno,ename,TO_CHAR(hiredate, 'yyyy-mm-dd') FROM emp;

去掉前导0:如果是5月会用05表示,如果不希望出现的话,可以使用fm去掉

SELECT empno,ename,TO_CHAR(hiredate, 'fmyyyy-mm-dd') FROM emp;

分割数字:在数字中加入一些符号以分割太长的数字,一般使用","

9:表示一位数字

SELECT empno,ename,TO_CHAR(sal, '99,999') FROM emp;

金额显示方式

$表示美元

L:Local的缩写,以本地的语言显示金额,这里表示人民币

SELECT empno,ename,TO_CHAR(sal, '$99,999') FROM emp;

SELECT empno,ename,TO_CHAR(sal, 'L99,999') FROM emp;

b)TO_NUMBER():转换成数字

SELECT TO_NUMBER('123') + TO_NUMBER('123') FROM dual;

在oracle中存在自动转换,因此

SELECT '123' + '123' FROM dual;

结果还是246

c)TO_DATE():转换成日期

SELECT TO_DATE('2009-02-16', 'yyyy-mm-dd') FROM dual;

转换后的数据是日期格式,16-02月 09

5)通用函数

a)NVL函数

如计算年薪

SELECT empno,ename,(sal+comm)*12 income FROM emp;

会有雇员没有年薪,造成这样的结果是有些雇员的奖金是NULL,NULL计算之后还是NULL,此时就可以使用NVL函数,将一个指定的NULL值变成指定的内容

SELECT empno,ename,NVL(comm,0),(sal+NVL(comm,0) )*12 income FROM emp;

b)DECODE函数

类似于if…else语句

DECODE(col/expression,search1,result[,search2,result2,…][,default])

说明:col/expression:列名或者表达式

search1、search2…:用于比较的表达式

result1、result2…:返回值

如果col/expression和searchi相比较,结果相同则返回resulti,如果没有与col/expression向匹配的结果,则返回默认值default

SELECT DECODE(1,1, '内容是1',2, '内容是2', 3,'内容是3') FROM dual;

SELECT ename|| '是'||DECODE(job, 'CLERK', '办事员', 'SALESMAN', '销售', 'PRESIDENT', '总裁', 'MANAGER', '经理', 'ANALYST', '分析人员', '清洁工') FROM emp;

相当于SELECT empno,job FROM emp;对job字段进行替换

Oracle从零开始2——简单查询相关推荐

  1. Oracle从零开始3——复杂查询

    3.1 多表查询 1)基本语法 a)用WHERE消除笛卡尔积 多表连接笛卡尔积是无法消除的,我们只是通过WHERE进行笛卡尔积的显示消除,即只显示符合条件的内容 SELECT * FROM emp,d ...

  2. oracle怎么查询成绩学号,oracle学习(简单查询)

    (1)查询C01课程成绩不为Null的学生的姓名和成绩. 分析:因为涉及到课程成绩和学生姓名,需要对student表和sc表进行连接. 代码: select sname,grade from stud ...

  3. Oracle数据库select简单查询命令及语法

    1.使用select语句查询某张表的所有数据内容 语法: select [distinct] * {col_name1,col_name2,-} from tb_name; 注意:语法中出现的中括号[ ...

  4. oracle数据库查表_【Oracle数据库】表查询(一)

    Oracle数据库的简单查询 本文使用到的数据表如下图: 表名为 EMP .其中,empno为员工号,empname为员工姓名,job为员工岗位,mgr为该员工上司的员工号,hiredate是入职日期 ...

  5. oracle计算期间工作日的简单查询办法

    oracle计算期间工作日的简单查询办法 SELECT sum(天数) 天数 FROM ( SELECT rownum 行,to_char(to_date('2019-12-31','yyyy-mm- ...

  6. Oracle学习之路——简单查询

    本人大三单身狗,虽说还有一年毕业,可是到了大四再幡然醒悟,奋发图强,着实有点晚.为了尽可能将自己从"毕业即失业"的悲惨现状中拯救出来,开始学习吧!!!本博客是为了记录鄙人学习之路中 ...

  7. Oracle数据库之数据库的简单查询

    注:所有的操作都建立在Oracle的Scott用户自带的表中进行 一.查询表的结构与显示表 查看数据表 select * from tab; 查看表的结构 desc 表名称; 二.简单查询(单表查询) ...

  8. oracle查询多个条件查询,ORACLE多条件统计查询的简单方法

    前几天要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析.一开始便想到了UNION和IF语句,然后写了1000多行代码,就为了查30条数据觉得不应该. @H_301_2@ 然后就开始百度,多种 ...

  9. 【Oracle】第1天 简单查询

    简单查询和别名 简单查询 sql中的数学运算 拼接符:|| 起别名--列别名 起别名--表别名 简单查询 结构(语法): SELECT COLUMN1,COLUMN2... FROM TABLE_NA ...

最新文章

  1. jquery Selector 源码分析
  2. 数字加字符串用,隔开
  3. 在MFC里面实现线程的实例
  4. C++ 重载函数调用运算符 | 再探lambda,函数对象,可调用对象
  5. 【数字逻辑设计】毛刺
  6. SonarQube搭建和使用教程
  7. Unity3D ARPG网络游戏编程实践
  8. 因分辨率变化html页面布局跳动_Web前端页面设计流程及注意事项,谨记!
  9. paip java.net.SocketException No buffer space available的解决办法及总结
  10. java 二分查找法和顺序查找法的效率比较
  11. php fseek函数,php fseek函数怎么用 - fseek
  12. 【计算理论】计算理论总结 ( 上下文无关文法 | 乔姆斯基范式 | 乔姆斯基范式转化步骤 | 示例 ) ★★
  13. matlab 交互界面设计
  14. 自然底数e究竟“自然”在哪?
  15. galaxy 用不了_开箱即用使Galaxy S9更好的六种方法
  16. 白色在html中怎么写,html如何设置文字颜色白色
  17. 2020工作第一天,免费请大家喝星巴克咖啡了,速来!
  18. 预告:揭秘7*24小时用数学解码交易的神秘玩家,量化交易者——TokenInsight对话首席...
  19. Led显示屏设备自发现技术实现-上海灵信
  20. 错误 CS0246 未能找到类型或命名空间名“XXXX”(是否缺少 using 指令或程序集引用?)

热门文章

  1. sublime安装与使用
  2. 动态字段列表实现及ListT排序
  3. uboot——之初体验
  4. java 中类型后面三个点的用法
  5. Spring集成activeMQ
  6. dataAdapter与dataSet和dataTable的填充
  7. 如何使用cocos2dx-jsbinding 来处理分辨率适配
  8. 转 sqlserver 中NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
  9. CVPR2021 P2GAN:提高图像风格迁移的鲁棒性
  10. CVPR2021|引入记忆模块,突破长距离依赖视频预测的性能瓶颈