逻辑条件关系
SQL 的三个逻辑运算符是:AND 、OR 、NOT 。
AND :要求两个条件同时为真。
OR :操作要求两者之一为真即可。
NOT:取反。也可以用于另一个 SQL 运算符,例如,BETWEEN、LIKE、IN 和 NULL。
优先规则:算数运算符>连字操作(||)> 比较运算符>逻辑运算
ORDER BY 排序
用于对结果集进行排序处理,默认升序(asc) desc 降序排列order by 后面跟需要排序的列。
多列排序 第一个列排名相同的列,在按照第二个列的要求排,(在第一个排序的基础上排序)
select语句的执行顺序:
- from 语句
- where语句
- select语句
- order by 语句
Oracle 函数
函数:是数据库产品中提供的能够处理查询结果的方法。
函数类型:
单行函数:这些函数仅对单个行进行运算,并且每行返回一个结果。
多行函数(聚合函数):这些函数能够操纵成组的行,每个行组给出一个结果,这些函数
也被称为组函数。
单行函数的特性:
- 作用于每一个返回行,每行返回一个结果
- 可能需要一个或多个参数
- 可以修改结果集的数据类型
- 可以嵌套
- 可能返回一个与参数不同类型的数据值
- 能够用在 SELECT、WHERE 和 ORDER BY 子句中
单行函数分为
- 字符函数:接受字符输入,可以返回字符或者数字值
- 数字函数:接受数字输入,返回数字值
- 日期函数:对 DATE 数据类型的值进行运算 (除了 MONTHS_BETWEEN 函数返回一
- 个数字,所有日期函数都返回一个 DATE 数据类型的值。)
- 转换函数:从一个数据类型到另一个数据类型转换一个值
- 通用函数: NVL NVL2 NULLIF COALSECE CASEDECODE
字符函数
- 大小写处理函数
- 字符处理函数
大小写处理函数
lower 转为小写
upper 转为大写
initcap 每个单词首字母大写,其他小写
字符处理函数
dual 表:
dual 是一张只有一个字段,一行记录的表。dual 表也称之为'伪表',因为他不存储主题数据。如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过 select 完成时,就要借助 dual 表来满足结构化查询语言的格式。
arg:字符串类型。
CONCAT(arg1,arg2):concat(arg1,arg2)连接值在一起 (CONCAT 函数有两个输入参数)
SUBSTR(arg1,arg2,arg3):substr(arg1,arg2,arg3)截取子串。
- arg1:原字符串。
- arg2: 开始位置(开始位置可以是一个负数,-1 表示原串的最后一位,-2 则表示倒是第二位以此类推),
- arg3:整数类型。截取个数。
SUBSTR(arg1,arg2):substr(arg1,arg2)截取子串。
- arg1:字符串类型。原字符串
- arg2 开始位置(开始位置可以是一个负数,-1 表示原串的最后一位,-2 则表示倒是第二位以此类推)截取到末尾。
LENGTH(arg1):length()以数字值显示一个字符串的长度。
INSTR(arg1,arg2,arg3,arg4):instr()指定查找位置以及出现的次数。
- arg1:字符串类型。原字符串
- arg2:字符串类型。查找内容
- arg3:整数类型。开始位置。
- arg4:整数类型。第几次出现
LPAD(arg1,arg2,arg3):用给定的字符左填充字符串到给定的长度
- arg1:字符串类型。原字符串
- arg2:整数类型。总长度。
- arg3:字符串类型。填充的子字符串。
RPAD(arg1,arg2,arg3):用给定的字符右填充字符串到给定的长度。
- arg1:字符串类型。原字符串
- arg2:整数类型。总长度。
- arg3:字符串类型。填充的子字符串。
数字函数
round 四合五入
round(a,b) a代表一个数字 b代表保留的小数位数
round(45.925,1)-->45.9 负数代表 小数点前面的位数 一个参数 是取整
trunc 不会做四舍五入 和round 用法一样
mod 去余数
日期函数
- round (date, 'month') 月份四舍五入 也可以用作时间 day,month,year
- months_between(date1,date2) 计算date1和date2之间的月数 返回的是数字
- add_months(date,n) 添加n个月 n必须是整数 可以为负数
- next_day(date1,‘星期几’) 得到一个日期类型 距离 下个 星期几最近的日期 next_day(date1,1-7) 或者数字1-7 注意 1代表周日 以此类推
- last_day(date) 返回一个日期 date月最后一天日期
数据类型装换
包括 隐式数据类型转换 和显示数据类型转换
隐式转换:当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换。
隐式转换的问题
1.性能影响:
隐式转换的最大问题就是转换时会导致索引的无效,进而可能导致全表扫描。当表的数据量很大的时候,产生会很大的性能问题。比如说,VARCHAR2 和 NVARCHAR2 隐式数据类型转换导致的性能问题。
2. 不便于阅读
由于隐式转换使得数据库编程人员和 DBA 难以了解到究竟发生了怎样的类型转换,而且如果代码很多很长的话要查出错误就需要费很大的劲.
显示数据类型转换
通过数据库中的转换函数完成数据类型的转换。
- To_char 数字转为字符 日期转为字符
- To_number 将字符转为数字
- To_date 将字符转为日期
代码展示(使用hr用户登录)
查询雇员的 last_ name,job ID 和 department_ id号,要求这些雇员的 department_id 是90。
select last_name,job_id,department_id from employees where department_id=90;
查询员工表中名字为 King 的员工的工作编号。
select employee_id from employees where last_name ='King';
查询 2006 年 1 月 24 日入职的员工的姓名、部门编号以及工作 ID
select last_name,department_id,job_id from employees where hire_date='24,1月,06';
查询员工薪水小于等于 3000 的员工的姓名与薪水。
select last_name,salary from employees where salary<=3000;
查询薪水在$2,500 和$3,500(包含 2500 与 3500) 之间的那些雇员的姓名以及薪水。
select last_name,salary from employees where salary between 2500 and 3500;
查询所有经理号(manager_id )为 100、101 或 201 的雇员的 employee_id, last names, salary。
select employee_id,last_name,salary from employees where manager_id in(100,101,201);
查询 EMPLOYEES 表中名字以一个大写字母 S 开始的雇员的名字。
select last_name from employees where last_name like'S%';
查询所有在 2005 年进入本公司的雇员的名字和受雇日期。(05/6/28)
select last_name,hire_date from employees where hire_date like '%05';
查询员工表中工作 ID 中包含 SA_的员工姓名以及工作 ID。‘SA_’的字符串可以使用escape 对表示该符号为转义符号。
select last_name,job_id from employees where job_id like '%SA_%'escape'';
查询所有没有佣金的雇员的 last name, job ID 和 commission。
select last_name,job_ id,commission_pct from employees where commission_pct is null;
查询所有有佣金的雇员的 last name, job ID 和 commission。
select last_name,job_id,commission_pct from employees where commission_pct is not null;
查询工作岗位包含字符串 MAN 并且收入大于等于$10,000 的那些雇员的编号、工作ID、名字以及薪水。
select employee_id,job_id,last_name,salary from employees where job_id like '%MAN%' and salary >=10000;
查询任何 job ID 中包含 MAN 或者收入大于等于$10,000 的雇员编号、工作 ID、名字以及薪水。
select employee_id,job_id,last_name,salary from employees where job_id like '%MAN%' or salary >=10000;
查询那些工作岗位不是 IT_PROG、ST_CLERK 或 SA_ REP 的雇员的名字和工作岗位。
select last_name,job_id from employees where job_id not in('IT_PROG','ST_CLERK','SA_REP');
查询工作岗位是 SA_REP 或者工作岗位是 AD_ PRES 并且薪水大于 15000 的员工姓名、工作 ID 以及薪水。
select last_name,job_ id,salary fromemployees where job_id = 'SA_ REP' or job_id='AD_PRES' and salary > 15000;
查询工作岗位是 SA_REP 或者是 AD_ PRES 并且他们的薪水大于 15000 的员工姓名、工作 ID 以及薪水。
select last_name,job_ id,salary fromemployees where (job_id = 'SA_ REP' or job_id='AD_PRES') and salary > 15000;
显示所有薪水不在 5000 和 12000 之间的雇员的名字和薪水。
select last_name ,salary from employees where salary not between 5000 and 12000;
显示受雇日期在 2002 年 2 月 20 日 和 2007 年 5 月1 日 之间的雇员的名字、岗位和受雇日期。按受雇日期顺序排序查询结果。
select last_name,job_id,hire_date from employees where hire_date between '20/2月/02' and '1/5月/07' order by hire_date;
显示所有在部门 20 和 50 中的雇员的名字和部门号,并以名字按字母顺序排序。
select last_name,department_id from employees where department_id between 20 and 50 order by department_id;
列出收入在 $5,000 和 $12,000 之间,并且在部门 20或 50 工作的雇员的名字和薪水。将列标题分别显示为Employee 和 Monthly Salary。
select last_name "Employee",salary "Monthly Salary" from employees where (salary between 5000 and 12000) and (department_id between 20 and 50) ;
显示每一个在 2004 年受雇的雇员的名字和受雇日期.
select last_name,hire_date from employees where hire_date like '%04';
显示所有没有主管经理的雇员的名字和工作岗位。
select last_name,job_id from employees where manager_id is null;
显示所有有佣金的雇员的名字、薪水和佣金。以薪水和佣金的降序排序数据。
select last_name,salary,commission_pct from employees where commission_pct is not null order by salary desc ,commission_pct desc;
显示所有名字中第三个字母是 a 的雇员的名字。
select last_name from employees where last_name like '__a%';
显示所有名字中有一个 a 和一个 e 的雇员的名字。
select last_name from employees where last_name like '%a%' and last_name like '%e%';
显示所有工作是销售代表(SA_REP)或者普通职员(ST_CLERK),并 且薪水不 等于 $2,500、$3,500 或$7,000 的雇员的名字、工作和薪水。
select last_name,job_id,salary from employees where job_id in('SA_REP','ST_CLERK') and salary not in(2500,3500,7000);
显示所有佣金总计为 20% 的雇员的名字、薪水和佣金。
select last_name,salary,commission_pct from employees where commission_pct=0.2;
查询所有受雇在 15 年 (180 个月) 以内的雇员的 employee_id,hire_date,显示他们已被雇用的月,从受雇日期开始加 6 个月的试用期后的日期,受雇日期后的第一个星期五几号,以及受雇月的最后一天是几号。
select employee_id ,hire_date,months_between(sysdate,hire_date),add_months(hire_date,6),next_day(hire_date,' 星 期 五 '),last_
day(hire_date) from employees where months_between(sysdate,hire_date) < 180;
查询受雇日期,找出 2002 年开始工作的哪些人。用 ROUND 和 TRUNC 函数显示开始的月份。
select round(hire_date,'month'),trunc(hire_date,'month') from employees where hire_ date like'%02';
显示所有雇员的名字和受雇日期,受雇日期以 2007 年 8 月 10 日 12:00:00 AM 显示。
select last_name,to_char(hire_date,'yyyy" 年 "MM" 月"DD"日" HH:MI:SS AM') from employees;