一、sql基础
日期和字符只能在单引号 中出现
在select子句中使用关键字 distinct 删除重复行
select distinct department_id
from employees;
使用 desc(describe)命令,显示表结构
desc employees;
sql是一种语言,sql plus是一种环境,mysql是数据库
二、过滤和排序数据
1.where过滤
where子句紧随from子句,使用where子句将不满足条件的行过滤掉
字符大小写敏感,日期格式敏感
默认的日期格式是DD-MON月-RR
SELECT last_name, hire_date, department_id
FROM employees
WHERE hire_date = '7-6月-1994'
建议用这一种↓↓↓
SELECT last_name, hire_date, department_id
FROM employees
WHERE to_char(hire_date,'yyyy-mm-dd') = '1994-06-07'
2.like
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符。
%和_可以同时使用
select job_id
from jobs
where job_id like 'IT\_%' escape '\'
3.order by排序
使用order by子句排序
asc(ascend)升序-从小到大,默认是从小到大
desc(descend)降序-从大到小
order by子句在select语句的结尾
三、单行函数
1.字符函数
<1>大小写控制函数
lower-全部小写
upper-全部大写
initcacp-首字母大写
<2>字符控制函数
concat-连接字符串
substr-从第几个字符开始取,取几个字符(注意:是从1开始)
length-字符数
instr-首次出现的位置。若无返回0(在第一位返回1,也是从1开始)
lpad-补左边,补到几位,用什么补
rpad-补右边,同上
trim-将一个字符从另一个字符串中移除(注意:只能去首尾)
replace-将一个字符串中的某一个字符取代为另一个(注意:全部替换)
select concat('hello','world'),substr('helloworld',2,4),length('helloworld')
from dual;运行结果↓↓↓
CONCAT('HELLO','WORLD') SUBSTR('HELLOWORLD',2,4) LENGTH('HELLOWORLD')
----------------------- ------------------------ --------------------
helloworld ello 10
select instr('helloworld','l')
from dual
select instr('helloworld','s')
from dual
select employee_id,salary,lpad(salary,10,' '),rpad(salary,10,' ')
from employees
select trim('h' from 'hhhhellohworldhh')
from dual
select replace('abcdab','b','m')
from dual
2.数字函数
<1>round
四舍五入,保留到几位小数。如无参数,默认为0,只取整数。
select round(435.45,2),round(435.45),round(435.45,-2)
from dual运行结果↓↓↓
ROUND(435.45,2) ROUND(435.45) ROUND(435.45,-2)
--------------- ------------- ----------------435.45 435 400
select round(435.45,1),round(435.45),round(435.45,-1)
from dual运行结果↓↓↓
ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
--------------- ------------- ----------------435.5 435 440
<2>trunc
截断,不管是几都舍去
select trunc(435.45,1),trunc(435.45),trunc(435.45,-1)
from dual运行结果↓↓↓
TRUNC(435.45,1) TRUNC(435.45) TRUNC(435.45,-1)
--------------- ------------- ----------------435.4 435 430
<3>mod
求余
select mod(1100,300)
from dual运行结果↓↓↓
MOD(1100,300)
-------------200
dual是一个伪表,可以用来测试函数和表达式
3.日期
Oracle 中的日期型数据实际含有两个值: 日期和时间。
函数sysdate返回日期和时间
select sysdate from dual;
<1>日期的数学运算
在日期上加上或减去一个数字结果仍为日期。
select sysdate,sysdate + 1,sysdate -3
from dual
两个日期相减返回日期之间相差的天数。
日期不允许做加法运算,无意义
select employee_id,last_name,trunc(sysdate-hire_date) worked_days
from employees
可以用数字除24来向日期中加上或减去天数。
<2>日期函数
months_betwenn
select employee_id,last_name,(sysdate-hire_date)/30,months_between(sysdate,hire_date)
from employees
add_months和next_day
select add_months(sysdate,2),add_months(sysdate,-3),next_day(sysdate,'星期四')
from dual
last_day
--来公司的员工中,hire_date是每个月倒数第二天来公司的有哪些?
select last_name,hire_date
from employees
where hire_date = last_day(hire_date) - 1
select last_day(sysdate) from dual
round和trunc
select round(sysdate,'month'),round(sysdate,'mm'),trunc(sysdate,'hh')
from dual
yyyy 年
mm 月
dd 日
day星期 hh小时 mi分钟 ss秒
4.转换函数(重点)
<1>隐式数据类型转换
Oracle自动完成下图转换:
select '12' + 2 from dual;运行结果↓↓↓'12'+2
----------14
<2>显式数据类型转换
to_char
select employee_id,hire_date
from employees
where to_char(hire_date,'yyyy-mm-dd') = '1994-06-07'
to_date
select employee_id,hire_date
from employees
where to_date('1994-06-07','yyyy-mm-dd') = hire_date
to_number
select to_char(1234567.89,'999,999,999.99') from dual运行结果↓↓↓
TO_CHAR(1234567.89,'999,999,99
------------------------------1,234,567.89
L 本地的货币符号
select to_char(1234567.89,'L999,999,999.99') from dual;运行结果↓↓↓
TO_CHAR(1234567.89,'L999,999,9
------------------------------¥1,234,567.89
select to_number('¥001,234,567.89','L000,000,999.99') + 1
from dual运行结果↓↓↓
TO_NUMBER('¥001,234,567.89','
-----------------------------1234568.89
5.通用函数
<1>nvl函数
将空值转换成一个已知的值
可以使用的数据类型有日期、字符、数字。
函数的一般形式:
NVL(commission_pct,0)
NVL(hire_date,‘01-JAN-97’)
NVL(job_id,‘No Job Yet’)
--求公司员工的年薪(含commission_pct)
select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) "annual sal"
from employees
--输出last_name,department_id,当department_id为null时,显示‘没有部门’
select employee_id,last_name,nvl(to_char(department_id,'999999'),'没有部门')
from employees
<2>nvl2函数
NVL2 (expr1, expr2, expr3) : expr1不为NULL时,返回expr2;expr1为NULL时,返回expr3。
--查询员工的奖金率,若为空,返回0.01;若不为空,返回实际奖金率+0.015
select last_name,commission_pct,nvl2(commission_pct,commission_pct + 0.015,0.01)
from employees
<3>nullif函数
NULLIF (expr1, expr2) : 相等返回NULL,不等返回expr1
6.条件表达式(重点)
在 SQL 语句中使用IF-THEN-ELSE 逻辑
<1>case表达式
CASE expr WHEN comparison_expr1 THEN return_expr1[WHEN comparison_expr2 THEN return_expr2WHEN comparison_exprn THEN return_exprnELSE else_expr]
END
--查询部门号为 10, 20, 30 的员工信息,
--若部门号为 10, 则打印其工资的 1.1 倍,
--20 号部门, 则打印其工资的 1.2 倍,
--30 号部门打印其工资的 1.3 倍数
select employee_id,last_name,department_id,case department_id when 10 then salary * 1.1when 20 then salary * 1.2else salary * 1.3 end new_sal
from employees
where department_id in (10,20,30)
<2>decode表达式
select employee_id,last_name,department_id,decode(department_id,10,salary * 1.1,20,salary * 1.2,salary * 1.3) new_sal
from employees
where department_id in (10,20,30)