sql中的select 语句
spool d:\基本查询.txt
--spool 录屏所录的为文本文件
--清屏
host clear(linux)
host cls (window)
--当前用户
show user
--当前用户下的表
select * from tab;(tab数据字典,表和视图)
--员工表的结构
desc emp
empno 员工号 ename 员工名字 job 工作 mgr 老板
hiredate 入职日期 sal 月薪 comm 奖金 deptno 部门号
--查询所有的员工信息
select * from emp
--设置行宽
show linesize
set linesize 150
--设置列宽
col ename for a8 (设置名字这行的宽度为8个字符)
col sal for 9999(4列用数字进行代表)
/ (执行上一条语句)
/*sql优化(数据库的优化)
1.尽量使用列名
*/
光标所在的位置代表上一条记录
若sql语句书写错误,修改的方法
--c命令 change
2 (代表修改第二条)
c /form/from (将什么修改成什么)
/ (执行上一条语句)
-- sql 语句是支持算术表达式的
select empno,ename,sal,sal*12,comm,sal*12+comm
from emp
/* sql语句中的空值问题
1.包含null的表达式都为null,解决方法
滤空函数nvl(a,b)若a为空,则值为b,若a不空,则值为a
2.null 永远!=null
is nll 代表等于空
3.如果集合当中含有null,不能使用not in ;但是可以使用in
*/
--列的别名
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0)
from emp
ed 打开默认的编辑器
select empno as "员工号",ename "姓名" ,sal 月薪 ,sal*12 as ,comm as ,sal*12+nvl(comm,0) as
from emp
as "员工号"和"姓名"两个别名没有区别
别名当中含有关键字或者含有特殊的符号或者纯数字则要加上""
select *|{distinct column|expression [alias]}
from table
--distinct
select distinct deptno,job form emp;(两列看成整体不重复)
--连接符 和--concat的作用相同(连接字符串)
select ‘hello‘||‘ world‘ 字符串 from dual;
select concat(‘hello‘,‘ word‘) from dual;
当进行操作的时候和任何表都没有关系的时候
select 3+2 from dual;
--解释dual:伪表
dual 的出现仅仅是为了满足select语句的要求(sql99当中要求select必须和from相互配套)
--查询员工信息:***的薪水是***
select ename||‘的薪水是‘||sal 信息 from emp;
hadoop的数据仓库hive支持sql92 可以直接写select
--字符串
单引号:表示日期和字符
双引号:表示列的别名
--sql和sqlplus
sql 增删改查(改变数据)
sqlplus oracle提供的工具(不能修改数据)
两者的区别:
sql 没有进行缩写(insert select update delete)
sqlplus 进行缩写(desc ed c col for)
linux 当中的端口不能改到1024以下(linux系统保留)
oracle服务监听器监听的端口为1521,通过监听1521端口登录到数据库(orcl)的服务上
--任务调度:(oracleJobSchedulerORCL)
到达时间后做什么事情
oracleDBConsoleorcle(oracle的控制台,相当于一个监听1158端口)
进行管理数据库:
192.168.56.101:1158/em/console/logon/logon
sys
password
sysdba
isqlplus只能在oralce9i 和oracle 10g才有(sqlplus的网页版)
192.168.56.101:5560/isqlplus
scott
password
网页版遵守http协议,明文协议不安全
11g 当中遵守https 加密协议
--spool off
单行函数:
函数:简化操作
函数:
单行函数(nvl)
单行进行变换产生结果
字符;数值;日期;转换;通用;条件表达式
多行函数(max)
多行进行变换产生结果
单行函数:
大小写控制: lower(小写) upper(大写) initcap(首字母大写)
字符函数: concat(字符串连接) concat(a,b) 将a和b相互连接
substr(字符串的子串) substr(a,b,c) 从a中,第b位开始取c位
length(长度) length(a)字符长度 lengthb(a)字节长度
instr(一个字符串来当中查找另外一个字符串) instr(a,b) 返回位置/没有返回0
lpad|rpad(左填充,右填充) lpad(a,b,c) 将a,填充到b位,填充的字符为c
trim(去掉前后指定的字符) trim(a from b) 将b 当中的前后a去掉
replacel(用什么去替换什么) replalce(a,b,c) 将a中的b都替换为c
数值函数: round(a,b) a保留b位小数(四舍五入)保留小数,四舍五入
trunc(a,b) 截断,截断后的数值
日期:
mysql : date datetime(含有年月日)
oracle: date= 日期+时间(DD-MON-RR)
--查询当前时间:
select sysdate from dual
to_char 把什么东西按照什么格式转换为字符串
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;
日期的运算只有加和减没有乘和除(两个日期不能相加(没有意义)
--昨天 今天 明天
select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天
from dual
--计算员工的工龄: 天 星期 月 年
select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,
(syddate-hiredate)/30 月,(sysdate-hiredate)/365 年
from emp;
--两个日期相差的月数: months_between(a,b)
--添加多少个月:add_months(sysdate,56)
--当前月最后一天:last_day(sysdate)
--指定日期的下一个日期 next_day
/*
next_day 的应用:每个星期一自动备份数据
异地容灾(数据库远程备份)
1.分布式数据库
2.快照和触发器
*/
select next_day(sysdate,‘星期一‘) from dual
select round(sysdate,‘month‘),round(sysdate,‘year‘) from dual
转换函数:数据类型的转换(隐式类型和显式类型)
select * from emp where hiredate="17-11月-81" (隐式类型转换)
显示类型转换:
number character date
to_char;to_number;to_date
yyyy year mm month dy day dd
to_char 将日期转换为字符串(to_number 相反)
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss"今天是"day‘) from dual;
--查询员工薪水:两位小数,千位符 货币代码
select to_char(sal,‘L9,999.99‘) from emp;
to_date 将字符转换为日期(字符按照日期格式转换为日期)
to_date(char,‘format_model‘)和to_char 相反
通用函数:适用于任何的类型,同时也适用于空值
oracle 当中含有2的是不含2的增强
--nvl2(a,b,c) 当a =null 的时候,返回c;否则返回b
select sal*12+nvl2(comm,comm,0) from emp;
--nullif(a,b) 当a=b的时候,返回null;否则返回a
select nullif(‘abc‘,‘abc‘) 值 from dual;
--coalesce 从左到右找到第一个不为null的值
select comm,sal,coalesce(comm,sal) "第一个不为空的值" from emp;
条件表达式:if-then-else的逻辑时:
case expr when expr1 then return_expr1
when expr2 then return_expr2
when expr3 then return_expr3
else else_expr
end
--涨工资
select ename,job,sal 涨前
case job when ‘president‘ then sal+1000
when ‘manager‘ then sal+800
else sal+400 涨后
from emp;
case job when sal<3000 then ***
when sal>=3000 and sal<6000 then ***
else ***
select ename,job,sal 涨前
decode(job,‘president’,sal+1000
‘manager‘ ,sal+800
sal +400) 涨后
from emp;
过滤和排序
--字符大小写敏感,日期格式敏感(默认 DD-MON-RR)
日期和字符串要包含在单引号中
select *
from emp
where hiredate =‘17-11月-81‘
where hiredate = ‘1981-11-17‘ 错误
--查询默认的格式:
select * from v$nls_parameters(动态视图)(取得操作系统的语言)
alter session|system set NLS_DATE_FORMAT=‘yyyy-mm-dd‘
比较运算:赋值使用:=符号
java : int a =0;
pl/sql: a number :=0
between and 1.含边界 2.小值在前,大值在后
in(null,30)(可以) 和 not in (null,30,40) (不可以)
--like 模糊查询 % 代表所有的字符 _ 代表任意的一个字符
--查询员工当中含有下划线的员工
select *
from emp
where ename like ‘%\_%‘ escape ‘\‘ (escape声明转移字符为\)