Oracle_DAY 03操作语句
Oracle_DAY 03操作语句
1.用子查询,查询谁是普通员工
select first_name,id from s_emp where id in (领导的id);
select first_name,id from s_emp where id in (select distinct manager_id from s_emp);
select first_name,id from s_emp where id in (1,2,3,黑盒子);
select first_name,id from s_emp where id not in (select distinct manager_id from s_emp);
注意:not in 使用时要注意NULL值
select first_name,id from s_emp where id not in (select distinct manager_id from s_emp where manager_id is not null);
select first_name,id from s_emp where id not in (select distinct nvl(manager_id,-1) from s_emp );
select first_name,id from s_emp where id not in (select distinct nvl(manager_id,1) from s_emp );
select first_name,id from s_emp where id not in (select distinct nvl(manager_id,25) from s_emp );
//logic error
找出和id 是1的职位相同的员工
select title from s_emp where id=1;
select first_name,title from s_emp where title=(select title from s_emp where id=1) and id!=1;
------------------------------------------
SQL数据类型:
number 数字类型
varchar2(n) 变长字符串
char(n) 定长字符串 4k
date 日期类型
CLOB 大字符类型 4g
BLOB 大二进制类型 4g
日期类型:
表达系统当前时间 sysdate
和语言相关的-------NLS_LANG
英文默认格式
DD-MON-YY
07-NOV-12
07-11月-12
处理日期的函数
语言环境
时间的表达问题
to_date(要转换的日期字符串,格式字符串)
建表 字段 都要遵循标识符的定义
create table 表名(
字段名 类型,
字段名 类型,
字段名 类型
);
create table testtype(
id number,
fname varchar2(10),
sname char(10),
birday date
);
插入语句
insert into testtype values(1,'xsy','xsy',sysdate);
insert into testtype values(9527,'zxc','zxc','01-NOV-08');
insert into testtype values(9527,'zxc','zxc','01-11月-08');
to_date
insert into testtype values(1,'abc','abc',to_date('2008-08-08 08:08:08','yyyy-mm-dd hh:mi:ss'));
yyyy 四位年
mm 二位月
dd 日
hh 12小时的 hh24
mi 分钟
ss 秒
day 表达星期几
mon 月的英文缩写
month
to_char(日期,'日期格式')
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day mon') from dual;
to_date 就是按照格式放入日期
to_char 按照格式来显示日期
日期的加减法:
select to_char(sysdate-1,'yyyy-mm-dd hh24:mi:ss day mon') from dual;
向前走一个小时
select to_char(sysdate+1/24,'yyyy-mm-dd hh24:mi:ss day mon') from dual;
往前加一个月 往后推一个月
select to_char(add_months(sysdate,1),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
select to_char(add_months(sysdate,2),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
next_day 下一个星期几是几号
select next_day(sysdate,'星期五') from dual;
select next_day(next_day(sysdate,'星期五'),'星期五') from dual;
last_day 本月的最后一天
select to_char(last_day(sysdate),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
补充:
round(日期)
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day mon'),to_char(round(sysdate+1/24),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
默认对天进行四舍五入
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day mon'),to_char(round(sysdate,'mm'),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day mon'),to_char(round(sysdate,'y'),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
trunc(日期)
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day mon'),to_char(trunc(sysdate,'mm'),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss day mon'),to_char(trunc(sysdate,'y'),'yyyy-mm-dd hh24:mi:ss day mon') from dual;
在一个月的任何时间执行一条语句,得到的都是下一个月的开始的时间
to_char()
trunc(add_months(sysdate,1),'mm')
trunc(last_day(sysdate)+1)
----------------------------------------------
SQL约束的种类
主键 ------primary key
唯一 ------unique
非空 ------not null
检查 ------check
外键 ------foreign key references
表上建立约束:对数据的最后一道屏障
主键 ------唯一 且 非空,一个表最多只能有一个主键
唯一 -----------不能有重复的
非空 -----------不能有NULL值
检查 ------字段要符合检查条件
外键 ------------涉及到两张表
s_dept -----id (主表)
s_emp -----dept_id(子表)
定义了外键的表就是子表
s_dept -----region_id
s_region ----id(主键)
外键:引用主表的字段,必须有唯一性限制。外键的取值只能是主表字段的值,要么是NULL,这样能保证子表数据的完整性,一旦违反外键约束,就会报数据完整性约束。
约束的语法:
列级约束:在